39 #include "libmythbase/mythversion.h"
62 QString fields =
"title,director,studio,plot,rating,year,releasedate,"
63 "userrating,length,playcount,filename,hash,showlevel,"
64 "coverfile,inetref,collectionref,homepage,childid,browse,watched,"
65 "playcommand,category,intid,trailer,screenshot,banner,fanart,"
66 "subtitle,tagline,season,episode,host,insertdate,processed,contenttype";
68 QStringList sortFields = fields.split(
',');
73 if (!Folder.isEmpty())
74 sql.append(
" WHERE filename LIKE '" + Folder +
"%'");
76 sql.append(
" ORDER BY ");
77 QString sort = Sort.toLower();
79 sql.append(
"insertdate");
80 else if (sort ==
"released")
81 sql.append(
"releasedate");
82 else if (sortFields.contains(sort))
91 std::vector<VideoMetadataListManager::VideoMetadataPtr> videos(videolist.begin(), videolist.end());
99 nStartIndex = (nStartIndex > 0) ? std::min( nStartIndex, (
int)videos.size() ) : 0;
100 nCount = (nCount > 0) ? std::min( nCount, (
int)videos.size() ) : videos.size();
101 int nEndIndex = std::min((nStartIndex + nCount), (
int)videos.size() );
103 for(
int n = nStartIndex; n < nEndIndex; n++ )
118 totalPages = (int)ceil((
float)videos.size() / nCount);
124 curPage = (int)ceil((
float)nStartIndex / nCount) + 1;
127 pVideoMetadataInfos->setStartIndex ( nStartIndex );
128 pVideoMetadataInfos->setCount ( nCount );
129 pVideoMetadataInfos->setCurrentPage ( curPage );
130 pVideoMetadataInfos->setTotalPages ( totalPages );
131 pVideoMetadataInfos->setTotalAvailable( videos.size() );
133 pVideoMetadataInfos->setVersion ( MYTH_BINARY_VERSION );
134 pVideoMetadataInfos->setProtoVer ( MYTH_PROTO_VERSION );
136 return pVideoMetadataInfos;
149 throw( QString(
"No metadata found for selected ID!." ));
155 return pVideoMetadataInfo;
167 mlm->setList(videolist);
171 throw( QString(
"No metadata found for selected filename!." ));
177 return pVideoMetadataInfo;
185 const QString &Subtitle,
186 const QString &Inetref,
200 list = factory->SynchronousLookup(Title, Subtitle,
201 Inetref, Season, Episode,
206 return pVideoLookups;
210 for(
const auto & lookup : qAsConst(list))
216 pVideoLookup->setTitle(lookup->GetTitle());
217 pVideoLookup->setSubTitle(lookup->GetSubtitle());
218 pVideoLookup->setSeason(lookup->GetSeason());
219 pVideoLookup->setEpisode(lookup->GetEpisode());
220 pVideoLookup->setYear(lookup->GetYear());
221 pVideoLookup->setTagline(lookup->GetTagline());
222 pVideoLookup->setDescription(lookup->GetDescription());
223 pVideoLookup->setCertification(lookup->GetCertification());
224 pVideoLookup->setInetref(lookup->GetInetref());
225 pVideoLookup->setCollectionref(lookup->GetCollectionref());
226 pVideoLookup->setHomePage(lookup->GetHomepage());
227 pVideoLookup->setReleaseDate(
228 QDateTime(lookup->GetReleaseDate(),
229 QTime(0,0),Qt::LocalTime).toUTC());
230 pVideoLookup->setUserRating(lookup->GetUserRating());
231 pVideoLookup->setLength(lookup->GetRuntime().count());
232 pVideoLookup->setLanguage(lookup->GetLanguage());
233 pVideoLookup->setCountries(lookup->GetCountries());
234 pVideoLookup->setPopularity(lookup->GetPopularity());
235 pVideoLookup->setBudget(lookup->GetBudget());
236 pVideoLookup->setRevenue(lookup->GetRevenue());
237 pVideoLookup->setIMDB(lookup->GetIMDB());
238 pVideoLookup->setTMSRef(lookup->GetTMSref());
241 ArtworkList::iterator c;
242 for (c = coverartlist.begin(); c != coverartlist.end(); ++c)
245 art->setType(
"coverart");
246 art->setUrl((*c).url);
247 art->setThumbnail((*c).thumbnail);
248 art->setWidth((*c).width);
249 art->setHeight((*c).height);
252 ArtworkList::iterator f;
253 for (f = fanartlist.begin(); f != fanartlist.end(); ++f)
256 art->setType(
"fanart");
257 art->setUrl((*f).url);
258 art->setThumbnail((*f).thumbnail);
259 art->setWidth((*f).width);
260 art->setHeight((*f).height);
263 ArtworkList::iterator b;
264 for (b = bannerlist.begin(); b != bannerlist.end(); ++b)
267 art->setType(
"banner");
268 art->setUrl((*b).url);
269 art->setThumbnail((*b).thumbnail);
270 art->setWidth((*b).width);
271 art->setHeight((*b).height);
274 ArtworkList::iterator s;
275 for (s = screenshotlist.begin(); s != screenshotlist.end(); ++s)
278 art->setType(
"screenshot");
279 art->setUrl((*s).url);
280 art->setThumbnail((*s).thumbnail);
281 art->setWidth((*s).width);
282 art->setHeight((*s).height);
287 pVideoLookups->setCount ( list.count() );
289 pVideoLookups->setVersion ( MYTH_BINARY_VERSION );
290 pVideoLookups->setProtoVer ( MYTH_PROTO_VERSION );
294 return pVideoLookups;
303 bool bResult =
false;
308 mlm->setList(videolist);
312 bResult = metadata->DeleteFromDatabase();
322 const QString &sHostName )
324 if ( sHostName.isEmpty() )
325 throw( QString(
"Host not provided! Local storage is deprecated and "
326 "is not supported by the API." ));
328 if ( sFileName.isEmpty() ||
329 (sFileName.contains(
"/../")) ||
330 (sFileName.startsWith(
"../")) )
332 throw( QString(
"Filename not provided, or fails sanity checks!" ));
337 QString fullname = sgroup.
FindFile(sFileName);
339 if ( !QFile::exists(fullname) )
340 throw( QString(
"Provided filename does not exist!" ));
346 LOG(VB_GENERAL, LOG_ERR,
"Video Hash Failed. Unless this is a DVD or "
347 "Blu-ray, something has probably gone wrong.");
357 QString(), QString(), QString(), QString(),
383 mlm->setList(videolist);
389 metadata->SetWatched(bWatched);
390 metadata->UpdateDatabase();
401 QString path = sPath;
406 LOG(VB_GENERAL, LOG_NOTICE,
407 QString(
"Parsing Blu-ray at path: %1 ").arg(path));
412 throw( QString(
"Unable to open Blu-ray Metadata Parser!" ));
414 if ( !bdmeta->OpenDisc() )
415 throw( QString(
"Unable to open Blu-ray Disc/Path!" ));
417 if ( !bdmeta->ParseDisc() )
418 throw( QString(
"Unable to parse metadata from Blu-ray Disc/Path!" ));
422 pBlurayInfo->setPath(path);
423 pBlurayInfo->setTitle(bdmeta->GetTitle());
424 pBlurayInfo->setAltTitle(bdmeta->GetAlternateTitle());
425 pBlurayInfo->setDiscLang(bdmeta->GetDiscLanguage());
426 pBlurayInfo->setDiscNum(bdmeta->GetCurrentDiscNumber());
427 pBlurayInfo->setTotalDiscNum(bdmeta->GetTotalDiscNumber());
428 pBlurayInfo->setTitleCount(bdmeta->GetTitleCount());
429 pBlurayInfo->setThumbCount(bdmeta->GetThumbnailCount());
430 pBlurayInfo->setTopMenuSupported(bdmeta->GetTopMenuSupported());
431 pBlurayInfo->setFirstPlaySupported(bdmeta->GetFirstPlaySupported());
432 pBlurayInfo->setNumHDMVTitles(bdmeta->GetNumHDMVTitles());
433 pBlurayInfo->setNumBDJTitles(bdmeta->GetNumBDJTitles());
434 pBlurayInfo->setNumUnsupportedTitles(bdmeta->GetNumUnsupportedTitles());
435 pBlurayInfo->setAACSDetected(bdmeta->GetAACSDetected());
436 pBlurayInfo->setLibAACSDetected(bdmeta->GetLibAACSDetected());
437 pBlurayInfo->setAACSHandled(bdmeta->GetAACSHandled());
438 pBlurayInfo->setBDPlusDetected(bdmeta->GetBDPlusDetected());
439 pBlurayInfo->setLibBDPlusDetected(bdmeta->GetLibBDPlusDetected());
440 pBlurayInfo->setBDPlusHandled(bdmeta->GetBDPlusHandled());
442 QStringList thumbs = bdmeta->GetThumbnails();
444 pBlurayInfo->setThumbPath(thumbs.at(0));
456 const QString &sTitle,
457 const QString &sSubTitle,
458 const QString &sTagLine,
459 const QString &sDirector,
460 const QString &sStudio,
461 const QString &sPlot,
462 const QString &sRating,
463 const QString &sInetref,
465 const QString &sHomePage,
467 const QDate &sReleasedate,
474 const QString &sFileName,
475 const QString &sHash,
476 const QString &sCoverFile,
481 const QString &sPlayCommand,
483 const QString &sTrailer,
484 const QString &sHost,
485 const QString &sScreenshot,
486 const QString &sBanner,
487 const QString &sFanart,
488 const QDate &sInsertDate,
489 const QString &sContentType,
490 const QString &sGenres,
491 const QString &sCast,
492 const QString &sCountries)
494 bool update_required =
false;
498 mlm->setList(videolist);
503 LOG(VB_GENERAL, LOG_ERR, QString(
"UpdateVideoMetadata: Id=%1 not found")
510 metadata->SetTitle(sTitle);
511 update_required =
true;
516 metadata->SetSubtitle(sSubTitle);
517 update_required =
true;
522 metadata->SetTagline(sTagLine);
523 update_required =
true;
528 metadata->SetDirector(sDirector);
529 update_required =
true;
534 metadata->SetStudio(sStudio);
535 update_required =
true;
540 metadata->SetPlot(sPlot);
541 update_required =
true;
546 metadata->SetUserRating(fUserRating);
547 update_required =
true;
552 metadata->SetInetRef(sInetref);
553 update_required =
true;
558 metadata->SetCollectionRef(nCollectionRef);
559 update_required =
true;
564 metadata->SetHomepage(sHomePage);
565 update_required =
true;
570 metadata->SetYear(nYear);
571 update_required =
true;
576 metadata->SetReleaseDate(sReleasedate);
577 update_required =
true;
582 metadata->SetRating(sRating);
583 update_required =
true;
588 metadata->SetLength(std::chrono::minutes(nLength));
589 update_required =
true;
594 metadata->SetPlayCount(nPlayCount);
595 update_required =
true;
600 metadata->SetSeason(nSeason);
601 update_required =
true;
606 metadata->SetEpisode(nEpisode);
607 update_required =
true;
613 update_required =
true;
618 metadata->SetFilename(sFileName);
619 update_required =
true;
624 metadata->SetHash(sHash);
625 update_required =
true;
630 metadata->SetCoverFile(sCoverFile);
631 update_required =
true;
636 metadata->SetChildID(nChildID);
637 update_required =
true;
642 metadata->SetBrowse(bBrowse);
643 update_required =
true;
648 metadata->SetWatched(bWatched);
649 update_required =
true;
654 metadata->SetProcessed(bProcessed);
655 update_required =
true;
660 metadata->SetPlayCommand(sPlayCommand);
661 update_required =
true;
666 metadata->SetCategoryID(nCategory);
667 update_required =
true;
672 metadata->SetTrailer(sTrailer);
673 update_required =
true;
678 metadata->SetHost(sHost);
679 update_required =
true;
684 metadata->SetScreenshot(sScreenshot);
685 update_required =
true;
690 metadata->SetBanner(sBanner);
691 update_required =
true;
696 metadata->SetFanart(sFanart);
697 update_required =
true;
702 metadata->SetInsertdate(sInsertDate);
703 update_required =
true;
710 if (sContentType ==
"MOVIE")
713 if (sContentType ==
"TELEVISION")
716 if (sContentType ==
"ADULT")
719 if (sContentType ==
"MUSICVIDEO")
722 if (sContentType ==
"HOMEVIDEO")
727 metadata->SetContentType(contentType);
728 update_required =
true;
731 LOG(VB_GENERAL, LOG_ERR, QString(
"UpdateVideoMetadata: Ignoring unknown ContentType: %1").arg(sContentType));
737 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
738 QStringList genresList = sGenres.split(
',', QString::SkipEmptyParts);
740 QStringList genresList = sGenres.split(
',', Qt::SkipEmptyParts);
743 std::transform(genresList.cbegin(), genresList.cend(), std::back_inserter(genres),
744 [](
const QString& name)
745 {return VideoMetadata::genre_list::value_type(-1, name.simplified());} );
747 metadata->SetGenres(genres);
748 update_required =
true;
754 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
755 QStringList castList = sCast.split(
',', QString::SkipEmptyParts);
757 QStringList castList = sCast.split(
',', Qt::SkipEmptyParts);
760 std::transform(castList.cbegin(), castList.cend(), std::back_inserter(cast),
761 [](
const QString& name)
762 {return VideoMetadata::cast_list::value_type(-1, name.simplified());} );
764 metadata->SetCast(cast);
765 update_required =
true;
771 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
772 QStringList countryList = sCountries.split(
',', QString::SkipEmptyParts);
774 QStringList countryList = sCountries.split(
',', Qt::SkipEmptyParts);
777 std::transform(countryList.cbegin(), countryList.cend(), std::back_inserter(countries),
778 [](
const QString& name)
779 {return VideoMetadata::country_list::value_type(-1, name.simplified());} );
781 metadata->SetCountries(countries);
782 update_required =
true;
786 metadata->UpdateDatabase();
801 (
const QString &storageGroup,
802 const QString &FileName )
808 QString sFullFileName = storage.
FindFile( FileName );
817 pVideoStreamInfos->setVersion ( MYTH_BINARY_VERSION );
818 pVideoStreamInfos->setProtoVer ( MYTH_PROTO_VERSION );
819 pVideoStreamInfos->setErrorCode ( infos.
m_errorCode );
820 pVideoStreamInfos->setErrorMsg ( infos.
m_errorMsg );
825 pVideoStreamInfo->setCodecType ( QString(QChar(info.m_codecType)) );
826 pVideoStreamInfo->setCodecName ( info.m_codecName );
827 pVideoStreamInfo->setWidth ( info.m_width );
828 pVideoStreamInfo->setHeight ( info.m_height );
829 pVideoStreamInfo->setAspectRatio ( info.m_SampleAspectRatio );
830 pVideoStreamInfo->setFieldOrder ( info.m_fieldOrder );
831 pVideoStreamInfo->setFrameRate ( info.m_frameRate );
832 pVideoStreamInfo->setAvgFrameRate ( info.m_avgFrameRate );
833 pVideoStreamInfo->setChannels ( info.m_channels );
834 pVideoStreamInfo->setDuration ( info.m_duration );
837 return pVideoStreamInfos;
848 query.
prepare(
"SELECT filename "
849 "FROM videometadata "
850 "WHERE intid = :ID ");
862 fileName = query.
value(0).toString();
865 LOG(VB_GENERAL, LOG_ERR, QString(
"Video/GetSavedBookmark Video id %1 Not found.").arg(Id));
895 query.
prepare(
"SELECT filename "
896 "FROM videometadata "
897 "WHERE intid = :ID ");
909 fileName = query.
value(0).toString();
912 LOG(VB_GENERAL, LOG_ERR, QString(
"Video/SetSavedBookmark Video id %1 Not found.").arg(Id));