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 }