8 #include "libmythbase/mythversion.h"
31 qRegisterMetaType<V2VideoMetadataInfo*>(
"V2VideoMetadataInfo");
32 qRegisterMetaType<V2VideoMetadataInfoList*>(
"V2VideoMetadataInfoList");
33 qRegisterMetaType<V2VideoLookupList*>(
"V2VideoLookupList");
34 qRegisterMetaType<V2BlurayInfo*>(
"V2BlurayInfo");
35 qRegisterMetaType<V2VideoStreamInfoList*>(
"V2VideoStreamInfoList");
36 qRegisterMetaType<V2VideoStreamInfo*>(
"V2VideoStreamInfo");
37 qRegisterMetaType<V2ArtworkInfoList*>(
"V2ArtworkInfoList");
38 qRegisterMetaType<V2ArtworkInfo*>(
"V2ArtworkInfo");
39 qRegisterMetaType<V2CastMemberList*>(
"V2CastMemberList");
40 qRegisterMetaType<V2CastMember*>(
"V2CastMember");
41 qRegisterMetaType<V2GenreList*>(
"V2GenreList");
42 qRegisterMetaType<V2Genre*>(
"V2Genre");
43 qRegisterMetaType<V2VideoLookupList*>(
"V2VideoLookupList");
44 qRegisterMetaType<V2VideoLookup*>(
"V2VideoLookup");
45 qRegisterMetaType<V2ArtworkItem*>(
"V2ArtworkItem");
46 qRegisterMetaType<V2CutList*>(
"V2CutList");
47 qRegisterMetaType<V2Cutting*>(
"V2Cutting");
61 throw( QString(
"No metadata found for selected ID!." ));
67 return pVideoMetadataInfo;
75 mlm->setList(videolist);
79 throw( QString(
"No metadata found for selected filename!." ));
85 return pVideoMetadataInfo;
97 query.
prepare(
"SELECT filename "
99 "WHERE intid = :ID ");
111 fileName = query.
value(0).toString();
114 LOG(VB_GENERAL, LOG_ERR, QString(
"V2Video/GetSavedBookmark Video id %1 Not found.").arg(Id));
144 query.
prepare(
"SELECT filename "
145 "FROM videometadata "
146 "WHERE intid = :ID ");
158 fileName = query.
value(0).toString();
161 LOG(VB_GENERAL, LOG_ERR, QString(
"V2Video/GetLastPlayPos Video id %1 Not found.").arg(Id));
190 QString fields =
"title,director,studio,plot,rating,year,releasedate,"
191 "userrating,length,playcount,filename,hash,showlevel,"
192 "coverfile,inetref,collectionref,homepage,childid,browse,watched,"
193 "playcommand,category,intid,trailer,screenshot,banner,fanart,"
194 "subtitle,tagline,season,episode,host,insertdate,processed,contenttype";
196 QStringList sortFields = fields.split(
',');
201 if (!Folder.isEmpty())
202 sql.append(
" WHERE filename LIKE '" + Folder +
"%'");
203 sql.append(
" ORDER BY ");
204 QString sort = Sort.toLower();
206 sql.append(
"insertdate");
207 else if (sort ==
"released")
208 sql.append(
"releasedate");
209 else if (sortFields.contains(sort))
218 std::vector<VideoMetadataListManager::VideoMetadataPtr> videos(videolist.begin(), videolist.end());
226 nStartIndex = (nStartIndex > 0) ? std::min( nStartIndex, (
int)videos.size() ) : 0;
227 nCount = (nCount > 0) ? std::min( nCount, (
int)videos.size() ) : videos.size();
228 int nEndIndex = std::min((nStartIndex + nCount), (
int)videos.size() );
230 for(
int n = nStartIndex; n < nEndIndex; n++ )
245 totalPages = (int)ceil((
float)videos.size() / nCount);
251 curPage = (int)ceil((
float)nStartIndex / nCount) + 1;
254 pVideoMetadataInfos->setStartIndex ( nStartIndex );
255 pVideoMetadataInfos->setCount ( nCount );
256 pVideoMetadataInfos->setCurrentPage ( curPage );
257 pVideoMetadataInfos->setTotalPages ( totalPages );
258 pVideoMetadataInfos->setTotalAvailable( videos.size() );
260 pVideoMetadataInfos->setVersion ( MYTH_BINARY_VERSION );
261 pVideoMetadataInfos->setProtoVer ( MYTH_PROTO_VERSION );
263 return pVideoMetadataInfos;
268 const QString &Subtitle,
269 const QString &Inetref,
283 list = factory->SynchronousLookup(Title, Subtitle,
284 Inetref, Season, Episode,
289 return pVideoLookups;
293 for(
const auto & lookup : qAsConst(list))
295 V2VideoLookup *pVideoLookup = pVideoLookups->AddNewVideoLookup();
299 pVideoLookup->setTitle(lookup->GetTitle());
300 pVideoLookup->setSubTitle(lookup->GetSubtitle());
301 pVideoLookup->setSeason(lookup->GetSeason());
302 pVideoLookup->setEpisode(lookup->GetEpisode());
303 pVideoLookup->setYear(lookup->GetYear());
304 pVideoLookup->setTagline(lookup->GetTagline());
305 pVideoLookup->setDescription(lookup->GetDescription());
306 pVideoLookup->setCertification(lookup->GetCertification());
307 pVideoLookup->setInetref(lookup->GetInetref());
308 pVideoLookup->setCollectionref(lookup->GetCollectionref());
309 pVideoLookup->setHomePage(lookup->GetHomepage());
310 pVideoLookup->setReleaseDate(
311 QDateTime(lookup->GetReleaseDate(),
312 QTime(0,0),Qt::LocalTime).toUTC());
313 pVideoLookup->setUserRating(lookup->GetUserRating());
314 pVideoLookup->setLength(lookup->GetRuntime().count());
315 pVideoLookup->setLanguage(lookup->GetLanguage());
316 pVideoLookup->setCountries(lookup->GetCountries());
317 pVideoLookup->setPopularity(lookup->GetPopularity());
318 pVideoLookup->setBudget(lookup->GetBudget());
319 pVideoLookup->setRevenue(lookup->GetRevenue());
320 pVideoLookup->setIMDB(lookup->GetIMDB());
321 pVideoLookup->setTMSRef(lookup->GetTMSref());
324 ArtworkList::iterator c;
325 for (c = coverartlist.begin(); c != coverartlist.end(); ++c)
328 art->setType(
"coverart");
329 art->setUrl((*c).url);
330 art->setThumbnail((*c).thumbnail);
331 art->setWidth((*c).width);
332 art->setHeight((*c).height);
335 ArtworkList::iterator f;
336 for (f = fanartlist.begin(); f != fanartlist.end(); ++f)
339 art->setType(
"fanart");
340 art->setUrl((*f).url);
341 art->setThumbnail((*f).thumbnail);
342 art->setWidth((*f).width);
343 art->setHeight((*f).height);
346 ArtworkList::iterator b;
347 for (b = bannerlist.begin(); b != bannerlist.end(); ++b)
350 art->setType(
"banner");
351 art->setUrl((*b).url);
352 art->setThumbnail((*b).thumbnail);
353 art->setWidth((*b).width);
354 art->setHeight((*b).height);
357 ArtworkList::iterator s;
358 for (s = screenshotlist.begin(); s != screenshotlist.end(); ++s)
361 art->setType(
"screenshot");
362 art->setUrl((*s).url);
363 art->setThumbnail((*s).thumbnail);
364 art->setWidth((*s).width);
365 art->setHeight((*s).height);
370 pVideoLookups->setCount ( list.count() );
372 pVideoLookups->setVersion ( MYTH_BINARY_VERSION );
373 pVideoLookups->setProtoVer ( MYTH_PROTO_VERSION );
377 return pVideoLookups;
383 bool bResult =
false;
388 mlm->setList(videolist);
392 bResult = metadata->DeleteFromDatabase();
398 const QString &sHostName )
400 if ( sHostName.isEmpty() )
401 throw( QString(
"Host not provided! Local storage is deprecated and "
402 "is not supported by the API." ));
404 if ( sFileName.isEmpty() ||
405 (sFileName.contains(
"/../")) ||
406 (sFileName.startsWith(
"../")) )
408 throw( QString(
"Filename not provided, or fails sanity checks!" ));
413 QString fullname = sgroup.
FindFile(sFileName);
415 if ( !QFile::exists(fullname) )
416 throw( QString(
"Provided filename does not exist!" ));
422 LOG(VB_GENERAL, LOG_ERR,
"Video Hash Failed. Unless this is a DVD or "
423 "Blu-ray, something has probably gone wrong.");
433 QString(), QString(), QString(), QString(),
459 mlm->setList(videolist);
465 metadata->SetWatched(bWatched);
466 metadata->UpdateDatabase();
472 const QString &sTitle,
473 const QString &sSubTitle,
474 const QString &sTagLine,
475 const QString &sDirector,
476 const QString &sStudio,
477 const QString &sPlot,
478 const QString &sRating,
479 const QString &sInetref,
481 const QString &sHomePage,
490 const QString &sFileName,
491 const QString &sHash,
492 const QString &sCoverFile,
497 const QString &sPlayCommand,
499 const QString &sTrailer,
500 const QString &sHost,
501 const QString &sScreenshot,
502 const QString &sBanner,
503 const QString &sFanart,
505 const QString &sContentType,
506 const QString &sGenres,
507 const QString &sCast,
508 const QString &sCountries)
510 bool update_required =
false;
514 mlm->setList(videolist);
519 LOG(VB_GENERAL, LOG_ERR, QString(
"UpdateVideoMetadata: Id=%1 not found")
526 metadata->SetTitle(sTitle);
527 update_required =
true;
532 metadata->SetSubtitle(sSubTitle);
533 update_required =
true;
538 metadata->SetTagline(sTagLine);
539 update_required =
true;
544 metadata->SetDirector(sDirector);
545 update_required =
true;
550 metadata->SetStudio(sStudio);
551 update_required =
true;
556 metadata->SetPlot(sPlot);
557 update_required =
true;
562 metadata->SetUserRating(fUserRating);
563 update_required =
true;
568 metadata->SetInetRef(sInetref);
569 update_required =
true;
574 metadata->SetCollectionRef(nCollectionRef);
575 update_required =
true;
580 metadata->SetHomepage(sHomePage);
581 update_required =
true;
586 metadata->SetYear(nYear);
587 update_required =
true;
592 metadata->SetReleaseDate(sReleasedate);
593 update_required =
true;
598 metadata->SetRating(sRating);
599 update_required =
true;
604 metadata->SetLength(std::chrono::minutes(nLength));
605 update_required =
true;
610 metadata->SetPlayCount(nPlayCount);
611 update_required =
true;
616 metadata->SetSeason(nSeason);
617 update_required =
true;
622 metadata->SetEpisode(nEpisode);
623 update_required =
true;
629 update_required =
true;
634 metadata->SetFilename(sFileName);
635 update_required =
true;
640 metadata->SetHash(sHash);
641 update_required =
true;
646 metadata->SetCoverFile(sCoverFile);
647 update_required =
true;
652 metadata->SetChildID(nChildID);
653 update_required =
true;
658 metadata->SetBrowse(bBrowse);
659 update_required =
true;
664 metadata->SetWatched(bWatched);
665 update_required =
true;
670 metadata->SetProcessed(bProcessed);
671 update_required =
true;
676 metadata->SetPlayCommand(sPlayCommand);
677 update_required =
true;
682 metadata->SetCategoryID(nCategory);
683 update_required =
true;
688 metadata->SetTrailer(sTrailer);
689 update_required =
true;
694 metadata->SetHost(sHost);
695 update_required =
true;
700 metadata->SetScreenshot(sScreenshot);
701 update_required =
true;
706 metadata->SetBanner(sBanner);
707 update_required =
true;
712 metadata->SetFanart(sFanart);
713 update_required =
true;
718 metadata->SetInsertdate(sInsertDate);
719 update_required =
true;
726 if (sContentType ==
"MOVIE")
729 if (sContentType ==
"TELEVISION")
732 if (sContentType ==
"ADULT")
735 if (sContentType ==
"MUSICVIDEO")
738 if (sContentType ==
"HOMEVIDEO")
743 metadata->SetContentType(contentType);
744 update_required =
true;
747 LOG(VB_GENERAL, LOG_ERR, QString(
"UpdateVideoMetadata: Ignoring unknown ContentType: %1").arg(sContentType));
753 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
754 QStringList genresList = sGenres.split(
',', QString::SkipEmptyParts);
756 QStringList genresList = sGenres.split(
',', Qt::SkipEmptyParts);
759 std::transform(genresList.cbegin(), genresList.cend(), std::back_inserter(genres),
760 [](
const QString& name)
761 {return VideoMetadata::genre_list::value_type(-1, name.simplified());} );
763 metadata->SetGenres(genres);
764 update_required =
true;
770 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
771 QStringList castList = sCast.split(
',', QString::SkipEmptyParts);
773 QStringList castList = sCast.split(
',', Qt::SkipEmptyParts);
776 std::transform(castList.cbegin(), castList.cend(), std::back_inserter(cast),
777 [](
const QString& name)
778 {return VideoMetadata::cast_list::value_type(-1, name.simplified());} );
780 metadata->SetCast(cast);
781 update_required =
true;
787 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
788 QStringList countryList = sCountries.split(
',', QString::SkipEmptyParts);
790 QStringList countryList = sCountries.split(
',', Qt::SkipEmptyParts);
793 std::transform(countryList.cbegin(), countryList.cend(), std::back_inserter(countries),
794 [](
const QString& name)
795 {return VideoMetadata::country_list::value_type(-1, name.simplified());} );
797 metadata->SetCountries(countries);
798 update_required =
true;
802 metadata->UpdateDatabase();
815 query.
prepare(
"SELECT filename "
816 "FROM videometadata "
817 "WHERE intid = :ID ");
829 fileName = query.
value(0).toString();
832 LOG(VB_GENERAL, LOG_ERR, QString(
"Video/SetSavedBookmark Video id %1 Not found.").arg(Id));
862 query.
prepare(
"SELECT filename "
863 "FROM videometadata "
864 "WHERE intid = :ID ");
876 fileName = query.
value(0).toString();
879 LOG(VB_GENERAL, LOG_ERR, QString(
"Video/SetLastPlayPos Video id %1 Not found.").arg(Id));
904 QString path = sPath;
909 LOG(VB_GENERAL, LOG_NOTICE,
910 QString(
"Parsing Blu-ray at path: %1 ").arg(path));
915 throw( QString(
"Unable to open Blu-ray Metadata Parser!" ));
917 if ( !bdmeta->OpenDisc() )
918 throw( QString(
"Unable to open Blu-ray Disc/Path!" ));
920 if ( !bdmeta->ParseDisc() )
921 throw( QString(
"Unable to parse metadata from Blu-ray Disc/Path!" ));
925 pBlurayInfo->setPath(path);
926 pBlurayInfo->setTitle(bdmeta->GetTitle());
927 pBlurayInfo->setAltTitle(bdmeta->GetAlternateTitle());
928 pBlurayInfo->setDiscLang(bdmeta->GetDiscLanguage());
929 pBlurayInfo->setDiscNum(bdmeta->GetCurrentDiscNumber());
930 pBlurayInfo->setTotalDiscNum(bdmeta->GetTotalDiscNumber());
931 pBlurayInfo->setTitleCount(bdmeta->GetTitleCount());
932 pBlurayInfo->setThumbCount(bdmeta->GetThumbnailCount());
933 pBlurayInfo->setTopMenuSupported(bdmeta->GetTopMenuSupported());
934 pBlurayInfo->setFirstPlaySupported(bdmeta->GetFirstPlaySupported());
935 pBlurayInfo->setNumHDMVTitles(bdmeta->GetNumHDMVTitles());
936 pBlurayInfo->setNumBDJTitles(bdmeta->GetNumBDJTitles());
937 pBlurayInfo->setNumUnsupportedTitles(bdmeta->GetNumUnsupportedTitles());
938 pBlurayInfo->setAACSDetected(bdmeta->GetAACSDetected());
939 pBlurayInfo->setLibAACSDetected(bdmeta->GetLibAACSDetected());
940 pBlurayInfo->setAACSHandled(bdmeta->GetAACSHandled());
941 pBlurayInfo->setBDPlusDetected(bdmeta->GetBDPlusDetected());
942 pBlurayInfo->setLibBDPlusDetected(bdmeta->GetLibBDPlusDetected());
943 pBlurayInfo->setBDPlusHandled(bdmeta->GetBDPlusHandled());
945 QStringList thumbs = bdmeta->GetThumbnails();
947 pBlurayInfo->setThumbPath(thumbs.at(0));
965 (
const QString &storageGroup,
966 const QString &FileName )
972 QString sFullFileName = storage.
FindFile( FileName );
981 pVideoStreamInfos->setVersion ( MYTH_BINARY_VERSION );
982 pVideoStreamInfos->setProtoVer ( MYTH_PROTO_VERSION );
983 pVideoStreamInfos->setErrorCode ( infos.
m_errorCode );
984 pVideoStreamInfos->setErrorMsg ( infos.
m_errorMsg );
988 V2VideoStreamInfo *pVideoStreamInfo = pVideoStreamInfos->AddNewVideoStreamInfo();
989 pVideoStreamInfo->setCodecType ( QString(QChar(info.m_codecType)) );
990 pVideoStreamInfo->setCodecName ( info.m_codecName );
991 pVideoStreamInfo->setWidth ( info.m_width );
992 pVideoStreamInfo->setHeight ( info.m_height );
993 pVideoStreamInfo->setAspectRatio ( info.m_SampleAspectRatio );
994 pVideoStreamInfo->setFieldOrder ( info.m_fieldOrder );
995 pVideoStreamInfo->setFrameRate ( info.m_frameRate );
996 pVideoStreamInfo->setAvgFrameRate ( info.m_avgFrameRate );
997 pVideoStreamInfo->setChannels ( info.m_channels );
998 pVideoStreamInfo->setDuration ( info.m_duration );
1001 return pVideoStreamInfos;
1010 const QString &offsettype )
1014 query.
prepare(
"SELECT filename "
1015 "FROM videometadata "
1016 "WHERE intid = :ID ");
1022 throw QString(
"Database Error.");
1028 fileName = query.
value(0).toString();
1031 LOG(VB_GENERAL, LOG_ERR, QString(
"V2Video/GetVideoCommBreak Video id %1 Not found.").arg(Id));
1032 throw QString(
"Video Not Found.");
1053 if (offsettype.toLower() ==
"position")
1055 else if (offsettype.toLower() ==
"duration")
1071 const QString &offsettype )
1075 query.
prepare(
"SELECT filename "
1076 "FROM videometadata "
1077 "WHERE intid = :ID ");
1083 throw QString(
"Database Error.");
1089 fileName = query.
value(0).toString();
1092 LOG(VB_GENERAL, LOG_ERR, QString(
"V2Video/GetVideoCommBreak Video id %1 Not found.").arg(Id));
1093 throw QString(
"Video Not Found.");
1114 if (offsettype.toLower() ==
"position")
1116 else if (offsettype.toLower() ==
"duration")