File indexing completed on 2024-06-02 04:50:52
0001 #include "artworkprovider.h" 0002 #include "../../utils/bae.h" 0003 #include "taginfo.h" 0004 #include "vvave.h" 0005 #include <MauiKit3/FileBrowsing/downloader.h> 0006 #include <QImage> 0007 0008 AsyncImageResponse::AsyncImageResponse(const QString &id, const QSize &requestedSize) 0009 : m_id(id) 0010 , m_requestedSize(requestedSize) 0011 { 0012 auto parts = id.split(":"); 0013 0014 if (parts.isEmpty()) { 0015 m_image = QImage(":/assets/cover.png"); 0016 Q_EMIT this->finished(); 0017 return; 0018 } 0019 0020 auto type = parts[0]; 0021 0022 QString artist, album; 0023 0024 if (parts.length() >= 2) 0025 artist = parts[1]; 0026 0027 if (parts.length() >= 3) 0028 album = parts[2]; 0029 0030 FMH::MODEL_KEY m_type = FMH::MODEL_KEY::ID; 0031 if (type == "artist") { 0032 m_type = FMH::MODEL_KEY::ARTIST; 0033 } else { 0034 m_type = FMH::MODEL_KEY::ALBUM; 0035 } 0036 0037 FMH::MODEL data = {{FMH::MODEL_KEY::ARTIST, artist}, {FMH::MODEL_KEY::ALBUM, album}}; 0038 0039 if (BAE::artworkCache(data, m_type)) { 0040 qDebug() << "ARTWORK CACHED" << album << artist; 0041 m_image = QImage(QUrl(data[FMH::MODEL_KEY::ARTWORK]).toLocalFile()); 0042 Q_EMIT this->finished(); 0043 } else if (vvave::instance()->fetchArtwork()) { 0044 auto m_artworkFetcher = new ArtworkFetcher; 0045 connect(m_artworkFetcher, &ArtworkFetcher::finished, m_artworkFetcher, &ArtworkFetcher::deleteLater); 0046 0047 connect(m_artworkFetcher, &ArtworkFetcher::artworkReady, [this, m_artworkFetcher](QUrl url) { 0048 qDebug() << "FILE ARTWORK READY" << url; 0049 if (url.isEmpty() || !url.isLocalFile()) { 0050 m_image = QImage(":/assets/cover.png"); 0051 } else { 0052 this->m_image = QImage(url.toLocalFile()); 0053 } 0054 0055 Q_EMIT this->finished(); 0056 m_artworkFetcher->deleteLater(); 0057 }); 0058 0059 m_artworkFetcher->fetch(data, m_type == FMH::MODEL_KEY::ALBUM ? PULPO::ONTOLOGY::ALBUM : PULPO::ONTOLOGY::ARTIST); 0060 } else { 0061 m_image = QImage(":/assets/cover.png"); 0062 Q_EMIT this->finished(); 0063 } 0064 } 0065 0066 QQuickTextureFactory *AsyncImageResponse::textureFactory() const 0067 { 0068 return QQuickTextureFactory::textureFactoryForImage(m_image); 0069 } 0070 0071 QQuickImageResponse *ArtworkProvider::requestImageResponse(const QString &id, const QSize &requestedSize) 0072 { 0073 AsyncImageResponse *response = new AsyncImageResponse(id, requestedSize); 0074 return response; 0075 } 0076 0077 void ArtworkFetcher::fetch(FMH::MODEL data, PULPO::ONTOLOGY ontology) 0078 { 0079 qDebug() << "FETCHING ARTWORKS FROM THREAD"; 0080 PULPO::REQUEST request; 0081 request.track = data; 0082 request.ontology = ontology; 0083 request.services = {PULPO::SERVICES::LastFm, PULPO::SERVICES::Spotify}; 0084 request.info = {PULPO::INFO::ARTWORK}; 0085 request.callback = [&](PULPO::REQUEST request, PULPO::RESPONSES responses) { 0086 qDebug() << "DONE WITH " << request.track; 0087 0088 for (const auto &res : responses) { 0089 if (res.context == PULPO::PULPO_CONTEXT::IMAGE) { 0090 auto imageUrl = res.value.toString(); 0091 0092 if (!imageUrl.isEmpty()) { 0093 auto downloader = new FMH::Downloader; 0094 QObject::connect(downloader, &FMH::Downloader::fileSaved, [&, downloader](QString path) mutable { 0095 downloader->deleteLater(); 0096 Q_EMIT this->artworkReady(QUrl::fromLocalFile(path)); 0097 }); 0098 0099 const auto format = res.value.toUrl().fileName().endsWith(".png") ? ".png" : ".jpg"; 0100 QString name = !request.track[FMH::MODEL_KEY::ALBUM].isEmpty() ? request.track[FMH::MODEL_KEY::ARTIST] + "_" + request.track[FMH::MODEL_KEY::ALBUM] : request.track[FMH::MODEL_KEY::ARTIST]; 0101 0102 BAE::fixArtworkImageFileName(name); 0103 0104 downloader->downloadFile(imageUrl, BAE::CachePath.toString() + name + format); 0105 qDebug() << "SAVING ARTWORK FOR: " << request.track[FMH::MODEL_KEY::ALBUM] << BAE::CachePath.toString() + name + format; 0106 0107 } else { 0108 Q_EMIT this->artworkReady(QUrl(":/assets/cover.png")); 0109 } 0110 } 0111 } 0112 }; 0113 0114 auto pulpo = new Pulpo; 0115 QObject::connect(pulpo, &Pulpo::finished, pulpo, &Pulpo::deleteLater); 0116 QObject::connect(pulpo, &Pulpo::error, [this, pulpo]() { 0117 Q_EMIT this->artworkReady(QUrl(":/assets/cover.png")); 0118 pulpo->deleteLater(); 0119 }); 0120 0121 pulpo->request(request); 0122 }