File indexing completed on 2024-04-28 15:39:47

0001 // SPDX-FileCopyrightText: 2012-2022 The KPhotoAlbum Development Team
0002 //
0003 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 
0005 #include "HandleVideoThumbnailRequestJob.h"
0006 
0007 #include <ImageManager/ExtractOneVideoFrame.h>
0008 #include <ImageManager/ImageClientInterface.h>
0009 #include <ImageManager/ImageRequest.h>
0010 #include <MainWindow/FeatureDialog.h>
0011 #include <ThumbnailView/CellGeometry.h>
0012 #include <Utilities/ImageUtil.h>
0013 #include <kpabase/SettingsData.h>
0014 #include <kpathumbnails/ThumbnailCache.h>
0015 
0016 #include <KLocalizedString>
0017 #include <QCryptographicHash>
0018 #include <QDir>
0019 #include <QIcon>
0020 #include <QImage>
0021 
0022 namespace BackgroundJobs
0023 {
0024 
0025 HandleVideoThumbnailRequestJob::HandleVideoThumbnailRequestJob(ImageManager::ImageRequest *request, BackgroundTaskManager::Priority priority, ImageManager::ThumbnailCache *thumbnailCache)
0026     : BackgroundTaskManager::JobInterface(priority)
0027     , m_request(request)
0028     , m_thumbnailCache(thumbnailCache)
0029 {
0030 }
0031 
0032 QString HandleVideoThumbnailRequestJob::title() const
0033 {
0034     return i18n("Extract Video Thumbnail");
0035 }
0036 
0037 QString HandleVideoThumbnailRequestJob::details() const
0038 {
0039     return m_request->databaseFileName().relative();
0040 }
0041 
0042 void HandleVideoThumbnailRequestJob::execute()
0043 {
0044     QImage image(pathForRequest(m_request->fileSystemFileName()).absolute());
0045     if (!image.isNull())
0046         frameLoaded(image);
0047     else
0048         ImageManager::ExtractOneVideoFrame::extract(m_request->fileSystemFileName(), 0, this, SLOT(frameLoaded(QImage)));
0049 }
0050 
0051 void HandleVideoThumbnailRequestJob::frameLoaded(QImage image)
0052 {
0053     if (image.isNull())
0054         image = brokenImage();
0055     saveFullScaleFrame(m_request->databaseFileName(), image);
0056     sendResult(image);
0057     Q_EMIT completed();
0058 }
0059 
0060 void HandleVideoThumbnailRequestJob::saveFullScaleFrame(const DB::FileName &fileName, const QImage &image)
0061 {
0062     Utilities::saveImage(pathForRequest(fileName), image, "JPEG");
0063 }
0064 
0065 DB::FileName HandleVideoThumbnailRequestJob::pathForRequest(const DB::FileName &fileName)
0066 {
0067     QCryptographicHash md5(QCryptographicHash::Md5);
0068     md5.addData(fileName.absolute().toUtf8());
0069     return DB::FileName::fromRelativePath(QString::fromLatin1(".videoThumbnails/%2").arg(QString::fromUtf8(md5.result().toHex())));
0070 }
0071 
0072 DB::FileName HandleVideoThumbnailRequestJob::frameName(const DB::FileName &videoName, int frameNumber)
0073 {
0074     return DB::FileName::fromRelativePath(pathForRequest(videoName).relative() + QLatin1String("-") + QString::number(frameNumber));
0075 }
0076 
0077 void HandleVideoThumbnailRequestJob::removeFullScaleFrame(const DB::FileName &fileName)
0078 {
0079     QDir().remove(BackgroundJobs::HandleVideoThumbnailRequestJob::pathForRequest(fileName).absolute());
0080 }
0081 
0082 void HandleVideoThumbnailRequestJob::sendResult(QImage image)
0083 {
0084     // if ( m_request->isRequestStillValid(m_request) ) {
0085     image = image.scaled(QSize(m_request->width(), m_request->height()), Qt::KeepAspectRatio, Qt::SmoothTransformation);
0086     if (m_request->isThumbnailRequest()) {
0087         m_thumbnailCache->insert(m_request->databaseFileName(), image);
0088     }
0089     m_request->setLoadedOK(!image.isNull());
0090     m_request->client()->pixmapLoaded(m_request, image);
0091     //}
0092 }
0093 
0094 QImage HandleVideoThumbnailRequestJob::brokenImage() const
0095 {
0096     return QIcon::fromTheme(QString::fromUtf8("applications-multimedia")).pixmap(ThumbnailView::CellGeometry::preferredIconSize()).toImage();
0097 }
0098 
0099 } // namespace BackgroundJobs
0100 // vi:expandtab:tabstop=4 shiftwidth=4:
0101 
0102 #include "moc_HandleVideoThumbnailRequestJob.cpp"