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