diff --git a/src/tidal/tidalbaserequest.cpp b/src/tidal/tidalbaserequest.cpp index 1adf5754b..b64045fa6 100644 --- a/src/tidal/tidalbaserequest.cpp +++ b/src/tidal/tidalbaserequest.cpp @@ -56,9 +56,8 @@ QNetworkReply *TidalBaseRequest::CreateRequest(const QString &ressource_name, co << Param("countryCode", country_code()); QUrlQuery url_query; - for (const Param& param : params) { - EncodedParam encoded_param(QUrl::toPercentEncoding(param.first), QUrl::toPercentEncoding(param.second)); - url_query.addQueryItem(encoded_param.first, encoded_param.second); + for (const Param ¶m : params) { + url_query.addQueryItem(QUrl::toPercentEncoding(param.first), QUrl::toPercentEncoding(param.second)); } QUrl url(kApiUrl + QString("/") + ressource_name); @@ -72,7 +71,7 @@ QNetworkReply *TidalBaseRequest::CreateRequest(const QString &ressource_name, co QNetworkReply *reply = network_->get(req); connect(reply, SIGNAL(sslErrors(QList)), this, SLOT(HandleSSLErrors(QList))); - qLog(Debug) << "Tidal: Sending request" << url; + //qLog(Debug) << "Tidal: Sending request" << url; return reply; @@ -144,7 +143,7 @@ QByteArray TidalBaseRequest::GetReplyData(QNetworkReply *reply, const bool send_ } -QJsonObject TidalBaseRequest::ExtractJsonObj(QByteArray &data) { +QJsonObject TidalBaseRequest::ExtractJsonObj(const QByteArray &data) { QJsonParseError json_error; QJsonDocument json_doc = QJsonDocument::fromJson(data, &json_error); @@ -154,7 +153,7 @@ QJsonObject TidalBaseRequest::ExtractJsonObj(QByteArray &data) { return QJsonObject(); } - if (json_doc.isNull() || json_doc.isEmpty()) { + if (json_doc.isEmpty()) { Error("Received empty Json document.", data); return QJsonObject(); } @@ -174,7 +173,7 @@ QJsonObject TidalBaseRequest::ExtractJsonObj(QByteArray &data) { } -QJsonValue TidalBaseRequest::ExtractItems(QByteArray &data) { +QJsonValue TidalBaseRequest::ExtractItems(const QByteArray &data) { QJsonObject json_obj = ExtractJsonObj(data); if (json_obj.isEmpty()) return QJsonValue(); @@ -182,7 +181,7 @@ QJsonValue TidalBaseRequest::ExtractItems(QByteArray &data) { } -QJsonValue TidalBaseRequest::ExtractItems(QJsonObject &json_obj) { +QJsonValue TidalBaseRequest::ExtractItems(const QJsonObject &json_obj) { if (!json_obj.contains("items")) { Error("Json reply is missing items.", json_obj); diff --git a/src/tidal/tidalbaserequest.h b/src/tidal/tidalbaserequest.h index c18c8ddee..3e855c35b 100644 --- a/src/tidal/tidalbaserequest.h +++ b/src/tidal/tidalbaserequest.h @@ -63,14 +63,11 @@ class TidalBaseRequest : public QObject { typedef QPair Param; typedef QList ParamList; - typedef QPair EncodedParam; - typedef QList EncodedParamList; - QNetworkReply *CreateRequest(const QString &ressource_name, const QList ¶ms_provided); QByteArray GetReplyData(QNetworkReply *reply, const bool send_login); - QJsonObject ExtractJsonObj(QByteArray &data); - QJsonValue ExtractItems(QByteArray &data); - QJsonValue ExtractItems(QJsonObject &json_obj); + QJsonObject ExtractJsonObj(const QByteArray &data); + QJsonValue ExtractItems(const QByteArray &data); + QJsonValue ExtractItems(const QJsonObject &json_obj); virtual void Error(const QString &error, const QVariant &debug = QVariant()) = 0; QString ErrorsToHTML(const QStringList &errors); diff --git a/src/tidal/tidalfavoriterequest.cpp b/src/tidal/tidalfavoriterequest.cpp index 047625a04..8ee213838 100644 --- a/src/tidal/tidalfavoriterequest.cpp +++ b/src/tidal/tidalfavoriterequest.cpp @@ -102,7 +102,7 @@ void TidalFavoriteRequest::AddFavorites(const FavoriteType type, const SongList break; } - QStringList ids_list; + QStringList id_list; for (const Song &song : songs) { QString id; switch (type) { @@ -120,23 +120,18 @@ void TidalFavoriteRequest::AddFavorites(const FavoriteType type, const SongList break; } if (id.isEmpty()) continue; - if (!ids_list.contains(id)) { - ids_list << id; + if (!id_list.contains(id)) { + id_list << id; } } - if (ids_list.isEmpty()) return; - - QString ids = ids_list.join(','); - - typedef QPair EncodedParam; + if (id_list.isEmpty()) return; ParamList params = ParamList() << Param("countryCode", country_code()) - << Param(text, ids); + << Param(text, id_list.join(',')); QUrlQuery url_query; for (const Param& param : params) { - EncodedParam encoded_param(QUrl::toPercentEncoding(param.first), QUrl::toPercentEncoding(param.second)); - url_query.addQueryItem(encoded_param.first, encoded_param.second); + url_query.addQueryItem(QUrl::toPercentEncoding(param.first), QUrl::toPercentEncoding(param.second)); } QUrl url(api_url() + QString("/") + "users/" + QString::number(service_->user_id()) + "/favorites/" + FavoriteText(type)); @@ -209,15 +204,15 @@ void TidalFavoriteRequest::RemoveFavorites(const FavoriteType type, const SongLi QString id; switch (type) { case FavoriteType_Artists: - if (song.artist_id() <= 0) continue; + if (song.artist_id().isEmpty()) continue; id = song.artist_id(); break; case FavoriteType_Albums: if (song.album_id().isEmpty()) continue; - id = song.album_id().toLongLong(); + id = song.album_id(); break; case FavoriteType_Songs: - if (song.song_id() <= 0) continue; + if (song.song_id().isEmpty()) continue; id = song.song_id(); break; } @@ -238,8 +233,7 @@ void TidalFavoriteRequest::RemoveFavorites(const FavoriteType type, const QStrin QUrlQuery url_query; for (const Param& param : params) { - EncodedParam encoded_param(QUrl::toPercentEncoding(param.first), QUrl::toPercentEncoding(param.second)); - url_query.addQueryItem(encoded_param.first, encoded_param.second); + url_query.addQueryItem(QUrl::toPercentEncoding(param.first), QUrl::toPercentEncoding(param.second)); } QUrl url(api_url() + QString("/") + "users/" + QString::number(service_->user_id()) + "/favorites/" + FavoriteText(type) + QString("/") + id); diff --git a/src/tidal/tidalrequest.cpp b/src/tidal/tidalrequest.cpp index f3699590b..bb9d83ac1 100644 --- a/src/tidal/tidalrequest.cpp +++ b/src/tidal/tidalrequest.cpp @@ -380,50 +380,50 @@ void TidalRequest::ArtistsReplyReceived(QNetworkReply *reply, const int limit_re emit UpdateProgress(query_id_, artists_received_); } - QJsonValue json_value = ExtractItems(json_obj); - if (!json_value.isArray()) { + QJsonValue value_items = ExtractItems(json_obj); + if (!value_items.isArray()) { ArtistsFinishCheck(); return; } - QJsonArray json_items = json_value.toArray(); - if (json_items.isEmpty()) { // Empty array means no results + QJsonArray array_items = value_items.toArray(); + if (array_items.isEmpty()) { // Empty array means no results if (offset_requested == 0) no_results_ = true; ArtistsFinishCheck(); return; } int artists_received = 0; - for (const QJsonValue &value : json_items) { + for (const QJsonValue &value_item : array_items) { ++artists_received; - if (!value.isObject()) { - Error("Invalid Json reply, item not a object.", value); + if (!value_item.isObject()) { + Error("Invalid Json reply, item in array is not a object.", value_item); continue; } - QJsonObject json_obj = value.toObject(); + QJsonObject obj_item = value_item.toObject(); - if (json_obj.contains("item")) { - QJsonValue json_item = json_obj["item"]; + if (obj_item.contains("item")) { + QJsonValue json_item = obj_item["item"]; if (!json_item.isObject()) { - Error("Invalid Json reply, item not a object.", json_item); + Error("Invalid Json reply, item in array is not a object.", json_item); continue; } - json_obj = json_item.toObject(); + obj_item = json_item.toObject(); } - if (!json_obj.contains("id") || !json_obj.contains("name")) { - Error("Invalid Json reply, item missing id or album.", json_obj); + if (!obj_item.contains("id") || !obj_item.contains("name")) { + Error("Invalid Json reply, item missing id or album.", obj_item); continue; } QString artist_id; - if (json_obj["id"].isString()) { - artist_id = json_obj["id"].toString(); + if (obj_item["id"].isString()) { + artist_id = obj_item["id"].toString(); } else { - artist_id = QString::number(json_obj["id"].toInt()); + artist_id = QString::number(obj_item["id"].toInt()); } if (artist_albums_requests_pending_.contains(artist_id)) continue; artist_albums_requests_pending_.append(artist_id); @@ -556,13 +556,13 @@ void TidalRequest::AlbumsReceived(QNetworkReply *reply, const QString &artist_id return; } - QJsonValue json_value = ExtractItems(json_obj); - if (!json_value.isArray()) { + QJsonValue value_items = ExtractItems(json_obj); + if (!value_items.isArray()) { AlbumsFinishCheck(artist_id_requested); return; } - QJsonArray json_items = json_value.toArray(); - if (json_items.isEmpty()) { + QJsonArray array_items = value_items.toArray(); + if (array_items.isEmpty()) { if ((type_ == QueryType_Albums || type_ == QueryType_SearchAlbums || (type_ == QueryType_SearchSongs && fetchalbums_)) && offset_requested == 0) { no_results_ = true; } @@ -571,93 +571,93 @@ void TidalRequest::AlbumsReceived(QNetworkReply *reply, const QString &artist_id } int albums_received = 0; - for (const QJsonValue &value : json_items) { + for (const QJsonValue &value_item : array_items) { ++albums_received; - if (!value.isObject()) { - Error("Invalid Json reply, item not a object.", value); + if (!value_item.isObject()) { + Error("Invalid Json reply, item in array is not a object.", value_item); continue; } - QJsonObject json_obj = value.toObject(); + QJsonObject obj_item = value_item.toObject(); - if (json_obj.contains("item")) { - QJsonValue json_item = json_obj["item"]; + if (obj_item.contains("item")) { + QJsonValue json_item = obj_item["item"]; if (!json_item.isObject()) { - Error("Invalid Json reply, item not a object.", json_item); + Error("Invalid Json reply, item in array is not a object.", json_item); continue; } - json_obj = json_item.toObject(); + obj_item = json_item.toObject(); } QString album_id; QString album; - if (json_obj.contains("type")) { // This was a albums request or search - if (!json_obj.contains("id") || !json_obj.contains("title")) { - Error("Invalid Json reply, item is missing ID or title.", json_obj); + if (obj_item.contains("type")) { // This was a albums request or search + if (!obj_item.contains("id") || !obj_item.contains("title")) { + Error("Invalid Json reply, item is missing ID or title.", obj_item); continue; } - if (json_obj["id"].isString()) { - album_id = json_obj["id"].toString(); + if (obj_item["id"].isString()) { + album_id = obj_item["id"].toString(); } else { - album_id = QString::number(json_obj["id"].toInt()); + album_id = QString::number(obj_item["id"].toInt()); } - album = json_obj["title"].toString(); + album = obj_item["title"].toString(); } - else if (json_obj.contains("album")) { // This was a tracks request or search - QJsonValue json_value_album = json_obj["album"]; - if (!json_value_album.isObject()) { - Error("Invalid Json reply, item album is not a object.", json_value_album); + else if (obj_item.contains("album")) { // This was a tracks request or search + QJsonValue value_album = obj_item["album"]; + if (!value_album.isObject()) { + Error("Invalid Json reply, item album is not a object.", value_album); continue; } - QJsonObject json_album = json_value_album.toObject(); - if (!json_album.contains("id") || !json_album.contains("title")) { - Error("Invalid Json reply, item album is missing ID or title.", json_album); + QJsonObject obj_album = value_album.toObject(); + if (!obj_album.contains("id") || !obj_album.contains("title")) { + Error("Invalid Json reply, item album is missing ID or title.", obj_album); continue; } - if (json_album["id"].isString()) { - album_id = json_album["id"].toString(); + if (obj_album["id"].isString()) { + album_id = obj_album["id"].toString(); } else { - album_id = QString::number(json_album["id"].toInt()); + album_id = QString::number(obj_album["id"].toInt()); } - album = json_album["title"].toString(); + album = obj_album["title"].toString(); } else { - Error("Invalid Json reply, item missing type or album.", json_obj); + Error("Invalid Json reply, item missing type or album.", obj_item); continue; } if (album_songs_requests_pending_.contains(album_id)) continue; - if (!json_obj.contains("artist") || !json_obj.contains("title") || !json_obj.contains("audioQuality")) { - Error("Invalid Json reply, item missing artist, title or audioQuality.", json_obj); + if (!obj_item.contains("artist") || !obj_item.contains("title") || !obj_item.contains("audioQuality")) { + Error("Invalid Json reply, item missing artist, title or audioQuality.", obj_item); continue; } - QJsonValue json_value_artist = json_obj["artist"]; - if (!json_value_artist.isObject()) { - Error("Invalid Json reply, item artist is not a object.", json_value_artist); + QJsonValue value_artist = obj_item["artist"]; + if (!value_artist.isObject()) { + Error("Invalid Json reply, item artist is not a object.", value_artist); continue; } - QJsonObject json_artist = json_value_artist.toObject(); - if (!json_artist.contains("id") || !json_artist.contains("name")) { - Error("Invalid Json reply, item artist missing id or name.", json_artist); + QJsonObject obj_artist = value_artist.toObject(); + if (!obj_artist.contains("id") || !obj_artist.contains("name")) { + Error("Invalid Json reply, item artist missing id or name.", obj_artist); continue; } QString artist_id; - if (json_artist["id"].isString()) { - artist_id = json_artist["id"].toString(); + if (obj_artist["id"].isString()) { + artist_id = obj_artist["id"].toString(); } else { - artist_id = QString::number(json_artist["id"].toInt()); + artist_id = QString::number(obj_artist["id"].toInt()); } - QString artist = json_artist["name"].toString(); + QString artist = obj_artist["name"].toString(); - QString quality = json_obj["audioQuality"].toString(); - QString copyright = json_obj["copyright"].toString(); + QString quality = obj_item["audioQuality"].toString(); + QString copyright = obj_item["copyright"].toString(); //qLog(Debug) << "Tidal:" << artist << album << quality << copyright; @@ -841,26 +841,26 @@ void TidalRequest::SongsReceived(QNetworkReply *reply, const QString &artist_id, bool multidisc = false; SongList songs; int songs_received = 0; - for (const QJsonValue &value : json_items) { + for (const QJsonValue &value_item : json_items) { - if (!value.isObject()) { - Error("Invalid Json reply, track is not a object.", value); + if (!value_item.isObject()) { + Error("Invalid Json reply, track is not a object.", value_item); continue; } - QJsonObject json_obj = value.toObject(); + QJsonObject obj_item = value_item.toObject(); - if (json_obj.contains("item")) { - QJsonValue json_item = json_obj["item"]; - if (!json_item.isObject()) { - Error("Invalid Json reply, item not a object.", json_item); + if (obj_item.contains("item")) { + QJsonValue item = obj_item["item"]; + if (!item.isObject()) { + Error("Invalid Json reply, item is not a object.", item); continue; } - json_obj = json_item.toObject(); + obj_item = item.toObject(); } ++songs_received; Song song(Song::Source_Tidal); - ParseSong(song, json_obj, artist_id, album_id, album_artist); + ParseSong(song, obj_item, artist_id, album_id, album_artist); if (!song.is_valid()) continue; if (song.disc() >= 2) multidisc = true; if (song.is_compilation()) compilation = true; @@ -955,10 +955,10 @@ QString TidalRequest::ParseSong(Song &song, const QJsonObject &json_obj, const Q return QString(); } - QJsonValue json_value_artist = json_obj["artist"]; - QJsonValue json_value_album = json_obj["album"]; + QJsonValue value_artist = json_obj["artist"]; + QJsonValue value_album = json_obj["album"]; QJsonValue json_duration = json_obj["duration"]; - QJsonArray json_artists = json_obj["artists"].toArray(); + QJsonArray array_artists = json_obj["artists"].toArray(); QString song_id; if (json_obj["id"].isString()) { @@ -976,46 +976,46 @@ QString TidalRequest::ParseSong(Song &song, const QJsonObject &json_obj, const Q bool stream_ready = json_obj["streamReady"].toBool(); QString copyright = json_obj["copyright"].toString(); - if (!json_value_artist.isObject()) { - Error("Invalid Json reply, track artist is not a object.", json_value_artist); + if (!value_artist.isObject()) { + Error("Invalid Json reply, track artist is not a object.", value_artist); return QString(); } - QJsonObject json_artist = json_value_artist.toObject(); - if (!json_artist.contains("id") || !json_artist.contains("name")) { - Error("Invalid Json reply, track artist is missing id or name.", json_artist); + QJsonObject obj_artist = value_artist.toObject(); + if (!obj_artist.contains("id") || !obj_artist.contains("name")) { + Error("Invalid Json reply, track artist is missing id or name.", obj_artist); return QString(); } QString artist_id; - if (json_artist["id"].isString()) { - artist_id = json_artist["id"].toString(); + if (obj_artist["id"].isString()) { + artist_id = obj_artist["id"].toString(); } else { - artist_id = QString::number(json_artist["id"].toInt()); + artist_id = QString::number(obj_artist["id"].toInt()); } - QString artist = json_artist["name"].toString(); + QString artist = obj_artist["name"].toString(); - if (!json_value_album.isObject()) { - Error("Invalid Json reply, track album is not a object.", json_value_album); + if (!value_album.isObject()) { + Error("Invalid Json reply, track album is not a object.", value_album); return QString(); } - QJsonObject json_album = json_value_album.toObject(); - if (!json_album.contains("id") || !json_album.contains("title") || !json_album.contains("cover")) { - Error("Invalid Json reply, track album is missing id, title or cover.", json_album); + QJsonObject obj_album = value_album.toObject(); + if (!obj_album.contains("id") || !obj_album.contains("title") || !obj_album.contains("cover")) { + Error("Invalid Json reply, track album is missing id, title or cover.", obj_album); return QString(); } QString album_id; - if (json_album["id"].isString()) { - album_id = json_album["id"].toString(); + if (obj_album["id"].isString()) { + album_id = obj_album["id"].toString(); } else { - album_id = QString::number(json_album["id"].toInt()); + album_id = QString::number(obj_album["id"].toInt()); } if (!album_id_requested.isEmpty() && album_id_requested != album_id) { - Error("Invalid Json reply, track album id is wrong.", json_album); + Error("Invalid Json reply, track album id is wrong.", obj_album); return QString(); } - QString album = json_album["title"].toString(); - QString cover = json_album["cover"].toString(); + QString album = obj_album["title"].toString(); + QString cover = obj_album["cover"].toString(); if (!allow_streaming) { Warn(QString("Song %1 %2 %3 is not allowStreaming").arg(artist).arg(album).arg(title)); @@ -1244,7 +1244,7 @@ void TidalRequest::Error(const QString &error, const QVariant &debug) { } -void TidalRequest::Warn(QString error, QVariant debug) { +void TidalRequest::Warn(const QString &error, const QVariant &debug) { qLog(Error) << "Tidal:" << error; if (debug.isValid()) qLog(Debug) << debug; diff --git a/src/tidal/tidalrequest.h b/src/tidal/tidalrequest.h index 320cf73c8..f5811aee3 100644 --- a/src/tidal/tidalrequest.h +++ b/src/tidal/tidalrequest.h @@ -87,9 +87,6 @@ class TidalRequest : public TidalBaseRequest { void AlbumCoverReceived(QNetworkReply *reply, const QString &album_id, const QUrl &url, const QString &filename); private: - typedef QPair Param; - typedef QList ParamList; - struct Request { QString artist_id = 0; QString album_id = 0; @@ -144,7 +141,7 @@ class TidalRequest : public TidalBaseRequest { void AlbumCoverFinishCheck(); void FinishCheck(); - void Warn(QString error, QVariant debug = QVariant()); + void Warn(const QString &error, const QVariant &debug = QVariant()); void Error(const QString &error, const QVariant &debug = QVariant()); static const char *kResourcesUrl; diff --git a/src/tidal/tidalservice.cpp b/src/tidal/tidalservice.cpp index 86fba2fdf..765c01d3c 100644 --- a/src/tidal/tidalservice.cpp +++ b/src/tidal/tidalservice.cpp @@ -279,8 +279,7 @@ void TidalService::StartAuthorisation() { QUrlQuery url_query; for (const Param ¶m : params) { - EncodedParam encoded_param(QUrl::toPercentEncoding(param.first), QUrl::toPercentEncoding(param.second)); - url_query.addQueryItem(encoded_param.first, encoded_param.second); + url_query.addQueryItem(QUrl::toPercentEncoding(param.first), QUrl::toPercentEncoding(param.second)); } QUrl url = QUrl(kOAuthUrl); @@ -329,15 +328,14 @@ void TidalService::AuthorisationUrlReceived(const QUrl &url) { << Param("scope", "r_usr w_usr") << Param("code_verifier", code_verifier_); - QUrlQuery url_query; + QUrlQuery new_url_query; for (const Param ¶m : params) { - EncodedParam encoded_param(QUrl::toPercentEncoding(param.first), QUrl::toPercentEncoding(param.second)); - url_query.addQueryItem(encoded_param.first, encoded_param.second); + new_url_query.addQueryItem(QUrl::toPercentEncoding(param.first), QUrl::toPercentEncoding(param.second)); } - QUrl url(kOAuthAccessTokenUrl); - QNetworkRequest request = QNetworkRequest(url); - QByteArray query = url_query.toString(QUrl::FullyEncoded).toUtf8(); + QUrl new_url(kOAuthAccessTokenUrl); + QNetworkRequest request = QNetworkRequest(new_url); + QByteArray query = new_url_query.toString(QUrl::FullyEncoded).toUtf8(); login_errors_.clear(); QNetworkReply *reply = network_->post(request, query); @@ -347,7 +345,6 @@ void TidalService::AuthorisationUrlReceived(const QUrl &url) { } else { - LoginError(tr("Reply from Tidal is missing query items.")); return; } @@ -410,7 +407,7 @@ void TidalService::AccessTokenRequestFinished(QNetworkReply *reply) { return; } - if (json_doc.isNull() || json_doc.isEmpty()) { + if (json_doc.isEmpty()) { LoginError("Authentication reply from server has empty Json document."); return; } @@ -494,8 +491,7 @@ void TidalService::SendLogin(const QString &api_token, const QString &username, QUrlQuery url_query; for (const Param ¶m : params) { - EncodedParam encoded_param(QUrl::toPercentEncoding(param.first), QUrl::toPercentEncoding(param.second)); - url_query.addQueryItem(encoded_param.first, encoded_param.second); + url_query.addQueryItem(QUrl::toPercentEncoding(param.first), QUrl::toPercentEncoding(param.second)); } QUrl url(kAuthUrl); @@ -952,9 +948,9 @@ void TidalService::LoginError(const QString &error, const QVariant &debug) { if (!error.isEmpty()) login_errors_ << error; QString error_html; - for (const QString &error : login_errors_) { - qLog(Error) << "Tidal:" << error; - error_html += error + "
"; + for (const QString &e : login_errors_) { + qLog(Error) << "Tidal:" << e; + error_html += e + "
"; } if (debug.isValid()) qLog(Debug) << debug; diff --git a/src/tidal/tidalservice.h b/src/tidal/tidalservice.h index 9d19516e3..30b0f07ae 100644 --- a/src/tidal/tidalservice.h +++ b/src/tidal/tidalservice.h @@ -164,9 +164,6 @@ class TidalService : public InternetService { typedef QPair Param; typedef QList ParamList; - typedef QPair EncodedParam; - typedef QList EncodedParamList; - void SendSearch(); void LoginError(const QString &error = QString(), const QVariant &debug = QVariant());