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 //}