summaryrefslogtreecommitdiffstats
path: root/webdownloader.cpp
blob: c0505b91204d45574ff4c7c6afa4c29ecea0e92e (plain)
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
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

#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();
    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();
        std::for_each(relArr.constBegin(), relArr.constEnd(), [this, aId](auto c){
            QString id = c.toObject().value("artist-credit").toArray().at(0).toObject().value("artist").toObject().value("id").toString();
            if(id == aId){
                QString primary = c.toObject().value("release-group").toObject().value("primary-type").toString().toLower();
                QString status = c.toObject().value("status").toString().toLower();
                if(primary == "album" && status == "official"){
                    QString linkId = c.toObject().value("release-group").toObject().value("id").toString();
                    QString title = c.toObject().value("title").toString().toLower();
                    mOtherData.insert(linkId, title);
                }
            }
        });
    }
    reply->deleteLater();
    emit done();
}