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

0001 #include "deezerService.h"
0002 
0003 deezer::deezer(const FMH::MODEL &song)
0004 {
0005     this->availableInfo.insert(ONTOLOGY::ARTIST, {INFO::ARTWORK});
0006     this->availableInfo.insert(ONTOLOGY::ALBUM, {INFO::ARTWORK});
0007     this->availableInfo.insert(ONTOLOGY::TRACK, {INFO::TAGS, INFO::ARTWORK, INFO::METADATA});
0008 
0009     this->track = song;
0010 }
0011 
0012 bool deezer::setUpService(const PULPO::ONTOLOGY &ontology, const PULPO::INFO &info)
0013 {
0014     qDebug() << "setting up genius service";
0015     this->ontology = ontology;
0016     this->info = info;
0017 
0018     if (!this->availableInfo[this->ontology].contains(this->info))
0019         return false;
0020 
0021     auto url = this->API;
0022 
0023     QUrl encodedArtist(this->track[FMH::MODEL_KEY::ARTIST]);
0024     encodedArtist.toEncoded(QUrl::FullyEncoded);
0025 
0026     QUrl encodedTrack(this->track[FMH::MODEL_KEY::TITLE]);
0027     encodedTrack.toEncoded(QUrl::FullyEncoded);
0028 
0029     QUrl encodedAlbum(this->track[FMH::MODEL_KEY::ALBUM]);
0030     encodedAlbum.toEncoded(QUrl::FullyEncoded);
0031 
0032     switch (this->ontology) {
0033     case PULPO::ONTOLOGY::ARTIST: {
0034         url.append("artist:\"");
0035         url.append(encodedArtist.toString());
0036         url.append("\"");
0037 
0038         break;
0039     }
0040 
0041     case PULPO::ONTOLOGY::TRACK: {
0042         url.append("artist:\"");
0043         url.append(encodedArtist.toString());
0044         url.append("\" ");
0045 
0046         url.append("track:\"");
0047         url.append(encodedTrack.toString());
0048         url.append("\"");
0049         break;
0050     }
0051 
0052     case PULPO::ONTOLOGY::ALBUM: {
0053         url.append("artist:\"");
0054         url.append(encodedArtist.toString());
0055         url.append("\" ");
0056 
0057         url.append("album:\"");
0058         url.append(encodedAlbum.toString());
0059         url.append("\"");
0060         break;
0061     }
0062     default:
0063         return false;
0064     }
0065 
0066     url.append("&limit=10");
0067     qDebug() << "DEEZER API" << url;
0068     this->array = this->startConnection(url);
0069     if (this->array.isEmpty())
0070         return false;
0071 
0072     return this->parseArray();
0073 }
0074 
0075 bool deezer::parseArtist()
0076 {
0077     QJsonParseError jsonParseError;
0078     QJsonDocument jsonResponse = QJsonDocument::fromJson(static_cast<QString>(this->array).toUtf8(), &jsonParseError);
0079 
0080     if (jsonParseError.error != QJsonParseError::NoError)
0081         return false;
0082     if (!jsonResponse.isObject())
0083         return false;
0084 
0085     qDebug() << "parsing artist deezer";
0086 
0087     QJsonObject mainJsonObject(jsonResponse.object());
0088     auto data = mainJsonObject.toVariantMap();
0089     auto itemList = data.value("data").toList();
0090 
0091     if (itemList.isEmpty())
0092         return false;
0093 
0094     for (auto item : itemList) {
0095         auto artistMap = item.toMap().value("artist").toMap();
0096 
0097         if (this->info == INFO::ARTWORK || this->info == INFO::ALL) {
0098             if (artistMap.value("name").toString() == this->track[FMH::MODEL_KEY::ARTIST]) {
0099                 auto artwork = artistMap.value("picture_big").toString();
0100                 emit this->infoReady(this->track, this->packResponse(ONTOLOGY::ARTIST, INFO::ARTWORK, CONTEXT::IMAGE, this->startConnection(artwork)));
0101                 if (artwork.isEmpty() && this->info == INFO::ARTWORK)
0102                     return false;
0103 
0104                 return true;
0105 
0106             } else
0107                 continue;
0108         }
0109     }
0110     return false;
0111 }
0112 
0113 bool deezer::parseTrack()
0114 {
0115     QJsonParseError jsonParseError;
0116     QJsonDocument jsonResponse = QJsonDocument::fromJson(static_cast<QString>(this->array).toUtf8(), &jsonParseError);
0117 
0118     if (jsonParseError.error != QJsonParseError::NoError)
0119         return false;
0120     if (!jsonResponse.isObject())
0121         return false;
0122 
0123     QJsonObject mainJsonObject(jsonResponse.object());
0124     auto data = mainJsonObject.toVariantMap();
0125     auto itemList = data.value("data").toList();
0126 
0127     if (itemList.isEmpty())
0128         return false;
0129 
0130     for (auto item : itemList) {
0131         if (item.toMap().value("artist").toMap().value("name").toString() == this->track[FMH::MODEL_KEY::ARTIST] && item.toMap().value("title").toString() == this->track[FMH::MODEL_KEY::TITLE]) {
0132             auto albumMap = item.toMap().value("album").toMap();
0133 
0134             if (this->info == INFO::TAGS || this->info == INFO::ALL) {
0135                 auto rank = item.toMap().value("rank").toString();
0136                 emit this->infoReady(this->track, this->packResponse(ONTOLOGY::TRACK, INFO::TAGS, CONTEXT::TRACK_STAT, rank));
0137 
0138                 if (this->info == INFO::TAGS)
0139                     return true;
0140             }
0141 
0142             if (this->info == INFO::ARTWORK || this->info == INFO::ALL) {
0143                 auto image = albumMap.value("cover_big").toString();
0144 
0145                 emit this->infoReady(this->track, this->packResponse(ONTOLOGY::TRACK, INFO::ARTWORK, CONTEXT::IMAGE, this->startConnection(image)));
0146                 if (image.isEmpty() && this->info == INFO::ARTWORK)
0147                     return false;
0148             }
0149 
0150             if (this->info == INFO::METADATA || this->info == INFO::ALL) {
0151                 auto albumMap = item.toMap().value("album").toMap();
0152                 auto albumTitle = albumMap.value("title").toString();
0153 
0154                 emit this->infoReady(this->track, this->packResponse(ONTOLOGY::TRACK, INFO::METADATA, CONTEXT::ALBUM_TITLE, albumTitle));
0155 
0156                 if (albumTitle.isEmpty() && this->info == INFO::ARTWORK)
0157                     return false;
0158             }
0159 
0160             return true;
0161 
0162         } else
0163             continue;
0164     }
0165 
0166     return false;
0167 }
0168 
0169 bool deezer::parseAlbum()
0170 {
0171     QJsonParseError jsonParseError;
0172     QJsonDocument jsonResponse = QJsonDocument::fromJson(static_cast<QString>(array).toUtf8(), &jsonParseError);
0173 
0174     if (jsonParseError.error != QJsonParseError::NoError)
0175         return false;
0176 
0177     if (!jsonResponse.isObject())
0178         return false;
0179 
0180     QJsonObject mainJsonObject(jsonResponse.object());
0181     auto data = mainJsonObject.toVariantMap();
0182     auto itemList = data.value("data").toList();
0183 
0184     if (itemList.isEmpty())
0185         return false;
0186 
0187     for (auto item : itemList) {
0188         if (this->info == INFO::ARTWORK || this->info == INFO::ALL) {
0189             auto albumMap = item.toMap().value("album").toMap();
0190             auto artistMap = item.toMap().value("artist").toMap();
0191             auto album = albumMap.value("title").toString();
0192             auto artist = artistMap.value("name").toString();
0193 
0194             if (album == this->track[FMH::MODEL_KEY::ALBUM] && artist == this->track[FMH::MODEL_KEY::ARTIST]) {
0195                 auto albumArt = albumMap.value("cover_big").toString();
0196                 emit this->infoReady(this->track, this->packResponse(ONTOLOGY::ALBUM, INFO::ARTWORK, CONTEXT::IMAGE, startConnection(albumArt)));
0197 
0198                 if (this->info == INFO::ARTWORK && albumArt.isEmpty())
0199                     return false;
0200 
0201                 return true;
0202 
0203             } else
0204                 continue;
0205         }
0206     }
0207 
0208     return false;
0209 }