1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QRegularExpression>
#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();
}
|