File indexing completed on 2025-02-16 04:25:53

0001 #include "musicbrainzService.h"
0002 
0003 /*
0004  * http://musicbrainz.org/ws/2/recording/?query=artist:lana%20del%20rey+recording:ultraviolence
0005  * http://google.com/complete/search?output=toolbar&q=lana
0006  * */
0007 
0008 musicBrainz::musicBrainz(const FMH::MODEL &song)
0009 {
0010     this->availableInfo.insert(ONTOLOGY::ALBUM, {INFO::TAGS});
0011     this->availableInfo.insert(ONTOLOGY::ARTIST, {INFO::TAGS});
0012     this->availableInfo.insert(ONTOLOGY::TRACK, {INFO::TAGS});
0013 
0014     this->track = song;
0015 }
0016 
0017 bool musicBrainz::setUpService(const PULPO::ONTOLOGY &ontology, const PULPO::INFO &info)
0018 {
0019     this->ontology = ontology;
0020     this->info = info;
0021 
0022     if (!this->availableInfo[this->ontology].contains(this->info))
0023         return false;
0024 
0025     auto url = this->API;
0026     QUrl encodedArtist(this->track[FMH::MODEL_KEY::ARTIST]);
0027     encodedArtist.toEncoded(QUrl::FullyEncoded);
0028 
0029     switch (this->ontology) {
0030     case PULPO::ONTOLOGY::ARTIST: {
0031         url.append(QString("artist/?query=artist:\"" + encodedArtist.toString() + "\""));
0032         url.append("&fmt=json");
0033         url.append("&limit=5");
0034         break;
0035     }
0036 
0037     case PULPO::ONTOLOGY::ALBUM: {
0038         QUrl encodedAlbum(this->track[FMH::MODEL_KEY::ALBUM]);
0039         encodedAlbum.toEncoded(QUrl::FullyEncoded);
0040 
0041         url.append(QString("release/?query=release:\"" + encodedAlbum.toString() + "\""));
0042         url.append(QString("+artist:\"" + encodedArtist.toString() + "\""));
0043         url.append(QString("+primarytype:\"album\"&fmt=json&limit=5"));
0044         break;
0045     }
0046 
0047     case PULPO::ONTOLOGY::TRACK: {
0048         QUrl encodedTrack(this->track[FMH::MODEL_KEY::TITLE]);
0049         encodedTrack.toEncoded(QUrl::FullyEncoded);
0050         url.append(QString("recording/?query=artist:\"" + encodedArtist.toString() + "\""));
0051         url.append(QString("+recording:\"" + encodedTrack.toString() + "\""));
0052         url.append("&fmt=json");
0053         url.append("&limit=5");
0054 
0055         break;
0056     }
0057 
0058     default:
0059         return false;
0060     }
0061 
0062     qDebug() << "[musicbrainz service]: " << url;
0063 
0064     this->array = this->startConnection(url, this->header);
0065     if (this->array.isEmpty())
0066         return false;
0067 
0068     return this->parseArray();
0069 }
0070 
0071 bool musicBrainz::parseArtist()
0072 {
0073     QJsonParseError jsonParseError;
0074     QJsonDocument jsonResponse = QJsonDocument::fromJson(static_cast<QString>(array).toUtf8(), &jsonParseError);
0075 
0076     if (jsonParseError.error != QJsonParseError::NoError)
0077         return false;
0078 
0079     if (!jsonResponse.isObject())
0080         return false;
0081 
0082     auto data = jsonResponse.object().toVariantMap();
0083 
0084     if (data.isEmpty())
0085         return false;
0086 
0087     QList<QVariant> items = data.value("artists").toList();
0088 
0089     if (items.isEmpty())
0090         return false;
0091 
0092     for (auto item : items) {
0093         auto itemMap = item.toMap();
0094 
0095         if (this->info == INFO::TAGS || this->info == INFO::ALL) {
0096             PULPO::VALUE contexts;
0097 
0098             auto score = itemMap.value("score").toString();
0099             contexts.insert(CONTEXT::ARTIST_STAT, score);
0100 
0101             QStringList aliases;
0102             aliases << itemMap.value("sort-name").toString();
0103             for (auto alias : itemMap.value("aliases").toList())
0104                 aliases << alias.toMap().value("name").toString();
0105 
0106             contexts.insert(CONTEXT::ARTIST_ALIAS, aliases);
0107 
0108             auto gender = itemMap.value("gender").toString();
0109             contexts.insert(CONTEXT::ARTIST_GENDER, gender);
0110 
0111             QStringList places;
0112 
0113             places << itemMap.value("country").toString();
0114             places << itemMap.value("area").toMap().value("name").toString();
0115             places << itemMap.value("begin-area").toMap().value("name").toString();
0116 
0117             contexts.insert(CONTEXT::ARTIST_PLACE, places);
0118 
0119             auto lifeSpan_begin = itemMap.value("life-span").toMap().value("begin").toString();
0120             auto lifeSpan_end = itemMap.value("life-span").toMap().value("ended").toString();
0121             contexts.insert(CONTEXT::ARTIST_DATE, QStringList{lifeSpan_begin, lifeSpan_end});
0122 
0123             QStringList tags;
0124             for (auto tag : itemMap.value("tags").toList())
0125                 tags << tag.toMap().value("name").toString();
0126 
0127             contexts.insert(CONTEXT::TAG, tags);
0128 
0129             emit this->infoReady(this->track, this->packResponse(ONTOLOGY::ARTIST, INFO::TAGS, contexts));
0130             if (this->info == INFO::TAGS && !contexts.isEmpty())
0131                 return true;
0132         }
0133     }
0134 
0135     return false;
0136 }
0137 
0138 bool musicBrainz::parseAlbum()
0139 {
0140     QJsonParseError jsonParseError;
0141     QJsonDocument jsonResponse = QJsonDocument::fromJson(static_cast<QString>(array).toUtf8(), &jsonParseError);
0142 
0143     if (jsonParseError.error != QJsonParseError::NoError)
0144         return false;
0145 
0146     if (!jsonResponse.isObject())
0147         return false;
0148 
0149     auto data = jsonResponse.object().toVariantMap();
0150 
0151     if (data.isEmpty())
0152         return false;
0153 
0154     QList<QVariant> items = data.value("releases").toList();
0155 
0156     if (items.isEmpty())
0157         return false;
0158 
0159     for (auto item : items) {
0160         auto itemMap = item.toMap();
0161 
0162         if (this->info == INFO::TAGS || this->info == INFO::ALL) {
0163             PULPO::VALUE contexts;
0164 
0165             auto score = itemMap.value("score").toString();
0166             contexts.insert(CONTEXT::ALBUM_STAT, score);
0167 
0168             auto date = itemMap.value("date").toString();
0169             contexts.insert(CONTEXT::ALBUM_DATE, date);
0170 
0171             QStringList labels;
0172             for (auto label : itemMap.value("label-info").toList())
0173                 labels << label.toMap().value("label").toMap().value("name").toString();
0174 
0175             contexts.insert(CONTEXT::ALBUM_LABEL, labels);
0176 
0177             emit this->infoReady(this->track, this->packResponse(ONTOLOGY::ALBUM, INFO::TAGS, contexts));
0178             if (this->info == INFO::TAGS && !contexts.isEmpty())
0179                 return true;
0180         }
0181     }
0182 
0183     return false;
0184 }
0185 
0186 bool musicBrainz::parseTrack()
0187 {
0188     QJsonParseError jsonParseError;
0189     QJsonDocument jsonResponse = QJsonDocument::fromJson(static_cast<QString>(array).toUtf8(), &jsonParseError);
0190 
0191     if (jsonParseError.error != QJsonParseError::NoError)
0192         return false;
0193 
0194     if (!jsonResponse.isObject())
0195         return false;
0196 
0197     auto data = jsonResponse.object().toVariantMap();
0198 
0199     if (data.isEmpty())
0200         return false;
0201     QList<QVariant> items = data.value("recordings").toList();
0202 
0203     if (items.isEmpty())
0204         return false;
0205 
0206     auto id = items.first().toMap().value("id").toString();
0207     auto url = QString("http://musicbrainz.org/ws/2/recording/%1?inc=artist-rels+recording-rels&fmt=json&limit=5").arg(id);
0208     qDebug() << "NEW TRACK INFO URL MUSICBRAINZ" << url;
0209     auto rel = this->startConnection(url, this->header);
0210 
0211     if (rel.isEmpty())
0212         return false;
0213 
0214     jsonResponse = QJsonDocument::fromJson(static_cast<QString>(rel).toUtf8(), &jsonParseError);
0215 
0216     if (jsonParseError.error != QJsonParseError::NoError)
0217         return false;
0218 
0219     if (!jsonResponse.isObject())
0220         return false;
0221 
0222     data = jsonResponse.object().toVariantMap();
0223 
0224     if (data.isEmpty())
0225         return false;
0226 
0227     if (this->info == INFO::TAGS || this->info == INFO::ALL) {
0228         items = data.value("relations").toList();
0229 
0230         if (items.isEmpty())
0231             return false;
0232 
0233         QStringList people;
0234 
0235         for (auto item : items) {
0236             auto team = item.toMap().value("artist").toMap().value("name").toString();
0237             people << team;
0238         }
0239 
0240         emit this->infoReady(this->track, this->packResponse(ONTOLOGY::TRACK, INFO::TAGS, CONTEXT::TRACK_TEAM, people));
0241         if (this->info == INFO::TAGS && !people.isEmpty())
0242             return true;
0243     }
0244 
0245     return false;
0246 }