File indexing completed on 2024-04-21 04:49:07

0001 /*
0002  * SPDX-FileCopyrightText: 2021 George Florea Bănuș <georgefb899@gmail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 #include "thumbnailimageprovider.h"
0008 
0009 #include "application.h"
0010 #include "worker.h"
0011 
0012 #include <QFile>
0013 #include <QIcon>
0014 
0015 ThumbnailImageProvider::ThumbnailImageProvider()
0016 {
0017 }
0018 
0019 QQuickImageResponse *ThumbnailImageProvider::requestImageResponse(const QString &id, const QSize &requestedSize)
0020 {
0021     auto response = new ThumbnailResponse(id, requestedSize);
0022     return response;
0023 }
0024 
0025 ThumbnailResponse::ThumbnailResponse(const QString &id, const QSize &requestedSize)
0026 {
0027     connect(
0028         Worker::instance(),
0029         &Worker::thumbnailSuccess,
0030         this,
0031         [=](const QString &path, const QImage &image) {
0032             if (path == QUrl::fromUserInput(id).toLocalFile()) {
0033                 m_texture = QQuickTextureFactory::textureFactoryForImage(image);
0034                 Q_EMIT finished();
0035             }
0036         },
0037         Qt::QueuedConnection);
0038 
0039     connect(
0040         Worker::instance(),
0041         &Worker::thumbnailFail,
0042         this,
0043         [=]() {
0044             auto url = QUrl::fromUserInput(id);
0045             if (url.scheme() != QStringLiteral("file")) {
0046                 return;
0047             }
0048             QString mimeType = Application::mimeType(url);
0049             QString iconName;
0050             if (mimeType.startsWith(QStringLiteral("video/"))) {
0051                 iconName = QStringLiteral("video-x-generic");
0052             } else if (mimeType.startsWith(QStringLiteral("audio/"))) {
0053                 iconName = QStringLiteral("audio-x-generic");
0054             } else {
0055                 return;
0056             }
0057             auto icon = QIcon::fromTheme(iconName).pixmap(requestedSize);
0058             m_texture = QQuickTextureFactory::textureFactoryForImage(icon.toImage());
0059 
0060             Q_EMIT finished();
0061         },
0062         Qt::QueuedConnection);
0063     getPreview(id, requestedSize);
0064 }
0065 
0066 void ThumbnailResponse::getPreview(const QString &id, const QSize &requestedSize)
0067 {
0068     auto url = QUrl::fromUserInput(id);
0069     if (QFile(url.toLocalFile()).exists()) {
0070         Worker::instance()->makePlaylistThumbnail(url.toLocalFile(), requestedSize.width());
0071     }
0072 
0073     if (url.scheme() == QStringLiteral("http") || url.scheme() == QStringLiteral("https")) {
0074         auto icon = QIcon::fromTheme(QStringLiteral("im-youtube"), QIcon::fromTheme(QStringLiteral("video-x-generic")));
0075         m_texture = QQuickTextureFactory::textureFactoryForImage(icon.pixmap(requestedSize).toImage());
0076         Q_EMIT finished();
0077     }
0078 }
0079 
0080 QQuickTextureFactory *ThumbnailResponse::textureFactory() const
0081 {
0082     return m_texture;
0083 }