File indexing completed on 2025-02-16 04:25:53
0001 #include "lastfmService.h" 0002 0003 using namespace PULPO; 0004 0005 lastfm::lastfm() 0006 { 0007 this->scope.insert(ONTOLOGY::ALBUM, {INFO::ARTWORK, INFO::WIKI, INFO::TAGS}); 0008 this->scope.insert(ONTOLOGY::ARTIST, {INFO::WIKI, INFO::TAGS}); 0009 this->scope.insert(ONTOLOGY::TRACK, {INFO::TAGS, INFO::WIKI, INFO::ARTWORK, INFO::METADATA}); 0010 connect(this, &lastfm::arrayReady, this, &lastfm::parse); 0011 } 0012 0013 lastfm::~lastfm() 0014 { 0015 qDebug() << "DELETING LASTFM INSTANCE"; 0016 } 0017 0018 void lastfm::set(const PULPO::REQUEST &request) 0019 { 0020 this->request = request; 0021 0022 if (!scopePass()) { 0023 ERROR(this->request) 0024 } 0025 0026 auto url = this->API; 0027 0028 QUrl encodedArtist(this->request.track[FMH::MODEL_KEY::ARTIST]); 0029 encodedArtist.toEncoded(QUrl::FullyEncoded); 0030 0031 switch (this->request.ontology) { 0032 case PULPO::ONTOLOGY::ARTIST: { 0033 url.append("?method=artist.getinfo"); 0034 url.append(KEY); 0035 url.append("&artist=" + encodedArtist.toString()); 0036 break; 0037 } 0038 0039 case PULPO::ONTOLOGY::ALBUM: { 0040 QUrl encodedAlbum(this->request.track[FMH::MODEL_KEY::ALBUM]); 0041 encodedAlbum.toEncoded(QUrl::FullyEncoded); 0042 0043 url.append("?method=album.getinfo"); 0044 url.append(KEY); 0045 url.append("&artist=" + encodedArtist.toString()); 0046 url.append("&album=" + encodedAlbum.toString()); 0047 break; 0048 } 0049 0050 case PULPO::ONTOLOGY::TRACK: { 0051 QUrl encodedTrack(this->request.track[FMH::MODEL_KEY::TITLE]); 0052 encodedTrack.toEncoded(QUrl::FullyEncoded); 0053 0054 url.append("?method=track.getinfo"); 0055 url.append(KEY); 0056 url.append("&artist=" + encodedArtist.toString()); 0057 url.append("&track=" + encodedTrack.toString()); 0058 url.append("&format=json"); 0059 break; 0060 } 0061 } 0062 0063 qDebug() << "[lastfm service]: " << url; 0064 0065 this->retrieve(url); 0066 } 0067 0068 void lastfm::parseArtist(const QByteArray &array) 0069 { 0070 QString xmlData(array); 0071 QDomDocument doc; 0072 0073 if (!doc.setContent(xmlData)) { 0074 qDebug() << "LASTFM XML FAILED 1" << this->request.track; 0075 ERROR(this->request); 0076 } 0077 0078 if (doc.documentElement().toElement().attributes().namedItem("status").nodeValue() != "ok") { 0079 qDebug() << "LASTFM XML FAILED 2" << this->request.track; 0080 ERROR(this->request); 0081 } 0082 0083 // QStringList artistTags; 0084 // QByteArray artistSimilarArt; 0085 // QStringList artistSimilar; 0086 // QStringList artistStats; 0087 0088 const QDomNodeList nodeList = doc.documentElement().namedItem("artist").childNodes(); 0089 0090 for (int i = 0; i < nodeList.count(); i++) { 0091 QDomNode n = nodeList.item(i); 0092 0093 if (n.isElement()) { 0094 // Here retrieve the artist wiki (bio) 0095 if (this->request.info.contains(INFO::WIKI)) { 0096 if (n.nodeName() == "bio") { 0097 auto artistWiki = n.childNodes().item(3).toElement().text(); 0098 0099 this->responses << PULPO::RESPONSE{PULPO_CONTEXT::WIKI, artistWiki}; 0100 } 0101 } 0102 } 0103 } 0104 0105 // //Here retrieve the artist similar artists 0106 // if(this->info == INFO::TAGS || this->info == INFO::ALL) 0107 // { 0108 // if(n.nodeName() == "similar") 0109 // { 0110 // auto similarList = n.toElement().childNodes(); 0111 0112 // for(int i=0; i<similarList.count(); i++) 0113 // { 0114 // QDomNode m = similarList.item(i); 0115 0116 // auto artistSimilarName = m.childNodes().item(0).toElement().text(); 0117 // artistSimilar<<artistSimilarName; 0118 // } 0119 0120 // emit this->infoReady(this->track,this->packResponse(ONTOLOGY::ARTIST, INFO::TAGS,CONTEXT::ARTIST_SIMILAR,artistSimilar)); 0121 0122 // }else if(n.nodeName() == "tags") 0123 // { 0124 // auto tagsList = n.toElement().childNodes(); 0125 // //qDebug()<<"Fetching ArtistTags LastFm[]"; 0126 0127 // for(int i=0; i<tagsList.count(); i++) 0128 // { 0129 // QDomNode m = tagsList.item(i); 0130 // artistTags<<m.childNodes().item(0).toElement().text(); 0131 // } 0132 0133 // emit this->infoReady(this->track,this->packResponse(ONTOLOGY::ARTIST, INFO::TAGS,CONTEXT::TAG,artistTags)); 0134 0135 // }else if(n.nodeName() == "stats") 0136 // { 0137 // QVariant stat; 0138 // auto stats = n.toElement().childNodes(); 0139 // //qDebug()<<"Fetching ArtistTags LastFm[]"; 0140 0141 // for(int i=0; i<stats.count(); i++) 0142 // { 0143 // QDomNode m = stats.item(i); 0144 // artistStats<<m.toElement().text(); 0145 // } 0146 0147 // emit this->infoReady(this->track,this->packResponse(ONTOLOGY::ARTIST, INFO::TAGS, CONTEXT::ARTIST_STAT,artistStats)); 0148 0149 // }else if(this->info == INFO::TAGS) continue; 0150 // } 0151 0152 // } 0153 // } 0154 0155 // /*********NOW WE WANT TO PARSE SIMILAR ARTISTS***********/ 0156 // if(this->info == INFO::TAGS || this->info == INFO::ALL) 0157 // { 0158 // auto url = this->API; 0159 // QUrl encodedTrack(this->track[FMH::MODEL_KEY::TITLE]); 0160 // encodedTrack.toEncoded(QUrl::FullyEncoded); 0161 // QUrl encodedArtist(this->track[FMH::MODEL_KEY::ARTIST]); 0162 // encodedArtist.toEncoded(QUrl::FullyEncoded); 0163 // url.append("?method=artist.getSimilar"); 0164 // url.append(KEY); 0165 // url.append("&artist=" + encodedArtist.toString()); 0166 // url.append("&format=json"); 0167 0168 // qDebug()<< "[lastfm service]: "<< url; 0169 0170 // this->array = this->startConnection(url); 0171 0172 // if(!this->array.isEmpty()) 0173 // this->parseSimilar(); 0174 // } 0175 0176 emit this->responseReady(this->request, this->responses); 0177 } 0178 0179 void lastfm::parseAlbum(const QByteArray &array) 0180 { 0181 QString xmlData(array); 0182 QDomDocument doc; 0183 0184 if (!doc.setContent(xmlData)) { 0185 qDebug() << "LASTFM XML FAILED 1" << this->request.track; 0186 ERROR(this->request); 0187 } 0188 0189 if (doc.documentElement().toElement().attributes().namedItem("status").nodeValue() != "ok") { 0190 qDebug() << "LASTFM XML FAILED 2" << this->request.track; 0191 ERROR(this->request); 0192 } 0193 0194 const auto nodeList = doc.documentElement().namedItem("album").childNodes(); 0195 0196 for (int i = 0; i < nodeList.count(); i++) { 0197 QDomNode n = nodeList.item(i); 0198 0199 if (n.isElement()) { 0200 // Here retrieve the artist image 0201 if (n.nodeName() == "image" && n.hasAttributes()) { 0202 if (this->request.info.contains(INFO::ARTWORK)) { 0203 const auto imgSize = n.attributes().namedItem("size").nodeValue(); 0204 0205 if (imgSize == "large" && n.isElement()) { 0206 const auto albumArt_url = n.toElement().text(); 0207 this->responses << PULPO::RESPONSE{PULPO_CONTEXT::IMAGE, albumArt_url}; 0208 0209 if (this->request.info.size() == 1) 0210 break; 0211 else 0212 continue; 0213 0214 } else 0215 continue; 0216 0217 } else 0218 continue; 0219 } 0220 0221 if (n.nodeName() == "wiki") { 0222 if (this->request.info.contains(INFO::WIKI)) { 0223 const auto albumWiki = n.childNodes().item(1).toElement().text(); 0224 // qDebug()<<"Fetching AlbumWiki LastFm[]"; 0225 0226 this->responses << PULPO::RESPONSE{PULPO_CONTEXT::WIKI, albumWiki}; 0227 0228 if (this->request.info.size() == 1) 0229 break; 0230 else 0231 continue; 0232 0233 } else 0234 continue; 0235 } 0236 0237 if (n.nodeName() == "tags") { 0238 if (this->request.info.contains(INFO::TAGS)) { 0239 auto tagsList = n.toElement().childNodes(); 0240 QStringList albumTags; 0241 for (int j = 0; j < tagsList.count(); j++) { 0242 QDomNode m = tagsList.item(j); 0243 albumTags << m.childNodes().item(0).toElement().text(); 0244 } 0245 0246 this->responses << PULPO::RESPONSE{PULPO_CONTEXT::TAG, albumTags}; 0247 0248 if (this->request.info.size() == 1) 0249 break; 0250 else 0251 continue; 0252 0253 } else 0254 continue; 0255 } 0256 } 0257 } 0258 0259 emit this->responseReady(this->request, this->responses); 0260 } 0261 0262 // void lastfm::parseTrack(const QByteArray &array) 0263 //{ 0264 // QJsonParseError jsonParseError; 0265 // QJsonDocument jsonResponse = QJsonDocument::fromJson(static_cast<QString>(array).toUtf8(), &jsonParseError); 0266 0267 // if (jsonParseError.error != QJsonParseError::NoError) 0268 // return false; 0269 0270 // if (!jsonResponse.isObject()) 0271 // return false; 0272 0273 // QJsonObject mainJsonObject(jsonResponse.object()); 0274 // auto data = mainJsonObject.toVariantMap(); 0275 // auto itemMap = data.value("track").toMap(); 0276 0277 // if(itemMap.isEmpty()) return false; 0278 0279 // if(this->info == INFO::TAGS || this->info == INFO::ALL) 0280 //{ 0281 0282 // auto listeners = itemMap.value("listeners").toString(); 0283 // auto playcount = itemMap.value("playcount").toString(); 0284 // QStringList stats = {listeners,playcount}; 0285 0286 // QStringList tags; 0287 // for(auto tag : itemMap.value("toptags").toMap().value("tag").toList()) 0288 // tags<<tag.toMap().value("name").toString(); 0289 0290 // PULPO::VALUE contexts = {{ CONTEXT::TRACK_STAT,stats},{ CONTEXT::TAG,tags}}; 0291 0292 // emit this->infoReady(this->track, this->packResponse(ONTOLOGY::TRACK, INFO::TAGS, contexts)); 0293 0294 // if(this->info == INFO::TAGS ) return true; 0295 //} 0296 0297 // if(this->info == INFO::METADATA || this->info == INFO::ALL) 0298 //{ 0299 // auto albumTitle = itemMap.value("album").toMap().value("title").toString(); 0300 // auto trackNumber = itemMap.value("album").toMap().value("@attr").toMap().value("position").toString(); 0301 0302 // emit this->infoReady(this->track, this->packResponse(ONTOLOGY::TRACK, INFO::METADATA, {{CONTEXT::TRACK_NUMBER,trackNumber}, {CONTEXT::ALBUM_TITLE,albumTitle}})); 0303 0304 // if(this->info == INFO::METADATA ) return true; 0305 //} 0306 0307 // if(this->info == INFO::WIKI || this->info == INFO::ALL) 0308 //{ 0309 // auto wiki = itemMap.value("wiki").toMap().value("content").toString(); 0310 // emit this->infoReady(this->track, this->packResponse(ONTOLOGY::TRACK, INFO::WIKI, CONTEXT::WIKI,wiki)); 0311 // if(wiki.isEmpty() && this->info == INFO::WIKI) return false; 0312 //} 0313 0314 // if(this->info == INFO::ARTWORK || this->info == INFO::ALL) 0315 //{ 0316 // auto images = itemMap.value("album").toMap().value("image").toList(); 0317 0318 // QString artwork; 0319 0320 // for(auto image : images) 0321 // if(image.toMap().value("size").toString()=="extralarge") 0322 // artwork = image.toMap().value("#text").toString(); 0323 0324 // emit this->infoReady(this->track, this->packResponse(ONTOLOGY::TRACK, INFO::ARTWORK, CONTEXT::IMAGE,this->startConnection(artwork))); 0325 // if(artwork.isEmpty() && this->info == INFO::ARTWORK) return false; 0326 //} 0327 0328 // return false; 0329 //} 0330 0331 // void lastfm::parseSimilar() 0332 //{ 0333 0334 // QJsonParseError jsonParseError; 0335 // QJsonDocument jsonResponse = QJsonDocument::fromJson(static_cast<QString>(array).toUtf8(), &jsonParseError); 0336 0337 // if (jsonParseError.error != QJsonParseError::NoError) 0338 // return false; 0339 0340 // if (!jsonResponse.isObject()) 0341 // return false; 0342 0343 // QJsonObject mainJsonObject(jsonResponse.object()); 0344 // auto data = mainJsonObject.toVariantMap(); 0345 // auto itemMap = data.value("similarartists").toMap().value("artist"); 0346 0347 // if(itemMap.isNull()) return false; 0348 0349 // QList<QVariant> items = itemMap.toList(); 0350 0351 // if(items.isEmpty()) return false; 0352 0353 // if(this->info == INFO::TAGS || this->info == INFO::ALL) 0354 //{ 0355 // QStringList artistSimilar; 0356 0357 // for(auto item : items) 0358 // artistSimilar<<item.toMap().value("name").toString(); 0359 0360 // emit this->infoReady(this->track, this->packResponse(ONTOLOGY::ARTIST, INFO::TAGS, CONTEXT::ARTIST_SIMILAR,artistSimilar)); 0361 0362 // if(this->info == INFO::TAGS && !artistSimilar.isEmpty() ) return true; 0363 //} 0364 0365 // return false; 0366 //}