diff options
Diffstat (limited to 'media-sound/clementine/files/clementine-1.0.1-liblastfm-1.patch')
-rw-r--r-- | media-sound/clementine/files/clementine-1.0.1-liblastfm-1.patch | 475 |
1 files changed, 475 insertions, 0 deletions
diff --git a/media-sound/clementine/files/clementine-1.0.1-liblastfm-1.patch b/media-sound/clementine/files/clementine-1.0.1-liblastfm-1.patch new file mode 100644 index 000000000000..7ab1c29e73e8 --- /dev/null +++ b/media-sound/clementine/files/clementine-1.0.1-liblastfm-1.patch @@ -0,0 +1,475 @@ +--- src/core/song.cpp ++++ src/core/song.cpp +@@ -49,7 +49,7 @@ + + #ifdef HAVE_LIBLASTFM + #include "internet/fixlastfm.h" +- #include <lastfm/Track> ++ #include <lastfm/Track.h> + #endif + + #include <QFile> +--- src/covers/lastfmcoverprovider.cpp ++++ src/covers/lastfmcoverprovider.cpp +@@ -19,8 +19,8 @@ + #include "coverprovider.h" + #include "lastfmcoverprovider.h" + +-#include <lastfm/Artist> +-#include <lastfm/XmlQuery> ++#include <lastfm/Artist.h> ++#include <lastfm/XmlQuery.h> + #include <lastfm/ws.h> + + #include <QNetworkReply> +@@ -52,14 +52,8 @@ void LastFmCoverProvider::QueryFinished( + + CoverSearchResults results; + +- try { +- lastfm::XmlQuery query(lastfm::ws::parse(reply)); +-#ifdef Q_OS_WIN32 +- if (lastfm::ws::last_parse_error != lastfm::ws::NoError) { +- throw std::runtime_error(""); +- } +-#endif +- ++ lastfm::XmlQuery query; ++ if (query.parse(reply->readAll())) { + // parse the list of search results + QList<lastfm::XmlQuery> elements = query["results"]["albummatches"].children("album"); + +@@ -69,7 +63,7 @@ void LastFmCoverProvider::QueryFinished( + result.image_url = element["image size=extralarge"].text(); + results << result; + } +- } catch(std::runtime_error&) { ++ } else { + // Drop through and emit an empty list of results. + } + +--- src/internet/lastfmservice.cpp ++++ src/internet/lastfmservice.cpp +@@ -33,20 +33,18 @@ + + #include <boost/scoped_ptr.hpp> + +-#include <lastfm/Audioscrobbler> ++#include <lastfm/Audioscrobbler.h> + #include <lastfm/misc.h> +-#include <lastfm/RadioStation> +-#include <lastfm/Scrobble> +-#include <lastfm/ScrobbleCache> +-#include <lastfm/ScrobblePoint> ++#include <lastfm/RadioStation.h> ++#include <lastfm/ScrobbleCache.h> ++#include <lastfm/ScrobblePoint.h> + #include <lastfm/ws.h> +-#include <lastfm/XmlQuery> ++#include <lastfm/XmlQuery.h> + + #include <QMenu> + #include <QSettings> + + using boost::scoped_ptr; +-using lastfm::Scrobble; + using lastfm::XmlQuery; + + uint qHash(const lastfm::Track& track) { +@@ -300,13 +298,8 @@ void LastFMService::AuthenticateReplyFin + reply->deleteLater(); + + // Parse the reply +- try { +- lastfm::XmlQuery const lfm = lastfm::ws::parse(reply); +-#ifdef Q_OS_WIN32 +- if (lastfm::ws::last_parse_error != lastfm::ws::NoError) +- throw std::runtime_error(""); +-#endif +- ++ lastfm::XmlQuery lfm; ++ if (lfm.parse(reply->readAll())) { + lastfm::ws::Username = lfm["session"]["name"].text(); + lastfm::ws::SessionKey = lfm["session"]["key"].text(); + QString subscribed = lfm["session"]["subscriber"].text(); +@@ -318,8 +311,8 @@ void LastFMService::AuthenticateReplyFin + settings.setValue("Username", lastfm::ws::Username); + settings.setValue("Session", lastfm::ws::SessionKey); + settings.setValue("Subscriber", is_subscriber); +- } catch (std::runtime_error& e) { +- qLog(Error) << e.what(); ++ } else { ++ qLog(Error) << lfm.parseError().message(); + emit AuthenticationComplete(false); + return; + } +@@ -347,13 +340,8 @@ void LastFMService::UpdateSubscriberStat + + bool is_subscriber = false; + +- try { +- const lastfm::XmlQuery lfm = lastfm::ws::parse(reply); +-#ifdef Q_OS_WIN32 +- if (lastfm::ws::last_parse_error != lastfm::ws::NoError) +- throw std::runtime_error(""); +-#endif +- ++ lastfm::XmlQuery lfm; ++ if (lfm.parse(reply->readAll())) { + connection_problems_ = false; + QString subscriber = lfm["user"]["subscriber"].text(); + is_subscriber = (subscriber.toInt() == 1); +@@ -362,11 +350,9 @@ void LastFMService::UpdateSubscriberStat + settings.beginGroup(kSettingsGroup); + settings.setValue("Subscriber", is_subscriber); + qLog(Info) << lastfm::ws::Username << "Subscriber status:" << is_subscriber; +- } catch (lastfm::ws::ParseError e) { +- qLog(Error) << "Last.fm parse error: " << e.enumValue(); +- connection_problems_ = e.enumValue() == lastfm::ws::MalformedResponse; +- } catch (std::runtime_error& e) { +- qLog(Error) << e.what(); ++ } else { ++ qLog(Error) << "Last.fm parse error: " << lfm.parseError().message(); ++ connection_problems_ = lfm.parseError().enumValue() == lastfm::ws::MalformedResponse; + } + + emit UpdatedSubscriberStatus(is_subscriber); +@@ -469,7 +455,8 @@ bool LastFMService::InitScrobbler() { + scrobbler_ = new lastfm::Audioscrobbler(kAudioscrobblerClientId); + + //reemit the signal since the sender is private +- connect(scrobbler_, SIGNAL(status(int)), SIGNAL(ScrobblerStatus(int))); ++ connect(scrobbler_, SIGNAL(scrobblesSubmitted(QList<lastfm::Track>)), SIGNAL(ScrobbleSubmitted())); ++ connect(scrobbler_, SIGNAL(nowPlayingError(int,QString)), SIGNAL(ScrobbleError(int))); + return true; + } + +@@ -497,7 +484,7 @@ void LastFMService::NowPlaying(const Son + if (!last_track_.isNull() && + last_track_.source() == lastfm::Track::NonPersonalisedBroadcast) { + const int duration_secs = last_track_.timestamp().secsTo(QDateTime::currentDateTime()); +- if (duration_secs >= ScrobblePoint::kScrobbleMinLength) { ++ if (duration_secs >= lastfm::ScrobblePoint::scrobbleTimeMin()) { + lastfm::MutableTrack mtrack(last_track_); + mtrack.setDuration(duration_secs); + +@@ -514,14 +501,16 @@ void LastFMService::NowPlaying(const Son + already_scrobbled_ = false; + last_track_ = mtrack; + +- //check immediately if the song is valid +- Scrobble::Invalidity invalidity; +- +- if (!lastfm::Scrobble(last_track_).isValid( &invalidity )) { +- //for now just notify this, we can also see the cause +- emit ScrobblerStatus(-1); +- return; +- } ++// TODO: validity was removed from liblastfm1 but might reappear, it should have ++// no impact as we get a different error when actually trying to scrobble. ++// //check immediately if the song is valid ++// Scrobble::Invalidity invalidity; ++// ++// if (!lastfm::Scrobble(last_track_).isValid( &invalidity )) { ++// //for now just notify this, we can also see the cause ++// emit ScrobbleError(-1); ++// return; ++// } + + scrobbler_->nowPlaying(mtrack); + } +@@ -530,12 +519,12 @@ void LastFMService::Scrobble() { + if (!InitScrobbler()) + return; + +- ScrobbleCache cache(lastfm::ws::Username); ++ lastfm::ScrobbleCache cache(lastfm::ws::Username); + qLog(Debug) << "There are" << cache.tracks().count() << "tracks in the last.fm cache."; + scrobbler_->cache(last_track_); + + // Let's mark a track as cached, useful when the connection is down +- emit ScrobblerStatus(30); ++ emit ScrobbleError(30); + scrobbler_->submit(); + + already_scrobbled_ = true; +@@ -640,7 +629,7 @@ void LastFMService::RefreshFriends(bool + return; + } + +- lastfm::AuthenticatedUser user; ++ lastfm::User user; + QNetworkReply* reply = user.getFriends(); + connect(reply, SIGNAL(finished()), SLOT(RefreshFriendsFinished())); + } +@@ -649,7 +638,7 @@ void LastFMService::RefreshNeighbours() + if (!neighbours_list_ || !IsAuthenticated()) + return; + +- lastfm::AuthenticatedUser user; ++ lastfm::User user; + QNetworkReply* reply = user.getNeighbours(); + connect(reply, SIGNAL(finished()), SLOT(RefreshNeighboursFinished())); + } +@@ -661,14 +650,11 @@ void LastFMService::RefreshFriendsFinish + + QList<lastfm::User> friends; + +- try { +- friends = lastfm::User::list(reply); +-#ifdef Q_OS_WIN32 +- if (lastfm::ws::last_parse_error != lastfm::ws::NoError) +- throw std::runtime_error(""); +-#endif +- } catch (std::runtime_error& e) { +- qLog(Error) << e.what(); ++ lastfm::XmlQuery lfm; ++ if (lfm.parse(reply->readAll())) { ++ friends = lastfm::UserList(lfm).users(); ++ } else { ++ qLog(Error) << lfm.parseError().message(); + return; + } + +@@ -708,14 +694,11 @@ void LastFMService::RefreshNeighboursFin + + QList<lastfm::User> neighbours; + +- try { +- neighbours = lastfm::User::list(reply); +-#ifdef Q_OS_WIN32 +- if (lastfm::ws::last_parse_error != lastfm::ws::NoError) +- throw std::runtime_error(""); +-#endif +- } catch (std::runtime_error& e) { +- qLog(Error) << e.what(); ++ lastfm::XmlQuery lfm; ++ if (lfm.parse(reply->readAll())) { ++ neighbours = lastfm::UserList(lfm).users(); ++ } else { ++ qLog(Error) << lfm.parseError().message(); + return; + } + +@@ -869,13 +852,8 @@ void LastFMService::FetchMoreTracksFinis + model()->task_manager()->SetTaskFinished(tune_task_id_); + tune_task_id_ = 0; + +- try { +- const XmlQuery& query = lastfm::ws::parse(reply); +-#ifdef Q_OS_WIN32 +- if (lastfm::ws::last_parse_error != lastfm::ws::NoError) +- throw std::runtime_error(""); +-#endif +- ++ XmlQuery query; ++ if (query.parse(reply->readAll())) { + const XmlQuery& playlist = query["playlist"]; + foreach (const XmlQuery& q, playlist["trackList"].children("track")) { + lastfm::MutableTrack t; +@@ -890,17 +868,9 @@ void LastFMService::FetchMoreTracksFinis + art_urls_[t] = q["image"].text(); + playlist_ << t; + } +- } catch (std::runtime_error& e) { +- // For some reason a catch block that takes a lastfm::ws::ParseError& +- // doesn't get called, even when a lastfm::ws::ParseError is thrown... +- // Hacks like this remind me of Java... +- if (QString(typeid(e).name()).contains("ParseError")) { +- // dynamic_cast throws a std::bad_cast ... *boggle* ++ } else { + emit StreamError(tr("Couldn't load the last.fm radio station") +- .arg(e.what())); +- } else { +- emit StreamError(tr("An unknown last.fm error occurred: %1").arg(e.what())); +- } ++ .arg(query.parseError().message())); + return; + } + +@@ -913,7 +883,7 @@ void LastFMService::Tune(const QUrl& url + + last_url_ = url; + initial_tune_ = true; +- const lastfm::RadioStation station(FixupUrl(url)); ++ const lastfm::RadioStation station(FixupUrl(url).toString()); + + playlist_.clear(); + +--- src/internet/lastfmservice.h ++++ src/internet/lastfmservice.h +@@ -27,7 +27,8 @@ class Track; + uint qHash(const lastfm::Track& track); + + #include "fixlastfm.h" +-#include <lastfm/Track> ++#include <lastfm/Audioscrobbler.h> ++#include <lastfm/Track.h> + #include <lastfm/ws.h> + + #include "internetmodel.h" +@@ -132,7 +133,8 @@ class LastFMService : public InternetSer + void ScrobblingEnabledChanged(bool value); + void ButtonVisibilityChanged(bool value); + void ScrobbleButtonVisibilityChanged(bool value); +- void ScrobblerStatus(int value); ++ void ScrobbleSubmitted(); ++ void ScrobbleError(int value); + void UpdatedSubscriberStatus(bool is_subscriber); + void ScrobbledRadioStream(); + +--- src/songinfo/lastfmtrackinfoprovider.cpp ++++ src/songinfo/lastfmtrackinfoprovider.cpp +@@ -22,7 +22,7 @@ + #include "ui/iconloader.h" + + #include <lastfm/ws.h> +-#include <lastfm/XmlQuery> ++#include <lastfm/XmlQuery.h> + + void LastfmTrackInfoProvider::FetchInfo(int id, const Song& metadata) { + QMap<QString, QString> params; +@@ -50,18 +50,12 @@ void LastfmTrackInfoProvider::RequestFin + return; + } + +- try { +- lastfm::XmlQuery query = lastfm::ws::parse(reply); +-#ifdef Q_OS_WIN32 +- if (lastfm::ws::last_parse_error != lastfm::ws::NoError) +- throw std::runtime_error(""); +-#endif +- ++ lastfm::XmlQuery query; ++ if (query.parse(reply->readAll())) { + GetPlayCounts(id, query); + GetWiki(id, query); + GetTags(id, query); + +- } catch (std::runtime_error&) { + } + emit Finished(id); + } +--- src/suggesters/lastfmsuggester.cpp ++++ src/suggesters/lastfmsuggester.cpp +@@ -1,6 +1,6 @@ + #include "lastfmsuggester.h" + +-#include <lastfm/XmlQuery> ++#include <lastfm/XmlQuery.h> + + #include "core/logging.h" + #include "core/timeconstants.h" +@@ -39,13 +39,8 @@ void LastFMSuggester::RequestFinished() + int id = it.value(); + replies_.erase(it); + +- try { +- lastfm::XmlQuery const lfm = lastfm::ws::parse(reply); +-#ifdef Q_OS_WIN32 +- if (lastfm::ws::last_parse_error != lastfm::ws::NoError) +- throw std::runtime_error(""); +-#endif +- ++ lastfm::XmlQuery lfm; ++ if (lfm.parse(reply->readAll())) { + const QList<XmlQuery> tracks = lfm["similartracks"].children("track"); + SongList songs; + foreach (const XmlQuery& q, tracks) { +@@ -59,8 +54,8 @@ void LastFMSuggester::RequestFinished() + } + qLog(Debug) << songs.length() << "suggested songs from Last.fm"; + emit SuggestSongsFinished(id, songs); +- } catch (std::runtime_error& e) { +- qLog(Error) << e.what(); ++ } else { ++ qLog(Error) << lfm.parseError().message(); + emit SuggestSongsFinished(id, SongList()); + } + } +--- src/ui/mainwindow.cpp ++++ src/ui/mainwindow.cpp +@@ -700,7 +700,8 @@ MainWindow::MainWindow( + connect(player_->playlists()->sequence(), SIGNAL(ShuffleModeChanged(PlaylistSequence::ShuffleMode)), osd_, SLOT(ShuffleModeChanged(PlaylistSequence::ShuffleMode))); + + #ifdef HAVE_LIBLASTFM +- connect(InternetModel::Service<LastFMService>(), SIGNAL(ScrobblerStatus(int)), SLOT(ScrobblerStatus(int))); ++ connect(InternetModel::Service<LastFMService>(), SIGNAL(ScrobbleSubmitted()), SLOT(ScrobbleSubmitted())); ++ connect(InternetModel::Service<LastFMService>(), SIGNAL(ScrobbleError(int)), SLOT(ScrobbleError(int))); + + LastFMButtonVisibilityChanged(internet_model_->InternetModel::Service<LastFMService>()->AreButtonsVisible()); + ScrobbleButtonVisibilityChanged(internet_model_->InternetModel::Service<LastFMService>()->IsScrobbleButtonVisible()); +@@ -2201,30 +2202,26 @@ void MainWindow::SetToggleScrobblingIcon + } + + #ifdef HAVE_LIBLASTFM +-void MainWindow::ScrobblerStatus(int value) { ++void MainWindow::ScrobbleSubmitted() { + const LastFMService* lastfm_service = InternetModel::Service<LastFMService>(); + const bool last_fm_enabled = ui_->action_toggle_scrobbling->isVisible() && + lastfm_service->IsScrobblingEnabled() && + lastfm_service->IsAuthenticated(); + ++ playlists_->active()->set_lastfm_status(Playlist::LastFM_Scrobbled); ++ // update the button icon ++ if (last_fm_enabled) ++ ui_->action_toggle_scrobbling->setIcon(QIcon(":/last.fm/as.png")); ++} ++ ++void MainWindow::ScrobbleError(int value) { ++ + switch (value) { + case -1: + // custom error value got from initial validity check + playlists_->active()->set_lastfm_status(Playlist::LastFM_Invalid); + break; + +- case 2: +- case 3: +- // we should get 3 for a correct scrobbling, but I just get 2 for +- // mysterious reasons +- // seems to scrobble fine though, so for now we accept it as correct +- playlists_->active()->set_lastfm_status(Playlist::LastFM_Scrobbled); +- +- // update the button icon +- if (last_fm_enabled) +- ui_->action_toggle_scrobbling->setIcon(QIcon(":/last.fm/as.png")); +- break; +- + case 30: + // Hack: when offline, liblastfm doesn't inform us, so set the status + // as queued; in this way we won't try to scrobble again, it will be done automatically +--- src/ui/mainwindow.h ++++ src/ui/mainwindow.h +@@ -224,7 +224,8 @@ class MainWindow : public QMainWindow, p + + void ShowCoverManager(); + #ifdef HAVE_LIBLASTFM +- void ScrobblerStatus(int value); ++ void ScrobbleSubmitted(); ++ void ScrobbleError(int value); + #endif + void ShowAboutDialog(); + void ShowTranscodeDialog(); +--- tests/mpris1_test.cpp ++++ tests/mpris1_test.cpp +@@ -22,7 +22,7 @@ + #include "playlist/playlistsequence.h" + #ifdef HAVE_LIBLASTFM + #include "internet/fixlastfm.h" +-#include <lastfm/Track> ++#include <lastfm/Track.h> + #endif + + #include "gmock/gmock.h" +--- tests/song_test.cpp ++++ tests/song_test.cpp +@@ -20,7 +20,7 @@ + #include "core/song.h" + #ifdef HAVE_LIBLASTFM + #include "internet/fixlastfm.h" +-#include <lastfm/Track> ++#include <lastfm/Track.h> + #endif + + #include "gmock/gmock.h" |