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() );
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(
int n = 0; n < list.size(); n++ )
295 V2VideoLookup *pVideoLookup = pVideoLookups->AddNewVideoLookup();
301 pVideoLookup->setTitle(lookup->
GetTitle());
303 pVideoLookup->setSeason(lookup->
GetSeason());
304 pVideoLookup->setEpisode(lookup->
GetEpisode());
305 pVideoLookup->setYear(lookup->
GetYear());
306 pVideoLookup->setTagline(lookup->
GetTagline());
309 pVideoLookup->setInetref(lookup->
GetInetref());
312 pVideoLookup->setReleaseDate(
314 QTime(0,0),Qt::LocalTime).toUTC());
316 pVideoLookup->setLength(lookup->
GetRuntime().count());
320 pVideoLookup->setBudget(lookup->
GetBudget());
321 pVideoLookup->setRevenue(lookup->
GetRevenue());
322 pVideoLookup->setIMDB(lookup->
GetIMDB());
323 pVideoLookup->setTMSRef(lookup->
GetTMSref());
326 ArtworkList::iterator c;
327 for (c = coverartlist.begin(); c != coverartlist.end(); ++c)
330 art->setType(
"coverart");
331 art->setUrl((*c).url);
332 art->setThumbnail((*c).thumbnail);
333 art->setWidth((*c).width);
334 art->setHeight((*c).height);
337 ArtworkList::iterator f;
338 for (f = fanartlist.begin(); f != fanartlist.end(); ++f)
341 art->setType(
"fanart");
342 art->setUrl((*f).url);
343 art->setThumbnail((*f).thumbnail);
344 art->setWidth((*f).width);
345 art->setHeight((*f).height);
348 ArtworkList::iterator b;
349 for (b = bannerlist.begin(); b != bannerlist.end(); ++b)
352 art->setType(
"banner");
353 art->setUrl((*b).url);
354 art->setThumbnail((*b).thumbnail);
355 art->setWidth((*b).width);
356 art->setHeight((*b).height);
359 ArtworkList::iterator s;
360 for (s = screenshotlist.begin(); s != screenshotlist.end(); ++s)
363 art->setType(
"screenshot");
364 art->setUrl((*s).url);
365 art->setThumbnail((*s).thumbnail);
366 art->setWidth((*s).width);
367 art->setHeight((*s).height);
372 pVideoLookups->setCount ( list.count() );
379 return pVideoLookups;
385 bool bResult =
false;
390 mlm->setList(videolist);
394 bResult = metadata->DeleteFromDatabase();
400 const QString &sHostName )
402 if ( sHostName.isEmpty() )
403 throw( QString(
"Host not provided! Local storage is deprecated and "
404 "is not supported by the API." ));
406 if ( sFileName.isEmpty() ||
407 (sFileName.contains(
"/../")) ||
408 (sFileName.startsWith(
"../")) )
410 throw( QString(
"Filename not provided, or fails sanity checks!" ));
415 QString fullname = sgroup.
FindFile(sFileName);
417 if ( !QFile::exists(fullname) )
418 throw( QString(
"Provided filename does not exist!" ));
424 LOG(VB_GENERAL, LOG_ERR,
"Video Hash Failed. Unless this is a DVD or "
425 "Blu-ray, something has probably gone wrong.");
435 QString(), QString(), QString(), QString(),
461 mlm->setList(videolist);
467 metadata->SetWatched(bWatched);
468 metadata->UpdateDatabase();
474 const QString &sTitle,
475 const QString &sSubTitle,
476 const QString &sTagLine,
477 const QString &sDirector,
478 const QString &sStudio,
479 const QString &sPlot,
480 const QString &sRating,
481 const QString &sInetref,
483 const QString &sHomePage,
492 const QString &sFileName,
493 const QString &sHash,
494 const QString &sCoverFile,
499 const QString &sPlayCommand,
501 const QString &sTrailer,
502 const QString &sHost,
503 const QString &sScreenshot,
504 const QString &sBanner,
505 const QString &sFanart,
507 const QString &sContentType,
508 const QString &sGenres,
509 const QString &sCast,
510 const QString &sCountries)
512 bool update_required =
false;
516 mlm->setList(videolist);
521 LOG(VB_GENERAL, LOG_ERR, QString(
"UpdateVideoMetadata: Id=%1 not found")
528 metadata->SetTitle(sTitle);
529 update_required =
true;
534 metadata->SetSubtitle(sSubTitle);
535 update_required =
true;
540 metadata->SetTagline(sTagLine);
541 update_required =
true;
546 metadata->SetDirector(sDirector);
547 update_required =
true;
552 metadata->SetStudio(sStudio);
553 update_required =
true;
558 metadata->SetPlot(sPlot);
559 update_required =
true;
564 metadata->SetUserRating(fUserRating);
565 update_required =
true;
570 metadata->SetInetRef(sInetref);
571 update_required =
true;
576 metadata->SetCollectionRef(nCollectionRef);
577 update_required =
true;
582 metadata->SetHomepage(sHomePage);
583 update_required =
true;
588 metadata->SetYear(nYear);
589 update_required =
true;
594 metadata->SetReleaseDate(sReleasedate);
595 update_required =
true;
600 metadata->SetRating(sRating);
601 update_required =
true;
606 metadata->SetLength(std::chrono::minutes(nLength));
607 update_required =
true;
612 metadata->SetPlayCount(nPlayCount);
613 update_required =
true;
618 metadata->SetSeason(nSeason);
619 update_required =
true;
624 metadata->SetEpisode(nEpisode);
625 update_required =
true;
631 update_required =
true;
636 metadata->SetFilename(sFileName);
637 update_required =
true;
642 metadata->SetHash(sHash);
643 update_required =
true;
648 metadata->SetCoverFile(sCoverFile);
649 update_required =
true;
654 metadata->SetChildID(nChildID);
655 update_required =
true;
660 metadata->SetBrowse(bBrowse);
661 update_required =
true;
666 metadata->SetWatched(bWatched);
667 update_required =
true;
672 metadata->SetProcessed(bProcessed);
673 update_required =
true;
678 metadata->SetPlayCommand(sPlayCommand);
679 update_required =
true;
684 metadata->SetCategoryID(nCategory);
685 update_required =
true;
690 metadata->SetTrailer(sTrailer);
691 update_required =
true;
696 metadata->SetHost(sHost);
697 update_required =
true;
702 metadata->SetScreenshot(sScreenshot);
703 update_required =
true;
708 metadata->SetBanner(sBanner);
709 update_required =
true;
714 metadata->SetFanart(sFanart);
715 update_required =
true;
720 metadata->SetInsertdate(sInsertDate);
721 update_required =
true;
728 if (sContentType ==
"MOVIE")
731 if (sContentType ==
"TELEVISION")
734 if (sContentType ==
"ADULT")
737 if (sContentType ==
"MUSICVIDEO")
740 if (sContentType ==
"HOMEVIDEO")
745 metadata->SetContentType(contentType);
746 update_required =
true;
749 LOG(VB_GENERAL, LOG_ERR, QString(
"UpdateVideoMetadata: Ignoring unknown ContentType: %1").arg(sContentType));
755 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
756 QStringList genresList = sGenres.split(
',', QString::SkipEmptyParts);
758 QStringList genresList = sGenres.split(
',', Qt::SkipEmptyParts);
761 std::transform(genresList.cbegin(), genresList.cend(), std::back_inserter(genres),
762 [](
const QString& name)
763 {return VideoMetadata::genre_list::value_type(-1, name.simplified());} );
765 metadata->SetGenres(genres);
766 update_required =
true;
772 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
773 QStringList castList = sCast.split(
',', QString::SkipEmptyParts);
775 QStringList castList = sCast.split(
',', Qt::SkipEmptyParts);
778 std::transform(castList.cbegin(), castList.cend(), std::back_inserter(cast),
779 [](
const QString& name)
780 {return VideoMetadata::cast_list::value_type(-1, name.simplified());} );
782 metadata->SetCast(cast);
783 update_required =
true;
789 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
790 QStringList countryList = sCountries.split(
',', QString::SkipEmptyParts);
792 QStringList countryList = sCountries.split(
',', Qt::SkipEmptyParts);
795 std::transform(countryList.cbegin(), countryList.cend(), std::back_inserter(countries),
796 [](
const QString& name)
797 {return VideoMetadata::country_list::value_type(-1, name.simplified());} );
799 metadata->SetCountries(countries);
800 update_required =
true;
804 metadata->UpdateDatabase();
817 query.
prepare(
"SELECT filename "
818 "FROM videometadata "
819 "WHERE intid = :ID ");
831 fileName = query.
value(0).toString();
834 LOG(VB_GENERAL, LOG_ERR, QString(
"Video/SetSavedBookmark Video id %1 Not found.").arg(Id));
864 query.
prepare(
"SELECT filename "
865 "FROM videometadata "
866 "WHERE intid = :ID ");
878 fileName = query.
value(0).toString();
881 LOG(VB_GENERAL, LOG_ERR, QString(
"Video/SetLastPlayPos Video id %1 Not found.").arg(Id));
906 QString path = sPath;
911 LOG(VB_GENERAL, LOG_NOTICE,
912 QString(
"Parsing Blu-ray at path: %1 ").arg(path));
917 throw( QString(
"Unable to open Blu-ray Metadata Parser!" ));
919 if ( !bdmeta->OpenDisc() )
920 throw( QString(
"Unable to open Blu-ray Disc/Path!" ));
922 if ( !bdmeta->ParseDisc() )
923 throw( QString(
"Unable to parse metadata from Blu-ray Disc/Path!" ));
927 pBlurayInfo->setPath(path);
928 pBlurayInfo->setTitle(bdmeta->GetTitle());
929 pBlurayInfo->setAltTitle(bdmeta->GetAlternateTitle());
930 pBlurayInfo->setDiscLang(bdmeta->GetDiscLanguage());
931 pBlurayInfo->setDiscNum(bdmeta->GetCurrentDiscNumber());
932 pBlurayInfo->setTotalDiscNum(bdmeta->GetTotalDiscNumber());
933 pBlurayInfo->setTitleCount(bdmeta->GetTitleCount());
934 pBlurayInfo->setThumbCount(bdmeta->GetThumbnailCount());
935 pBlurayInfo->setTopMenuSupported(bdmeta->GetTopMenuSupported());
936 pBlurayInfo->setFirstPlaySupported(bdmeta->GetFirstPlaySupported());
937 pBlurayInfo->setNumHDMVTitles(bdmeta->GetNumHDMVTitles());
938 pBlurayInfo->setNumBDJTitles(bdmeta->GetNumBDJTitles());
939 pBlurayInfo->setNumUnsupportedTitles(bdmeta->GetNumUnsupportedTitles());
940 pBlurayInfo->setAACSDetected(bdmeta->GetAACSDetected());
941 pBlurayInfo->setLibAACSDetected(bdmeta->GetLibAACSDetected());
942 pBlurayInfo->setAACSHandled(bdmeta->GetAACSHandled());
943 pBlurayInfo->setBDPlusDetected(bdmeta->GetBDPlusDetected());
944 pBlurayInfo->setLibBDPlusDetected(bdmeta->GetLibBDPlusDetected());
945 pBlurayInfo->setBDPlusHandled(bdmeta->GetBDPlusHandled());
947 QStringList thumbs = bdmeta->GetThumbnails();
949 pBlurayInfo->setThumbPath(thumbs.at(0));
967 (
const QString &storageGroup,
968 const QString &FileName )
974 QString sFullFileName = storage.
FindFile( FileName );
985 pVideoStreamInfos->setErrorCode ( infos.
m_errorCode );
986 pVideoStreamInfos->setErrorMsg ( infos.
m_errorMsg );
990 V2VideoStreamInfo *pVideoStreamInfo = pVideoStreamInfos->AddNewVideoStreamInfo();
991 pVideoStreamInfo->setCodecType ( QString(QChar(info.m_codecType)) );
992 pVideoStreamInfo->setCodecName ( info.m_codecName );
993 pVideoStreamInfo->setWidth ( info.m_width );
994 pVideoStreamInfo->setHeight ( info.m_height );
995 pVideoStreamInfo->setAspectRatio ( info.m_SampleAspectRatio );
996 pVideoStreamInfo->setFieldOrder ( info.m_fieldOrder );
997 pVideoStreamInfo->setFrameRate ( info.m_frameRate );
998 pVideoStreamInfo->setAvgFrameRate ( info.m_avgFrameRate );
999 pVideoStreamInfo->setChannels ( info.m_channels );
1000 pVideoStreamInfo->setDuration ( info.m_duration );
1003 return pVideoStreamInfos;
1012 const QString &offsettype )
1016 query.
prepare(
"SELECT filename "
1017 "FROM videometadata "
1018 "WHERE intid = :ID ");
1024 throw QString(
"Database Error.");
1030 fileName = query.
value(0).toString();
1033 LOG(VB_GENERAL, LOG_ERR, QString(
"V2Video/GetVideoCommBreak Video id %1 Not found.").arg(Id));
1034 throw QString(
"Video Not Found.");
1055 if (offsettype.toLower() ==
"position")
1057 else if (offsettype.toLower() ==
"duration")
1073 const QString &offsettype )
1077 query.
prepare(
"SELECT filename "
1078 "FROM videometadata "
1079 "WHERE intid = :ID ");
1085 throw QString(
"Database Error.");
1091 fileName = query.
value(0).toString();
1094 LOG(VB_GENERAL, LOG_ERR, QString(
"V2Video/GetVideoCommBreak Video id %1 Not found.").arg(Id));
1095 throw QString(
"Video Not Found.");
1116 if (offsettype.toLower() ==
"position")
1118 else if (offsettype.toLower() ==
"duration")