summaryrefslogtreecommitdiff
path: root/src/lastfm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lastfm.cpp')
-rw-r--r--src/lastfm.cpp155
1 files changed, 11 insertions, 144 deletions
diff --git a/src/lastfm.cpp b/src/lastfm.cpp
index f6ff5004..e9baabca 100644
--- a/src/lastfm.cpp
+++ b/src/lastfm.cpp
@@ -22,27 +22,12 @@
#ifdef HAVE_CURL_CURL_H
-#ifdef WIN32
-# include <io.h>
-#else
-# include <sys/stat.h>
-#endif // WIN32
-
-#include <cassert>
-#include <cerrno>
-#include <cstring>
-#include <boost/locale/conversion.hpp>
-#include <fstream>
-#include <iostream>
-
-#include "error.h"
#include "helpers.h"
#include "charset.h"
#include "global.h"
#include "statusbar.h"
#include "title.h"
#include "screen_switcher.h"
-#include "utility/string.h"
using Global::MainHeight;
using Global::MainStartY;
@@ -51,7 +36,6 @@ Lastfm *myLastfm;
Lastfm::Lastfm()
: Screen(NC::Scrollpad(0, MainStartY, COLS, MainHeight, "", Config.main_color, NC::Border::None))
-, isReadyToTake(0), isDownloadInProgress(0)
{ }
void Lastfm::resize()
@@ -65,23 +49,13 @@ void Lastfm::resize()
std::wstring Lastfm::title()
{
- return itsTitle;
+ return m_title;
}
void Lastfm::update()
{
- if (isReadyToTake)
- Take();
-}
-
-void Lastfm::Take()
-{
- assert(isReadyToTake);
- pthread_join(itsDownloader, 0);
- w.flush();
- w.refresh();
- isDownloadInProgress = 0;
- isReadyToTake = 0;
+ if (m_worker.valid() && m_worker.is_ready())
+ getResult();
}
void Lastfm::switchTo()
@@ -90,134 +64,27 @@ void Lastfm::switchTo()
if (myScreen != this)
{
SwitchTo::execute(this);
- // get an old info if it waits
- if (isReadyToTake)
- Take();
- Load();
drawHeader();
}
else
switchToPreviousScreen();
}
-void Lastfm::Load()
-{
- if (isDownloadInProgress)
- return;
-
- assert(itsService.get());
- assert(itsService->checkArgs(itsArgs));
-
- SetTitleAndFolder();
-
- w.clear();
- w.reset();
-
- std::string artist = itsArgs.find("artist")->second;
- std::string file = boost::locale::to_lower(artist + ".txt");
- removeInvalidCharsFromFilename(file, Config.generate_win32_compatible_filenames);
-
- itsFilename = itsFolder + "/" + file;
-
- mkdir(itsFolder.c_str()
-# ifndef WIN32
- , 0755
-# endif // !WIN32
- );
-
- std::ifstream input(itsFilename.c_str());
- if (input.is_open())
- {
- bool first = 1;
- std::string line;
- while (std::getline(input, line))
- {
- if (!first)
- w << '\n';
- w << Charset::utf8ToLocale(line);
- first = 0;
- }
- input.close();
- itsService->colorizeOutput(w);
- }
- else
- {
- w << "Fetching informations... ";
- pthread_create(&itsDownloader, 0, DownloadWrapper, this);
- isDownloadInProgress = 1;
- }
- w.flush();
-}
-
-void Lastfm::SetTitleAndFolder()
-{
- if (dynamic_cast<ArtistInfo *>(itsService.get()))
- {
- itsTitle = L"Artist info - ";
- itsTitle += ToWString(itsArgs.find("artist")->second);
- itsFolder = Config.ncmpcpp_directory + "artists";
- }
-}
-
-void *Lastfm::DownloadWrapper(void *this_ptr)
+void Lastfm::getResult()
{
- static_cast<Lastfm *>(this_ptr)->Download();
- pthread_exit(0);
-}
-
-void Lastfm::Download()
-{
- LastfmService::Result result = itsService->fetch(itsArgs);
-
+ auto result = m_worker.get();
if (result.first)
{
- Save(result.second);
w.clear();
w << Charset::utf8ToLocale(result.second);
- itsService->colorizeOutput(w);
- }
- else
- w << NC::Color::Red << result.second << NC::Color::End;
-
- isReadyToTake = 1;
-}
-
-void Lastfm::Save(const std::string &data)
-{
- std::ofstream output(itsFilename.c_str());
- if (output.is_open())
- {
- output << data;
- output.close();
+ m_service->beautifyOutput(w);
}
else
- std::cerr << "ncmpcpp: couldn't save file \"" << itsFilename << "\"\n";
-}
-
-void Lastfm::Refetch()
-{
- if (remove(itsFilename.c_str()) && errno != ENOENT)
- {
- const char msg[] = "Couldn't remove \"%ls\": %s";
- Statusbar::msg(msg, wideShorten(ToWString(itsFilename), COLS-const_strlen(msg)-25).c_str(), strerror(errno));
- return;
- }
- Load();
-}
-
-bool Lastfm::SetArtistInfoArgs(const std::string &artist, const std::string &lang)
-{
- if (isDownloading())
- return false;
-
- itsService.reset(new ArtistInfo);
- itsArgs.clear();
- itsArgs["artist"] = artist;
- if (!lang.empty())
- itsArgs["lang"] = lang;
-
- return true;
+ w << " " << NC::Color::Red << result.second << NC::Color::End;
+ w.flush();
+ w.refresh();
+ // reset m_worker so it's no longer valid
+ m_worker = boost::unique_future<LastFm::Service::Result>();
}
#endif // HVAE_CURL_CURL_H
-