diff options
author | Andrzej Rybczak <electricityispower@gmail.com> | 2010-08-09 11:39:41 +0200 |
---|---|---|
committer | Andrzej Rybczak <electricityispower@gmail.com> | 2010-08-09 11:39:41 +0200 |
commit | daad444f3c183a7388d5285d5a7fa6cd5133d84e (patch) | |
tree | 1f49a026e0a69d3f2abfc3f33ec8f2ba04327b33 /src/lyrics.cpp | |
parent | d3cb0ea6f6ab7be363baf0d395fb4aee91457a85 (diff) |
lyrics: redesigned plugins system
Diffstat (limited to 'src/lyrics.cpp')
-rw-r--r-- | src/lyrics.cpp | 160 |
1 files changed, 32 insertions, 128 deletions
diff --git a/src/lyrics.cpp b/src/lyrics.cpp index fd4c976c..72119b67 100644 --- a/src/lyrics.cpp +++ b/src/lyrics.cpp @@ -28,6 +28,7 @@ #include <fstream> #include "lyrics.h" +#include "lyrics_fetcher.h" #include "browser.h" #include "charset.h" @@ -85,10 +86,18 @@ void Lyrics::Resize() void Lyrics::Update() { # if defined(HAVE_CURL_CURL_H) && defined(HAVE_PTHREAD_H) - if (myLyrics->Ready) - myLyrics->Take(); + if (Ready) + Take(); # endif // HAVE_CURL_CURL_H && HAVE_PTHREAD_H +# ifdef HAVE_PTHREAD_H + if (Downloader) + { + w->Flush(); + w->Refresh(); + } +# endif + if (Reload) SwitchTo(); } @@ -134,13 +143,9 @@ void Lyrics::SwitchTo() Global::RedrawHeader = 1; w->Clear(); w->Reset(); -# ifdef HAVE_CURL_CURL_H - static_cast<Window &>(*w) << "Fetching lyrics..."; - w->Window::Refresh(); # ifdef HAVE_PTHREAD_H if (!Downloader) # endif // HAVE_PTHREAD_H -# endif // HAVE_CURL_CURL_H { std::string file = locale_to_utf_cpy(itsSong.GetArtist()) + " - " + locale_to_utf_cpy(itsSong.GetTitle()) + ".txt"; EscapeUnallowedChars(file); @@ -205,62 +210,35 @@ void Lyrics::SpacePressed() void *Lyrics::Get(void *screen_void_ptr) { Lyrics *screen = static_cast<Lyrics *>(screen_void_ptr); - const Plugin *my_lyrics = ChoosePlugin(Config.lyrics_db); - - std::string result; - std::string artist = locale_to_utf_cpy(screen->itsSong.GetArtist()); - std::string title = locale_to_utf_cpy(screen->itsSong.GetTitle()); - - std::string url = my_lyrics->url; - Replace(url, "%artist%", Curl::escape(artist).c_str()); - Replace(url, "%title%", Curl::escape(title).c_str()); - - CURLcode code = Curl::perform(url, result); - if (code != CURLE_OK) - { - *screen->w << "Error while fetching lyrics: " << curl_easy_strerror(code); - Ready = 1; - pthread_exit(0); - } + std::string artist = Curl::escape(locale_to_utf_cpy(screen->itsSong.GetArtist())); + std::string title = Curl::escape(locale_to_utf_cpy(screen->itsSong.GetTitle())); - size_t a, b; - bool parse_failed = 0; + LyricsFetcher::Result result; - if ((a = result.find(my_lyrics->tag_open)) != std::string::npos) + for (LyricsFetcher **plugin = lyricsPlugins; *plugin != 0; ++plugin) { - a += strlen(my_lyrics->tag_open); - if ((b = result.find(my_lyrics->tag_close, a)) != std::string::npos) - result = result.substr(a, b-a); + *screen->w << "Fetching lyrics from " << fmtBold << (*plugin)->name() << fmtBoldEnd << "... "; + result = (*plugin)->fetch(artist, title); + if (result.first == false) + *screen->w << clRed << result.second << clEnd << "\n"; else - parse_failed = 1; + break; } - else - parse_failed = 1; - if (parse_failed || my_lyrics->not_found(result)) + if (result.first == true) { - *screen->w << "Not found"; - Ready = 1; - pthread_exit(0); + screen->w->Clear(); + *screen->w << utf_to_locale_cpy(result.second); + + std::ofstream output(screen->itsFilenamePath.c_str()); + if (output.is_open()) + { + output << result.second; + output.close(); + } } - if (my_lyrics == &Lyricsfly) - Replace(result, "[br]", ""); - Replace(result, "<", "<"); - Replace(result, ">", ">"); - - EscapeHtml(result); - Trim(result); - - *screen->w << utf_to_locale_cpy(result); - - std::ofstream output(screen->itsFilenamePath.c_str()); - if (output.is_open()) - { - output << result; - output.close(); - } Ready = 1; pthread_exit(0); } @@ -307,9 +285,7 @@ void Lyrics::FetchAgain() } } -#ifdef HAVE_CURL_CURL_H - -#ifdef HAVE_PTHREAD_H +#if defined(HAVE_CURL_CURL_H) && defined(HAVE_PTHREAD_H) void Lyrics::Take() { if (!Ready) @@ -321,77 +297,5 @@ void Lyrics::Take() Downloader = 0; Ready = 0; } -#endif // HAVE_PTHREAD_H - -const unsigned Lyrics::DBs = 2; // number of currently supported lyrics databases - -const char *Lyrics::PluginsList[] = -{ - //"lyricsplugin.com", - "lyrc.com.ar", - "lyricsfly.com", - 0 -}; - -const char *Lyrics::GetPluginName(int offset) -{ - return PluginsList[offset]; -} - -/*bool Lyrics::LyricsPlugin_NotFound(const std::string &s) -{ - if (s.empty()) - return true; - for (std::string::const_iterator it = s.begin(); it != s.end(); ++it) - if (isprint(*it)) - return false; - return true; -} - -const Lyrics::Plugin Lyrics::LyricsPlugin = -{ - "http://www.lyricsplugin.com/winamp03/plugin/?artist=%artist%&title=%title%", - "<div id=\"lyrics\">", - "</div>", - LyricsPlugin_NotFound -};*/ - -bool Lyrics::Generic_NotFound(const std::string &) -{ - // it should never fail as open_tag and close_tag - // are not present if lyrics are not found - return false; -} - -const Lyrics::Plugin Lyrics::LyrcComAr = -{ - "http://lyrc.com.ar/tema1es.php?artist=%artist%&songname=%title%", - "</table>", - "<p>", - Generic_NotFound -}; - -const Lyrics::Plugin Lyrics::Lyricsfly = -{ - "http://api.lyricsfly.com/api/api.php?i=30002e18b71fbe4f0-temporary.API.access&a=%artist%&t=%title%", - "<tx>", - "</tx>", - Generic_NotFound -}; - -const Lyrics::Plugin *Lyrics::ChoosePlugin(int i) -{ - switch (i) - { - case 0: - //return &LyricsPlugin; - return &LyrcComAr; - case 1: - return &Lyricsfly; - default: - return &LyrcComAr; - } -} - -#endif // HAVE_CURL_CURL_H +#endif // HAVE_CURL_CURL_H && HAVE_PTHREAD_H |