MythTV master
programinfo.h
Go to the documentation of this file.
1// -*- Mode: c++ -*-
2
3#ifndef MYTHPROGRAM_H_
4#define MYTHPROGRAM_H_
5
6// ANSI C
7#include <cstdint> // for [u]int[32,64]_t
8#include <utility>
9#include <vector> // for GetNextRecordingList
10
11#include <QStringList>
12#include <QDateTime>
13
14// MythTV headers
23
24/* If NUMPROGRAMLINES gets updated, then MYTH_PROTO_VERSION and MYTH_PROTO_TOKEN
25 in mythversion.h need to be bumped, and also follow the instructions in
26 myth_version.h about other changes needed when the network protocol changes.
27*/
28static constexpr int8_t NUMPROGRAMLINES { 52 };
29
30class ProgramInfo;
32
63class MSqlQuery;
66
68{
69 friend int pginfo_init_statics(void);
70 friend class TestRecordingExtender;
71 private:
72 // Must match the number of items in CategoryType below
73 static const std::array<const QString,5> kCatName;
74 public:
75 static constexpr int kNumCatTypes = 5;
76 enum CategoryType : std::uint8_t
77 { kCategoryNone, kCategoryMovie, kCategorySeries,
78 kCategorySports, kCategoryTVShow };
79
81 ProgramInfo(void) { ensureSortFields(); }
83 ProgramInfo(const ProgramInfo &other);
85 explicit ProgramInfo(uint recordedid);
87 ProgramInfo(uint chanid, const QDateTime &recstartts);
89 ProgramInfo(uint recordedid,
90 QString title,
91 QString sortTitle,
92 QString subtitle,
93 QString sortSubtitle,
94 QString description,
95 uint season,
96 uint episode,
97 uint totalepisodes,
98 QString syndicatedepisode,
99 QString category,
100
101 uint chanid,
102 QString channum,
103 QString chansign,
104 QString channame,
105 QString chanplaybackfilters,
106
107 QString recgroup,
108 QString playgroup,
109
110 const QString &pathname,
111
112 QString hostname,
113 QString storagegroup,
114
115 QString seriesid,
116 QString programid,
117 QString inetref,
118 CategoryType catType,
119
120 int recpriority,
121
122 uint64_t filesize,
123
124 QDateTime startts,
125 QDateTime endts,
126 QDateTime recstartts,
127 QDateTime recendts,
128
129 float stars,
130
131 uint year,
132 uint partnumber,
133 uint parttotal,
134
135 QDate originalAirDate,
136 QDateTime lastmodified,
137
138 RecStatus::Type recstatus,
139
140 uint recordid,
141
142 RecordingDupInType dupin,
143 RecordingDupMethodType dupmethod,
144
145 uint findid,
146
147 uint programflags,
148 uint audioproperties,
149 uint videoproperties,
150 uint subtitleType,
151 QString inputname,
152 QDateTime bookmarkupdate);
153
155 ProgramInfo(QString title,
156 QString sortTitle,
157 QString subtitle,
158 QString sortSubtitle,
159 QString description,
160 uint season,
161 uint episode,
162 QString category,
163
164 uint chanid,
165 QString channum,
166 QString chansign,
167 QString channame,
168
169 QString seriesid,
170 QString programid,
171 QString inetref,
172
173 QDateTime startts,
174 QDateTime endts,
175 QDateTime recstartts,
176 QDateTime recendts,
177
178 RecStatus::Type recstatus,
179
180 uint recordid,
181
182 RecordingType rectype,
183
184 uint findid,
185
186 bool duplicate);
187
189 ProgramInfo(QString title,
190 QString sortTitle,
191 QString subtitle,
192 QString sortSubtitle,
193 QString description,
194 QString syndicatedepisode,
195 QString category,
196
197 uint chanid,
198 QString channum,
199 QString chansign,
200 QString channame,
201 QString chanplaybackfilters,
202
203 QDateTime startts,
204 QDateTime endts,
205 QDateTime recstartts,
206 QDateTime recendts,
207
208 QString seriesid,
209 QString programid,
210 CategoryType catType,
211
212 float stars,
213 uint year,
214 uint partnumber,
215 uint parttotal,
216 QDate originalAirDate,
217 RecStatus::Type recstatus,
218 uint recordid,
219 RecordingType rectype,
220 uint findid,
221
222 bool commfree,
223 bool repeat,
224
225 uint videoproperties,
226 uint audioproperties,
227 uint subtitletype,
228
229 uint season,
230 uint episode,
231 uint totalepisodes,
232
233 const ProgramList &schedList);
235 ProgramInfo(QString title,
236 QString sortTitle,
237 QString subtitle,
238 QString sortSubtitle,
239 QString description,
240 uint season,
241 uint episode,
242 uint totalepisodes,
243 QString category,
244
245 uint chanid,
246 QString channum,
247 QString chansign,
248 QString channame,
249 QString chanplaybackfilters,
250
251 QString recgroup,
252 QString playgroup,
253
254 QDateTime startts,
255 QDateTime endts,
256 QDateTime recstartts,
257 QDateTime recendts,
258
259 QString seriesid,
260 QString programid,
261 QString inetref,
262 QString inputname);
264 explicit ProgramInfo(const QString &pathname);
266 ProgramInfo(const QString &pathname,
267 const QString &plot,
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,
276 uint year,
277 const QString &programid);
279 ProgramInfo(const QString &_title, uint _chanid,
280 const QDateTime &_startts, const QDateTime &_endts);
282 ProgramInfo(QString _title, QString _category,
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(); }
287 ProgramInfo(QStringList::const_iterator &it,
288 const QStringList::const_iterator& end)
289 {
290 if (!FromStringList(it, end))
292 }
293 explicit ProgramInfo(const QStringList &list)
294 {
295 QStringList::const_iterator it = list.begin();
296 if (!FromStringList(it, list.end()))
298 }
299
300 bool operator==(const ProgramInfo& rhs);
301 ProgramInfo &operator=(const ProgramInfo &other);
302 virtual void clone(const ProgramInfo &other,
303 bool ignore_non_serialized_data = false);
304 void ensureSortFields(void);
305
306 virtual void clear(void);
307
308 // Destructor
309 virtual ~ProgramInfo() = default;
310
311 // Serializers
312 void ToStringList(QStringList &list) const;
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);
318
319 // Used for scheduling recordings
320 bool IsSameProgram(const ProgramInfo &other) const; // Exact same program
321 bool IsDuplicateProgram(const ProgramInfo &other) const; // Is this program considered a duplicate according to rule type and dup method (scheduler only)
322 bool IsSameProgramAndStartTime(const ProgramInfo &other) const; // Exact same program and same starttime, Any channel
323 bool IsSameTitleStartTimeAndChannel(const ProgramInfo &other) const; // Same title, starttime and channel
324 bool IsSameTitleTimeslotAndChannel(const ProgramInfo &other) const;//sched only - Same title, starttime, endtime and channel
325 static bool UsingProgramIDAuthority(void)
326 {
327 return s_usingProgIDAuth;
328 };
329 static void CheckProgramIDAuthorities(void);//sched only
330
331 // Used for extending scheduled recordings
332 bool IsSameProgramWeakCheck(const ProgramInfo &other) const;
333 bool IsSameRecording(const ProgramInfo &other) const
334 { return m_chanId == other.m_chanId && m_recStartTs == other.m_recStartTs; }
335 bool IsSameChannel(const ProgramInfo &other) const;
336
337 // Quick gets
340 QString MakeUniqueKey(void) const
341 { return MakeUniqueKey(m_chanId, m_recStartTs); }
342 std::chrono::seconds GetSecondsInRecording(void) const;
343 QString ChannelText(const QString& format) const;
344 QString GetPathname(void) const { return m_pathname; }
345 QString GetBasename(void) const { return m_pathname.section('/', -1); }
346 bool IsVideoFile(void) const
347 { return GetProgramInfoType() == kProgramInfoTypeVideoFile; }
348 bool IsVideoDVD(void) const
349 { return GetProgramInfoType() == kProgramInfoTypeVideoDVD; }
350 bool IsVideoBD(void) const
351 { return GetProgramInfoType() == kProgramInfoTypeVideoBD; }
352 bool IsLocal(void) const { return m_pathname.startsWith("/")
353#ifdef _WIN32
354 || m_pathname.at(1) == ':'
355#endif
356 ; }
357 bool IsMythStream(void) const { return m_pathname.startsWith("myth://"); }
358 bool IsPathSet(void) const { return GetBasename() != m_pathname; }
359 bool HasPathname(void) const { return !GetPathname().isEmpty(); }
360 bool IsFileReadable(void);
361
362 QString GetTitle(void) const { return m_title; }
363 QString GetSortTitle(void) const { return m_sortTitle; }
364 QString GetSubtitle(void) const { return m_subtitle; }
365 QString GetSortSubtitle(void) const { return m_sortSubtitle; }
366 QString GetDescription(void) const { return m_description; }
367 uint GetSeason(void) const { return m_season; }
368 uint GetEpisode(void) const { return m_episode; }
369 uint GetEpisodeTotal(void) const { return m_totalEpisodes; }
370 QString GetCategory(void) const { return m_category; }
373 uint GetChanID(void) const { return m_chanId; }
377 QString GetChanNum(void) const { return m_chanStr; }
384 QString GetChannelSchedulingID(void) const { return m_chanSign; }
387 QString GetChannelName(void) const { return m_chanName; }
388 QString GetChannelPlaybackFilters(void) const
389 { return m_chanPlaybackFilters; }
391 QDateTime GetScheduledStartTime(void) const { return m_startTs; }
394 {
395 return MythDate::toString(m_startTs, fmt);
396 }
398 QDateTime GetScheduledEndTime(void) const { return m_endTs; }
401 {
402 return MythDate::toString(m_endTs, fmt);
403 }
405 QDateTime GetRecordingStartTime(void) const { return m_recStartTs; }
408 {
409 return MythDate::toString(m_recStartTs, fmt);
410 }
413 QDateTime GetRecordingEndTime(void) const { return m_recEndTs; }
417 {
418 return MythDate::toString(m_recEndTs, fmt);
419 }
420 QString GetRecordingGroup(void) const { return m_recGroup; }
421 QString GetPlaybackGroup(void) const { return m_playGroup; }
422 QString GetHostname(void) const { return m_hostname; }
423 QString GetStorageGroup(void) const { return m_storageGroup; }
425 {
426 if (m_year > 0)
427 return m_year;
428 if (m_originalAirDate.isValid())
429 return m_originalAirDate.year();
430 return 0;
431 }
432 QDate GetOriginalAirDate(void) const { return m_originalAirDate; }
433 QDateTime GetLastModifiedTime(void) const { return m_lastModified; }
435 {
436 return MythDate::toString(m_lastModified, fmt);
437 }
438 virtual uint64_t GetFilesize(void) const; // TODO Remove
439 QString GetSeriesID(void) const { return m_seriesId; }
440 QString GetProgramID(void) const { return m_programId; }
441 QString GetInetRef(void) const { return m_inetRef; }
442 CategoryType GetCategoryType(void) const { return m_catType; }
443 QString GetCategoryTypeString(void) const;
444 int GetRecordingPriority(void) const { return m_recPriority; }
445 int GetRecordingPriority2(void) const { return m_recPriority2; }
446 float GetStars(void) const { return m_stars; }
447 uint GetStars(uint range_max) const
448 { return lroundf(m_stars * range_max); }
449
450 uint GetRecordingID(void) const { return m_recordedId; }
452 { return (RecStatus::Type)m_recStatus; }
453 uint GetRecordingRuleID(void) const { return m_recordId; }
454 uint GetParentRecordingRuleID(void) const { return m_parentId; }
456 { return (RecordingType)m_recType; }
457
460 { return (RecordingDupInType)m_dupIn; }
461
464 { return (RecordingDupMethodType)m_dupMethod; }
465
466 uint GetSourceID(void) const { return m_sourceId; }
467 uint GetInputID(void) const { return m_inputId; }
468 QString GetInputName(void) const { return m_inputName; }
469 QString GetShortInputName(void) const;
470 void ClearInputName(void) { m_inputName.clear(); }
471
472 uint GetFindID(void) const { return m_findId; }
473
474 uint32_t GetProgramFlags(void) const { return m_programFlags; }
475 QString GetProgramFlagNames(void) const;
477 { return (ProgramInfoType)((m_programFlags & FL_TYPEMASK) >> 20); }
478 QDateTime GetBookmarkUpdate(void) const { return m_bookmarkUpdate; }
479 QString GetRecTypeStatus(bool showrerecord) const;
480 bool IsGeneric(void) const;
481 bool IsInUsePlaying(void) const { return (m_programFlags & FL_INUSEPLAYING) != 0U;}
482 bool IsCommercialFree(void) const { return (m_programFlags & FL_CHANCOMMFREE) != 0U;}
483 bool IsCommercialFlagged(void) const { return (m_programFlags & FL_COMMFLAG) != 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; }
488 bool IsAutoExpirable(void) const { return (m_programFlags & FL_AUTOEXP) != 0U; }
489 bool IsPreserved(void) const { return (m_programFlags & FL_PRESERVED) != 0U; }
490 bool IsVideo(void) const { return (m_programFlags & FL_TYPEMASK) != 0U; }
491 bool IsRecording(void) const { return !IsVideo(); }
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; }
495 bool IsDeletePending(void) const
496 { return (m_programFlags & FL_DELETEPENDING) != 0U; }
497
498 uint GetSubtitleType(void) const { return m_subtitleProperties; }
499 QString GetSubtitleTypeNames(void) const;
500 uint GetVideoProperties(void) const { return m_videoProperties; }
501 QString GetVideoPropertyNames(void) const;
502 uint GetAudioProperties(void) const { return m_audioProperties; }
503 QString GetAudioPropertyNames(void) const;
504
505 static uint SubtitleTypesFromNames(const QString & names);
506 static uint VideoPropertiesFromNames(const QString & names);
507 static uint AudioPropertiesFromNames(const QString & names);
508
509 void ProgramFlagsFromNames(const QString & names);
510
511 enum Verbosity : std::uint8_t
512 {
517 };
518 QString toString(Verbosity v = kLongDescription, const QString& sep = ":",
519 const QString& grp = "\"") const;
520
521 // Quick sets
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);
527 void SetChanID(uint _chanid) { m_chanId = _chanid; }
528 void SetScheduledStartTime(const QDateTime &dt) { m_startTs = dt; }
529 void SetScheduledEndTime( const QDateTime &dt) { m_endTs = dt; }
530 void SetRecordingStartTime(const QDateTime &dt) { m_recStartTs = dt; }
531 void SetRecordingEndTime( const QDateTime &dt) { m_recEndTs = dt; }
532 void SetRecordingGroup(const QString &group) { m_recGroup = group; }
533 void SetPlaybackGroup( const QString &group) { m_playGroup = group; }
534 void SetHostname( const QString &host) { m_hostname = host; }
535 void SetStorageGroup( const QString &group) { m_storageGroup = group; }
536 virtual void SetFilesize( uint64_t sz);
537 void SetSeriesID( const QString &id) { m_seriesId = id; }
538 void SetProgramID( const QString &id) { m_programId = id; }
539 void SetCategory( const QString &cat) { m_category = cat; }
540 void SetCategoryType( const CategoryType type) { m_catType = type; }
541 void SetRecordingPriority(int priority) { m_recPriority = priority; }
542 void SetRecordingPriority2(int priority) { m_recPriority2 = priority; }
543 void SetRecordingRuleID(uint id) { m_recordId = id; }
544 void SetSourceID(uint id) { m_sourceId = id; }
545 void SetInputID(uint id) { m_inputId = id; }
546 void SetReactivated(bool reactivate)
547 {
548 m_programFlags &= ~FL_REACTIVATE;
549 m_programFlags |= (reactivate) ? FL_REACTIVATE : FL_NONE;
550 }
551 void SetEditing(bool editing)
552 {
553 m_programFlags &= ~FL_EDITING;
554 m_programFlags |= (editing) ? FL_EDITING : FL_NONE;
555 }
556 void SetFlagging(bool flagging)
557 {
558 m_programFlags &= ~FL_COMMFLAG;
559 m_programFlags |= (flagging) ? FL_COMMFLAG : FL_NONE;
560 }
563 void SetIgnoreBookmark(bool ignore)
564 {
565 m_programFlags &= ~FL_IGNOREBOOKMARK;
566 m_programFlags |= (ignore) ? FL_IGNOREBOOKMARK : FL_NONE;
567 }
570 void SetIgnoreProgStart(bool ignore)
571 {
572 m_programFlags &= ~FL_IGNOREPROGSTART;
573 m_programFlags |= (ignore) ? FL_IGNOREPROGSTART : FL_NONE;
574 }
578 void SetIgnoreLastPlayPos(bool ignore)
579 {
580 m_programFlags &= ~FL_IGNORELASTPLAYPOS;
581 m_programFlags |= (ignore) ? FL_IGNORELASTPLAYPOS : FL_NONE;
582 }
583 virtual void SetRecordingID(uint _recordedid)
584 { m_recordedId = _recordedid; }
585 void SetRecordingStatus(RecStatus::Type status) { m_recStatus = status; }
588 { m_positionMapDBReplacement = pmap; }
589
590 void CalculateRecordedProgress();
591 uint GetRecordedPercent() const { return m_recordedPercent; }
592 void CalculateWatchedProgress(uint64_t pos);
593 uint GetWatchedPercent() const { return m_watchedPercent; }
594 void SetWatchedPercent(uint progress) { m_watchedPercent = progress; }
595 void CalculateProgress(uint64_t pos);
596
597 // Slow DB gets
598 QString QueryBasename(void) const;
599// uint64_t QueryFilesize(void) const; // TODO Remove
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;
613 AutoExpireType QueryAutoExpire(void) const;
614 TranscodingStatus QueryTranscodeStatus(void) const;
615 bool QueryTuningInfo(QString &channum, QString &input) const;
616 QString QueryInputDisplayName(void) 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;
625 bool QueryMarkupFlag(MarkTypes type) const;
626 uint QueryTranscoderID(void) const;
627 uint64_t QueryLastFrameInPosMap(void) const;
628 bool Reload(void);
629
630 // Slow DB sets
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);
637 void SaveTranscodeStatus(TranscodingStatus trans);
638 void SaveWatched(bool watchedFlag);
639 void SaveDeletePendingFlag(bool deleteFlag);
640 void SaveCommFlagged(CommFlagStatus flag); // 1 = flagged, 2 = processing
641 void SaveAutoExpire(AutoExpireType autoExpire, bool updateDelete = false);
642 void SavePreserve(bool preserveEpisode);
643 bool SaveBasename(const QString &basename);
644 void SaveAspect(uint64_t frame, MarkTypes type, uint customAspect);
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);
651 void SaveMarkupFlag(MarkTypes type) const;
652 void ClearMarkupFlag(MarkTypes type) const { ClearMarkupMap(type); }
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);
658
659 // Extremely slow functions that cannot be called from the UI thread.
660 QString DiscoverRecordingDirectory(void);
661 QString GetPlaybackURL(bool checkMaster = false,
662 bool forceCheckLocal = false);
663 ProgramInfoType DiscoverProgramInfoType(void) const;
664
665 // Edit flagging map
666 bool QueryCutList(frm_dir_map_t &delMap, bool loadAutosave=false) const;
667 void SaveCutList(frm_dir_map_t &delMap, bool isAutoSave=false) const;
668
669 // Commercial flagging map
670 void QueryCommBreakList(frm_dir_map_t &frames) const;
671 void SaveCommBreakList(frm_dir_map_t &frames) const;
672
673 // Keyframe positions map
674 void QueryPositionMap(frm_pos_map_t &posMap, MarkTypes type) const;
675 void ClearPositionMap(MarkTypes type) const;
676 void SavePositionMap(frm_pos_map_t &posMap, MarkTypes type,
677 int64_t min_frame = -1, int64_t max_frame = -1) const;
678 void SavePositionMapDelta(frm_pos_map_t &posMap, MarkTypes type) const;
679
680 // Get position/duration for keyframe and vice versa
681 bool QueryKeyFrameInfo(uint64_t *result, uint64_t position_or_keyframe,
682 bool backwards,
683 MarkTypes type, const char *from_filemarkup_asc,
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;
695
696 // Get/set all markup
698 {
699 int type { -1 }; // MarkTypes
700 uint64_t frame { 0 };
701 uint64_t data { 0 };
702 bool isDataNull { true };
703 MarkupEntry(int t, uint64_t f, uint64_t d, bool n)
704 : type(t), frame(f), data(d), isDataNull(n) {}
705 MarkupEntry(void) = default;
706 };
707 void QueryMarkup(QVector<MarkupEntry> &mapMark,
708 QVector<MarkupEntry> &mapSeek) const;
709 void SaveMarkup(const QVector<MarkupEntry> &mapMark,
710 const QVector<MarkupEntry> &mapSeek) const;
711
713 void SendUpdateEvent(void) const;
715 void SendAddedEvent(void) const;
717 void SendDeletedEvent(void) const;
718
720 static QString i18n(const QString &msg);
721
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,
730 uint &recordedid);
731
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);
736 static QStringList LoadFromScheduler(const QString &tmptable, int recordid);
737
738 // Flagging map support methods
739 void UpdateMarkTimeStamp(bool bookmarked) const;
740 void UpdateLastPlayTimeStamp(bool lastplay) const;
741 void QueryMarkupMap(frm_dir_map_t&marks, MarkTypes type,
742 bool merge = false) const;
743 void SaveMarkupMap(const frm_dir_map_t &marks, MarkTypes type = MARK_ALL,
744 int64_t min_frame = -1, int64_t max_frame = -1) const;
745 void ClearMarkupMap(MarkTypes type = MARK_ALL,
746 int64_t min_frame = -1, int64_t max_frame = -1) const;
747
748 protected:
749 // Creates a basename from the start and end times
750 QString CreateRecordBasename(const QString &ext) const;
751
752 bool LoadProgramFromRecorded(
753 uint chanid, const QDateTime &recstartts);
754
755 bool FromStringList(QStringList::const_iterator &it,
756 const QStringList::const_iterator& end);
757
758 static void QueryMarkupMap(
759 const QString &video_pathname,
760 frm_dir_map_t &marks, MarkTypes type, bool merge = false);
761 static void QueryMarkupMap(
762 uint chanid, const QDateTime &recstartts,
763 frm_dir_map_t &marks, MarkTypes type, bool merge = false);
764
765 static int InitStatics(void);
766
767 protected:
768 QString m_title;
769 QString m_sortTitle;
770 QString m_subtitle;
773 uint m_season {0};
774 uint m_episode {0};
775 uint m_totalEpisodes {0};
777 QString m_category;
778 QString m_director;
779
780 int32_t m_recPriority {0};
781
782 uint32_t m_chanId {0};
783 QString m_chanStr; // Channum
784 QString m_chanSign; // Callsign
785 QString m_chanName;
787
788 QString m_recGroup {"Default"};
789 QString m_playGroup {"Default"};
790
791 mutable QString m_pathname;
792
793 QString m_hostname;
794 QString m_storageGroup {"Default"};
795
796 QString m_seriesId;
797 QString m_programId;
798 QString m_inetRef;
799 CategoryType m_catType {kCategoryNone};
800
801 uint64_t m_fileSize {0ULL};
802
803 QDateTime m_startTs {MythDate::current(true)};
804 QDateTime m_endTs {m_startTs};
805 QDateTime m_recStartTs {m_startTs};
806 QDateTime m_recEndTs {m_startTs};
807
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)};
813
814 int32_t m_recPriority2 {0};
815
816 uint32_t m_recordId {0};
817 uint32_t m_parentId {0};
818
819 uint32_t m_sourceId {0};
820 uint32_t m_inputId {0};
821 uint32_t m_findId {0};
822
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};
827 uint16_t m_year {0};
828 uint16_t m_partNumber {0};
829 uint16_t m_partTotal {0};
830
831 int8_t m_recStatus {RecStatus::Unknown};
832 uint8_t m_recType {kNotRecording};
833 uint8_t m_dupIn {kDupsInAll};
834 uint8_t m_dupMethod {kDupCheckSubThenDesc};
835
836 uint m_recordedId {0};
837 QString m_inputName;
839
840// everything below this line is not serialized
841 uint8_t m_availableStatus {asAvailable}; // only used for playbackbox.cpp
842 int8_t m_recordedPercent {-1}; // only used by UI
843 int8_t m_watchedPercent {-1}; // only used by UI
844
845 public:
846 void SetAvailableStatus(AvailableStatusType status, const QString &where);
848 { return (AvailableStatusType) m_availableStatus; }
849 int8_t m_spread {-1}; // only used in guidegrid.cpp
850 int8_t m_startCol {-1}; // only used in guidegrid.cpp
851
852 static const QString kFromRecordedQuery;
853
854 protected:
856 PMapDBReplacement *m_positionMapDBReplacement {nullptr};
857
858 static QMutex s_staticDataLock;
860 static bool s_usingProgIDAuth;
861
862 public:
864};
865
866// Class for specifying the desired grouping behavior when querying
867// for program data. Note that title and starttime are always used in
868// all cases but None and callsign is also used in the ChanNum case.
869class MBASE_PUBLIC ProgGroupBy : public QObject
870{
871 Q_OBJECT
872
873public:
874 enum Type : uint8_t {
875 None, // Don't group programs
876 ChanNum, // Group by number and callsign
877 CallSign, // Group by call sign
878 ProgramId // Group by program ID
879 };
880 static QString toString(ProgGroupBy::Type groupBy);
881 Q_ENUM(Type)
882};
883
885 ProgramList &destination,
886 const QString &where,
887 const QString &groupBy,
888 const QString &orderBy,
889 const MSqlBindings &bindings,
890 const ProgramList &schedList);
891
893 ProgramList &destination,
894 const QString &sql,
895 const MSqlBindings &bindings,
896 const ProgramList &schedList,
898
900 ProgramList &destination,
901 const QString &sql,
902 const MSqlBindings &bindings,
903 const ProgramList &schedList,
904 uint start,
905 uint limit,
906 uint &count,
908
910 uint chanid, const QDateTime &starttime);
911
913 ProgramList &destination,
914 const QString &sql,
915 const MSqlBindings &bindings);
916
918 ProgramList &destination,
919 const QString &sql,
920 const MSqlBindings &bindings,
921 uint start,
922 uint limit,
923 uint &count);
924
926 ProgramList &destination,
927 bool possiblyInProgressRecordingsOnly,
928 const QMap<QString,uint32_t> &inUseMap,
929 const QMap<QString,bool> &isJobRunning,
930 const QMap<QString, ProgramInfo*> &recMap,
931 int sort = 0,
932 const QString &sortBy = "",
933 bool ignoreLiveTV = false,
934 bool ignoreDeleted = false);
935
936template<typename TYPE>
938 AutoDeleteDeque<TYPE*> &destination,
939 bool &hasConflicts,
940 const QString& altTable = "",
941 int recordid = -1)
942{
943 destination.clear();
944 hasConflicts = false;
945
946 QStringList slist = ProgramInfo::LoadFromScheduler(altTable, recordid);
947 if (slist.empty())
948 return false;
949
950 hasConflicts = slist[0].toInt();
951
952 QStringList::const_iterator sit = slist.cbegin()+2;
953 while (sit != slist.cend())
954 {
955 TYPE *p = new TYPE(sit, slist.cend());
956 destination.push_back(p);
957
958 if (!p->HasPathname() && !p->GetChanID())
959 {
960 delete p;
961 destination.clear();
962 return false;
963 }
964 }
965
966 if (destination.size() != slist[1].toUInt())
967 {
968 destination.clear();
969 return false;
970 }
971
972 return true;
973}
974
975template<typename T>
977{
978 bool dummyConflicts = false;
979 return LoadFromScheduler(destination, dummyConflicts, "", -1);
980}
981
982// Moved from programdetails.cpp/h, used by MythWelcome/MythShutdown
983// could be factored out
984MBASE_PUBLIC bool GetNextRecordingList(QDateTime &nextRecordingStart,
985 bool *hasConflicts = nullptr,
986 std::vector<ProgramInfo> *list = nullptr);
987
988class QMutex;
990{
991 public:
994 QMutex *lock;
995 QMap<MarkTypes,frm_pos_map_t> map;
996};
997
1000
1003
1004#endif // MYTHPROGRAM_H_
1005
1006/* vim: set expandtab tabstop=4 shiftwidth=4: */
void clear(void)
void push_back(T info)
size_t size(void) const
QSqlQuery wrapper that fetches a DB connection from the connection pool.
Definition: mythdbcon.h:128
QMap< MarkTypes, frm_pos_map_t > map
Definition: programinfo.h:995
Holds information on recordings and videos.
Definition: programinfo.h:68
float GetStars(void) const
Definition: programinfo.h:446
uint GetChanID(void) const
This is the unique key used in the database to locate tuning information.
Definition: programinfo.h:373
uint GetRecordingRuleID(void) const
Definition: programinfo.h:453
bool IsInUsePlaying(void) const
Definition: programinfo.h:481
RecordingDupMethodType GetDuplicateCheckMethod(void) const
What should be compared to determine if two programs are the same?
Definition: programinfo.h:463
QString GetBasename(void) const
Definition: programinfo.h:345
void SetFlagging(bool flagging)
Definition: programinfo.h:556
bool HasPathname(void) const
Definition: programinfo.h:359
QString GetSeriesID(void) const
Definition: programinfo.h:439
static bool s_usingProgIDAuth
Definition: programinfo.h:860
uint GetVideoProperties(void) const
Definition: programinfo.h:500
static ProgramInfoUpdater * s_updater
Definition: programinfo.h:859
bool IsVideoFile(void) const
Definition: programinfo.h:346
ProgramInfo(QStringList::const_iterator &it, const QStringList::const_iterator &end)
Definition: programinfo.h:287
QString GetLastModifiedTime(MythDate::Format fmt) const
Definition: programinfo.h:434
virtual void clear(void)
bool IsCommercialFlagged(void) const
Definition: programinfo.h:483
QString m_hostname
Definition: programinfo.h:793
bool IsDeletePending(void) const
Definition: programinfo.h:495
bool IsAutoExpirable(void) const
Definition: programinfo.h:488
bool IsPreserved(void) const
Definition: programinfo.h:489
bool IsVideoDVD(void) const
Definition: programinfo.h:348
void SetRecordingPriority2(int priority)
Definition: programinfo.h:542
void SetIgnoreProgStart(bool ignore)
If "ignore" is true QueryProgStart() will return 0, otherwise QueryProgStart() will return the progst...
Definition: programinfo.h:570
QString m_pathname
Definition: programinfo.h:791
QDateTime m_previewUpdate
Definition: programinfo.h:863
ProgramInfoType GetProgramInfoType(void) const
Definition: programinfo.h:476
static const QString kFromRecordedQuery
Definition: programinfo.h:852
void SetIgnoreBookmark(bool ignore)
If "ignore" is true GetBookmark() will return 0, otherwise GetBookmark() will return the bookmark pos...
Definition: programinfo.h:563
uint GetEpisode(void) const
Definition: programinfo.h:368
uint GetSubtitleType(void) const
Definition: programinfo.h:498
bool IsVideo(void) const
Definition: programinfo.h:490
QString m_category
Definition: programinfo.h:777
QString GetProgramID(void) const
Definition: programinfo.h:440
QString m_chanPlaybackFilters
Definition: programinfo.h:786
QString m_sortSubtitle
Definition: programinfo.h:771
QDateTime GetBookmarkUpdate(void) const
Definition: programinfo.h:478
void SetEditing(bool editing)
Definition: programinfo.h:551
QString GetRecordingGroup(void) const
Definition: programinfo.h:420
virtual ~ProgramInfo()=default
QString m_inputName
Definition: programinfo.h:837
void SetRecordingRuleType(RecordingType type)
Definition: programinfo.h:586
ProgramInfo(const QStringList &list)
Definition: programinfo.h:293
uint GetRecordingID(void) const
Definition: programinfo.h:450
static const std::array< const QString, 5 > kCatName
Definition: programinfo.h:73
ProgramInfo(void)
Null constructor.
Definition: programinfo.h:81
QDateTime GetScheduledEndTime(void) const
The scheduled end time of the program.
Definition: programinfo.h:398
QString GetChannelPlaybackFilters(void) const
Definition: programinfo.h:388
uint32_t m_chanId
Definition: programinfo.h:782
QString GetInetRef(void) const
Definition: programinfo.h:441
void ClearMarkupFlag(MarkTypes type) const
Definition: programinfo.h:652
QString GetRecordingEndTime(MythDate::Format fmt) const
Approximate time the recording should have ended, did end, or is intended to end (with formatting).
Definition: programinfo.h:416
uint GetWatchedPercent() const
Definition: programinfo.h:593
void SetRecordingStatus(RecStatus::Type status)
Definition: programinfo.h:585
void SetScheduledStartTime(const QDateTime &dt)
Definition: programinfo.h:528
AvailableStatusType GetAvailableStatus(void) const
Definition: programinfo.h:847
RecordingDupInType GetDuplicateCheckSource(void) const
Where should we check for duplicates?
Definition: programinfo.h:459
bool HasCutlist(void) const
Definition: programinfo.h:484
uint GetAudioProperties(void) const
Definition: programinfo.h:502
bool IsRepeat(void) const
Definition: programinfo.h:492
void SetIgnoreLastPlayPos(bool ignore)
If "ignore" is true QueryLastPlayPos() will return 0, otherwise QueryLastPlayPos() will return the la...
Definition: programinfo.h:578
QString QueryInputDisplayName(void) const
QString GetSortSubtitle(void) const
Definition: programinfo.h:365
void SetPlaybackGroup(const QString &group)
Definition: programinfo.h:533
QString GetHostname(void) const
Definition: programinfo.h:422
bool IsRecording(void) const
Definition: programinfo.h:491
void SetRecordingGroup(const QString &group)
Definition: programinfo.h:532
static QStringList LoadFromScheduler(const QString &tmptable, int recordid)
void SetCategory(const QString &cat)
Definition: programinfo.h:539
static bool UsingProgramIDAuthority(void)
Definition: programinfo.h:325
uint GetSourceID(void) const
Definition: programinfo.h:466
QString m_title
Definition: programinfo.h:768
bool IsBookmarkSet(void) const
Definition: programinfo.h:485
bool IsReactivated(void) const
Definition: programinfo.h:494
QString GetPlaybackGroup(void) const
Definition: programinfo.h:421
void SetScheduledEndTime(const QDateTime &dt)
Definition: programinfo.h:529
QString GetDescription(void) const
Definition: programinfo.h:366
QString m_sortTitle
Definition: programinfo.h:769
QDateTime GetLastModifiedTime(void) const
Definition: programinfo.h:433
QString GetStorageGroup(void) const
Definition: programinfo.h:423
void SetPositionMapDBReplacement(PMapDBReplacement *pmap)
Definition: programinfo.h:587
void SetRecordingStartTime(const QDateTime &dt)
Definition: programinfo.h:530
QString GetScheduledStartTime(MythDate::Format fmt) const
The scheduled start time of program (with formatting).
Definition: programinfo.h:393
QString GetChannelName(void) const
This is the channel name in the local market, i.e.
Definition: programinfo.h:387
QString GetTitle(void) const
Definition: programinfo.h:362
void SetHostname(const QString &host)
Definition: programinfo.h:534
QDateTime GetRecordingStartTime(void) const
Approximate time the recording started.
Definition: programinfo.h:405
QString m_description
Definition: programinfo.h:772
QDateTime GetScheduledStartTime(void) const
The scheduled start time of program.
Definition: programinfo.h:391
ProgramInfo(QString _title, QString _category, QDateTime _startts, QDateTime _endts)
Constructs a Dummy ProgramInfo (used by GuideGrid)
Definition: programinfo.h:282
uint GetFindID(void) const
Definition: programinfo.h:472
bool IsLocal(void) const
Definition: programinfo.h:352
QString m_seriesId
Definition: programinfo.h:796
QString m_syndicatedEpisode
Definition: programinfo.h:776
QString GetChanNum(void) const
This is the channel "number", in the form 1, 1_2, 1-2, 1#1, etc.
Definition: programinfo.h:377
void SetChanID(uint _chanid)
Definition: programinfo.h:527
void SetSourceID(uint id)
Definition: programinfo.h:544
uint GetYearOfInitialRelease(void) const
Definition: programinfo.h:424
bool IsCommercialFree(void) const
Definition: programinfo.h:482
QDateTime m_recStartTs
Definition: programinfo.h:805
QString m_director
Definition: programinfo.h:778
bool IsDuplicate(void) const
Definition: programinfo.h:493
void SetRecordingRuleID(uint id)
Definition: programinfo.h:543
void SetProgramInfoType(ProgramInfoType t)
Definition: programinfo.h:524
QString MakeUniqueKey(void) const
Creates a unique string that can be used to identify an existing recording.
Definition: programinfo.h:340
QString GetInputName(void) const
Definition: programinfo.h:468
void SetWatchedPercent(uint progress)
Definition: programinfo.h:594
QString GetSortTitle(void) const
Definition: programinfo.h:363
bool IsVideoBD(void) const
Definition: programinfo.h:350
bool IsSameRecording(const ProgramInfo &other) const
Definition: programinfo.h:333
QString m_programId
Definition: programinfo.h:797
uint GetStars(uint range_max) const
Definition: programinfo.h:447
QString m_chanStr
Definition: programinfo.h:783
int GetRecordingPriority(void) const
Definition: programinfo.h:444
QString m_chanSign
Definition: programinfo.h:784
QString GetPathname(void) const
Definition: programinfo.h:344
QDate m_originalAirDate
Definition: programinfo.h:809
QDate GetOriginalAirDate(void) const
Definition: programinfo.h:432
uint GetInputID(void) const
Definition: programinfo.h:467
QString m_chanName
Definition: programinfo.h:785
CategoryType GetCategoryType(void) const
Definition: programinfo.h:442
int GetRecordingPriority2(void) const
Definition: programinfo.h:445
uint GetParentRecordingRuleID(void) const
Definition: programinfo.h:454
void SetSeriesID(const QString &id)
TODO Move to RecordingInfo.
Definition: programinfo.h:537
QString GetRecordingStartTime(MythDate::Format fmt) const
Approximate time the recording started (with formatting).
Definition: programinfo.h:407
void ClearInputName(void)
Definition: programinfo.h:470
void SetRecordingPriority(int priority)
Definition: programinfo.h:541
bool IsWatched(void) const
Definition: programinfo.h:487
bool IsPathSet(void) const
Definition: programinfo.h:358
void SetRecordingEndTime(const QDateTime &dt)
Definition: programinfo.h:531
QString m_subtitle
Definition: programinfo.h:770
QString m_inUseForWhat
Definition: programinfo.h:855
void SetStorageGroup(const QString &group)
Definition: programinfo.h:535
uint GetRecordedPercent() const
Definition: programinfo.h:591
uint32_t GetProgramFlags(void) const
Definition: programinfo.h:474
RecStatus::Type GetRecordingStatus(void) const
Definition: programinfo.h:451
bool IsLastPlaySet(void) const
Definition: programinfo.h:486
void SetReactivated(bool reactivate)
Definition: programinfo.h:546
void SetCategoryType(const CategoryType type)
Definition: programinfo.h:540
QDateTime m_bookmarkUpdate
Definition: programinfo.h:838
QDateTime GetRecordingEndTime(void) const
Approximate time the recording should have ended, did end, or is intended to end.
Definition: programinfo.h:413
void SetInputID(uint id)
Definition: programinfo.h:545
QString GetSubtitle(void) const
Definition: programinfo.h:364
QString GetScheduledEndTime(MythDate::Format fmt) const
The scheduled end time of the program (with formatting).
Definition: programinfo.h:400
QString GetCategory(void) const
Definition: programinfo.h:370
uint GetSeason(void) const
Definition: programinfo.h:367
virtual void SetRecordingID(uint _recordedid)
Definition: programinfo.h:583
void SetProgramID(const QString &id)
Definition: programinfo.h:538
bool IsMythStream(void) const
Definition: programinfo.h:357
QString m_inetRef
Definition: programinfo.h:798
RecordingType GetRecordingRuleType(void) const
Definition: programinfo.h:455
uint GetEpisodeTotal(void) const
Definition: programinfo.h:369
QString GetChannelSchedulingID(void) const
This is the unique programming identifier of a channel.
Definition: programinfo.h:384
static QMutex s_staticDataLock
Definition: programinfo.h:858
QString GetPlaybackURL(ProgramInfo *pginfo, bool storePath)
unsigned int uint
Definition: freesurround.h:24
static const iso6937table * d
unsigned short uint16_t
Definition: iso6937tables.h:3
bool operator==(MusicMetadata &a, MusicMetadata &b)
#define MBASE_PUBLIC
Definition: mythbaseexp.h:15
Q_DECLARE_METATYPE(std::chrono::seconds)
bool force
bool progress
static void clear(SettingsMap &cache, SettingsMap &overrides, const QString &myKey)
Definition: mythdb.cpp:949
QMap< QString, QVariant > MSqlBindings
typedef for a map of string -> string bindings for generic queries.
Definition: mythdbcon.h:100
QHash< QString, QString > InfoMap
Definition: mythtypes.h:15
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.
Definition: mythdate.cpp:93
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
Definition: mythdate.cpp:15
string hostname
Definition: caa.py:17
STL namespace.
int pginfo_init_statics()
Definition: programinfo.cpp:40
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
Definition: programinfo.h:28
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)
Definition: programinfo.h:937
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)
AvailableStatusType
Definition: programtypes.h:175
@ asAvailable
Definition: programtypes.h:176
MarkTypes
Definition: programtypes.h:46
@ MARK_ALL
Definition: programtypes.h:48
QMap< uint64_t, MarkTypes > frm_dir_map_t
Frame # -> Mark map.
Definition: programtypes.h:117
ProgramInfoType
Definition: programtypes.h:166
@ kProgramInfoTypeVideoDVD
Definition: programtypes.h:169
@ kProgramInfoTypeVideoFile
Definition: programtypes.h:168
@ kProgramInfoTypeVideoBD
Definition: programtypes.h:172
AutoExpireType
Definition: programtypes.h:192
CommFlagStatus
Definition: programtypes.h:119
QMap< long long, long long > frm_pos_map_t
Frame # -> File offset map.
Definition: programtypes.h:44
TranscodingStatus
Definition: programtypes.h:156
RecordingDupInType
@ kDupsInAll
RecordingType
@ kNotRecording
RecordingDupMethodType
@ kDupCheckSubThenDesc
MarkupEntry(int t, uint64_t f, uint64_t d, bool n)
Definition: programinfo.h:703
MarkupEntry(void)=default