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"