72 friend class TestRecordingExtender;
75 static const std::array<const QString,5>
kCatName;
77 static constexpr int kNumCatTypes = 5;
100 QString syndicatedepisode,
107 QString chanplaybackfilters,
112 const QString &pathname,
115 QString storagegroup,
120 CategoryType catType,
128 QDateTime recstartts,
137 QDate originalAirDate,
138 QDateTime lastmodified,
150 uint audioproperties,
151 uint videoproperties,
154 QDateTime bookmarkupdate);
160 QString sortSubtitle,
177 QDateTime recstartts,
194 QString sortSubtitle,
196 QString syndicatedepisode,
203 QString chanplaybackfilters,
207 QDateTime recstartts,
212 CategoryType catType,
218 QDate originalAirDate,
227 uint videoproperties,
228 uint audioproperties,
240 QString sortSubtitle,
251 QString chanplaybackfilters,
258 QDateTime recstartts,
270 const QString &title,
271 const QString &sortTitle,
272 const QString &subtitle,
273 const QString &sortSubtitle,
274 const QString &director,
275 int season,
int episode,
276 const QString &inetref,
277 std::chrono::minutes length_in_minutes,
279 const QString &programid);
282 const QDateTime &_startts,
const QDateTime &_endts);
285 QDateTime _startts, QDateTime _endts)
286 : m_title(
std::move(_title)), m_category(
std::move(_category)),
287 m_startTs(
std::move(_startts)), m_endTs(
std::move(_endts))
288 { ensureSortFields(); }
290 const QStringList::const_iterator& end)
297 QStringList::const_iterator it = list.begin();
305 bool ignore_non_serialized_data =
false);
306 void ensureSortFields(
void);
308 virtual void clear(
void);
315 virtual void ToMap(
InfoMap &progMap,
316 bool showrerecord =
false,
317 uint star_range = 10,
318 uint date_format = 0)
const;
319 virtual void SubstituteMatches(QString &str);
322 bool IsSameProgram(
const ProgramInfo &other)
const;
323 bool IsDuplicateProgram(
const ProgramInfo &other)
const;
324 bool IsSameProgramAndStartTime(
const ProgramInfo &other)
const;
325 bool IsSameTitleStartTimeAndChannel(
const ProgramInfo &other)
const;
326 bool IsSameTitleTimeslotAndChannel(
const ProgramInfo &other)
const;
329 return s_usingProgIDAuth;
331 static void CheckProgramIDAuthorities(
void);
334 bool IsSameProgramWeakCheck(
const ProgramInfo &other)
const;
337 bool IsSameChannel(
const ProgramInfo &other)
const;
343 {
return MakeUniqueKey(m_chanId, m_recStartTs); }
344 std::chrono::seconds GetSecondsInRecording(
void)
const;
345 QString ChannelText(
const QString& format)
const;
347 QString
GetBasename(
void)
const {
return m_pathname.section(
'/', -1); }
354 bool IsLocal(
void)
const {
return m_pathname.startsWith(
"/")
356 || m_pathname.at(1) ==
':'
359 bool IsMythStream(
void)
const {
return m_pathname.startsWith(
"myth://"); }
360 bool IsPathSet(
void)
const {
return GetBasename() != m_pathname; }
362 bool IsFileReadable(
void);
391 {
return m_chanPlaybackFilters; }
430 if (m_originalAirDate.isValid())
431 return m_originalAirDate.year();
440 virtual uint64_t GetFilesize(
void)
const;
445 QString GetCategoryTypeString(
void)
const;
450 {
return lroundf(m_stars * range_max); }
471 QString GetShortInputName(
void)
const;
477 QString GetProgramFlagNames(
void)
const;
481 QString GetRecTypeStatus(
bool showrerecord)
const;
482 bool IsGeneric(
void)
const;
483 bool IsInUsePlaying(
void)
const {
return (m_programFlags & FL_INUSEPLAYING) != 0U;}
486 bool HasCutlist(
void)
const {
return (m_programFlags & FL_CUTLIST) != 0U; }
487 bool IsBookmarkSet(
void)
const {
return (m_programFlags & FL_BOOKMARK) != 0U; }
488 bool IsLastPlaySet(
void)
const {
return (m_programFlags & FL_LASTPLAYPOS) != 0U; }
489 bool IsWatched(
void)
const {
return (m_programFlags & FL_WATCHED) != 0U; }
491 bool IsPreserved(
void)
const {
return (m_programFlags & FL_PRESERVED) != 0U; }
492 bool IsVideo(
void)
const {
return (m_programFlags & FL_TYPEMASK) != 0U; }
494 bool IsRepeat(
void)
const {
return (m_programFlags & FL_REPEAT) != 0U; }
495 bool IsDuplicate(
void)
const {
return (m_programFlags & FL_DUPLICATE) != 0U; }
496 bool IsReactivated(
void)
const {
return (m_programFlags & FL_REACTIVATE) != 0U; }
498 {
return (m_programFlags & FL_DELETEPENDING) != 0U; }
501 QString GetSubtitleTypeNames(
void)
const;
503 QString GetVideoPropertyNames(
void)
const;
505 QString GetAudioPropertyNames(
void)
const;
507 static uint SubtitleTypesFromNames(
const QString & names);
508 static uint VideoPropertiesFromNames(
const QString & names);
509 static uint AudioPropertiesFromNames(
const QString & names);
511 void ProgramFlagsFromNames(
const QString & names);
520 QString
toString(Verbosity v = kLongDescription,
const QString& sep =
":",
521 const QString& grp =
"\"")
const;
524 void SetTitle(
const QString &
t,
const QString &st =
nullptr);
525 void SetSubtitle(
const QString &st,
const QString &sst =
nullptr);
527 { m_programFlags &= ~FL_TYPEMASK; m_programFlags |= ((uint32_t)
t<<20); }
528 void SetPathname(
const QString& pn);
538 virtual void SetFilesize( uint64_t sz);
550 m_programFlags &= ~FL_REACTIVATE;
551 m_programFlags |= (reactivate) ? FL_REACTIVATE : FL_NONE;
555 m_programFlags &= ~FL_EDITING;
556 m_programFlags |= (editing) ? FL_EDITING : FL_NONE;
560 m_programFlags &= ~FL_COMMFLAG;
561 m_programFlags |= (flagging) ? FL_COMMFLAG : FL_NONE;
567 m_programFlags &= ~FL_IGNOREBOOKMARK;
568 m_programFlags |= (ignore) ? FL_IGNOREBOOKMARK : FL_NONE;
574 m_programFlags &= ~FL_IGNOREPROGSTART;
575 m_programFlags |= (ignore) ? FL_IGNOREPROGSTART : FL_NONE;
582 m_programFlags &= ~FL_IGNORELASTPLAYPOS;
583 m_programFlags |= (ignore) ? FL_IGNORELASTPLAYPOS : FL_NONE;
586 { m_recordedId = _recordedid; }
590 { m_positionMapDBReplacement = pmap; }
592 void CalculateRecordedProgress();
594 void CalculateWatchedProgress(uint64_t pos);
597 void CalculateProgress(uint64_t pos);
600 QString QueryBasename(
void)
const;
602 uint QueryMplexID(
void)
const;
603 QDateTime QueryBookmarkTimeStamp(
void)
const;
604 uint64_t QueryBookmark(
void)
const;
605 uint64_t QueryProgStart(
void)
const;
606 uint64_t QueryLastPlayPos(
void)
const;
607 uint64_t QueryStartMark(
void)
const;
608 CategoryType QueryCategoryType(
void)
const;
609 QStringList QueryDVDBookmark(
const QString &serialid)
const;
610 QStringList QueryBDBookmark(
const QString &serialid)
const;
611 bool QueryIsEditing(
void)
const;
612 bool QueryIsInUse(QStringList &byWho)
const;
613 bool QueryIsInUse(QString &byWho)
const;
614 bool QueryIsDeleteCandidate(
bool one_playback_allowed =
false)
const;
617 bool QueryTuningInfo(QString &channum, QString &input)
const;
619 uint QueryAverageWidth(
void)
const;
620 uint QueryAverageHeight(
void)
const;
621 uint QueryAverageFrameRate(
void)
const;
622 MarkTypes QueryAverageAspectRatio(
void)
const;
623 bool QueryAverageScanProgressive(
void)
const;
624 std::chrono::milliseconds QueryTotalDuration(
void)
const;
625 int64_t QueryTotalFrames(
void)
const;
626 QString QueryRecordingGroup(
void)
const;
628 uint QueryTranscoderID(
void)
const;
629 uint64_t QueryLastFrameInPosMap(
void)
const;
633 virtual void SaveFilesize(uint64_t fsize);
634 void SaveLastPlayPos(uint64_t frame);
635 void SaveBookmark(uint64_t frame);
636 static void SaveDVDBookmark(
const QStringList &fields) ;
637 static void SaveBDBookmark(
const QStringList &fields) ;
638 void SaveEditing(
bool edit);
640 void SaveWatched(
bool watchedFlag);
641 void SaveDeletePendingFlag(
bool deleteFlag);
643 void SaveAutoExpire(
AutoExpireType autoExpire,
bool updateDelete =
false);
644 void SavePreserve(
bool preserveEpisode);
645 bool SaveBasename(
const QString &basename);
647 void SaveResolution(uint64_t frame,
uint width,
uint height);
648 void SaveFrameRate(uint64_t frame,
uint framerate);
649 void SaveVideoScanType(uint64_t frame,
bool progressive);
650 void SaveTotalDuration(std::chrono::milliseconds duration);
651 void SaveTotalFrames(int64_t frames);
652 void SaveVideoProperties(
uint mask,
uint video_property_flags);
655 void UpdateLastDelete(
bool setTime)
const;
656 void MarkAsInUse(
bool inuse,
const QString& usedFor =
"");
657 void UpdateInUseMark(
bool force =
false);
658 void SaveSeasonEpisode(
uint seas,
uint ep);
659 void SaveInetRef(
const QString &inet);
662 QString DiscoverRecordingDirectory(
void);
664 bool forceCheckLocal =
false);
668 bool QueryCutList(
frm_dir_map_t &delMap,
bool loadAutosave=
false)
const;
669 void SaveCutList(
frm_dir_map_t &delMap,
bool isAutoSave=
false)
const;
679 int64_t min_frame = -1, int64_t max_frame = -1)
const;
683 bool QueryKeyFrameInfo(uint64_t *result, uint64_t position_or_keyframe,
686 const char *from_filemarkup_desc,
687 const char *from_recordedseek_asc,
688 const char *from_recordedseek_desc)
const;
689 bool QueryKeyFramePosition(uint64_t *position, uint64_t keyframe,
690 bool backwards)
const;
691 bool QueryPositionKeyFrame(uint64_t *keyframe, uint64_t position,
692 bool backwards)
const;
693 bool QueryKeyFrameDuration(uint64_t *duration, uint64_t keyframe,
694 bool backwards)
const;
695 bool QueryDurationKeyFrame(uint64_t *keyframe, uint64_t duration,
696 bool backwards)
const;
702 uint64_t frame { 0 };
704 bool isDataNull {
true };
706 :
type(
t), frame(f), data(
d), isDataNull(n) {}
709 void QueryMarkup(QVector<MarkupEntry> &mapMark,
710 QVector<MarkupEntry> &mapSeek)
const;
711 void SaveMarkup(
const QVector<MarkupEntry> &mapMark,
712 const QVector<MarkupEntry> &mapSeek)
const;
715 void SendUpdateEvent(
void)
const;
717 void SendAddedEvent(
void)
const;
719 void SendDeletedEvent(
void)
const;
722 static QString i18n(
const QString &msg);
724 static QString MakeUniqueKey(
uint chanid,
const QDateTime &recstartts);
725 static bool ExtractKey(
const QString &uniquekey,
726 uint &chanid, QDateTime &recstartts);
727 static bool ExtractKeyFromPathname(
728 const QString &pathname,
uint &chanid, QDateTime &recstartts);
729 static bool QueryKeyFromPathname(
730 const QString &pathname,
uint &chanid, QDateTime &recstartts);
731 static bool QueryRecordedIdFromPathname(
const QString &pathname,
734 static QString QueryRecordingGroupPassword(
const QString &group);
735 static uint64_t QueryBookmark(
uint chanid,
const QDateTime &recstartts);
736 static QMap<QString,uint32_t> QueryInUseMap(
void);
737 static QMap<QString,bool> QueryJobsRunning(
int type);
741 void UpdateMarkTimeStamp(
bool bookmarked)
const;
742 void UpdateLastPlayTimeStamp(
bool lastplay)
const;
744 bool merge =
false)
const;
746 int64_t min_frame = -1, int64_t max_frame = -1)
const;
748 int64_t min_frame = -1, int64_t max_frame = -1)
const;
752 QString CreateRecordBasename(
const QString &ext)
const;
754 bool LoadProgramFromRecorded(
755 uint chanid,
const QDateTime &recstartts);
758 const QStringList::const_iterator& end);
760 static void QueryMarkupMap(
761 const QString &video_pathname,
763 static void QueryMarkupMap(
764 uint chanid,
const QDateTime &recstartts,
767 static int InitStatics(
void);
782 int32_t m_recPriority {0};
784 uint32_t m_chanId {0};
790 QString m_recGroup {
"Default"};
791 QString m_playGroup {
"Default"};
796 QString m_storageGroup {
"Default"};
803 uint64_t m_fileSize {0ULL};
806 QDateTime m_endTs {m_startTs};
807 QDateTime m_recStartTs {m_startTs};
808 QDateTime m_recEndTs {m_startTs};
810 float m_stars {0.0F};
812 QDateTime m_lastModified {m_startTs};
813 static constexpr int64_t kLastInUseOffset {4LL * 60 * 60};
814 QDateTime m_lastInUseTime {m_startTs.addSecs(-kLastInUseOffset)};
816 int32_t m_recPriority2 {0};
818 uint32_t m_recordId {0};
819 uint32_t m_parentId {0};
821 uint32_t m_sourceId {0};
822 uint32_t m_inputId {0};
823 uint32_t m_findId {0};
825 uint32_t m_programFlags {FL_NONE};
826 VideoPropsType m_videoProperties {VID_UNKNOWN};
827 AudioPropsType m_audioProperties {AUD_UNKNOWN};
828 SubtitlePropsType m_subtitleProperties {SUB_UNKNOWN};
844 int8_t m_recordedPercent {-1};
845 int8_t m_watchedPercent {-1};
851 int8_t m_spread {-1};
852 int8_t m_startCol {-1};
888 const QString &where,
889 const QString &groupBy,
890 const QString &orderBy,
912 uint chanid,
const QDateTime &starttime);
929 bool possiblyInProgressRecordingsOnly,
930 const QMap<QString,uint32_t> &inUseMap,
931 const QMap<QString,bool> &isJobRunning,
932 const QMap<QString, ProgramInfo*> &recMap,
934 const QString &sortBy =
"",
935 bool ignoreLiveTV =
false,
936 bool ignoreDeleted =
false);
938template<
typename TYPE>
942 const QString& altTable =
"",
946 hasConflicts =
false;
952 hasConflicts = slist[0].toInt();
954 QStringList::const_iterator sit = slist.cbegin()+2;
955 while (sit != slist.cend())
957 TYPE *
p =
new TYPE(sit, slist.cend());
960 if (!
p->HasPathname() && !
p->GetChanID())
968 if (destination.
size() != slist[1].toUInt())
980 bool dummyConflicts =
false;
987 bool *hasConflicts =
nullptr,
988 std::vector<ProgramInfo> *list =
nullptr);
997 QMap<MarkTypes,frm_pos_map_t>
map;
QSqlQuery wrapper that fetches a DB connection from the connection pool.
QMap< MarkTypes, frm_pos_map_t > map
Holds information on recordings and videos.
float GetStars(void) const
uint GetChanID(void) const
This is the unique key used in the database to locate tuning information.
uint GetRecordingRuleID(void) const
bool IsInUsePlaying(void) const
RecordingDupMethodType GetDuplicateCheckMethod(void) const
What should be compared to determine if two programs are the same?
QString GetBasename(void) const
void SetFlagging(bool flagging)
bool HasPathname(void) const
QString GetSeriesID(void) const
static bool s_usingProgIDAuth
uint GetVideoProperties(void) const
static ProgramInfoUpdater * s_updater
bool IsVideoFile(void) const
ProgramInfo(QStringList::const_iterator &it, const QStringList::const_iterator &end)
QString GetLastModifiedTime(MythDate::Format fmt) const
bool IsCommercialFlagged(void) const
bool IsDeletePending(void) const
bool IsAutoExpirable(void) const
bool IsPreserved(void) const
bool IsVideoDVD(void) const
void SetRecordingPriority2(int priority)
void SetIgnoreProgStart(bool ignore)
If "ignore" is true QueryProgStart() will return 0, otherwise QueryProgStart() will return the progst...
QDateTime m_previewUpdate
ProgramInfoType GetProgramInfoType(void) const
static const QString kFromRecordedQuery
void SetIgnoreBookmark(bool ignore)
If "ignore" is true GetBookmark() will return 0, otherwise GetBookmark() will return the bookmark pos...
uint GetEpisode(void) const
uint GetSubtitleType(void) const
QString GetProgramID(void) const
QString m_chanPlaybackFilters
QDateTime GetBookmarkUpdate(void) const
void SetEditing(bool editing)
QString GetRecordingGroup(void) const
virtual ~ProgramInfo()=default
void SetRecordingRuleType(RecordingType type)
ProgramInfo(const QStringList &list)
uint GetRecordingID(void) const
static const std::array< const QString, 5 > kCatName
ProgramInfo(void)
Null constructor.
QDateTime GetScheduledEndTime(void) const
The scheduled end time of the program.
QString GetChannelPlaybackFilters(void) const
QString GetInetRef(void) const
void ClearMarkupFlag(MarkTypes type) const
QString GetRecordingEndTime(MythDate::Format fmt) const
Approximate time the recording should have ended, did end, or is intended to end (with formatting).
uint GetWatchedPercent() const
void SetRecordingStatus(RecStatus::Type status)
void SetScheduledStartTime(const QDateTime &dt)
AvailableStatusType GetAvailableStatus(void) const
RecordingDupInType GetDuplicateCheckSource(void) const
Where should we check for duplicates?
bool HasCutlist(void) const
uint GetAudioProperties(void) const
bool IsRepeat(void) const
void SetIgnoreLastPlayPos(bool ignore)
If "ignore" is true QueryLastPlayPos() will return 0, otherwise QueryLastPlayPos() will return the la...
QString QueryInputDisplayName(void) const
QString GetSortSubtitle(void) const
void SetPlaybackGroup(const QString &group)
QString GetHostname(void) const
bool IsRecording(void) const
void SetRecordingGroup(const QString &group)
static QStringList LoadFromScheduler(const QString &tmptable, int recordid)
void SetCategory(const QString &cat)
static bool UsingProgramIDAuthority(void)
uint GetSourceID(void) const
bool IsBookmarkSet(void) const
bool IsReactivated(void) const
QString GetPlaybackGroup(void) const
void SetScheduledEndTime(const QDateTime &dt)
QString GetDescription(void) const
QDateTime GetLastModifiedTime(void) const
QString GetStorageGroup(void) const
void SetPositionMapDBReplacement(PMapDBReplacement *pmap)
void SetRecordingStartTime(const QDateTime &dt)
QString GetScheduledStartTime(MythDate::Format fmt) const
The scheduled start time of program (with formatting).
QString GetChannelName(void) const
This is the channel name in the local market, i.e.
QString GetTitle(void) const
void SetHostname(const QString &host)
QDateTime GetRecordingStartTime(void) const
Approximate time the recording started.
QDateTime GetScheduledStartTime(void) const
The scheduled start time of program.
ProgramInfo(QString _title, QString _category, QDateTime _startts, QDateTime _endts)
Constructs a Dummy ProgramInfo (used by GuideGrid)
uint GetFindID(void) const
QString m_syndicatedEpisode
QString GetChanNum(void) const
This is the channel "number", in the form 1, 1_2, 1-2, 1#1, etc.
void SetChanID(uint _chanid)
void SetSourceID(uint id)
uint GetYearOfInitialRelease(void) const
bool IsCommercialFree(void) const
bool IsDuplicate(void) const
void SetRecordingRuleID(uint id)
void SetProgramInfoType(ProgramInfoType t)
QString MakeUniqueKey(void) const
Creates a unique string that can be used to identify an existing recording.
QString GetInputName(void) const
void SetWatchedPercent(uint progress)
QString GetSortTitle(void) const
bool IsVideoBD(void) const
bool IsSameRecording(const ProgramInfo &other) const
uint GetStars(uint range_max) const
int GetRecordingPriority(void) const
QString GetPathname(void) const
QDate GetOriginalAirDate(void) const
uint GetInputID(void) const
CategoryType GetCategoryType(void) const
int GetRecordingPriority2(void) const
uint GetParentRecordingRuleID(void) const
void SetSeriesID(const QString &id)
TODO Move to RecordingInfo.
QString GetRecordingStartTime(MythDate::Format fmt) const
Approximate time the recording started (with formatting).
void ClearInputName(void)
void SetRecordingPriority(int priority)
bool IsWatched(void) const
bool IsPathSet(void) const
void SetRecordingEndTime(const QDateTime &dt)
void SetStorageGroup(const QString &group)
uint GetRecordedPercent() const
uint32_t GetProgramFlags(void) const
RecStatus::Type GetRecordingStatus(void) const
bool IsLastPlaySet(void) const
void SetReactivated(bool reactivate)
void SetCategoryType(const CategoryType type)
QDateTime m_bookmarkUpdate
QDateTime GetRecordingEndTime(void) const
Approximate time the recording should have ended, did end, or is intended to end.
QString GetSubtitle(void) const
QString GetScheduledEndTime(MythDate::Format fmt) const
The scheduled end time of the program (with formatting).
QString GetCategory(void) const
uint GetSeason(void) const
virtual void SetRecordingID(uint _recordedid)
void SetProgramID(const QString &id)
bool IsMythStream(void) const
RecordingType GetRecordingRuleType(void) const
uint GetEpisodeTotal(void) const
QString GetChannelSchedulingID(void) const
This is the unique programming identifier of a channel.
static QMutex s_staticDataLock
QString GetPlaybackURL(ProgramInfo *pginfo, bool storePath)
static const iso6937table * d
Q_DECLARE_METATYPE(std::chrono::seconds)
static void clear(SettingsMap &cache, SettingsMap &overrides, const QString &myKey)
QMap< QString, QVariant > MSqlBindings
typedef for a map of string -> string bindings for generic queries.
QHash< QString, QString > InfoMap
MBASE_PUBLIC QStringList ToStringList(const FileSystemInfoList &fsInfos)
MBASE_PUBLIC FileSystemInfoList FromStringList(const QStringList &list)
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
int pginfo_init_statics()
MTV_PUBLIC bool LoadFromRecorded(ProgramList &destination, bool possiblyInProgressRecordingsOnly, const QMap< QString, uint32_t > &inUseMap, const QMap< QString, bool > &isJobRunning, const QMap< QString, ProgramInfo * > &recMap, int sort=0, const QString &sortBy="", bool ignoreLiveTV=false, bool ignoreDeleted=false)
static constexpr int8_t NUMPROGRAMLINES
MTV_PUBLIC bool GetNextRecordingList(QDateTime &nextRecordingStart, bool *hasConflicts=nullptr, std::vector< ProgramInfo > *list=nullptr)
MTV_PUBLIC ProgramInfo::CategoryType string_to_myth_category_type(const QString &type)
MTV_PUBLIC bool LoadFromOldRecorded(ProgramList &destination, const QString &sql, const MSqlBindings &bindings)
MTV_PUBLIC ProgramInfo * LoadProgramFromProgram(uint chanid, const QDateTime &starttime)
MTV_PUBLIC bool LoadFromProgram(ProgramList &destination, const QString &where, const QString &groupBy, const QString &orderBy, const MSqlBindings &bindings, const ProgramList &schedList)
bool LoadFromScheduler(AutoDeleteDeque< TYPE * > &destination, bool &hasConflicts, const QString &altTable="", int recordid=-1)
MTV_PUBLIC bool RemoteCheckFile(ProgramInfo *pginfo, bool checkSlaves=true)
MTV_PUBLIC QString myth_category_type_to_string(ProgramInfo::CategoryType category_type)
QMap< uint64_t, MarkTypes > frm_dir_map_t
Frame # -> Mark map.
@ kProgramInfoTypeVideoDVD
@ kProgramInfoTypeVideoFile
@ kProgramInfoTypeVideoBD
QMap< long long, long long > frm_pos_map_t
Frame # -> File offset map.
MarkupEntry(int t, uint64_t f, uint64_t d, bool n)
MarkupEntry(void)=default