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() );
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(
int n = 0; n < list.size(); n++ )
218 pVideoLookup->setTitle(lookup->
GetTitle());
220 pVideoLookup->setSeason(lookup->
GetSeason());
221 pVideoLookup->setEpisode(lookup->
GetEpisode());
222 pVideoLookup->setYear(lookup->
GetYear());
223 pVideoLookup->setTagline(lookup->
GetTagline());
226 pVideoLookup->setInetref(lookup->
GetInetref());
229 pVideoLookup->setReleaseDate(
231 QTime(0,0),Qt::LocalTime).toUTC());
233 pVideoLookup->setLength(lookup->
GetRuntime().count());
237 pVideoLookup->setBudget(lookup->
GetBudget());
238 pVideoLookup->setRevenue(lookup->
GetRevenue());
239 pVideoLookup->setIMDB(lookup->
GetIMDB());
240 pVideoLookup->setTMSRef(lookup->
GetTMSref());
243 ArtworkList::iterator c;
244 for (c = coverartlist.begin(); c != coverartlist.end(); ++c)
247 art->setType(
"coverart");
248 art->setUrl((*c).url);
249 art->setThumbnail((*c).thumbnail);
250 art->setWidth((*c).width);
251 art->setHeight((*c).height);
254 ArtworkList::iterator f;
255 for (f = fanartlist.begin(); f != fanartlist.end(); ++f)
258 art->setType(
"fanart");
259 art->setUrl((*f).url);
260 art->setThumbnail((*f).thumbnail);
261 art->setWidth((*f).width);
262 art->setHeight((*f).height);
265 ArtworkList::iterator b;
266 for (b = bannerlist.begin(); b != bannerlist.end(); ++b)
269 art->setType(
"banner");
270 art->setUrl((*b).url);
271 art->setThumbnail((*b).thumbnail);
272 art->setWidth((*b).width);
273 art->setHeight((*b).height);
276 ArtworkList::iterator s;
277 for (s = screenshotlist.begin(); s != screenshotlist.end(); ++s)
280 art->setType(
"screenshot");
281 art->setUrl((*s).url);
282 art->setThumbnail((*s).thumbnail);
283 art->setWidth((*s).width);
284 art->setHeight((*s).height);
289 pVideoLookups->setCount ( list.count() );
296 return pVideoLookups;
305 bool bResult =
false;
310 mlm->setList(videolist);
314 bResult = metadata->DeleteFromDatabase();
324 const QString &sHostName )
326 if ( sHostName.isEmpty() )
327 throw( QString(
"Host not provided! Local storage is deprecated and "
328 "is not supported by the API." ));
330 if ( sFileName.isEmpty() ||
331 (sFileName.contains(
"/../")) ||
332 (sFileName.startsWith(
"../")) )
334 throw( QString(
"Filename not provided, or fails sanity checks!" ));
339 QString fullname = sgroup.
FindFile(sFileName);
341 if ( !QFile::exists(fullname) )
342 throw( QString(
"Provided filename does not exist!" ));
348 LOG(VB_GENERAL, LOG_ERR,
"Video Hash Failed. Unless this is a DVD or "
349 "Blu-ray, something has probably gone wrong.");
359 QString(), QString(), QString(), QString(),
385 mlm->setList(videolist);
391 metadata->SetWatched(bWatched);
392 metadata->UpdateDatabase();
403 QString path = sPath;
408 LOG(VB_GENERAL, LOG_NOTICE,
409 QString(
"Parsing Blu-ray at path: %1 ").arg(path));
414 throw( QString(
"Unable to open Blu-ray Metadata Parser!" ));
416 if ( !bdmeta->OpenDisc() )
417 throw( QString(
"Unable to open Blu-ray Disc/Path!" ));
419 if ( !bdmeta->ParseDisc() )
420 throw( QString(
"Unable to parse metadata from Blu-ray Disc/Path!" ));
424 pBlurayInfo->setPath(path);
425 pBlurayInfo->setTitle(bdmeta->GetTitle());
426 pBlurayInfo->setAltTitle(bdmeta->GetAlternateTitle());
427 pBlurayInfo->setDiscLang(bdmeta->GetDiscLanguage());
428 pBlurayInfo->setDiscNum(bdmeta->GetCurrentDiscNumber());
429 pBlurayInfo->setTotalDiscNum(bdmeta->GetTotalDiscNumber());
430 pBlurayInfo->setTitleCount(bdmeta->GetTitleCount());
431 pBlurayInfo->setThumbCount(bdmeta->GetThumbnailCount());
432 pBlurayInfo->setTopMenuSupported(bdmeta->GetTopMenuSupported());
433 pBlurayInfo->setFirstPlaySupported(bdmeta->GetFirstPlaySupported());
434 pBlurayInfo->setNumHDMVTitles(bdmeta->GetNumHDMVTitles());
435 pBlurayInfo->setNumBDJTitles(bdmeta->GetNumBDJTitles());
436 pBlurayInfo->setNumUnsupportedTitles(bdmeta->GetNumUnsupportedTitles());
437 pBlurayInfo->setAACSDetected(bdmeta->GetAACSDetected());
438 pBlurayInfo->setLibAACSDetected(bdmeta->GetLibAACSDetected());
439 pBlurayInfo->setAACSHandled(bdmeta->GetAACSHandled());
440 pBlurayInfo->setBDPlusDetected(bdmeta->GetBDPlusDetected());
441 pBlurayInfo->setLibBDPlusDetected(bdmeta->GetLibBDPlusDetected());
442 pBlurayInfo->setBDPlusHandled(bdmeta->GetBDPlusHandled());
444 QStringList thumbs = bdmeta->GetThumbnails();
446 pBlurayInfo->setThumbPath(thumbs.at(0));
458 const QString &sTitle,
459 const QString &sSubTitle,
460 const QString &sTagLine,
461 const QString &sDirector,
462 const QString &sStudio,
463 const QString &sPlot,
464 const QString &sRating,
465 const QString &sInetref,
467 const QString &sHomePage,
469 const QDate &sReleasedate,
476 const QString &sFileName,
477 const QString &sHash,
478 const QString &sCoverFile,
483 const QString &sPlayCommand,
485 const QString &sTrailer,
486 const QString &sHost,
487 const QString &sScreenshot,
488 const QString &sBanner,
489 const QString &sFanart,
490 const QDate &sInsertDate,
491 const QString &sContentType,
492 const QString &sGenres,
493 const QString &sCast,
494 const QString &sCountries)
496 bool update_required =
false;
500 mlm->setList(videolist);
505 LOG(VB_GENERAL, LOG_ERR, QString(
"UpdateVideoMetadata: Id=%1 not found")
512 metadata->SetTitle(sTitle);
513 update_required =
true;
518 metadata->SetSubtitle(sSubTitle);
519 update_required =
true;
524 metadata->SetTagline(sTagLine);
525 update_required =
true;
530 metadata->SetDirector(sDirector);
531 update_required =
true;
536 metadata->SetStudio(sStudio);
537 update_required =
true;
542 metadata->SetPlot(sPlot);
543 update_required =
true;
548 metadata->SetUserRating(fUserRating);
549 update_required =
true;
554 metadata->SetInetRef(sInetref);
555 update_required =
true;
560 metadata->SetCollectionRef(nCollectionRef);
561 update_required =
true;
566 metadata->SetHomepage(sHomePage);
567 update_required =
true;
572 metadata->SetYear(nYear);
573 update_required =
true;
578 metadata->SetReleaseDate(sReleasedate);
579 update_required =
true;
584 metadata->SetRating(sRating);
585 update_required =
true;
590 metadata->SetLength(std::chrono::minutes(nLength));
591 update_required =
true;
596 metadata->SetPlayCount(nPlayCount);
597 update_required =
true;
602 metadata->SetSeason(nSeason);
603 update_required =
true;
608 metadata->SetEpisode(nEpisode);
609 update_required =
true;
615 update_required =
true;
620 metadata->SetFilename(sFileName);
621 update_required =
true;
626 metadata->SetHash(sHash);
627 update_required =
true;
632 metadata->SetCoverFile(sCoverFile);
633 update_required =
true;
638 metadata->SetChildID(nChildID);
639 update_required =
true;
644 metadata->SetBrowse(bBrowse);
645 update_required =
true;
650 metadata->SetWatched(bWatched);
651 update_required =
true;
656 metadata->SetProcessed(bProcessed);
657 update_required =
true;
662 metadata->SetPlayCommand(sPlayCommand);
663 update_required =
true;
668 metadata->SetCategoryID(nCategory);
669 update_required =
true;
674 metadata->SetTrailer(sTrailer);
675 update_required =
true;
680 metadata->SetHost(sHost);
681 update_required =
true;
686 metadata->SetScreenshot(sScreenshot);
687 update_required =
true;
692 metadata->SetBanner(sBanner);
693 update_required =
true;
698 metadata->SetFanart(sFanart);
699 update_required =
true;
704 metadata->SetInsertdate(sInsertDate);
705 update_required =
true;
712 if (sContentType ==
"MOVIE")
715 if (sContentType ==
"TELEVISION")
718 if (sContentType ==
"ADULT")
721 if (sContentType ==
"MUSICVIDEO")
724 if (sContentType ==
"HOMEVIDEO")
729 metadata->SetContentType(contentType);
730 update_required =
true;
733 LOG(VB_GENERAL, LOG_ERR, QString(
"UpdateVideoMetadata: Ignoring unknown ContentType: %1").arg(sContentType));
739 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
740 QStringList genresList = sGenres.split(
',', QString::SkipEmptyParts);
742 QStringList genresList = sGenres.split(
',', Qt::SkipEmptyParts);
745 std::transform(genresList.cbegin(), genresList.cend(), std::back_inserter(genres),
746 [](
const QString& name)
747 {return VideoMetadata::genre_list::value_type(-1, name.simplified());} );
749 metadata->SetGenres(genres);
750 update_required =
true;
756 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
757 QStringList castList = sCast.split(
',', QString::SkipEmptyParts);
759 QStringList castList = sCast.split(
',', Qt::SkipEmptyParts);
762 std::transform(castList.cbegin(), castList.cend(), std::back_inserter(cast),
763 [](
const QString& name)
764 {return VideoMetadata::cast_list::value_type(-1, name.simplified());} );
766 metadata->SetCast(cast);
767 update_required =
true;
773 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
774 QStringList countryList = sCountries.split(
',', QString::SkipEmptyParts);
776 QStringList countryList = sCountries.split(
',', Qt::SkipEmptyParts);
779 std::transform(countryList.cbegin(), countryList.cend(), std::back_inserter(countries),
780 [](
const QString& name)
781 {return VideoMetadata::country_list::value_type(-1, name.simplified());} );
783 metadata->SetCountries(countries);
784 update_required =
true;
788 metadata->UpdateDatabase();
803 (
const QString &storageGroup,
804 const QString &FileName )
810 QString sFullFileName = storage.
FindFile( FileName );
821 pVideoStreamInfos->setErrorCode ( infos.
m_errorCode );
822 pVideoStreamInfos->setErrorMsg ( infos.
m_errorMsg );
827 pVideoStreamInfo->setCodecType ( QString(QChar(info.m_codecType)) );
828 pVideoStreamInfo->setCodecName ( info.m_codecName );
829 pVideoStreamInfo->setWidth ( info.m_width );
830 pVideoStreamInfo->setHeight ( info.m_height );
831 pVideoStreamInfo->setAspectRatio ( info.m_SampleAspectRatio );
832 pVideoStreamInfo->setFieldOrder ( info.m_fieldOrder );
833 pVideoStreamInfo->setFrameRate ( info.m_frameRate );
834 pVideoStreamInfo->setAvgFrameRate ( info.m_avgFrameRate );
835 pVideoStreamInfo->setChannels ( info.m_channels );
836 pVideoStreamInfo->setDuration ( info.m_duration );
839 return pVideoStreamInfos;
850 query.
prepare(
"SELECT filename "
851 "FROM videometadata "
852 "WHERE intid = :ID ");
864 fileName = query.
value(0).toString();
867 LOG(VB_GENERAL, LOG_ERR, QString(
"Video/GetSavedBookmark Video id %1 Not found.").arg(Id));
897 query.
prepare(
"SELECT filename "
898 "FROM videometadata "
899 "WHERE intid = :ID ");
911 fileName = query.
value(0).toString();
914 LOG(VB_GENERAL, LOG_ERR, QString(
"Video/SetSavedBookmark Video id %1 Not found.").arg(Id));