Use new clementine images API.
This commit is contained in:
parent
81c905bcf5
commit
5d0cf343d5
|
@ -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, best.first);
|
||||||
emit ImageReady(id, winner.first);
|
|
||||||
}
|
}
|
||||||
emit Finished(id);
|
emit Finished(id);
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue