11 #include <QStringList>
28 #define NUMPROGRAMLINES 52
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); }
466 {
return m_inputName.isRightToLeft() ?
467 m_inputName.left(2) : m_inputName.right(2); }
473 QString GetProgramFlagNames(
void)
const;
477 bool IsGeneric(
void)
const;
478 bool IsInUsePlaying(
void)
const {
return (m_programFlags & FL_INUSEPLAYING) != 0U;}
481 bool HasCutlist(
void)
const {
return (m_programFlags & FL_CUTLIST) != 0U; }
482 bool IsBookmarkSet(
void)
const {
return (m_programFlags & FL_BOOKMARK) != 0U; }
483 bool IsLastPlaySet(
void)
const {
return (m_programFlags & FL_LASTPLAYPOS) != 0U; }
484 bool IsWatched(
void)
const {
return (m_programFlags & FL_WATCHED) != 0U; }
486 bool IsPreserved(
void)
const {
return (m_programFlags & FL_PRESERVED) != 0U; }
487 bool IsVideo(
void)
const {
return (m_programFlags & FL_TYPEMASK) != 0U; }
489 bool IsRepeat(
void)
const {
return (m_programFlags & FL_REPEAT) != 0U; }
490 bool IsDuplicate(
void)
const {
return (m_programFlags & FL_DUPLICATE) != 0U; }
491 bool IsReactivated(
void)
const {
return (m_programFlags & FL_REACTIVATE) != 0U; }
493 {
return (m_programFlags & FL_DELETEPENDING) != 0U; }
496 QString GetSubtitleTypeNames(
void)
const;
498 QString GetVideoPropertyNames(
void)
const;
500 QString GetAudioPropertyNames(
void)
const;
502 static uint SubtitleTypesFromNames(
const QString & names);
503 static uint VideoPropertiesFromNames(
const QString & names);
504 static uint AudioPropertiesFromNames(
const QString & names);
506 void ProgramFlagsFromNames(
const QString & names);
515 QString
toString(Verbosity v = kLongDescription,
const QString& sep =
":",
516 const QString& grp =
"\"")
const;
519 void SetTitle(
const QString &
t,
const QString &st =
nullptr);
520 void SetSubtitle(
const QString &st,
const QString &sst =
nullptr);
522 { m_programFlags &= ~FL_TYPEMASK; m_programFlags |= ((uint32_t)
t<<20); }
523 void SetPathname(
const QString& pn);
533 virtual void SetFilesize( uint64_t sz);
545 m_programFlags &= ~FL_REACTIVATE;
546 m_programFlags |= (reactivate) ? FL_REACTIVATE : 0;
550 m_programFlags &= ~FL_EDITING;
551 m_programFlags |= (editing) ? FL_EDITING : 0;
555 m_programFlags &= ~FL_COMMFLAG;
556 m_programFlags |= (flagging) ? FL_COMMFLAG : 0;
562 m_programFlags &= ~FL_IGNOREBOOKMARK;
563 m_programFlags |= (ignore) ? FL_IGNOREBOOKMARK : 0;
569 m_programFlags &= ~FL_IGNOREPROGSTART;
570 m_programFlags |= (ignore) ? FL_IGNOREPROGSTART : 0;
577 m_programFlags &= ~FL_IGNORELASTPLAYPOS;
578 m_programFlags |= (ignore) ? FL_IGNORELASTPLAYPOS : 0;
581 { m_recordedId = _recordedid; }
585 { m_positionMapDBReplacement = pmap; }
587 void CalculateRecordedProgress();
589 void CalculateWatchedProgress(uint64_t pos);
592 void CalculateProgress(uint64_t pos);
595 QString QueryBasename(
void)
const;
597 uint QueryMplexID(
void)
const;
598 QDateTime QueryBookmarkTimeStamp(
void)
const;
599 uint64_t QueryBookmark(
void)
const;
600 uint64_t QueryProgStart(
void)
const;
601 uint64_t QueryLastPlayPos(
void)
const;
602 uint64_t QueryStartMark(
void)
const;
603 CategoryType QueryCategoryType(
void)
const;
604 QStringList QueryDVDBookmark(
const QString &serialid)
const;
605 QStringList QueryBDBookmark(
const QString &serialid)
const;
606 bool QueryIsEditing(
void)
const;
607 bool QueryIsInUse(QStringList &byWho)
const;
608 bool QueryIsInUse(QString &byWho)
const;
609 bool QueryIsDeleteCandidate(
bool one_playback_allowed =
false)
const;
612 bool QueryTuningInfo(QString &channum, QString &input)
const;
613 QString QueryInputDisplayName(
void)
const;
614 uint QueryAverageWidth(
void)
const;
615 uint QueryAverageHeight(
void)
const;
616 uint QueryAverageFrameRate(
void)
const;
617 MarkTypes QueryAverageAspectRatio(
void)
const;
618 bool QueryAverageScanProgressive(
void)
const;
619 std::chrono::milliseconds QueryTotalDuration(
void)
const;
620 int64_t QueryTotalFrames(
void)
const;
621 QString QueryRecordingGroup(
void)
const;
623 uint QueryTranscoderID(
void)
const;
624 uint64_t QueryLastFrameInPosMap(
void)
const;
628 virtual void SaveFilesize(uint64_t fsize);
629 void SaveLastPlayPos(uint64_t frame);
630 void SaveBookmark(uint64_t frame);
631 static void SaveDVDBookmark(
const QStringList &fields) ;
632 static void SaveBDBookmark(
const QStringList &fields) ;
633 void SaveEditing(
bool edit);
635 void SaveWatched(
bool watchedFlag);
636 void SaveDeletePendingFlag(
bool deleteFlag);
638 void SaveAutoExpire(
AutoExpireType autoExpire,
bool updateDelete =
false);
639 void SavePreserve(
bool preserveEpisode);
640 bool SaveBasename(
const QString &basename);
642 void SaveResolution(uint64_t frame,
uint width,
uint height);
643 void SaveFrameRate(uint64_t frame,
uint framerate);
644 void SaveVideoScanType(uint64_t frame,
bool progressive);
645 void SaveTotalDuration(std::chrono::milliseconds duration);
646 void SaveTotalFrames(int64_t frames);
647 void SaveVideoProperties(
uint mask,
uint video_property_flags);
650 void UpdateLastDelete(
bool setTime)
const;
651 void MarkAsInUse(
bool inuse,
const QString& usedFor =
"");
652 void UpdateInUseMark(
bool force =
false);
653 void SaveSeasonEpisode(
uint seas,
uint ep);
654 void SaveInetRef(
const QString &inet);
657 QString DiscoverRecordingDirectory(
void);
659 bool forceCheckLocal =
false);
663 bool QueryCutList(
frm_dir_map_t &delMap,
bool loadAutosave=
false)
const;
664 void SaveCutList(
frm_dir_map_t &delMap,
bool isAutoSave=
false)
const;
674 int64_t min_frame = -1, int64_t max_frame = -1)
const;
678 bool QueryKeyFrameInfo(uint64_t *result, uint64_t position_or_keyframe,
681 const char *from_filemarkup_desc,
682 const char *from_recordedseek_asc,
683 const char *from_recordedseek_desc)
const;
684 bool QueryKeyFramePosition(uint64_t *position, uint64_t keyframe,
685 bool backwards)
const;
686 bool QueryPositionKeyFrame(uint64_t *keyframe, uint64_t position,
687 bool backwards)
const;
688 bool QueryKeyFrameDuration(uint64_t *duration, uint64_t keyframe,
689 bool backwards)
const;
690 bool QueryDurationKeyFrame(uint64_t *keyframe, uint64_t duration,
691 bool backwards)
const;
697 uint64_t frame { 0 };
699 bool isDataNull {
true };
701 :
type(
t), frame(f), data(
d), isDataNull(n) {}
704 void QueryMarkup(QVector<MarkupEntry> &mapMark,
705 QVector<MarkupEntry> &mapSeek)
const;
706 void SaveMarkup(
const QVector<MarkupEntry> &mapMark,
707 const QVector<MarkupEntry> &mapSeek)
const;
710 void SendUpdateEvent(
void)
const;
712 void SendAddedEvent(
void)
const;
714 void SendDeletedEvent(
void)
const;
717 static QString i18n(
const QString &msg);
719 static QString MakeUniqueKey(
uint chanid,
const QDateTime &recstartts);
720 static bool ExtractKey(
const QString &uniquekey,
721 uint &chanid, QDateTime &recstartts);
722 static bool ExtractKeyFromPathname(
723 const QString &pathname,
uint &chanid, QDateTime &recstartts);
724 static bool QueryKeyFromPathname(
725 const QString &pathname,
uint &chanid, QDateTime &recstartts);
726 static bool QueryRecordedIdFromPathname(
const QString &pathname,
729 static QString QueryRecordingGroupPassword(
const QString &group);
730 static uint64_t QueryBookmark(
uint chanid,
const QDateTime &recstartts);
731 static QMap<QString,uint32_t> QueryInUseMap(
void);
732 static QMap<QString,bool> QueryJobsRunning(
int type);
736 void UpdateMarkTimeStamp(
bool bookmarked)
const;
737 void UpdateLastPlayTimeStamp(
bool lastplay)
const;
739 bool merge =
false)
const;
741 int64_t min_frame = -1, int64_t max_frame = -1)
const;
743 int64_t min_frame = -1, int64_t max_frame = -1)
const;
747 QString CreateRecordBasename(
const QString &ext)
const;
749 bool LoadProgramFromRecorded(
750 uint chanid,
const QDateTime &recstartts);
752 bool FromStringList(QStringList::const_iterator &it,
753 const QStringList::const_iterator& end);
755 static void QueryMarkupMap(
756 const QString &video_pathname,
758 static void QueryMarkupMap(
759 uint chanid,
const QDateTime &recstartts,
762 static int InitStatics(
void);
777 int32_t m_recPriority {0};
779 uint32_t m_chanId {0};
785 QString m_recGroup {
"Default"};
786 QString m_playGroup {
"Default"};
791 QString m_storageGroup {
"Default"};
798 uint64_t m_fileSize {0ULL};
801 QDateTime m_endTs {m_startTs};
802 QDateTime m_recStartTs {m_startTs};
803 QDateTime m_recEndTs {m_startTs};
805 float m_stars {0.0F};
807 QDateTime m_lastModified {m_startTs};
808 QDateTime m_lastInUseTime {m_startTs.addSecs(-4 * 60 * 60)};
810 int32_t m_recPriority2 {0};
812 uint32_t m_recordId {0};
813 uint32_t m_parentId {0};
815 uint32_t m_sourceId {0};
816 uint32_t m_inputId {0};
817 uint32_t m_findId {0};
819 uint32_t m_programFlags {FL_NONE};
820 VideoPropsType m_videoProperties {VID_UNKNOWN};
821 AudioPropsType m_audioProperties {AUD_UNKNOWN};
822 SubtitlePropsType m_subtitleProperties {SUB_UNKNOWN};
838 int8_t m_recordedPercent {-1};
839 int8_t m_watchedPercent {-1};
845 int8_t m_spread {-1};
846 int8_t m_startCol {-1};
864 const QString &where,
865 const QString &groupBy,
866 const QString &orderBy,
886 uint chanid,
const QDateTime &starttime);
903 bool possiblyInProgressRecordingsOnly,
904 const QMap<QString,uint32_t> &inUseMap,
905 const QMap<QString,bool> &isJobRunning,
906 const QMap<QString, ProgramInfo*> &recMap,
908 const QString &sortBy =
"",
909 bool ignoreLiveTV =
false,
910 bool ignoreDeleted =
false);
912 template<
typename TYPE>
916 const QString& altTable =
"",
920 hasConflicts =
false;
926 hasConflicts = slist[0].toInt();
928 QStringList::const_iterator sit = slist.cbegin()+2;
929 while (sit != slist.cend())
931 TYPE *
p =
new TYPE(sit, slist.cend());
934 if (!
p->HasPathname() && !
p->GetChanID())
942 if (destination.
size() != slist[1].toUInt())
954 bool dummyConflicts =
false;
961 bool *hasConflicts =
nullptr,
962 std::vector<ProgramInfo> *list =
nullptr);
971 QMap<MarkTypes,frm_pos_map_t>
map;
980 #endif // MYTHPROGRAM_H_