#include #include #include #include #include #include #include "webdownloader.h" WebDownloader::WebDownloader(QObject *parent) : QObject(parent) { mAccessMgr = new QNetworkAccessManager(this); connect(mAccessMgr, &QNetworkAccessManager::finished, this, &WebDownloader::dlFinished); } void WebDownloader::fetchData(QString artist, QString album){ mArtist = artist; mAlbum = album; QString artistQ = QString("artist:%1").arg(artist); QByteArray peq = QUrl::toPercentEncoding(artistQ); QString url = QString("https://musicbrainz.org/ws/2/release/?query=%1&fmt=json&limit=100").arg(QString(peq)); QUrl aUrl(url); QNetworkRequest req(aUrl); req.setHeader(QNetworkRequest::UserAgentHeader, "Beetplayer/1.0.0 (beetplayer@d-tor.org"); mAccessMgr->get(req); } void WebDownloader::dlFinished(QNetworkReply *reply){ mData.clear(); mOtherData.clear(); mArtistId.clear(); mAlternateArtists.clear(); QRegularExpression yearRE("(\\d{4})"); QByteArray res = reply->readAll(); QJsonDocument jDoc = QJsonDocument::fromJson(res); QJsonObject docObj = jDoc.object(); QJsonArray relArr = docObj.value("releases").toArray(); QJsonArray::const_iterator it = std::find_if(relArr.constBegin(), relArr.constEnd(), [this](auto c) { QString title = c.toObject().value("title").toString().toLower(); return title == mAlbum; }); if(it != relArr.constEnd()){ QJsonValue titleRes = *it; QString curId = titleRes.toObject().value("release-group").toObject().value("id").toString(); if(!mData.contains(curId)){ mData << curId; } QString aId = titleRes.toObject().value("artist-credit").toArray().at(0).toObject().value("artist").toObject().value("id").toString(); mArtistId = aId; std::for_each(relArr.constBegin(), relArr.constEnd(), [this, aId, yearRE](auto c){ QString id = c.toObject().value("artist-credit").toArray().at(0).toObject().value("artist").toObject().value("id").toString(); QString linkId = c.toObject().value("release-group").toObject().value("id").toString(); QString title = c.toObject().value("title").toString().toLower(); if(id == aId){ QString primary = c.toObject().value("release-group").toObject().value("primary-type").toString().toLower(); auto secondary = c.toObject().value("release-group").toObject().value("secondary-types").toArray(); if(secondary.count()){ return; } QString status = c.toObject().value("status").toString().toLower(); if(primary == "album" && status == "official"){ QString date = c.toObject().value("date").toString(); int year = -1; QRegularExpressionMatch match = yearRE.match(date); if(match.hasMatch()){ year = match.captured(0).toInt(); } auto otherIt = mOtherData.constEnd(); if(year != -1){ otherIt = std::find_if(mOtherData.constBegin(), mOtherData.constEnd(), [linkId](auto c){ return c.at(0).toString() == linkId; }); if(otherIt == mOtherData.constEnd()){ QVariantList cur = QVariantList() << linkId << title << year; mOtherData.append(cur); } } } } }); }else{ std::for_each(relArr.constBegin(), relArr.constEnd(), [this](auto c){ QString disamb = c.toObject().value("artist-credit").toArray().at(0).toObject().value("artist").toObject().value("disambiguation").toString(); QString name = c.toObject().value("artist-credit").toArray().at(0).toObject().value("artist").toObject().value("name").toString(); QString linkId = c.toObject().value("artist-credit").toArray().at(0).toObject().value("artist").toObject().value("id").toString(); QString t; if(!disamb.isEmpty()){ t = QString("%1 (%2)").arg(name).arg(disamb); }else{ t = name; } mAlternateArtists.insert(linkId, t); }); } reply->deleteLater(); emit done(); }