Base initial score on album cover sizes retrieved from API

This commit is contained in:
Jonas Kvinge
2020-08-09 20:10:53 +02:00
parent 15ddf6ff20
commit 465369d79e
10 changed files with 132 additions and 94 deletions

View File

@@ -26,6 +26,7 @@
#include <QPair>
#include <QSet>
#include <QList>
#include <QMap>
#include <QVariant>
#include <QByteArray>
#include <QString>
@@ -45,6 +46,7 @@
#include "core/logging.h"
#include "core/song.h"
#include "albumcoverfetcher.h"
#include "albumcoverfetchersearch.h"
#include "jsoncoverprovider.h"
#include "deezercoverprovider.h"
@@ -197,26 +199,26 @@ void DeezerCoverProvider::HandleSearchReply(QNetworkReply *reply, const int id)
disconnect(reply, nullptr, this, nullptr);
reply->deleteLater();
CoverSearchResults results;
QByteArray data = GetReplyData(reply);
if (data.isEmpty()) {
emit SearchFinished(id, results);
emit SearchFinished(id, CoverSearchResults());
return;
}
QJsonValue value_data = ExtractData(data);
if (!value_data.isArray()) {
emit SearchFinished(id, results);
emit SearchFinished(id, CoverSearchResults());
return;
}
QJsonArray array_data = value_data.toArray();
if (array_data.isEmpty()) {
emit SearchFinished(id, results);
emit SearchFinished(id, CoverSearchResults());
return;
}
QMap<QUrl, CoverSearchResult> results;
int i = 0;
for (const QJsonValue &json_value : array_data) {
if (!json_value.isObject()) {
@@ -270,36 +272,46 @@ void DeezerCoverProvider::HandleSearchReply(QNetworkReply *reply, const int id)
}
QString album = obj_album["title"].toString();
QString cover;
if (obj_album.contains("cover_xl")) {
cover = obj_album["cover_xl"].toString();
}
else if (obj_album.contains("cover_big")) {
cover = obj_album["cover_big"].toString();
}
else if (obj_album.contains("cover_medium")) {
cover = obj_album["cover_medium"].toString();
}
else if (obj_album.contains("cover_small")) {
cover = obj_album["cover_small"].toString();
}
else {
Error("Invalid Json reply, data array value album object is missing cover.", obj_album);
continue;
}
QUrl url(cover);
album.remove(Song::kAlbumRemoveDisc);
album.remove(Song::kAlbumRemoveMisc);
album = album.remove(Song::kAlbumRemoveDisc);
album = album.remove(Song::kAlbumRemoveMisc);
CoverSearchResult cover_result;
cover_result.artist = artist;
cover_result.album = album;
cover_result.image_url = url;
results << cover_result;
bool have_cover = false;
QList<QPair<QString, QSize>> cover_sizes = QList<QPair<QString, QSize>>() << qMakePair(QString("cover_xl"), QSize(1000, 1000))
<< qMakePair(QString("cover_big"), QSize(500, 500));
for (const QPair<QString, QSize> &cover_size : cover_sizes) {
if (!obj_album.contains(cover_size.first)) continue;
QString cover = obj_album[cover_size.first].toString();
if (!have_cover) {
have_cover = true;
++i;
}
QUrl url(cover);
if (!results.contains(url)) {
cover_result.image_url = url;
cover_result.image_size = cover_size.second;
cover_result.number = i;
results.insert(url, cover_result);
}
}
if (!have_cover) {
Error("Invalid Json reply, data array value album object is missing cover.", obj_album);
}
}
emit SearchFinished(id, results);
if (results.isEmpty()) {
emit SearchFinished(id, CoverSearchResults());
}
else {
CoverSearchResults cover_results = results.values();
std::stable_sort(cover_results.begin(), cover_results.end(), AlbumCoverFetcherSearch::CoverSearchResultCompareNumber);
emit SearchFinished(id, cover_results);
}
}