Go to the documentation of this file.
11 #include <QStringList>
28 #define NUMPROGRAMLINES 52
72 static const std::array<const QString,5>
kCatName;
74 static constexpr
int kNumCatTypes = 5;
76 kCategorySports, kCategoryTVShow };
96 QString syndicatedepisode,
103 QString chanplaybackfilters,
108 const QString &pathname,
111 QString storagegroup,
116 CategoryType catType,
124 QDateTime recstartts,
133 QDate originalAirDate,
134 QDateTime lastmodified,
146 uint audioproperties,
147 uint videoproperties,
150 QDateTime bookmarkupdate);
156 QString sortSubtitle,
173 QDateTime recstartts,
190 QString sortSubtitle,
192 QString syndicatedepisode,
199 QString chanplaybackfilters,
203 QDateTime recstartts,
208 CategoryType catType,
214 QDate originalAirDate,
223 uint videoproperties,
224 uint audioproperties,
236 QString sortSubtitle,
247 QString chanplaybackfilters,
254 QDateTime recstartts,
266 const QString &
title,
267 const QString &sortTitle,
268 const QString &subtitle,
269 const QString &sortSubtitle,
270 const QString &director,
271 int season,
int episode,
272 const QString &inetref,
273 std::chrono::minutes length_in_minutes,
275 const QString &programid);
278 const QDateTime &_startts,
const QDateTime &_endts);
281 QDateTime _startts, QDateTime _endts)
282 : m_title(
std::move(_title)), m_category(
std::move(_category)),
283 m_startTs(
std::move(_startts)), m_endTs(
std::move(_endts))
284 { ensureSortFields(); }
286 const QStringList::const_iterator& end)
288 if (!FromStringList(it, end))
293 QStringList::const_iterator it = list.begin();
294 if (!FromStringList(it, list.end()))
301 bool ignore_non_serialized_data =
false);
302 void ensureSortFields(
void);
304 virtual void clear(
void);
310 void ToStringList(QStringList &list)
const;
311 virtual void ToMap(
InfoMap &progMap,
312 bool showrerecord =
false,
313 uint star_range = 10)
const;
314 virtual void SubstituteMatches(QString &str);
317 bool IsSameProgram(
const ProgramInfo &other)
const;
318 bool IsDuplicateProgram(
const ProgramInfo &other)
const;
319 bool IsSameProgramAndStartTime(
const ProgramInfo &other)
const;
320 bool IsSameTitleStartTimeAndChannel(
const ProgramInfo &other)
const;
321 bool IsSameTitleTimeslotAndChannel(
const ProgramInfo &other)
const;
324 return s_usingProgIDAuth;
326 static void CheckProgramIDAuthorities(
void);
329 bool IsSameProgramWeakCheck(
const ProgramInfo &other)
const;
332 bool IsSameChannel(
const ProgramInfo &other)
const;
338 {
return MakeUniqueKey(m_chanId, m_recStartTs); }
339 std::chrono::seconds GetSecondsInRecording(
void)
const;
340 QString ChannelText(
const QString& format)
const;
342 QString
GetBasename(
void)
const {
return m_pathname.section(
'/', -1); }
349 bool IsLocal(
void)
const {
return m_pathname.startsWith(
"/")
351 || m_pathname.at(1) ==
':'
354 bool IsMythStream(
void)
const {
return m_pathname.startsWith(
"myth://"); }
355 bool IsPathSet(
void)
const {
return GetBasename() != m_pathname; }
357 bool IsFileReadable(
void);
386 {
return m_chanPlaybackFilters; }
423 return ((m_year) ? m_year :
424 (m_originalAirDate.isValid()) ? m_originalAirDate.year() : 0);
432 virtual uint64_t GetFilesize(
void)
const;
437 QString GetCategoryTypeString(
void)
const;
442 {
return lroundf(m_stars * range_max); }
464 {
return m_inputName.isRightToLeft() ?
465 m_inputName.left(2) : m_inputName.right(2); }
474 bool IsGeneric(
void)
const;
504 QString
toString(Verbosity v = kLongDescription,
const QString& sep =
":",
505 const QString& grp =
"\"")
const;
508 void SetTitle(
const QString &
t,
const QString &st =
nullptr);
509 void SetSubtitle(
const QString &st,
const QString &sst =
nullptr);
511 { m_programFlags &= ~
FL_TYPEMASK; m_programFlags |= ((uint32_t)
t<<20); }
512 void SetPathname(
const QString& pn);
522 virtual void SetFilesize( uint64_t sz);
570 { m_recordedId = _recordedid; }
574 { m_positionMapDBReplacement = pmap; }
577 QString QueryBasename(
void)
const;
579 uint QueryMplexID(
void)
const;
580 QDateTime QueryBookmarkTimeStamp(
void)
const;
581 uint64_t QueryBookmark(
void)
const;
582 uint64_t QueryProgStart(
void)
const;
583 uint64_t QueryLastPlayPos(
void)
const;
584 CategoryType QueryCategoryType(
void)
const;
585 QStringList QueryDVDBookmark(
const QString &serialid)
const;
586 QStringList QueryBDBookmark(
const QString &serialid)
const;
587 bool QueryIsEditing(
void)
const;
588 bool QueryIsInUse(QStringList &byWho)
const;
589 bool QueryIsInUse(QString &byWho)
const;
590 bool QueryIsDeleteCandidate(
bool one_playback_allowed =
false)
const;
593 bool QueryTuningInfo(QString &channum, QString &input)
const;
594 QString QueryInputDisplayName(
void)
const;
595 uint QueryAverageWidth(
void)
const;
596 uint QueryAverageHeight(
void)
const;
597 uint QueryAverageFrameRate(
void)
const;
598 MarkTypes QueryAverageAspectRatio(
void)
const;
599 bool QueryAverageScanProgressive(
void)
const;
600 std::chrono::milliseconds QueryTotalDuration(
void)
const;
601 int64_t QueryTotalFrames(
void)
const;
602 QString QueryRecordingGroup(
void)
const;
604 uint QueryTranscoderID(
void)
const;
605 uint64_t QueryLastFrameInPosMap(
void)
const;
609 virtual void SaveFilesize(uint64_t fsize);
610 void SaveBookmark(uint64_t frame);
611 static void SaveDVDBookmark(
const QStringList &fields) ;
612 static void SaveBDBookmark(
const QStringList &fields) ;
613 void SaveEditing(
bool edit);
615 void SaveWatched(
bool watchedFlag);
616 void SaveDeletePendingFlag(
bool deleteFlag);
618 void SaveAutoExpire(
AutoExpireType autoExpire,
bool updateDelete =
false);
619 void SavePreserve(
bool preserveEpisode);
620 bool SaveBasename(
const QString &basename);
622 void SaveResolution(uint64_t frame,
uint width,
uint height);
623 void SaveFrameRate(uint64_t frame,
uint framerate);
624 void SaveVideoScanType(uint64_t frame,
bool progressive);
625 void SaveTotalDuration(std::chrono::milliseconds duration);
626 void SaveTotalFrames(int64_t frames);
627 void SaveVideoProperties(
uint mask,
uint video_property_flags);
630 void UpdateLastDelete(
bool setTime)
const;
631 void MarkAsInUse(
bool inuse,
const QString& usedFor =
"");
632 void UpdateInUseMark(
bool force =
false);
633 void SaveSeasonEpisode(
uint seas,
uint ep);
634 void SaveInetRef(
const QString &inet);
637 QString DiscoverRecordingDirectory(
void);
639 bool forceCheckLocal =
false);
643 bool QueryCutList(
frm_dir_map_t &delMap,
bool loadAutosave=
false)
const;
644 void SaveCutList(
frm_dir_map_t &delMap,
bool isAutoSave=
false)
const;
654 int64_t min_frame = -1, int64_t max_frame = -1)
const;
658 bool QueryKeyFrameInfo(uint64_t *result, uint64_t position_or_keyframe,
661 const char *from_filemarkup_desc,
662 const char *from_recordedseek_asc,
663 const char *from_recordedseek_desc)
const;
664 bool QueryKeyFramePosition(uint64_t *position, uint64_t keyframe,
665 bool backwards)
const;
666 bool QueryPositionKeyFrame(uint64_t *keyframe, uint64_t position,
667 bool backwards)
const;
668 bool QueryKeyFrameDuration(uint64_t *duration, uint64_t keyframe,
669 bool backwards)
const;
670 bool QueryDurationKeyFrame(uint64_t *keyframe, uint64_t duration,
671 bool backwards)
const;
677 uint64_t frame { 0 };
679 bool isDataNull {
true };
681 :
type(
t), frame(
f), data(
d), isDataNull(n) {}
684 void QueryMarkup(QVector<MarkupEntry> &mapMark,
685 QVector<MarkupEntry> &mapSeek)
const;
686 void SaveMarkup(
const QVector<MarkupEntry> &mapMark,
687 const QVector<MarkupEntry> &mapSeek)
const;
690 void SendUpdateEvent(
void)
const;
692 void SendAddedEvent(
void)
const;
694 void SendDeletedEvent(
void)
const;
697 static QString i18n(
const QString &msg);
699 static QString MakeUniqueKey(
uint chanid,
const QDateTime &recstartts);
700 static bool ExtractKey(
const QString &uniquekey,
701 uint &chanid, QDateTime &recstartts);
702 static bool ExtractKeyFromPathname(
703 const QString &pathname,
uint &chanid, QDateTime &recstartts);
704 static bool QueryKeyFromPathname(
705 const QString &pathname,
uint &chanid, QDateTime &recstartts);
706 static bool QueryRecordedIdFromPathname(
const QString &pathname,
709 static QString QueryRecordingGroupPassword(
const QString &group);
710 static uint64_t QueryBookmark(
uint chanid,
const QDateTime &recstartts);
711 static QMap<QString,uint32_t> QueryInUseMap(
void);
712 static QMap<QString,bool> QueryJobsRunning(
int type);
717 bool merge =
false)
const;
719 int64_t min_frame = -1, int64_t max_frame = -1)
const;
721 int64_t min_frame = -1, int64_t max_frame = -1)
const;
725 QString CreateRecordBasename(
const QString &ext)
const;
727 bool LoadProgramFromRecorded(
728 uint chanid,
const QDateTime &recstartts);
730 bool FromStringList(QStringList::const_iterator &it,
731 const QStringList::const_iterator& end);
733 static void QueryMarkupMap(
734 const QString &video_pathname,
736 static void QueryMarkupMap(
737 uint chanid,
const QDateTime &recstartts,
740 static int InitStatics(
void);
755 int32_t m_recPriority {0};
757 uint32_t m_chanId {0};
763 QString m_recGroup {
"Default"};
764 QString m_playGroup {
"Default"};
769 QString m_storageGroup {
"Default"};
776 uint64_t m_fileSize {0ULL};
779 QDateTime m_endTs {m_startTs};
780 QDateTime m_recStartTs {m_startTs};
781 QDateTime m_recEndTs {m_startTs};
783 float m_stars {0.0F};
785 QDateTime m_lastModified {m_startTs};
786 QDateTime m_lastInUseTime {m_startTs.addSecs(-4 * 60 * 60)};
788 int32_t m_recPriority2 {0};
790 uint32_t m_recordId {0};
791 uint32_t m_parentId {0};
793 uint32_t m_sourceId {0};
794 uint32_t m_inputId {0};
795 uint32_t m_findId {0};
819 int8_t m_spread {-1};
820 int8_t m_startCol {-1};
835 const QString &where,
836 const QString &groupBy,
837 const QString &orderBy,
857 uint chanid,
const QDateTime &starttime);
874 bool possiblyInProgressRecordingsOnly,
875 const QMap<QString,uint32_t> &inUseMap,
876 const QMap<QString,bool> &isJobRunning,
877 const QMap<QString, ProgramInfo*> &recMap,
879 const QString &sortBy =
"");
882 template<
typename TYPE>
886 const QString& altTable =
"",
890 hasConflicts =
false;
896 hasConflicts = slist[0].toInt();
898 QStringList::const_iterator sit = slist.cbegin()+2;
899 while (sit != slist.cend())
901 TYPE *
p =
new TYPE(sit, slist.cend());
904 if (!
p->HasPathname() && !
p->GetChanID())
912 if (destination.
size() != slist[1].toUInt())
924 bool dummyConflicts =
false;
931 bool *hasConflicts =
nullptr,
932 std::vector<ProgramInfo> *list =
nullptr);
941 QMap<MarkTypes,frm_pos_map_t>
map;
952 #endif // MYTHPROGRAM_H_
void SetProgramInfoType(ProgramInfoType t)
QString GetSortTitle(void) const
QMap< QString, QVariant > MSqlBindings
typedef for a map of string -> string bindings for generic queries.
QSqlQuery wrapper that fetches a DB connection from the connection pool.
bool IsMythStream(void) const
Q_DECLARE_METATYPE(GrabberScript *)
QString MakeUniqueKey(void) const
Creates a unique string that can be used to identify an existing recording.
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
bool IsDuplicate(void) const
bool LoadFromScheduler(AutoDeleteDeque< TYPE * > &destination, bool &hasConflicts, const QString &altTable="", int recordid=-1)
void SetRecordingStatus(RecStatus::Type status)
QString GetHostname(void) const
void ClearInputName(void)
QString GetInputName(void) const
void SetCategory(const QString &cat)
QString GetRecordingStartTime(MythDate::Format fmt) const
Approximate time the recording started (with formatting).
virtual void SetRecordingID(uint _recordedid)
#define kSubtitlePropertyMask
static QMutex s_staticDataLock
MarkupEntry(int t, uint64_t f, uint64_t d, bool n)
QString GetChannelName(void) const
This is the channel name in the local market, i.e.
uint GetRecordingID(void) const
QString GetChanNum(void) const
This is the channel "number", in the form 1, 1_2, 1-2, 1#1, etc.
void SetSeriesID(const QString &id)
TODO Move to RecordingInfo.
MPUBLIC ProgramInfo * LoadProgramFromProgram(uint chanid, const QDateTime &starttime)
QString GetChannelSchedulingID(void) const
This is the unique programming identifier of a channel.
QString GetCategory(void) const
QMap< uint64_t, MarkTypes > frm_dir_map_t
Frame # -> Mark map.
void SetEditing(bool editing)
static bool s_usingProgIDAuth
void SetHostname(const QString &host)
static bool UsingProgramIDAuthority(void)
void SetScheduledStartTime(const QDateTime &dt)
ProgramInfo(QString _title, QString _category, QDateTime _startts, QDateTime _endts)
Constructs a Dummy ProgramInfo (used by GuideGrid)
bool IsPathSet(void) const
bool IsReactivated(void) const
bool IsInUsePlaying(void) const
QDateTime GetScheduledEndTime(void) const
The scheduled end time of the program.
QDateTime m_bookmarkUpdate
MPUBLIC 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="")
void SetProgramID(const QString &id)
QString GetRecordingEndTime(MythDate::Format fmt) const
Approximate time the recording should have ended, did end, or is intended to end (with formatting).
bool IsSameRecording(const ProgramInfo &other) const
QDateTime GetRecordingEndTime(void) const
Approximate time the recording should have ended, did end, or is intended to end.
uint32_t GetProgramFlags(void) const
QString GetRecordingGroup(void) const
int GetRecordingPriority(void) const
@ kProgramInfoTypeVideoBD
MPUBLIC bool LoadFromOldRecorded(ProgramList &destination, const QString &sql, const MSqlBindings &bindings)
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
QDateTime GetRecordingStartTime(void) const
Approximate time the recording started.
QString GetPathname(void) const
bool IsWatched(void) const
QHash< QString, QString > InfoMap
bool IsPreserved(void) const
QString GetScheduledStartTime(MythDate::Format fmt) const
The scheduled start time of program (with formatting).
bool IsRepeat(void) const
QString GetInetRef(void) const
uint GetYearOfInitialRelease(void) const
#define kAudioPropertyMask
static const QString kFromRecordedQuery
QString GetLastModifiedTime(MythDate::Format fmt) const
QString toString(MarkTypes type)
bool IsVideoBD(void) const
void SetRecordingEndTime(const QDateTime &dt)
QDateTime GetScheduledStartTime(void) const
The scheduled start time of program.
RecStatus::Type GetRecordingStatus(void) const
void SetScheduledEndTime(const QDateTime &dt)
void SetRecordingRuleType(RecordingType type)
QString GetShortInputName(void) const
QString GetTitle(void) const
QString GetDescription(void) const
void SetPlaybackGroup(const QString &group)
void SetRecordingGroup(const QString &group)
uint GetEpisodeTotal(void) const
uint GetSourceID(void) const
bool HasCutlist(void) const
@ kProgramInfoTypeVideoDVD
QString GetPlaybackURL(ProgramInfo *pginfo, bool storePath)
@ kProgramInfoTypeVideoFile
static void clear(SettingsMap &cache, SettingsMap &overrides, const QString &myKey)
void SetRecordingPriority(int priority)
void ClearMarkupFlag(MarkTypes type) const
uint GetAudioProperties(void) const
QString GetPlaybackGroup(void) const
static const std::array< const QString, 5 > kCatName
QString GetChannelPlaybackFilters(void) const
MPUBLIC QString format_season_and_episode(int seasEp, int digits=-1)
uint GetFindID(void) const
static QStringList LoadFromScheduler(const QString &tmptable, int recordid)
QString GetSeriesID(void) const
QString GetStorageGroup(void) const
ProgramInfo(const QStringList &list)
QString GetSortSubtitle(void) const
QDate GetOriginalAirDate(void) const
MPUBLIC QString myth_category_type_to_string(ProgramInfo::CategoryType category_type)
#define kAudioPropertyOffset
ProgramInfo(void)
Null constructor.
QMap< long long, long long > frm_pos_map_t
Frame # -> File offset map.
uint GetVideoProperties(void) const
QString GetScheduledEndTime(MythDate::Format fmt) const
The scheduled end time of the program (with formatting).
#define kSubtitlePropertyOffset
RecordingDupMethodType GetDuplicateCheckMethod(void) const
What should be compared to determine if two programs are the same?
uint GetInputID(void) const
QString m_chanPlaybackFilters
void SetChanID(uint _chanid)
MPUBLIC bool LoadFromProgram(ProgramList &destination, const QString &where, const QString &groupBy, const QString &orderBy, const MSqlBindings &bindings, const ProgramList &schedList)
uint GetChanID(void) const
This is the unique key used in the database to locate tuning information.
RecordingType GetRecordingRuleType(void) const
uint GetEpisode(void) const
static ProgramInfoUpdater * s_updater
Holds information on recordings and videos.
ProgramInfoType GetProgramInfoType(void) const
QDateTime GetLastModifiedTime(void) const
uint GetSeason(void) const
void SetSourceID(uint id)
void SetIgnoreBookmark(bool ignore)
If "ignore" is true GetBookmark() will return 0, otherwise GetBookmark() will return the bookmark pos...
QString m_syndicatedEpisode
void SetRecordingPriority2(int priority)
void SetPositionMapDBReplacement(PMapDBReplacement *pmap)
bool IsAutoExpirable(void) const
bool IsVideoDVD(void) const
void SetCategoryType(const CategoryType type)
static const std::array< const mark, 16 > marks
bool IsVideoFile(void) const
void SetFlagging(bool flagging)
RecordingDupInType GetDuplicateCheckSource(void) const
Where should we check for duplicates?
bool IsDeletePending(void) const
MPUBLIC bool GetNextRecordingList(QDateTime &nextRecordingStart, bool *hasConflicts=nullptr, std::vector< ProgramInfo > *list=nullptr)
void SetIgnoreProgStart(bool ignore)
If "ignore" is true QueryProgStart() will return 0, otherwise QueryProgStart() will return the progst...
QString GetProgramID(void) const
uint GetParentRecordingRuleID(void) const
void SetRecordingRuleID(uint id)
static const iso6937table * d
int GetRecordingPriority2(void) const
ProgramInfo(QStringList::const_iterator &it, const QStringList::const_iterator &end)
uint GetRecordingRuleID(void) const
bool IsRecording(void) const
MPUBLIC ProgramInfo::CategoryType string_to_myth_category_type(const QString &type)
QString GetBasename(void) const
uint GetSubtitleType(void) const
AvailableStatusType GetAvailableStatus(void) const
#define kVideoPropertyOffset
void SetReactivated(bool reactivate)
CategoryType GetCategoryType(void) const
bool IsBookmarkSet(void) const
QMap< MarkTypes, frm_pos_map_t > map
uint GetStars(uint range_max) const
bool IsCommercialFree(void) const
void SetStorageGroup(const QString &group)
#define kVideoPropertyMask
bool HasPathname(void) const
void SetAllowLastPlayPos(bool allow)
If "ignore" is true QueryLastPlayPos() will return 0, otherwise QueryLastPlayPos() will return the la...
int pginfo_init_statics()
QDateTime GetBookmarkUpdate(void) const
QString GetSubtitle(void) const
void SetRecordingStartTime(const QDateTime &dt)
float GetStars(void) const