Subsonic: Use 500 albums per request

Fixes #740
This commit is contained in:
Jonas Kvinge 2021-07-30 21:17:44 +02:00
parent 88d7cb3ed5
commit 0c9989695a
2 changed files with 20 additions and 20 deletions

View File

@ -154,13 +154,13 @@ void SubsonicRequest::FlushAlbumsRequests() {
QNetworkReply *reply = CreateGetRequest(QString("getAlbumList2"), params); QNetworkReply *reply = CreateGetRequest(QString("getAlbumList2"), params);
replies_ << reply; replies_ << reply;
QObject::connect(reply, &QNetworkReply::finished, this, [this, reply, request]() { AlbumsReplyReceived(reply, request.offset); }); QObject::connect(reply, &QNetworkReply::finished, this, [this, reply, request]() { AlbumsReplyReceived(reply, request.offset, request.size); });
} }
} }
void SubsonicRequest::AlbumsReplyReceived(QNetworkReply *reply, const int offset_requested) { void SubsonicRequest::AlbumsReplyReceived(QNetworkReply *reply, const int offset_requested, const int size_requested) {
if (!replies_.contains(reply)) return; if (!replies_.contains(reply)) return;
replies_.removeAll(reply); replies_.removeAll(reply);
@ -174,13 +174,13 @@ void SubsonicRequest::AlbumsReplyReceived(QNetworkReply *reply, const int offset
if (finished_) return; if (finished_) return;
if (data.isEmpty()) { if (data.isEmpty()) {
AlbumsFinishCheck(offset_requested); AlbumsFinishCheck(offset_requested, size_requested);
return; return;
} }
QJsonObject json_obj = ExtractJsonObj(data); QJsonObject json_obj = ExtractJsonObj(data);
if (json_obj.isEmpty()) { if (json_obj.isEmpty()) {
AlbumsFinishCheck(offset_requested); AlbumsFinishCheck(offset_requested, size_requested);
return; return;
} }
@ -188,7 +188,7 @@ void SubsonicRequest::AlbumsReplyReceived(QNetworkReply *reply, const int offset
QJsonValue json_error = json_obj["error"]; QJsonValue json_error = json_obj["error"];
if (!json_error.isObject()) { if (!json_error.isObject()) {
Error("Json error is not an object.", json_obj); Error("Json error is not an object.", json_obj);
AlbumsFinishCheck(offset_requested); AlbumsFinishCheck(offset_requested, size_requested);
return; return;
} }
json_obj = json_error.toObject(); json_obj = json_error.toObject();
@ -196,11 +196,11 @@ void SubsonicRequest::AlbumsReplyReceived(QNetworkReply *reply, const int offset
int code = json_obj["code"].toInt(); int code = json_obj["code"].toInt();
QString message = json_obj["message"].toString(); QString message = json_obj["message"].toString();
Error(QString("%1 (%2)").arg(message).arg(code)); Error(QString("%1 (%2)").arg(message).arg(code));
AlbumsFinishCheck(offset_requested); AlbumsFinishCheck(offset_requested, size_requested);
} }
else { else {
Error("Json error object is missing code or message.", json_obj); Error("Json error object is missing code or message.", json_obj);
AlbumsFinishCheck(offset_requested); AlbumsFinishCheck(offset_requested, size_requested);
return; return;
} }
return; return;
@ -208,7 +208,7 @@ void SubsonicRequest::AlbumsReplyReceived(QNetworkReply *reply, const int offset
if (!json_obj.contains("albumList") && !json_obj.contains("albumList2")) { if (!json_obj.contains("albumList") && !json_obj.contains("albumList2")) {
Error("Json reply is missing albumList.", json_obj); Error("Json reply is missing albumList.", json_obj);
AlbumsFinishCheck(offset_requested); AlbumsFinishCheck(offset_requested, size_requested);
return; return;
} }
QJsonValue value_albumlist; QJsonValue value_albumlist;
@ -217,34 +217,34 @@ void SubsonicRequest::AlbumsReplyReceived(QNetworkReply *reply, const int offset
if (!value_albumlist.isObject()) { if (!value_albumlist.isObject()) {
Error("Json album list is not an object.", value_albumlist); Error("Json album list is not an object.", value_albumlist);
AlbumsFinishCheck(offset_requested); AlbumsFinishCheck(offset_requested, size_requested);
} }
json_obj = value_albumlist.toObject(); json_obj = value_albumlist.toObject();
if (json_obj.isEmpty()) { if (json_obj.isEmpty()) {
if (offset_requested == 0) no_results_ = true; if (offset_requested == 0) no_results_ = true;
AlbumsFinishCheck(offset_requested); AlbumsFinishCheck(offset_requested, size_requested);
return; return;
} }
if (!json_obj.contains("album")) { if (!json_obj.contains("album")) {
Error("Json album list does not contain album array.", json_obj); Error("Json album list does not contain album array.", json_obj);
AlbumsFinishCheck(offset_requested); AlbumsFinishCheck(offset_requested, size_requested);
} }
QJsonValue json_album = json_obj["album"]; QJsonValue json_album = json_obj["album"];
if (json_album.isNull()) { if (json_album.isNull()) {
if (offset_requested == 0) no_results_ = true; if (offset_requested == 0) no_results_ = true;
AlbumsFinishCheck(offset_requested); AlbumsFinishCheck(offset_requested, size_requested);
return; return;
} }
if (!json_album.isArray()) { if (!json_album.isArray()) {
Error("Json album is not an array.", json_album); Error("Json album is not an array.", json_album);
AlbumsFinishCheck(offset_requested); AlbumsFinishCheck(offset_requested, size_requested);
} }
QJsonArray array_albums = json_album.toArray(); QJsonArray array_albums = json_album.toArray();
if (array_albums.isEmpty()) { if (array_albums.isEmpty()) {
if (offset_requested == 0) no_results_ = true; if (offset_requested == 0) no_results_ = true;
AlbumsFinishCheck(offset_requested); AlbumsFinishCheck(offset_requested, size_requested);
return; return;
} }
@ -288,15 +288,15 @@ void SubsonicRequest::AlbumsReplyReceived(QNetworkReply *reply, const int offset
} }
AlbumsFinishCheck(offset_requested, albums_received); AlbumsFinishCheck(offset_requested, size_requested, albums_received);
} }
void SubsonicRequest::AlbumsFinishCheck(const int offset, const int albums_received) { void SubsonicRequest::AlbumsFinishCheck(const int offset, const int size, const int albums_received) {
if (finished_) return; if (finished_) return;
if (albums_received > 0) { if (albums_received > 0 && albums_received >= size) {
int offset_next = offset + albums_received; int offset_next = offset + albums_received;
if (offset_next > 0) { if (offset_next > 0) {
AddAlbumsRequest(offset_next); AddAlbumsRequest(offset_next);

View File

@ -67,7 +67,7 @@ class SubsonicRequest : public SubsonicBaseRequest {
void UpdateProgress(int max); void UpdateProgress(int max);
private slots: private slots:
void AlbumsReplyReceived(QNetworkReply *reply, const int offset_requested); void AlbumsReplyReceived(QNetworkReply *reply, const int offset_requested, const int size_requested);
void AlbumSongsReplyReceived(QNetworkReply *reply, const QString &artist_id, const QString &album_id, const QString &album_artist); void AlbumSongsReplyReceived(QNetworkReply *reply, const QString &artist_id, const QString &album_id, const QString &album_artist);
void AlbumCoverReceived(QNetworkReply *reply, const QUrl &url, const QString &filename); void AlbumCoverReceived(QNetworkReply *reply, const QUrl &url, const QString &filename);
@ -89,10 +89,10 @@ class SubsonicRequest : public SubsonicBaseRequest {
QString filename; QString filename;
}; };
void AddAlbumsRequest(const int offset = 0, const int size = 0); void AddAlbumsRequest(const int offset = 0, const int size = 500);
void FlushAlbumsRequests(); void FlushAlbumsRequests();
void AlbumsFinishCheck(const int offset = 0, const int albums_received = 0); void AlbumsFinishCheck(const int offset = 0, const int size = 0, const int albums_received = 0);
void SongsFinishCheck(); void SongsFinishCheck();
void AddAlbumSongsRequest(const QString &artist_id, const QString &album_id, const QString &album_artist, const int offset = 0); void AddAlbumSongsRequest(const QString &artist_id, const QString &album_id, const QString &album_artist, const int offset = 0);