From 165f9d769ba240d5009ea9e234df4cfd7eb8af9d Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Sun, 24 Mar 2024 06:59:01 +0100 Subject: [PATCH] MusixmatchCoverProvider: Fix parsing --- src/covermanager/musixmatchcoverprovider.cpp | 64 +++++++++++++------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/src/covermanager/musixmatchcoverprovider.cpp b/src/covermanager/musixmatchcoverprovider.cpp index 3b807ac44..d5c1257c6 100644 --- a/src/covermanager/musixmatchcoverprovider.cpp +++ b/src/covermanager/musixmatchcoverprovider.cpp @@ -68,9 +68,6 @@ bool MusixmatchCoverProvider::StartSearch(const QString &artist, const QString & QUrl url(QString("https://www.musixmatch.com/album/%1/%2").arg(artist_stripped, album_stripped)); QNetworkRequest req(url); req.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy); -#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) - req.setAttribute(QNetworkRequest::Http2AllowedAttribute, false); -#endif QNetworkReply *reply = network_->get(req); replies_ << reply; QObject::connect(reply, &QNetworkReply::finished, this, [this, reply, id, artist, album]() { HandleSearchReply(reply, id, artist, album); }); @@ -110,8 +107,12 @@ void MusixmatchCoverProvider::HandleSearchReply(QNetworkReply *reply, const int return; } QString content = data; - const QString data_begin = "var __mxmState = "; - const QString data_end = ";"; + const QString data_begin = ""; + if (!content.contains(data_begin) || !content.contains(data_end)) { + emit SearchFinished(id, results); + return; + } qint64 begin_idx = content.indexOf(data_begin); QString content_json; if (begin_idx > 0) { @@ -153,49 +154,68 @@ void MusixmatchCoverProvider::HandleSearchReply(QNetworkReply *reply, const int return; } - QJsonObject json_obj = json_doc.object(); - if (json_obj.isEmpty()) { + QJsonObject obj_data = json_doc.object(); + if (obj_data.isEmpty()) { Error("Received empty Json object.", json_doc); emit SearchFinished(id, results); return; } - if (!json_obj.contains("page") || !json_obj["page"].isObject()) { - Error("Json reply is missing page object.", json_obj); + if (!obj_data.contains("props") || !obj_data["props"].isObject()) { + Error("Json reply is missing props.", obj_data); emit SearchFinished(id, results); return; } - json_obj = json_obj["page"].toObject(); + obj_data = obj_data["props"].toObject(); - if (!json_obj.contains("album") || !json_obj["album"].isObject()) { - Error("Json page object is missing album object.", json_obj); + if (!obj_data.contains("pageProps") || !obj_data["pageProps"].isObject()) { + Error("Json props is missing pageProps.", obj_data); emit SearchFinished(id, results); return; } - QJsonObject obj_album = json_obj["album"].toObject(); + obj_data = obj_data["pageProps"].toObject(); - if (!obj_album.contains("artistName") || !obj_album.contains("name")) { - Error("Json album object is missing artistName or name.", obj_album); + if (!obj_data.contains("data") || !obj_data["data"].isObject()) { + Error("Json pageProps is missing data.", obj_data); emit SearchFinished(id, results); return; } + obj_data = obj_data["data"].toObject(); + + if (!obj_data.contains("albumGet") || !obj_data["albumGet"].isObject()) { + Error("Json data is missing albumGet.", obj_data); + emit SearchFinished(id, results); + return; + } + obj_data = obj_data["albumGet"].toObject(); + + if (!obj_data.contains("data") || !obj_data["data"].isObject()) { + Error("Json albumGet reply is missing data.", obj_data); + emit SearchFinished(id, results); + return; + } + obj_data = obj_data["data"].toObject(); CoverProviderSearchResult result; - result.artist = obj_album["artistName"].toString(); - result.album = obj_album["name"].toString(); + if (obj_data.contains("artistName") && obj_data["artistName"].isString()) { + result.artist = obj_data["artistName"].toString(); + } + if (obj_data.contains("name") && obj_data["name"].isString()) { + result.album = obj_data["name"].toString(); + } if (result.artist.compare(artist, Qt::CaseInsensitive) != 0 && result.album.compare(album, Qt::CaseInsensitive) != 0) { emit SearchFinished(id, results); return; } - QList> cover_sizes = QList>() << qMakePair(QString("coverart800x800"), QSize(800, 800)) - << qMakePair(QString("coverart500x500"), QSize(500, 500)) - << qMakePair(QString("coverart350x350"), QSize(350, 350)); + QList> cover_sizes = QList>() << qMakePair(QString("coverImage800x800"), QSize(800, 800)) + << qMakePair(QString("coverImage500x500"), QSize(500, 500)) + << qMakePair(QString("coverImage350x350"), QSize(350, 350)); for (const QPair &cover_size : cover_sizes) { - if (!obj_album.contains(cover_size.first)) continue; - QUrl cover_url(obj_album[cover_size.first].toString()); + if (!obj_data.contains(cover_size.first)) continue; + QUrl cover_url(obj_data[cover_size.first].toString()); if (cover_url.isValid()) { result.image_url = cover_url; result.image_size = cover_size.second;