Use new clementine images API.

This commit is contained in:
John Maguire 2017-03-06 18:15:59 +00:00
parent 81c905bcf5
commit 5d0cf343d5
1 changed files with 19 additions and 51 deletions

View File

@ -11,14 +11,8 @@
#include "core/network.h" #include "core/network.h"
namespace { namespace {
static const char* kSpotifySearchUrl = "https://api.spotify.com/v1/search"; static const char* kSpotifyImagesUrl =
static const char* kSpotifyArtistUrl = "https://api.spotify.com/v1/artists/%1"; "https://data.clementine-player.org/fetchimages";
} // namespace
namespace {
QString ExtractSpotifyId(const QString& spotify_uri) {
return spotify_uri.split(':')[2];
}
} // namespace } // namespace
SpotifyImages::SpotifyImages() : network_(new NetworkAccessManager) {} SpotifyImages::SpotifyImages() : network_(new NetworkAccessManager) {}
@ -31,64 +25,38 @@ void SpotifyImages::FetchInfo(int id, const Song& metadata) {
return; return;
} }
// Fetch artist id. QUrl url(kSpotifyImagesUrl);
QUrl search_url(kSpotifySearchUrl); url.addQueryItem("artist", metadata.artist());
search_url.addQueryItem("q", metadata.artist());
search_url.addQueryItem("type", "artist");
search_url.addQueryItem("limit", "1");
qLog(Debug) << "Fetching artist:" << search_url; QNetworkRequest request(url);
QNetworkRequest request(search_url);
QNetworkReply* reply = network_->get(request); QNetworkReply* reply = network_->get(request);
NewClosure(reply, SIGNAL(finished()), [this, id, reply]() { NewClosure(reply, SIGNAL(finished()), [this, id, reply]() {
reply->deleteLater(); reply->deleteLater();
QJson::Parser parser; QJson::Parser parser;
QVariantMap result = parser.parse(reply).toMap(); bool ok = false;
QVariantMap artists = result["artists"].toMap(); QVariant result = parser.parse(reply, &ok);
if (artists.isEmpty()) { if (!ok || result.type() != QVariant::List) {
emit Finished(id); emit Finished(id);
return; return;
} }
QVariantList items = artists["items"].toList();
if (items.isEmpty()) {
emit Finished(id);
return;
}
QVariantMap artist = items.first().toMap();
QString spotify_uri = artist["uri"].toString();
FetchImagesForArtist(id, ExtractSpotifyId(spotify_uri)); QVariantList results = result.toList();
});
}
void SpotifyImages::FetchImagesForArtist(int id, const QString& spotify_id) {
QUrl artist_url(QString(kSpotifyArtistUrl).arg(spotify_id));
qLog(Debug) << "Fetching images for artist:" << artist_url;
QNetworkRequest request(artist_url);
QNetworkReply* reply = network_->get(request);
NewClosure(reply, SIGNAL(finished()), [this, id, reply]() {
reply->deleteLater();
QJson::Parser parser;
QVariantMap result = parser.parse(reply).toMap();
QVariantList images = result["images"].toList();
QList<QPair<QUrl, QSize>> image_candidates; QList<QPair<QUrl, QSize>> image_candidates;
for (QVariant i : images) { for (QVariant v : results) {
QVariantMap image = i.toMap(); QVariantMap image = v.toMap();
QUrl url = image["url"].toUrl();
int height = image["height"].toInt(); int height = image["height"].toInt();
int width = image["width"].toInt(); int width = image["width"].toInt();
QUrl url = image["url"].toUrl();
image_candidates.append(qMakePair(url, QSize(width, height))); image_candidates.append(qMakePair(url, QSize(width, height)));
} }
if (!image_candidates.isEmpty()) { if (!image_candidates.isEmpty()) {
QPair<QUrl, QSize> winner = QPair<QUrl, QSize> best = *std::max_element(
*std::max_element(
image_candidates.begin(), image_candidates.end(), image_candidates.begin(), image_candidates.end(),
[](const QPair<QUrl, QSize>& a, const QPair<QUrl, QSize>& b) { [](const QPair<QUrl, QSize>& a, const QPair<QUrl, QSize>& b) {
return (a.second.height() * a.second.width()) < return (a.second.height() * a.second.width()) <
(b.second.height() * b.second.width()); (b.second.height() * b.second.width());
}); });
emit ImageReady(id, winner.first); emit ImageReady(id, best.first);
} }
emit Finished(id); emit Finished(id);
}); });