From f471d4bfe1a686a607a2b76f543ff7053d805af1 Mon Sep 17 00:00:00 2001 From: John Maguire Date: Thu, 25 Feb 2010 01:16:58 +0000 Subject: [PATCH] Scales the album art to a height of 100px in x11. Code review comments for r236 Updates issue 17 --- src/lastfmservice.cpp | 43 +++++++++++++++++++++++++++++++------------ src/lastfmservice.h | 13 ++++++++----- src/osd_x11.cpp | 2 +- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/src/lastfmservice.cpp b/src/lastfmservice.cpp index 3066db649..f7c52f831 100644 --- a/src/lastfmservice.cpp +++ b/src/lastfmservice.cpp @@ -4,6 +4,8 @@ #include "lastfmstationdialog.h" #include "lastfmconfigdialog.h" +#include + #include #include #include @@ -13,6 +15,7 @@ #include #include +using boost::scoped_ptr; using lastfm::XmlQuery; uint qHash(const lastfm::Track& track) { @@ -273,15 +276,25 @@ void LastFMService::LoadNext(const QUrl &) { return; } - last_track_ = playlist_.dequeue(); + scoped_ptr track(playlist_.dequeue()); + for (QMap::iterator it = image_requests_.begin(); + it != image_requests_.end(); ++it) { + if (it.value() == track.get()) { + // Cancel pending album cover request. + it.key()->abort(); + image_requests_.erase(it); + break; + } + } + last_track_ = track->track; if (playlist_.empty()) { FetchMoreTracks(); } Song metadata; metadata.InitFromLastFM(last_track_); - if (cached_images_.contains(last_track_)) { - metadata.set_image(cached_images_.take(last_track_)); + if (!track->image.isNull()) { + metadata.set_image(track->image); } emit StreamMetadataFound(last_url_, metadata); @@ -572,9 +585,9 @@ void LastFMService::FetchMoreTracksFinished() { return; } - const XmlQuery query = lastfm::ws::parse(reply); - const XmlQuery playlist = query["playlist"]; - foreach (XmlQuery q, playlist["trackList"].children("track")) { + const XmlQuery& query = lastfm::ws::parse(reply); + const XmlQuery& playlist = query["playlist"]; + foreach (const XmlQuery& q, playlist["trackList"].children("track")) { lastfm::MutableTrack t; t.setUrl(q["location"].text()); t.setExtra("trackauth", q["extension"]["trackauth"].text()); @@ -583,14 +596,17 @@ void LastFMService::FetchMoreTracksFinished() { t.setAlbum(q["album"].text()); t.setDuration(q["duration"].text().toInt() / 1000); const QString& image = q["image"].text(); + QueuedTrack* queued_track = new QueuedTrack; + queued_track->track = t; if (!image.isEmpty()) { - FetchImage(t, q["image"].text()); + FetchImage(queued_track, image); } - playlist_ << t; + playlist_ << queued_track; qDebug() << "Adding track to playlist: " << t.title(); } TunerTrackAvailable(); + reply->deleteLater(); } void LastFMService::Tune(const lastfm::RadioStation& station) { @@ -612,7 +628,7 @@ void LastFMService::TuneFinished() { reply->deleteLater(); } -void LastFMService::FetchImage(lastfm::Track track, const QString& image_url) { +void LastFMService::FetchImage(QueuedTrack* track, const QString& image_url) { QUrl url(image_url); QNetworkReply* reply = network_.get(QNetworkRequest(url)); connect(reply, SIGNAL(finished()), SLOT(FetchImageFinished())); @@ -625,9 +641,12 @@ void LastFMService::FetchImageFinished() { qWarning() << "Invalid reply on track image fetch."; return; } + // The response might be too late to matter. + if (image_requests_.contains(reply)) { + QueuedTrack* track = image_requests_.take(reply); + QImage image = QImage::fromData(reply->readAll()); + track->image = image; + } - lastfm::Track track = image_requests_.take(reply); - QImage image = QImage::fromData(reply->readAll()); - cached_images_[track] = image; reply->deleteLater(); } diff --git a/src/lastfmservice.h b/src/lastfmservice.h index 76fc7fe0d..9d2b527ea 100644 --- a/src/lastfmservice.h +++ b/src/lastfmservice.h @@ -111,6 +111,11 @@ class LastFMService : public RadioService { void FetchImageFinished(); private: + struct QueuedTrack { + lastfm::Track track; + QImage image; + }; + RadioItem* CreateStationItem(ItemType type, const QString& name, const QString& icon, RadioItem* parent); QString ErrorString(lastfm::ws::Error error) const; @@ -126,13 +131,12 @@ class LastFMService : public RadioService { const QIcon& icon, RadioItem *list); void Tune(const lastfm::RadioStation& station); - void FetchImage(lastfm::Track track, const QString& image_url); + void FetchImage(QueuedTrack* track, const QString& image_url); private: lastfm::Audioscrobbler* scrobbler_; lastfm::Track last_track_; - - QQueue playlist_; + QQueue playlist_; LastFMConfigDialog* config_; LastFMStationDialog* station_dialog_; @@ -155,8 +159,7 @@ class LastFMService : public RadioService { RadioItem* neighbours_list_; QNetworkAccessManager network_; - QMap image_requests_; - QHash cached_images_; + QMap image_requests_; }; #endif // LASTFMSERVICE_H diff --git a/src/osd_x11.cpp b/src/osd_x11.cpp index 151d460a8..eae7fb06f 100644 --- a/src/osd_x11.cpp +++ b/src/osd_x11.cpp @@ -51,7 +51,7 @@ void OSD::ShowMessageNative(const QString& summary, const QString& message, void OSD::ShowMessageNative(const QString& summary, const QString& message, const QImage& image) { - QImage happy_gdk_image = image.convertToFormat(QImage::Format_RGB888); + QImage happy_gdk_image = image.convertToFormat(QImage::Format_RGB888).scaledToHeight(100); pixbuf_ = gdk_pixbuf_new_from_data( happy_gdk_image.bits(), GDK_COLORSPACE_RGB,