70 friend class TestRecordingExtender;
73 static const std::array<const QString,5>
kCatName;
75 static constexpr int kNumCatTypes = 5;
98 QString syndicatedepisode,
105 QString chanplaybackfilters,
110 const QString &pathname,
113 QString storagegroup,
118 CategoryType catType,
126 QDateTime recstartts,
135 QDate originalAirDate,
136 QDateTime lastmodified,
148 uint audioproperties,
149 uint videoproperties,
152 QDateTime bookmarkupdate);
158 QString sortSubtitle,
175 QDateTime recstartts,
192 QString sortSubtitle,
194 QString syndicatedepisode,
201 QString chanplaybackfilters,
205 QDateTime recstartts,
210 CategoryType catType,
216 QDate originalAirDate,
225 uint videoproperties,
226 uint audioproperties,
238 QString sortSubtitle,
249 QString chanplaybackfilters,
256 QDateTime recstartts,
268 const QString &title,
269 const QString &sortTitle,
270 const QString &subtitle,
271 const QString &sortSubtitle,
272 const QString &director,
273 int season,
int episode,
274 const QString &inetref,
275 std::chrono::minutes length_in_minutes,
277 const QString &programid);
280 const QDateTime &_startts,
const QDateTime &_endts);
283 QDateTime _startts, QDateTime _endts)
284 : m_title(
std::move(_title)), m_category(
std::move(_category)),
285 m_startTs(
std::move(_startts)), m_endTs(
std::move(_endts))
286 { ensureSortFields(); }
288 const QStringList::const_iterator& end)
295 QStringList::const_iterator it = list.begin();
303 bool ignore_non_serialized_data =
false);
304 void ensureSortFields(
void);
306 virtual void clear(
void);
313 virtual void ToMap(
InfoMap &progMap,
314 bool showrerecord =
false,
315 uint star_range = 10,
316 uint date_format = 0)
const;
317 virtual void SubstituteMatches(QString &str);
320 bool IsSameProgram(
const ProgramInfo &other)
const;
321 bool IsDuplicateProgram(
const ProgramInfo &other)
const;
322 bool IsSameProgramAndStartTime(
const ProgramInfo &other)
const;
323 bool IsSameTitleStartTimeAndChannel(
const ProgramInfo &other)
const;
324 bool IsSameTitleTimeslotAndChannel(
const ProgramInfo &other)
const;
327 return s_usingProgIDAuth;
329 static void CheckProgramIDAuthorities(
void);
332 bool IsSameProgramWeakCheck(
const ProgramInfo &other)
const;
335 bool IsSameChannel(
const ProgramInfo &other)
const;
341 {
return MakeUniqueKey(m_chanId, m_recStartTs); }
342 std::chrono::seconds GetSecondsInRecording(
void)
const;
343 QString ChannelText(
const QString& format)
const;
345 QString
GetBasename(
void)
const {
return m_pathname.section(
'/', -1); }
352 bool IsLocal(
void)
const {
return m_pathname.startsWith(
"/")
354 || m_pathname.at(1) ==
':'
357 bool IsMythStream(
void)
const {
return m_pathname.startsWith(
"myth://"); }
358 bool IsPathSet(
void)
const {
return GetBasename() != m_pathname; }
360 bool IsFileReadable(
void);
389 {
return m_chanPlaybackFilters; }
428 if (m_originalAirDate.isValid())
429 return m_originalAirDate.year();
438 virtual uint64_t GetFilesize(
void)
const;
443 QString GetCategoryTypeString(
void)
const;
448 {
return lroundf(m_stars * range_max); }
469 QString GetShortInputName(
void)
const;
475 QString GetProgramFlagNames(
void)
const;
479 QString GetRecTypeStatus(
bool showrerecord)
const;
480 bool IsGeneric(
void)
const;
481 bool IsInUsePlaying(
void)
const {
return (m_programFlags & FL_INUSEPLAYING) != 0U;}
484 bool HasCutlist(
void)
const {
return (m_programFlags & FL_CUTLIST) != 0U; }
485 bool IsBookmarkSet(
void)
const {
return (m_programFlags & FL_BOOKMARK) != 0U; }
486 bool IsLastPlaySet(
void)
const {
return (m_programFlags & FL_LASTPLAYPOS) != 0U; }
487 bool IsWatched(
void)
const {
return (m_programFlags & FL_WATCHED) != 0U; }
489 bool IsPreserved(
void)
const {
return (m_programFlags & FL_PRESERVED) != 0U; }
490 bool IsVideo(
void)
const {
return (m_programFlags & FL_TYPEMASK) != 0U; }
492 bool IsRepeat(
void)
const {
return (m_programFlags & FL_REPEAT) != 0U; }
493 bool IsDuplicate(
void)
const {
return (m_programFlags & FL_DUPLICATE) != 0U; }
494 bool IsReactivated(
void)
const {
return (m_programFlags & FL_REACTIVATE) != 0U; }
496 {
return (m_programFlags & FL_DELETEPENDING) != 0U; }
499 QString GetSubtitleTypeNames(
void)
const;
501 QString GetVideoPropertyNames(
void)
const;
503 QString GetAudioPropertyNames(
void)
const;
505 static uint SubtitleTypesFromNames(
const QString & names);
506 static uint VideoPropertiesFromNames(
const QString & names);
507 static uint AudioPropertiesFromNames(
const QString & names);
509 void ProgramFlagsFromNames(
const QString & names);
518 QString
toString(Verbosity v = kLongDescription,
const QString& sep =
":",
519 const QString& grp =
"\"")
const;
522 void SetTitle(
const QString &
t,
const QString &st =
nullptr);
523 void SetSubtitle(
const QString &st,
const QString &sst =
nullptr);
525 { m_programFlags &= ~FL_TYPEMASK; m_programFlags |= ((uint32_t)
t<<20); }
526 void SetPathname(
const QString& pn);
536 virtual void SetFilesize( uint64_t sz);
548 m_programFlags &= ~FL_REACTIVATE;
549 m_programFlags |= (reactivate) ? FL_REACTIVATE : FL_NONE;
553 m_programFlags &= ~FL_EDITING;
554 m_programFlags |= (editing) ? FL_EDITING : FL_NONE;
558 m_programFlags &= ~FL_COMMFLAG;
559 m_programFlags |= (flagging) ? FL_COMMFLAG : FL_NONE;
565 m_programFlags &= ~FL_IGNOREBOOKMARK;
566 m_programFlags |= (ignore) ? FL_IGNOREBOOKMARK : FL_NONE;
572 m_programFlags &= ~FL_IGNOREPROGSTART;
573 m_programFlags |= (ignore) ? FL_IGNOREPROGSTART : FL_NONE;
580 m_programFlags &= ~FL_IGNORELASTPLAYPOS;
581 m_programFlags |= (ignore) ? FL_IGNORELASTPLAYPOS : FL_NONE;
584 { m_recordedId = _recordedid; }
588 { m_positionMapDBReplacement = pmap; }
590 void CalculateRecordedProgress();
592 void CalculateWatchedProgress(uint64_t pos);
595 void CalculateProgress(uint64_t pos);
598 QString QueryBasename(
void)
const;
600 uint QueryMplexID(
void)
const;
601 QDateTime QueryBookmarkTimeStamp(
void)
const;
602 uint64_t QueryBookmark(
void)
const;
603 uint64_t QueryProgStart(
void)
const;
604 uint64_t QueryLastPlayPos(
void)
const;
605 uint64_t QueryStartMark(
void)
const;
606 CategoryType QueryCategoryType(
void)
const;
607 QStringList QueryDVDBookmark(
const QString &serialid)
const;
608 QStringList QueryBDBookmark(
const QString &serialid)
const;
609 bool QueryIsEditing(
void)
const;
610 bool QueryIsInUse(QStringList &byWho)
const;
611 bool QueryIsInUse(QString &byWho)
const;
612 bool QueryIsDeleteCandidate(
bool one_playback_allowed =
false)
const;
615 bool QueryTuningInfo(QString &channum, QString &input)
const;
617 uint QueryAverageWidth(
void)
const;
618 uint QueryAverageHeight(
void)
const;
619 uint QueryAverageFrameRate(
void)
const;
620 MarkTypes QueryAverageAspectRatio(
void)
const;
621 bool QueryAverageScanProgressive(
void)
const;
622 std::chrono::milliseconds QueryTotalDuration(
void)
const;
623 int64_t QueryTotalFrames(
void)
const;
624 QString QueryRecordingGroup(
void)
const;
626 uint QueryTranscoderID(
void)
const;
627 uint64_t QueryLastFrameInPosMap(
void)
const;
631 virtual void SaveFilesize(uint64_t fsize);
632 void SaveLastPlayPos(uint64_t frame);
633 void SaveBookmark(uint64_t frame);
634 static void SaveDVDBookmark(
const QStringList &fields) ;
635 static void SaveBDBookmark(
const QStringList &fields) ;
636 void SaveEditing(
bool edit);
638 void SaveWatched(
bool watchedFlag);
639 void SaveDeletePendingFlag(
bool deleteFlag);
641 void SaveAutoExpire(
AutoExpireType autoExpire,
bool updateDelete =
false);
642 void SavePreserve(
bool preserveEpisode);
643 bool SaveBasename(
const QString &basename);
645 void SaveResolution(uint64_t frame,
uint width,
uint height);
646 void SaveFrameRate(uint64_t frame,
uint framerate);
647 void SaveVideoScanType(uint64_t frame,
bool progressive);
648 void SaveTotalDuration(std::chrono::milliseconds duration);
649 void SaveTotalFrames(int64_t frames);
650 void SaveVideoProperties(
uint mask,
uint video_property_flags);
653 void UpdateLastDelete(
bool setTime)
const;
654 void MarkAsInUse(
bool inuse,
const QString& usedFor =
"");
655 void UpdateInUseMark(
bool force =
false);
656 void SaveSeasonEpisode(
uint seas,
uint ep);
657 void SaveInetRef(
const QString &inet);
660 QString DiscoverRecordingDirectory(
void);
662 bool forceCheckLocal =
false);
666 bool QueryCutList(
frm_dir_map_t &delMap,
bool loadAutosave=
false)
const;
667 void SaveCutList(
frm_dir_map_t &delMap,
bool isAutoSave=
false)
const;
677 int64_t min_frame = -1, int64_t max_frame = -1)
const;
681 bool QueryKeyFrameInfo(uint64_t *result, uint64_t position_or_keyframe,
684 const char *from_filemarkup_desc,
685 const char *from_recordedseek_asc,
686 const char *from_recordedseek_desc)
const;
687 bool QueryKeyFramePosition(uint64_t *position, uint64_t keyframe,
688 bool backwards)
const;
689 bool QueryPositionKeyFrame(uint64_t *keyframe, uint64_t position,
690 bool backwards)
const;
691 bool QueryKeyFrameDuration(uint64_t *duration, uint64_t keyframe,
692 bool backwards)
const;
693 bool QueryDurationKeyFrame(uint64_t *keyframe, uint64_t duration,
694 bool backwards)
const;
700 uint64_t frame { 0 };
702 bool isDataNull {
true };
704 :
type(
t), frame(f), data(
d), isDataNull(n) {}
707 void QueryMarkup(QVector<MarkupEntry> &mapMark,
708 QVector<MarkupEntry> &mapSeek)
const;
709 void SaveMarkup(
const QVector<MarkupEntry> &mapMark,
710 const QVector<MarkupEntry> &mapSeek)
const;
713 void SendUpdateEvent(
void)
const;
715 void SendAddedEvent(
void)
const;
717 void SendDeletedEvent(
void)
const;
720 static QString i18n(
const QString &msg);
722 static QString MakeUniqueKey(
uint chanid,
const QDateTime &recstartts);
723 static bool ExtractKey(
const QString &uniquekey,
724 uint &chanid, QDateTime &recstartts);
725 static bool ExtractKeyFromPathname(
726 const QString &pathname,
uint &chanid, QDateTime &recstartts);
727 static bool QueryKeyFromPathname(
728 const QString &pathname,
uint &chanid, QDateTime &recstartts);
729 static bool QueryRecordedIdFromPathname(
const QString &pathname,
732 static QString QueryRecordingGroupPassword(
const QString &group);
733 static uint64_t QueryBookmark(
uint chanid,
const QDateTime &recstartts);
734 static QMap<QString,uint32_t> QueryInUseMap(
void);
735 static QMap<QString,bool> QueryJobsRunning(
int type);
739 void UpdateMarkTimeStamp(
bool bookmarked)
const;
740 void UpdateLastPlayTimeStamp(
bool lastplay)
const;
742 bool merge =
false)
const;
744 int64_t min_frame = -1, int64_t max_frame = -1)
const;
746 int64_t min_frame = -1, int64_t max_frame = -1)
const;
750 QString CreateRecordBasename(
const QString &ext)
const;
752 bool LoadProgramFromRecorded(
753 uint chanid,
const QDateTime &recstartts);
756 const QStringList::const_iterator& end);
758 static void QueryMarkupMap(
759 const QString &video_pathname,
761 static void QueryMarkupMap(
762 uint chanid,
const QDateTime &recstartts,
765 static int InitStatics(
void);
780 int32_t m_recPriority {0};
782 uint32_t m_chanId {0};
788 QString m_recGroup {
"Default"};
789 QString m_playGroup {
"Default"};
794 QString m_storageGroup {
"Default"};
801 uint64_t m_fileSize {0ULL};
804 QDateTime m_endTs {m_startTs};
805 QDateTime m_recStartTs {m_startTs};
806 QDateTime m_recEndTs {m_startTs};
808 float m_stars {0.0F};
810 QDateTime m_lastModified {m_startTs};
811 static constexpr int64_t kLastInUseOffset {4LL * 60 * 60};
812 QDateTime m_lastInUseTime {m_startTs.addSecs(-kLastInUseOffset)};
814 int32_t m_recPriority2 {0};
816 uint32_t m_recordId {0};
817 uint32_t m_parentId {0};
819 uint32_t m_sourceId {0};
820 uint32_t m_inputId {0};
821 uint32_t m_findId {0};
823 uint32_t m_programFlags {FL_NONE};
824 VideoPropsType m_videoProperties {VID_UNKNOWN};
825 AudioPropsType m_audioProperties {AUD_UNKNOWN};
826 SubtitlePropsType m_subtitleProperties {SUB_UNKNOWN};
842 int8_t m_recordedPercent {-1};
843 int8_t m_watchedPercent {-1};
849 int8_t m_spread {-1};
850 int8_t m_startCol {-1};
886 const QString &where,
887 const QString &groupBy,
888 const QString &orderBy,
910 uint chanid,
const QDateTime &starttime);
927 bool possiblyInProgressRecordingsOnly,
928 const QMap<QString,uint32_t> &inUseMap,
929 const QMap<QString,bool> &isJobRunning,
930 const QMap<QString, ProgramInfo*> &recMap,
932 const QString &sortBy =
"",
933 bool ignoreLiveTV =
false,
934 bool ignoreDeleted =
false);
936template<
typename TYPE>
940 const QString& altTable =
"",
944 hasConflicts =
false;
950 hasConflicts = slist[0].toInt();
952 QStringList::const_iterator sit = slist.cbegin()+2;
953 while (sit != slist.cend())
955 TYPE *
p =
new TYPE(sit, slist.cend());
958 if (!
p->HasPathname() && !
p->GetChanID())
966 if (destination.
size() != slist[1].toUInt())
978 bool dummyConflicts =
false;
985 bool *hasConflicts =
nullptr,
986 std::vector<ProgramInfo> *list =
nullptr);
995 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()
MBASE_PUBLIC ProgramInfo::CategoryType string_to_myth_category_type(const QString &type)
MBASE_PUBLIC ProgramInfo * LoadProgramFromProgram(uint chanid, const QDateTime &starttime)
MBASE_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
MBASE_PUBLIC bool LoadFromProgram(ProgramList &destination, const QString &where, const QString &groupBy, const QString &orderBy, const MSqlBindings &bindings, const ProgramList &schedList)
MBASE_PUBLIC bool LoadFromOldRecorded(ProgramList &destination, const QString &sql, const MSqlBindings &bindings)
bool LoadFromScheduler(AutoDeleteDeque< TYPE * > &destination, bool &hasConflicts, const QString &altTable="", int recordid=-1)
MBASE_PUBLIC bool GetNextRecordingList(QDateTime &nextRecordingStart, bool *hasConflicts=nullptr, std::vector< ProgramInfo > *list=nullptr)
MBASE_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