32 #include <QImageWriter>
69 qRegisterMetaType<V2ArtworkInfoList*>(
"V2ArtworkInfoList");
70 qRegisterMetaType<V2ArtworkInfo*>(
"V2ArtworkInfo");
82 const QString &sFileName )
84 QString sGroup = sStorageGroup;
88 LOG(VB_UPNP, LOG_WARNING,
89 "GetFile - StorageGroup missing... using 'Default'");
93 if (sFileName.isEmpty())
95 QString sMsg (
"GetFile - FileName missing." );
107 QString sFullFileName = storage.
FindFile( sFileName );
109 if (sFullFileName.isEmpty())
111 LOG(VB_UPNP, LOG_ERR,
112 QString(
"GetFile - Unable to find %1.").arg(sFileName));
123 return QFileInfo( sFullFileName );
126 LOG(VB_UPNP, LOG_ERR,
127 QString(
"GetFile - File Does not exist %1.").arg(sFullFileName));
137 const QString &sFileName,
141 QString sGroup = sStorageGroup;
143 if (sGroup.isEmpty())
145 LOG(VB_UPNP, LOG_WARNING,
146 "GetImageFile - StorageGroup missing... using 'Default'");
150 if (sFileName.isEmpty())
152 QString sMsg (
"GetImageFile - FileName missing." );
164 QString sFullFileName = storage.
FindFile( sFileName );
166 if (sFullFileName.isEmpty())
168 LOG(VB_UPNP, LOG_WARNING,
169 QString(
"GetImageFile - Unable to find %1.").arg(sFileName));
180 LOG(VB_UPNP, LOG_WARNING,
181 QString(
"GetImageFile - File Does not exist %1.").arg(sFullFileName));
188 if ((nWidth == 0) && (nHeight == 0))
189 return QFileInfo( sFullFileName );
194 QString sNewFileName = QString(
"%1.%2x%3.jpg" )
195 .arg( sFullFileName )
204 return QFileInfo( sNewFileName );
210 auto *pImage =
new QImage( sFullFileName );
212 if (!pImage || pImage->isNull())
215 float fAspect = (float)(pImage->width()) / pImage->height();
218 nWidth = (int)std::rint(nHeight * fAspect);
221 nHeight = (int)std::rint(nWidth / fAspect);
223 QImage img = pImage->scaled( nWidth, nHeight, Qt::KeepAspectRatio,
224 Qt::SmoothTransformation);
226 QByteArray fname = sNewFileName.toLatin1();
227 img.save( fname.constData(),
"JPG", 60 );
231 return QFileInfo( sNewFileName );
241 if (sStorageGroup.isEmpty())
243 QString sMsg(
"GetDirList - StorageGroup missing.");
244 LOG(VB_UPNP, LOG_ERR, sMsg);
261 if (sStorageGroup.isEmpty())
263 QString sMsg(
"GetFileList - StorageGroup missing.");
264 LOG(VB_UPNP, LOG_ERR, sMsg);
279 const QString &sInetref,
292 if (sType.toLower() ==
"coverart")
297 else if (sType.toLower() ==
"fanart")
302 else if (sType.toLower() ==
"banner")
308 if (!map.contains(
type))
311 QUrl url(map.value(
type).url);
312 QString sFileName = url.path();
314 if (sFileName.isEmpty())
317 return GetImageFile( sgroup, sFileName, nWidth, nHeight);
326 const QDateTime &StartTime)
328 if ((RecordedId <= 0) &&
329 (chanid <= 0 || !StartTime.isValid()))
330 throw QString(
"Recorded ID or Channel ID and StartTime appears invalid.");
357 int nId,
int nWidth,
int nHeight )
359 LOG(VB_UPNP, LOG_INFO, QString(
"GetVideoArtwork ID = %1").arg(nId));
361 QString sgroup =
"Coverart";
362 QString column =
"coverfile";
364 if (sType.toLower() ==
"coverart")
367 column =
"coverfile";
369 else if (sType.toLower() ==
"fanart")
374 else if (sType.toLower() ==
"banner")
379 else if (sType.toLower() ==
"screenshot")
381 sgroup =
"Screenshots";
382 column =
"screenshot";
391 QString querystr = QString(
"SELECT %1 FROM videometadata WHERE "
392 "intid = :ITEMID").arg(column);
403 QString sFileName = query.
value(0).toString();
405 if (sFileName.isEmpty())
408 return GetImageFile( sgroup, sFileName, nWidth, nHeight );
427 LOG(VB_GENERAL, LOG_DEBUG, QString(
"GetAlbumArt: %1").arg(sFullFileName));
434 QString sNewFileName = QString(
"/tmp/%1.%2x%3.jpg" )
435 .arg( QFileInfo(sFullFileName).fileName() )
444 return QFileInfo( sNewFileName );
452 if (sFullFileName.startsWith(
"myth://"))
454 RemoteFile rf(sFullFileName,
false,
false, 0s);
458 img.loadFromData(data);
462 img.load(sFullFileName);
470 if ((nWidth == 0) && (nHeight == 0))
472 if (!sFullFileName.startsWith(
"myth://"))
474 QFileInfo fi(sFullFileName);
475 if (fi.suffix().toLower() ==
"jpg")
479 else if (nWidth > img.width() && nHeight > img.height())
489 float fAspect = (float)(img.width()) / img.height();
491 if ( nWidth == 0 || nWidth > img.width() )
492 nWidth = (
int)std::rint(nHeight * fAspect);
494 if ( nHeight == 0 || nHeight > img.height() )
495 nHeight = (int)std::rint(nWidth / fAspect);
497 img = img.scaled( nWidth, nHeight, Qt::KeepAspectRatio,
498 Qt::SmoothTransformation);
501 QString fname = sNewFileName.toLatin1().constData();
504 if (!img.save( fname,
"JPG" ))
507 return QFileInfo( sNewFileName );
516 const QDateTime &StartTime,
520 const QString &sFormat )
522 if ((nRecordedId <= 0) &&
523 (nChanId <= 0 || !StartTime.isValid()))
524 throw QString(
"Recorded ID or Channel ID and StartTime appears invalid.");
526 if (!sFormat.isEmpty()
527 && !QImageWriter::supportedImageFormats().contains(sFormat.toLower().toLocal8Bit()))
529 throw QString(
"GetPreviewImage: Specified 'Format' is not supported.");
545 LOG(VB_GENERAL, LOG_ERR,
546 QString(
"GetPreviewImage: No recording for '%1'")
555 QString(
"GetPreviewImage: Wrong Host '%1' request from '%2'")
559 LOG(VB_UPNP, LOG_ERR, sMsg);
564 QString sImageFormat = sFormat;
565 if (sImageFormat.isEmpty())
566 sImageFormat =
"PNG";
574 QString sPreviewFileName;
576 auto nSecs = std::chrono::seconds(nSecsIn);
580 sPreviewFileName = QString(
"%1.png").arg(sFileName);
584 sPreviewFileName = QString(
"%1.%2.png").arg(sFileName).arg(nSecsIn);
592 if (!pginfo.
IsLocal() && sFileName.startsWith(
"/"))
600 previewgen->SetPreviewTimeAsSeconds( nSecs );
601 previewgen->SetOutputFilename ( sPreviewFileName );
603 bool ok = previewgen->Run();
605 previewgen->deleteLater();
611 bool bDefaultPixmap = (nWidth == 0) && (nHeight == 0);
613 QString sNewFileName;
616 sNewFileName = sPreviewFileName;
619 sNewFileName = QString(
"%1.%2.%3x%4.%5" )
622 .arg( nWidth == 0 ? -1 : nWidth )
623 .arg( nHeight == 0 ? -1 : nHeight )
624 .arg( sImageFormat.toLower() );
632 if (QFileInfo(sPreviewFileName).lastModified() <=
633 QFileInfo(sNewFileName).lastModified())
634 return QFileInfo( sNewFileName );
637 QImage image = QImage(sPreviewFileName);
645 image = image.scaledToHeight(nHeight, Qt::SmoothTransformation);
646 else if ( nHeight <= 0 )
647 image = image.scaledToWidth(nWidth, Qt::SmoothTransformation);
649 image = image.scaled(nWidth, nHeight, Qt::IgnoreAspectRatio,
650 Qt::SmoothTransformation);
652 image.save(sNewFileName, sImageFormat.toUpper().toLocal8Bit());
658 LOG(VB_GENERAL, LOG_ERR,
"Unable to change permissions on "
659 "preview image. Backends and frontends "
660 "running under different users will be "
661 "unable to access it");
666 return QFileInfo( sNewFileName );
670 previewgen->SetPreviewTimeAsSeconds( nSecs );
671 previewgen->SetOutputFilename ( sNewFileName );
672 previewgen->SetOutputSize (QSize(nWidth,nHeight));
674 bool ok = previewgen->Run();
676 previewgen->deleteLater();
681 return QFileInfo( sNewFileName );
690 const QDateTime &StartTime,
691 const QString &Download )
693 if ((nRecordedId <= 0) &&
694 (nChanId <= 0 || !StartTime.isValid()))
695 throw QString(
"Recorded ID or Channel ID and StartTime appears invalid.");
710 LOG(VB_UPNP, LOG_ERR, QString(
"GetRecording - for '%1' failed")
722 QString(
"GetRecording: Wrong Host '%1' request from '%2'.")
726 LOG(VB_UPNP, LOG_ERR, sMsg);
734 m_request->m_headers->insert(
"mythtv-download",Download);
741 return QFileInfo( sFileName );
762 query.
prepare(
"SELECT CONCAT_WS('/', music_directories.path, "
763 "music_songs.filename) AS filename FROM music_songs "
764 "LEFT JOIN music_directories ON "
765 "music_songs.directory_id="
766 "music_directories.directory_id "
767 "WHERE music_songs.song_id = :KEY");
779 sFileName = query.
value(0).toString();
783 if (sFileName.isEmpty())
786 return GetFile(
"Music", sFileName );
805 query.
prepare(
"SELECT filename FROM videometadata WHERE intid = :KEY" );
815 sFileName = query.
value(0).toString();
818 if (sFileName.isEmpty())
822 return GetFile(
"Videos", sFileName );
824 return QFileInfo( sFileName );
832 const QString &sFileName )
834 if ((sFileName.isEmpty()) ||
835 (sFileName.contains(
"/../")) ||
836 (sFileName.startsWith(
"../")))
838 LOG(VB_GENERAL, LOG_ERR,
839 QString(
"ERROR checking for file, filename '%1' "
840 "fails sanity checks").arg(sFileName));
844 QString storageGroup =
"Default";
846 if (!sStorageGroup.isEmpty())
847 storageGroup = sStorageGroup;
851 QString fullname = sgroup.
FindFile(sFileName);
866 QFileInfo finfo(sURL);
867 QString
filename = finfo.fileName();
872 if (outDir.isEmpty())
874 LOG(VB_GENERAL, LOG_ERR,
875 QString(
"Unable to determine directory "
876 "to write to in %1 write command").arg(sURL));
883 LOG(VB_GENERAL, LOG_ERR,
884 QString(
"ERROR: %1 write filename '%2' does not "
885 "pass sanity checks.").arg(sURL,
filename));