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 }