Go to the documentation of this file.
30 LOG(VB_GENERAL, LOG_ERR,
"Cannot load 'Info buttonlist'");
41 QString table = (recorded) ?
"recordedrating" :
"programrating";
42 QString sel = QString(
43 "SELECT `system`, rating FROM %1 "
44 "WHERE chanid = :CHANID "
45 "AND starttime = :STARTTIME").arg(table);
58 QMap<QString,QString> main_ratings;
62 if (
query.
value(0).toString().toLower() ==
"advisory")
70 advisory = advisory.left(advisory.length() - 2);
72 if (main_ratings.empty())
75 if (!advisory.isEmpty())
76 advisory =
": " + advisory;
78 if (main_ratings.size() == 1)
80 return *main_ratings.begin() + advisory;
84 QMap<QString,QString>::const_iterator it;
85 for (it = main_ratings.cbegin(); it != main_ratings.cend(); ++it)
87 ratings += it.key() +
": " + *it +
", ";
90 return ratings +
"Advisory" + advisory;
125 for (
int i = 0; i < actions.size() && !handled; i++)
127 QString
action = actions[i];
135 else if (
action ==
"DOWN")
161 using string_pair = QPair<QString, QString>;
162 QVector<string_pair> tests;
180 tests.append(qMakePair(QString(
"channel.recpriority"),
181 QString(
"channel.recpriority")));
182 tests.append(qMakePair(QString(
"capturecard.recpriority"),
183 QString(
"capturecard.recpriority")));
187 pwrpri = QString(
"(capturecard.cardid = record.prefinput) * %1")
189 tests.append(qMakePair(pwrpri, pwrpri));
193 pwrpri = QString(
"(program.hdtv > 0 OR "
194 "FIND_IN_SET('HDTV', program.videoprop) > 0) * %1")
196 tests.append(qMakePair(pwrpri, pwrpri));
201 (
"(FIND_IN_SET('WIDESCREEN', program.videoprop) > 0) * %1")
203 tests.append(qMakePair(pwrpri, pwrpri));
208 (
"(FIND_IN_SET('SIGNED', program.subtitletypes) > 0) * %1")
210 tests.append(qMakePair(pwrpri, pwrpri));
215 (
"(FIND_IN_SET('ONSCREEN', program.subtitletypes) > 0) * %1")
217 tests.append(qMakePair(pwrpri, pwrpri));
222 (
"(FIND_IN_SET('NORMAL', program.subtitletypes) > 0 OR "
223 "program.closecaptioned > 0 OR program.subtitled > 0) * %1")
225 tests.append(qMakePair(pwrpri, pwrpri));
230 (
"(FIND_IN_SET('HARDHEAR', program.subtitletypes) > 0 OR "
231 "FIND_IN_SET('HARDHEAR', program.audioprop) > 0) * %1")
233 tests.append(qMakePair(pwrpri, pwrpri));
238 (
"(FIND_IN_SET('VISUALIMPAIR', program.audioprop) > 0) * %1")
240 tests.append(qMakePair(pwrpri, pwrpri));
243 query.
prepare(
"SELECT recpriority, selectclause FROM powerpriority;");
257 sclause.remove(QRegExp(
"^\\s*AND\\s+", Qt::CaseInsensitive));
259 pwrpri = QString(
"(%1) * %2").arg(sclause)
261 pwrpri.replace(
"RECTABLE",
"record");
264 pwrpri += QString(
" AS powerpriority ");
266 tests.append(qMakePair(desc, pwrpri));
270 recmatch = QString(
"INNER JOIN record "
271 " ON ( record.recordid = %1 ) ")
274 for (
const auto & [label, csqlStart] : qAsConst(tests))
276 QString sqlStart = csqlStart;
277 query.
prepare(
"SELECT " + sqlStart.replace(
"program.",
"p.")
280 "INNER JOIN channel "
281 " ON ( channel.chanid = p.chanid ) "
282 "INNER JOIN capturecard "
283 " ON ( channel.sourceid = capturecard.sourceid AND "
284 " ( capturecard.schedorder <> 0 OR "
285 " capturecard.parentid = 0 ) ) ").
arg(ptable)
287 "WHERE p.chanid = :CHANID AND"
288 " p.starttime = :STARTTIME ;");
293 adjustmsg = QString(
"%1 : ").arg(label);
299 adjustmsg += tr(
" MATCHED, adding %1").arg(adj);
303 adjustmsg += tr(
" not matched");
306 adjustmsg += tr(
" Query FAILED");
308 addItem(tr(
"Recording Priority Adjustment"), adjustmsg,
312 if (!tests.isEmpty())
313 addItem(tr(
"Priority Adjustment Total"), QString::number(total),
320 QString category_type;
323 QString syndicatedEpisodeNum;
326 QString title_pronounce;
334 bool recorded =
false;
346 QString ptable = recorded ?
"recordedprogram" :
"program";
350 query.
prepare(QString(
"SELECT category_type, airdate, stars,"
351 " partnumber, parttotal, audioprop+0, videoprop+0,"
352 " subtitletypes+0, syndicatedepisodenumber, generic,"
353 " showtype, colorcode, title_pronounce"
354 " FROM %1 WHERE chanid = :CHANID AND"
355 " starttime = :STARTTIME ;").
arg(ptable));
370 syndicatedEpisodeNum =
query.
value(8).toString();
389 category_type =
"movie";
391 category_type =
"series";
393 category_type =
"sports";
395 category_type =
"tvshow";
409 attr += tr(
"Part %1 of %2, ").arg(partnumber).arg(parttotal);
413 if (category_type ==
"movie")
422 attr += tr(
"%n star(s)",
"", roundf(stars * 10.0F)) +
", ";
424 if (!colorcode.isEmpty())
425 attr += colorcode +
", ";
428 attr += tr(
"Mono") +
", ";
430 attr += tr(
"Stereo") +
", ";
432 attr += tr(
"Surround Sound") +
", ";
434 attr += tr(
"Dolby Sound") +
", ";
436 attr += tr(
"Audio for Hearing Impaired") +
", ";
438 attr += tr(
"Audio for Visually Impaired") +
", ";
441 attr += tr(
"HDTV") +
", ";
443 attr += tr(
"Widescreen") +
", ";
445 attr += tr(
"AVC/H.264") +
", ";
447 attr += tr(
"HEVC/H.265") +
", ";
449 attr += tr(
"720p Resolution") +
", ";
454 attr += tr(
"1080p Resolution") +
", ";
456 attr += tr(
"4K Resolution") +
", ";
461 attr += tr(
"1080i Resolution") +
", ";
463 attr += tr(
"4Ki Resolution") +
", ";
467 attr += tr(
"Damaged") +
", ";
470 attr += tr(
"CC",
"Closed Captioned") +
", ";
472 attr += tr(
"Subtitles Available") +
", ";
474 attr += tr(
"Subtitled") +
", ";
476 attr += tr(
"Deaf Signing") +
", ";
478 if (
generic && category_type ==
"series")
479 attr += tr(
"Unidentified Episode") +
", ";
481 attr += tr(
"Repeat") +
", ";
485 attr.truncate(attr.lastIndexOf(
','));
486 s +=
" (" + attr +
")";
494 QString execProducers;
500 QString commentators;
507 query.
prepare(
"SELECT role,people.name FROM recordedcredits"
509 " LEFT JOIN people ON credits.person = people.person"
510 " WHERE credits.chanid = :CHANID"
511 " AND credits.starttime = :STARTTIME"
517 " LEFT JOIN people ON credits.person = people.person"
518 " WHERE credits.chanid = :CHANID"
519 " AND credits.starttime = :STARTTIME"
551 .toByteArray().constData());
556 actors = plist.join(
", ");
557 else if (rstr ==
"director")
558 directors = plist.join(
", ");
559 else if (rstr ==
"producer")
560 producers = plist.join(
", ");
561 else if (rstr ==
"executive_producer")
562 execProducers = plist.join(
", ");
563 else if (rstr ==
"writer")
564 writers = plist.join(
", ");
565 else if (rstr ==
"guest_star")
566 guestStars = plist.join(
", ");
567 else if (rstr ==
"host")
568 hosts = plist.join(
", ");
569 else if (rstr ==
"adapter")
570 adapters = plist.join(
", ");
571 else if (rstr ==
"presenter")
572 presenters = plist.join(
", ");
573 else if (rstr ==
"commentator")
574 commentators = plist.join(
", ");
575 else if (rstr ==
"guest")
576 guests = plist.join(
", ");
585 actors = plist.join(
", ");
586 else if (rstr ==
"director")
587 directors = plist.join(
", ");
588 else if (rstr ==
"producer")
589 producers = plist.join(
", ");
590 else if (rstr ==
"executive_producer")
591 execProducers = plist.join(
", ");
592 else if (rstr ==
"writer")
593 writers = plist.join(
", ");
594 else if (rstr ==
"guest_star")
595 guestStars = plist.join(
", ");
596 else if (rstr ==
"host")
597 hosts = plist.join(
", ");
598 else if (rstr ==
"adapter")
599 adapters = plist.join(
", ");
600 else if (rstr ==
"presenter")
601 presenters = plist.join(
", ");
602 else if (rstr ==
"commentator")
603 commentators = plist.join(
", ");
604 else if (rstr ==
"guest")
605 guests = plist.join(
", ");
623 "WHERE chanid = :CHANID AND starttime = :STARTTIME "
624 "AND relevance <> '0' ORDER BY relevance;");
641 if (!category_type.isEmpty())
646 if (!showtype.isEmpty())
671 addItem(tr(
"Syndicated Episode Number"), syndicatedEpisodeNum,
676 category_type !=
"movie")
686 QDateTime statusDate;
699 "FROM oldrecorded WHERE duplicate > 0 AND "
701 "((programid <> '' AND programid = :PROGRAMID) OR "
702 " (title <> '' AND title = :TITLE AND "
703 " subtitle <> '' AND subtitle = :SUBTITLE AND "
704 " description <> '' AND description = :DECRIPTION));");
745 if (statusDate.isValid())
751 QString recordingRule;
752 QString lastRecorded;
753 QString nextRecording;
754 QString averageTimeShift;
755 QString watchListScore;
756 QString watchListStatus;
757 QString searchPhrase;
764 if (record && !record->
m_title.isEmpty())
765 recordingRule += QString(
" \"%2\"").arg(record->
m_title);
767 query.
prepare(
"SELECT last_record, next_record, avg_delay "
768 "FROM record WHERE recordid = :RECORDID");
786 averageTimeShift = tr(
"%n hour(s)",
"",
800 watchListStatus = tr(
"Auto-expire off");
803 watchListStatus = tr(
"Marked as 'watched'");
806 watchListStatus = tr(
"Not the earliest episode");
809 watchListStatus = tr(
"Recently deleted episode");
824 QDateTime fdate(QDate(1970, 1, 1),QTime(12,0,0));
838 QString recordingHost;
839 QString recordingInput;
840 QString recordedFilename;
841 QString recordedFileSize;
842 QString recordingGroup;
843 QString storageGroup;
844 QString playbackGroup;
845 QString recordingProfile;
853 recordedFileSize = QString(
"%1 ")
855 recordedFileSize += tr(
"GB",
"GigaBytes");
858 " WHERE chanid = :CHANID"
859 " AND starttime = :STARTTIME;");
873 recordingProfile = record ? record->
m_recProfile : tr(
"Unknown");
bool isActive(void) const
bool LoadByProgram(const ProgramInfo *proginfo)
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
QSqlQuery wrapper that fetches a DB connection from the connection pool.
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
virtual uint64_t GetFilesize(void) const
QString GetHostname(void) const
QString GetInputName(void) const
std::tuple< QString, QString, int > DataItem
QDateTime as_utc(const QDateTime &old_dt)
Returns copy of QDateTime with TimeSpec set to UTC.
void addItem(const QString &title, const QString &value, ProgInfoList::VisibleLevel level)
QVariant value(int i) const
arg(title).arg(filename).arg(doDelete))
QString GetCategory(void) const
Internal representation of a recording rule, mirrors the record table.
bool Create(void) override
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
QDateTime GetScheduledEndTime(void) const
The scheduled end time of the program.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
QString GetRecordingGroup(void) const
QDateTime GetRecordingStartTime(void) const
Approximate time the recording started.
void PowerPriorities(const QString &ptable)
static QString getRatings(bool recorded, uint chanid, const QDateTime &startts)
bool IsRepeat(void) const
QString toString(MarkTypes type)
QDateTime GetScheduledStartTime(void) const
The scheduled start time of program.
RecStatus::Type GetRecordingStatus(void) const
bool TranslateKeyPress(const QString &Context, QKeyEvent *Event, QStringList &Actions, bool AllowJumps=true)
Get a list of actions for a keypress in the given context.
bool Create(bool focusable)
Initialise buttonlist from XML.
void Toggle(void)
Toggle infolist state. Focusable widgets toggle between Basic & Full info. Non-focusable widgets togg...
QString GetTitle(void) const
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
QString GetDescription(void) const
static void DBError(const QString &where, const MSqlQuery &query)
uint GetEpisodeTotal(void) const
void BuildFocusList(void)
def rating(profile, smoonURL, gate)
RecSearchType m_searchType
QString toString(Verbosity v=kLongDescription, const QString &sep=":", const QString &grp="\"") const
void Display(const DataList &data)
Build list of key:value buttons.
QString GetPlaybackGroup(void) const
uint GetFindID(void) const
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
QString GetSeriesID(void) const
static QString i18n(const QString &msg)
Translations for play,recording, & storage groups +.
int GetNumSetting(const QString &key, int defaultval=0)
QString GetStorageGroup(void) const
QDate GetOriginalAirDate(void) const
void Init(void) override
Used after calling Load() to assign data to widgets and other UI initilisation which is prohibited in...
ProgInfoList::DataList m_data
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
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
@ kAddYear
Add year to string if not included.
uint GetSeason(void) const
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
MythMainWindow * GetMythMainWindow(void)
@ kDateFull
Default local time.
QString GetProgramID(void) const
static QString toString(Type recstatus, uint id)
Converts "recstatus" into a short (unreadable) string.
int GetRecordingPriority2(void) const
uint GetRecordingRuleID(void) const
QString GetBasename(void) const
bool Hide(void)
Remove infolist from display.
MSqlQuery query(MSqlQuery::InitCon())
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
QString GetSubtitle(void) const