11 #include <QStringList>
70 friend class TestRecordingExtender;
73 static const std::array<const QString,5>
kCatName;
75 static constexpr
int kNumCatTypes = 5;
77 kCategorySports, kCategoryTVShow };
97 QString syndicatedepisode,
104 QString chanplaybackfilters,
109 const QString &pathname,
112 QString storagegroup,
117 CategoryType catType,
125 QDateTime recstartts,
134 QDate originalAirDate,
135 QDateTime lastmodified,
147 uint audioproperties,
148 uint videoproperties,
151 QDateTime bookmarkupdate);
157 QString sortSubtitle,
174 QDateTime recstartts,
191 QString sortSubtitle,
193 QString syndicatedepisode,
200 QString chanplaybackfilters,
204 QDateTime recstartts,
209 CategoryType catType,
215 QDate originalAirDate,
224 uint videoproperties,
225 uint audioproperties,
237 QString sortSubtitle,
248 QString chanplaybackfilters,
255 QDateTime recstartts,
267 const QString &title,
268 const QString &sortTitle,
269 const QString &subtitle,
270 const QString &sortSubtitle,
271 const QString &director,
272 int season,
int episode,
273 const QString &inetref,
274 std::chrono::minutes length_in_minutes,
276 const QString &programid);
279 const QDateTime &_startts,
const QDateTime &_endts);
282 QDateTime _startts, QDateTime _endts)
283 : m_title(
std::move(_title)), m_category(
std::move(_category)),
284 m_startTs(
std::move(_startts)), m_endTs(
std::move(_endts))
285 { ensureSortFields(); }
287 const QStringList::const_iterator& end)
289 if (!FromStringList(it, end))
294 QStringList::const_iterator it = list.begin();
295 if (!FromStringList(it, list.end()))
302 bool ignore_non_serialized_data =
false);
303 void ensureSortFields(
void);
305 virtual void clear(
void);
311 void ToStringList(QStringList &list)
const;
312 virtual void ToMap(
InfoMap &progMap,
313 bool showrerecord =
false,
314 uint star_range = 10,
315 uint date_format = 0)
const;
316 virtual void SubstituteMatches(QString &str);
319 bool IsSameProgram(
const ProgramInfo &other)
const;
320 bool IsDuplicateProgram(
const ProgramInfo &other)
const;
321 bool IsSameProgramAndStartTime(
const ProgramInfo &other)
const;
322 bool IsSameTitleStartTimeAndChannel(
const ProgramInfo &other)
const;
323 bool IsSameTitleTimeslotAndChannel(
const ProgramInfo &other)
const;
326 return s_usingProgIDAuth;
328 static void CheckProgramIDAuthorities(
void);
331 bool IsSameProgramWeakCheck(
const ProgramInfo &other)
const;
334 bool IsSameChannel(
const ProgramInfo &other)
const;
340 {
return MakeUniqueKey(m_chanId, m_recStartTs); }
341 std::chrono::seconds GetSecondsInRecording(
void)
const;
342 QString ChannelText(
const QString& format)
const;
344 QString
GetBasename(
void)
const {
return m_pathname.section(
'/', -1); }
351 bool IsLocal(
void)
const {
return m_pathname.startsWith(
"/")
353 || m_pathname.at(1) ==
':'
356 bool IsMythStream(
void)
const {
return m_pathname.startsWith(
"myth://"); }
357 bool IsPathSet(
void)
const {
return GetBasename() != m_pathname; }
359 bool IsFileReadable(
void);
388 {
return m_chanPlaybackFilters; }
425 return ((m_year) ? m_year :
426 (m_originalAirDate.isValid()) ? m_originalAirDate.year() : 0);
434 virtual uint64_t GetFilesize(
void)
const;
439 QString GetCategoryTypeString(
void)
const;
444 {
return lroundf(m_stars * range_max); }
465 QString GetShortInputName(
void)
const;
471 QString GetProgramFlagNames(
void)
const;
475 bool IsGeneric(
void)
const;
476 bool IsInUsePlaying(
void)
const {
return (m_programFlags & FL_INUSEPLAYING) != 0U;}
479 bool HasCutlist(
void)
const {
return (m_programFlags & FL_CUTLIST) != 0U; }
480 bool IsBookmarkSet(
void)
const {
return (m_programFlags & FL_BOOKMARK) != 0U; }
481 bool IsLastPlaySet(
void)
const {
return (m_programFlags & FL_LASTPLAYPOS) != 0U; }
482 bool IsWatched(
void)
const {
return (m_programFlags & FL_WATCHED) != 0U; }
484 bool IsPreserved(
void)
const {
return (m_programFlags & FL_PRESERVED) != 0U; }
485 bool IsVideo(
void)
const {
return (m_programFlags & FL_TYPEMASK) != 0U; }
487 bool IsRepeat(
void)
const {
return (m_programFlags & FL_REPEAT) != 0U; }
488 bool IsDuplicate(
void)
const {
return (m_programFlags & FL_DUPLICATE) != 0U; }
489 bool IsReactivated(
void)
const {
return (m_programFlags & FL_REACTIVATE) != 0U; }
491 {
return (m_programFlags & FL_DELETEPENDING) != 0U; }
494 QString GetSubtitleTypeNames(
void)
const;
496 QString GetVideoPropertyNames(
void)
const;
498 QString GetAudioPropertyNames(
void)
const;
500 static uint SubtitleTypesFromNames(
const QString & names);
501 static uint VideoPropertiesFromNames(
const QString & names);
502 static uint AudioPropertiesFromNames(
const QString & names);
504 void ProgramFlagsFromNames(
const QString & names);
513 QString
toString(Verbosity v = kLongDescription,
const QString& sep =
":",
514 const QString& grp =
"\"")
const;
517 void SetTitle(
const QString &
t,
const QString &st =
nullptr);
518 void SetSubtitle(
const QString &st,
const QString &sst =
nullptr);
520 { m_programFlags &= ~FL_TYPEMASK; m_programFlags |= ((uint32_t)
t<<20); }
521 void SetPathname(
const QString& pn);
531 virtual void SetFilesize( uint64_t sz);
543 m_programFlags &= ~FL_REACTIVATE;
544 m_programFlags |= (reactivate) ? FL_REACTIVATE : 0;
548 m_programFlags &= ~FL_EDITING;
549 m_programFlags |= (editing) ? FL_EDITING : 0;
553 m_programFlags &= ~FL_COMMFLAG;
554 m_programFlags |= (flagging) ? FL_COMMFLAG : 0;
560 m_programFlags &= ~FL_IGNOREBOOKMARK;
561 m_programFlags |= (ignore) ? FL_IGNOREBOOKMARK : 0;
567 m_programFlags &= ~FL_IGNOREPROGSTART;
568 m_programFlags |= (ignore) ? FL_IGNOREPROGSTART : 0;
575 m_programFlags &= ~FL_IGNORELASTPLAYPOS;
576 m_programFlags |= (ignore) ? FL_IGNORELASTPLAYPOS : 0;
579 { m_recordedId = _recordedid; }
583 { m_positionMapDBReplacement = pmap; }
585 void CalculateRecordedProgress();
587 void CalculateWatchedProgress(uint64_t pos);
590 void CalculateProgress(uint64_t pos);
593 QString QueryBasename(
void)
const;
595 uint QueryMplexID(
void)
const;
596 QDateTime QueryBookmarkTimeStamp(
void)
const;
597 uint64_t QueryBookmark(
void)
const;
598 uint64_t QueryProgStart(
void)
const;
599 uint64_t QueryLastPlayPos(
void)
const;
600 uint64_t QueryStartMark(
void)
const;
601 CategoryType QueryCategoryType(
void)
const;
602 QStringList QueryDVDBookmark(
const QString &serialid)
const;
603 QStringList QueryBDBookmark(
const QString &serialid)
const;
604 bool QueryIsEditing(
void)
const;
605 bool QueryIsInUse(QStringList &byWho)
const;
606 bool QueryIsInUse(QString &byWho)
const;
607 bool QueryIsDeleteCandidate(
bool one_playback_allowed =
false)
const;
610 bool QueryTuningInfo(QString &channum, QString &input)
const;
611 QString QueryInputDisplayName(
void)
const;
612 uint QueryAverageWidth(
void)
const;
613 uint QueryAverageHeight(
void)
const;
614 uint QueryAverageFrameRate(
void)
const;
615 MarkTypes QueryAverageAspectRatio(
void)
const;
616 bool QueryAverageScanProgressive(
void)
const;
617 std::chrono::milliseconds QueryTotalDuration(
void)
const;
618 int64_t QueryTotalFrames(
void)
const;
619 QString QueryRecordingGroup(
void)
const;
621 uint QueryTranscoderID(
void)
const;
622 uint64_t QueryLastFrameInPosMap(
void)
const;
626 virtual void SaveFilesize(uint64_t fsize);
627 void SaveLastPlayPos(uint64_t frame);
628 void SaveBookmark(uint64_t frame);
629 static void SaveDVDBookmark(
const QStringList &fields) ;
630 static void SaveBDBookmark(
const QStringList &fields) ;
631 void SaveEditing(
bool edit);
633 void SaveWatched(
bool watchedFlag);
634 void SaveDeletePendingFlag(
bool deleteFlag);
636 void SaveAutoExpire(
AutoExpireType autoExpire,
bool updateDelete =
false);
637 void SavePreserve(
bool preserveEpisode);
638 bool SaveBasename(
const QString &basename);
640 void SaveResolution(uint64_t frame,
uint width,
uint height);
641 void SaveFrameRate(uint64_t frame,
uint framerate);
642 void SaveVideoScanType(uint64_t frame,
bool progressive);
643 void SaveTotalDuration(std::chrono::milliseconds duration);
644 void SaveTotalFrames(int64_t frames);
645 void SaveVideoProperties(
uint mask,
uint video_property_flags);
648 void UpdateLastDelete(
bool setTime)
const;
649 void MarkAsInUse(
bool inuse,
const QString& usedFor =
"");
650 void UpdateInUseMark(
bool force =
false);
651 void SaveSeasonEpisode(
uint seas,
uint ep);
652 void SaveInetRef(
const QString &inet);
655 QString DiscoverRecordingDirectory(
void);
657 bool forceCheckLocal =
false);
661 bool QueryCutList(
frm_dir_map_t &delMap,
bool loadAutosave=
false)
const;
662 void SaveCutList(
frm_dir_map_t &delMap,
bool isAutoSave=
false)
const;
672 int64_t min_frame = -1, int64_t max_frame = -1)
const;
676 bool QueryKeyFrameInfo(uint64_t *result, uint64_t position_or_keyframe,
679 const char *from_filemarkup_desc,
680 const char *from_recordedseek_asc,
681 const char *from_recordedseek_desc)
const;
682 bool QueryKeyFramePosition(uint64_t *position, uint64_t keyframe,
683 bool backwards)
const;
684 bool QueryPositionKeyFrame(uint64_t *keyframe, uint64_t position,
685 bool backwards)
const;
686 bool QueryKeyFrameDuration(uint64_t *duration, uint64_t keyframe,
687 bool backwards)
const;
688 bool QueryDurationKeyFrame(uint64_t *keyframe, uint64_t duration,
689 bool backwards)
const;
695 uint64_t frame { 0 };
697 bool isDataNull {
true };
699 :
type(
t), frame(f), data(
d), isDataNull(n) {}
702 void QueryMarkup(QVector<MarkupEntry> &mapMark,
703 QVector<MarkupEntry> &mapSeek)
const;
704 void SaveMarkup(
const QVector<MarkupEntry> &mapMark,
705 const QVector<MarkupEntry> &mapSeek)
const;
708 void SendUpdateEvent(
void)
const;
710 void SendAddedEvent(
void)
const;
712 void SendDeletedEvent(
void)
const;
715 static QString i18n(
const QString &msg);
717 static QString MakeUniqueKey(
uint chanid,
const QDateTime &recstartts);
718 static bool ExtractKey(
const QString &uniquekey,
719 uint &chanid, QDateTime &recstartts);
720 static bool ExtractKeyFromPathname(
721 const QString &pathname,
uint &chanid, QDateTime &recstartts);
722 static bool QueryKeyFromPathname(
723 const QString &pathname,
uint &chanid, QDateTime &recstartts);
724 static bool QueryRecordedIdFromPathname(
const QString &pathname,
727 static QString QueryRecordingGroupPassword(
const QString &group);
728 static uint64_t QueryBookmark(
uint chanid,
const QDateTime &recstartts);
729 static QMap<QString,uint32_t> QueryInUseMap(
void);
730 static QMap<QString,bool> QueryJobsRunning(
int type);
734 void UpdateMarkTimeStamp(
bool bookmarked)
const;
735 void UpdateLastPlayTimeStamp(
bool lastplay)
const;
737 bool merge =
false)
const;
739 int64_t min_frame = -1, int64_t max_frame = -1)
const;
741 int64_t min_frame = -1, int64_t max_frame = -1)
const;
745 QString CreateRecordBasename(
const QString &ext)
const;
747 bool LoadProgramFromRecorded(
748 uint chanid,
const QDateTime &recstartts);
750 bool FromStringList(QStringList::const_iterator &it,
751 const QStringList::const_iterator& end);
753 static void QueryMarkupMap(
754 const QString &video_pathname,
756 static void QueryMarkupMap(
757 uint chanid,
const QDateTime &recstartts,
760 static int InitStatics(
void);
775 int32_t m_recPriority {0};
777 uint32_t m_chanId {0};
783 QString m_recGroup {
"Default"};
784 QString m_playGroup {
"Default"};
789 QString m_storageGroup {
"Default"};
796 uint64_t m_fileSize {0ULL};
799 QDateTime m_endTs {m_startTs};
800 QDateTime m_recStartTs {m_startTs};
801 QDateTime m_recEndTs {m_startTs};
803 float m_stars {0.0F};
805 QDateTime m_lastModified {m_startTs};
806 static constexpr int64_t kLastInUseOffset {4LL * 60 * 60};
807 QDateTime m_lastInUseTime {m_startTs.addSecs(-kLastInUseOffset)};
809 int32_t m_recPriority2 {0};
811 uint32_t m_recordId {0};
812 uint32_t m_parentId {0};
814 uint32_t m_sourceId {0};
815 uint32_t m_inputId {0};
816 uint32_t m_findId {0};
818 uint32_t m_programFlags {FL_NONE};
819 VideoPropsType m_videoProperties {VID_UNKNOWN};
820 AudioPropsType m_audioProperties {AUD_UNKNOWN};
821 SubtitlePropsType m_subtitleProperties {SUB_UNKNOWN};
837 int8_t m_recordedPercent {-1};
838 int8_t m_watchedPercent {-1};
844 int8_t m_spread {-1};
845 int8_t m_startCol {-1};
863 const QString &where,
864 const QString &groupBy,
865 const QString &orderBy,
885 uint chanid,
const QDateTime &starttime);
902 bool possiblyInProgressRecordingsOnly,
903 const QMap<QString,uint32_t> &inUseMap,
904 const QMap<QString,bool> &isJobRunning,
905 const QMap<QString, ProgramInfo*> &recMap,
907 const QString &sortBy =
"",
908 bool ignoreLiveTV =
false,
909 bool ignoreDeleted =
false);
911 template<
typename TYPE>
915 const QString& altTable =
"",
919 hasConflicts =
false;
925 hasConflicts = slist[0].toInt();
927 QStringList::const_iterator sit = slist.cbegin()+2;
928 while (sit != slist.cend())
930 TYPE *
p =
new TYPE(sit, slist.cend());
933 if (!
p->HasPathname() && !
p->GetChanID())
941 if (destination.
size() != slist[1].toUInt())
953 bool dummyConflicts =
false;
960 bool *hasConflicts =
nullptr,
961 std::vector<ProgramInfo> *list =
nullptr);
970 QMap<MarkTypes,frm_pos_map_t>
map;
979 #endif // MYTHPROGRAM_H_