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 }