From 394874aedb3e329ac4a000ccf14d9e2bf4b67dda Mon Sep 17 00:00:00 2001
From: Roger Siddons <dizygotheca@ntlworld.com>
Date: Tue, 7 Oct 2014 15:53:03 +0100
Subject: [PATCH 3/6] Watchlist: Remove caching, prog details info & improve
logging
diff --git a/mythtv/libs/libmyth/programtypes.h b/mythtv/libs/libmyth/programtypes.h
index 2ac2cc2..6275196 100644
a
|
b
|
typedef enum AvailableStatusTypes { |
252 | 252 | } AvailableStatusType; // note stored in uint8_t in ProgramInfo |
253 | 253 | MPUBLIC QString toString(AvailableStatusType); |
254 | 254 | |
255 | | enum WatchListStatus { |
256 | | wlDeleted = -4, |
257 | | wlEarlier = -3, |
258 | | wlWatched = -2, |
259 | | wlExpireOff = -1 |
260 | | }; |
261 | | |
262 | 255 | typedef enum AutoExpireTypes { |
263 | 256 | kDisableAutoExpire = 0, |
264 | 257 | kNormalAutoExpire = 1, |
diff --git a/mythtv/programs/mythfrontend/playbackbox.cpp b/mythtv/programs/mythfrontend/playbackbox.cpp
index 23c129f..7927133 100644
a
|
b
|
static int comp_originalAirDate_rev(const ProgramInfo *a, const ProgramInfo *b) |
96 | 96 | return (dt1 > dt2 ? 1 : -1); |
97 | 97 | } |
98 | 98 | |
99 | | static int comp_recpriority2(const ProgramInfo *a, const ProgramInfo *b) |
100 | | { |
101 | | if (a->GetRecordingPriority2() == b->GetRecordingPriority2()) |
102 | | return (a->GetRecordingStartTime() < |
103 | | b->GetRecordingStartTime() ? 1 : -1); |
104 | | else |
105 | | return (a->GetRecordingPriority2() < |
106 | | b->GetRecordingPriority2() ? 1 : -1); |
107 | | } |
108 | | |
109 | 99 | static int comp_recordDate(const ProgramInfo *a, const ProgramInfo *b) |
110 | 100 | { |
111 | 101 | if (a->GetScheduledStartTime().date() == b->GetScheduledStartTime().date()) |
… |
… |
static bool comp_originalAirDate_rev_less_than( |
170 | 160 | return comp_originalAirDate_rev(a, b) < 0; |
171 | 161 | } |
172 | 162 | |
173 | | static bool comp_recpriority2_less_than( |
174 | | const ProgramInfo *a, const ProgramInfo *b) |
175 | | { |
176 | | return comp_recpriority2(a, b) < 0; |
177 | | } |
178 | | |
179 | 163 | static bool comp_recordDate_less_than( |
180 | 164 | const ProgramInfo *a, const ProgramInfo *b) |
181 | 165 | { |
… |
… |
bool PlaybackBox::UpdateUILists(void) |
1774 | 1758 | { |
1775 | 1759 | if (m_watchListAutoExpire && !p->IsAutoExpirable()) |
1776 | 1760 | { |
1777 | | p->SetRecordingPriority2(wlExpireOff); |
1778 | | LOG(VB_FILE, LOG_INFO, QString("Auto-expire off: %1") |
1779 | | .arg(p->GetTitle())); |
| 1761 | LOG(VB_GUI, LOG_DEBUG, |
| 1762 | QString("Watchlist: Auto-expire off - %1 %2 (%3x%4)") |
| 1763 | .arg(MythDate::toString(p->GetScheduledStartTime(), |
| 1764 | Qt::ISODate)) |
| 1765 | .arg(p->GetTitle()) |
| 1766 | .arg(p->GetSeason()) |
| 1767 | .arg(p->GetEpisode())); |
1780 | 1768 | } |
1781 | 1769 | else if (p->IsWatched()) |
1782 | 1770 | { |
1783 | | p->SetRecordingPriority2(wlWatched); |
1784 | | LOG(VB_FILE, LOG_INFO, |
1785 | | QString("Marked as 'watched': %1") |
1786 | | .arg(p->GetTitle())); |
| 1771 | LOG(VB_GUI, LOG_DEBUG, |
| 1772 | QString("Watchlist: Watched - %1 %2 (%3x%4)") |
| 1773 | .arg(MythDate::toString(p->GetScheduledStartTime(), |
| 1774 | Qt::ISODate)) |
| 1775 | .arg(p->GetTitle()) |
| 1776 | .arg(p->GetSeason()) |
| 1777 | .arg(p->GetEpisode())); |
1787 | 1778 | } |
1788 | 1779 | else |
1789 | 1780 | { |
… |
… |
bool PlaybackBox::UpdateUILists(void) |
1825 | 1816 | Qt::ISODate)) |
1826 | 1817 | .arg(cs).arg(ce)); |
1827 | 1818 | } |
1828 | | else |
1829 | | { |
1830 | | p->SetRecordingPriority2(wlEarlier); |
1831 | | LOG(VB_FILE, LOG_INFO, |
1832 | | QString("Not the earliest: %1") |
1833 | | .arg(p->GetTitle())); |
1834 | | } |
1835 | 1819 | } |
1836 | 1820 | else |
1837 | 1821 | { |
… |
… |
bool PlaybackBox::UpdateUILists(void) |
1924 | 1908 | |
1925 | 1909 | if (!watchEpisode.empty()) |
1926 | 1910 | { |
1927 | | // populate watchlist |
1928 | | foreach (ProgramInfo* wp, watchEpisode.values()) |
1929 | | m_progLists[m_watchGroupLabel].push_front(wp); |
1930 | | m_progLists[m_watchGroupLabel].setAutoDelete(false); |
1931 | | |
1932 | 1911 | QDateTime now = MythDate::current(); |
1933 | 1912 | int baseValue = m_watchListMaxAge * 2 / 3; |
1934 | 1913 | |
… |
… |
bool PlaybackBox::UpdateUILists(void) |
1938 | 1917 | QMap<int, int> spanHours; |
1939 | 1918 | QMap<int, int> delHours; |
1940 | 1919 | QMap<int, int> nextHours; |
| 1920 | typedef unsigned long long score_type; // 64 bit |
| 1921 | QMultiMap<score_type, ProgramInfo*> watchList; // progs keyed by score |
1941 | 1922 | |
1942 | 1923 | MSqlQuery query(MSqlQuery::InitCon()); |
1943 | 1924 | query.prepare("SELECT recordid, type, maxepisodes, avg_delay, " |
… |
… |
bool PlaybackBox::UpdateUILists(void) |
1976 | 1957 | } |
1977 | 1958 | } |
1978 | 1959 | |
1979 | | ProgramList::iterator pit = m_progLists[m_watchGroupLabel].begin(); |
1980 | | while (pit != m_progLists[m_watchGroupLabel].end()) |
| 1960 | TitleMap::iterator it = watchEpisode.begin(); |
| 1961 | while (it != watchEpisode.end()) |
1981 | 1962 | { |
1982 | | int recid = (*pit)->GetRecordingRuleID(); |
| 1963 | uint score = 0; |
| 1964 | ProgramInfo* p = it.value(); |
| 1965 | int recid = p->GetRecordingRuleID(); |
1983 | 1966 | int avgd = avgDelay[recid]; |
1984 | 1967 | |
1985 | 1968 | if (avgd == 0) |
… |
… |
bool PlaybackBox::UpdateUILists(void) |
1993 | 1976 | } |
1994 | 1977 | |
1995 | 1978 | // add point equal to baseValue for each additional episode |
1996 | | if (!(*pit)->GetRecordingRuleID() || maxEpisodes[recid] > 0) |
1997 | | (*pit)->SetRecordingPriority2(0); |
1998 | | else |
| 1979 | if (recid && maxEpisodes[recid] == 0) |
1999 | 1980 | { |
2000 | | (*pit)->SetRecordingPriority2( |
2001 | | (watchlistCount[extract_watchlist_title(**pit)] - 1) * |
2002 | | baseValue); |
| 1981 | score += (watchlistCount[extract_watchlist_title(*p)] - 1) * |
| 1982 | baseValue; |
2003 | 1983 | } |
2004 | 1984 | |
2005 | 1985 | // add points every 3hr leading up to the next recording |
2006 | 1986 | if (nextHours[recid] > 0 && nextHours[recid] < baseValue * 3) |
2007 | 1987 | { |
2008 | | (*pit)->SetRecordingPriority2( |
2009 | | (*pit)->GetRecordingPriority2() + |
2010 | | (baseValue * 3 - nextHours[recid]) / 3); |
| 1988 | score += (baseValue * 3 - nextHours[recid]) / 3; |
2011 | 1989 | } |
2012 | 1990 | |
2013 | | int hrs = (*pit)->GetScheduledEndTime().secsTo(now) / 3600; |
| 1991 | int hrs = p->GetScheduledEndTime().secsTo(now) / 3600; |
2014 | 1992 | if (hrs < 1) |
2015 | 1993 | hrs = 1; |
2016 | 1994 | |
2017 | 1995 | // add points for a new recording that decrease each hour |
2018 | 1996 | if (hrs < 42) |
2019 | 1997 | { |
2020 | | (*pit)->SetRecordingPriority2( |
2021 | | (*pit)->GetRecordingPriority2() + 42 - hrs); |
| 1998 | score += 42 - hrs; |
2022 | 1999 | } |
2023 | 2000 | |
2024 | 2001 | // add points for how close the recorded time of day is to 'now' |
2025 | | (*pit)->SetRecordingPriority2( |
2026 | | (*pit)->GetRecordingPriority2() + abs((hrs % 24) - 12) * 2); |
| 2002 | score += abs((hrs % 24) - 12) * 2; |
2027 | 2003 | |
2028 | 2004 | // Daily |
2029 | 2005 | if (spanHours[recid] < 50 || |
… |
… |
bool PlaybackBox::UpdateUILists(void) |
2031 | 2007 | { |
2032 | 2008 | if (delHours[recid] < m_watchListBlackOut * 4) |
2033 | 2009 | { |
2034 | | (*pit)->SetRecordingPriority2(wlDeleted); |
2035 | | LOG(VB_FILE, LOG_INFO, |
2036 | | QString("Recently deleted daily: %1") |
2037 | | .arg((*pit)->GetTitle())); |
2038 | | pit = m_progLists[m_watchGroupLabel].erase(pit); |
| 2010 | LOG(VB_GUI, LOG_DEBUG, |
| 2011 | QString("Watchlist: Recently deleted daily: %1") |
| 2012 | .arg(p->GetTitle())); |
| 2013 | it = watchEpisode.erase(it); |
2039 | 2014 | continue; |
2040 | 2015 | } |
2041 | 2016 | else |
2042 | 2017 | { |
2043 | | LOG(VB_FILE, LOG_INFO, QString("Daily interval: %1") |
2044 | | .arg((*pit)->GetTitle())); |
| 2018 | LOG(VB_GUI, LOG_DEBUG, QString("Watchlist: Daily interval: %1") |
| 2019 | .arg(p->GetTitle())); |
2045 | 2020 | |
2046 | 2021 | if (maxEpisodes[recid] > 0) |
2047 | 2022 | { |
2048 | | (*pit)->SetRecordingPriority2( |
2049 | | (*pit)->GetRecordingPriority2() + |
2050 | | (baseValue / 2) + (hrs / 24)); |
| 2023 | score += (baseValue / 2) + (hrs / 24); |
2051 | 2024 | } |
2052 | 2025 | else |
2053 | 2026 | { |
2054 | | (*pit)->SetRecordingPriority2( |
2055 | | (*pit)->GetRecordingPriority2() + |
2056 | | (baseValue / 5) + hrs); |
| 2027 | score += (baseValue / 5) + hrs; |
2057 | 2028 | } |
2058 | 2029 | } |
2059 | 2030 | } |
… |
… |
bool PlaybackBox::UpdateUILists(void) |
2064 | 2035 | { |
2065 | 2036 | if (delHours[recid] < (m_watchListBlackOut * 24) - 4) |
2066 | 2037 | { |
2067 | | (*pit)->SetRecordingPriority2(wlDeleted); |
2068 | | LOG(VB_FILE, LOG_INFO, |
2069 | | QString("Recently deleted weekly: %1") |
2070 | | .arg((*pit)->GetTitle())); |
2071 | | pit = m_progLists[m_watchGroupLabel].erase(pit); |
| 2038 | LOG(VB_GUI, LOG_DEBUG, |
| 2039 | QString("Watchlist: Recently deleted weekly: %1") |
| 2040 | .arg(p->GetTitle())); |
| 2041 | it = watchEpisode.erase(it); |
2072 | 2042 | continue; |
2073 | 2043 | } |
2074 | 2044 | else |
2075 | 2045 | { |
2076 | | LOG(VB_FILE, LOG_INFO, QString("Weekly interval: %1") |
2077 | | .arg((*pit)->GetTitle())); |
| 2046 | LOG(VB_GUI, LOG_DEBUG, QString("Watchlist: Weekly interval: %1") |
| 2047 | .arg(p->GetTitle())); |
2078 | 2048 | |
2079 | 2049 | if (maxEpisodes[recid] > 0) |
2080 | 2050 | { |
2081 | | (*pit)->SetRecordingPriority2( |
2082 | | (*pit)->GetRecordingPriority2() + |
2083 | | (baseValue / 2) + (hrs / 24)); |
| 2051 | score += (baseValue / 2) + (hrs / 24); |
2084 | 2052 | } |
2085 | 2053 | else |
2086 | 2054 | { |
2087 | | (*pit)->SetRecordingPriority2( |
2088 | | (*pit)->GetRecordingPriority2() + |
2089 | | (baseValue / 3) + (baseValue * hrs / 24 / 4)); |
| 2055 | score += (baseValue / 3) + (baseValue * hrs / 24 / 4); |
2090 | 2056 | } |
2091 | 2057 | } |
2092 | 2058 | } |
… |
… |
bool PlaybackBox::UpdateUILists(void) |
2095 | 2061 | { |
2096 | 2062 | if (delHours[recid] < (m_watchListBlackOut * 48) - 4) |
2097 | 2063 | { |
2098 | | (*pit)->SetRecordingPriority2(wlDeleted); |
2099 | | pit = m_progLists[m_watchGroupLabel].erase(pit); |
| 2064 | it = watchEpisode.erase(it); |
2100 | 2065 | continue; |
2101 | 2066 | } |
2102 | 2067 | else |
… |
… |
bool PlaybackBox::UpdateUILists(void) |
2104 | 2069 | // add points for a new Single or final episode |
2105 | 2070 | if (hrs < 36) |
2106 | 2071 | { |
2107 | | (*pit)->SetRecordingPriority2( |
2108 | | (*pit)->GetRecordingPriority2() + |
2109 | | baseValue * (36 - hrs) / 36); |
| 2072 | score += baseValue * (36 - hrs) / 36; |
2110 | 2073 | } |
2111 | 2074 | |
2112 | 2075 | if (avgd != 100) |
2113 | 2076 | { |
2114 | 2077 | if (maxEpisodes[recid] > 0) |
2115 | 2078 | { |
2116 | | (*pit)->SetRecordingPriority2( |
2117 | | (*pit)->GetRecordingPriority2() + |
2118 | | (baseValue / 2) + (hrs / 24)); |
| 2079 | score += (baseValue / 2) + (hrs / 24); |
2119 | 2080 | } |
2120 | 2081 | else |
2121 | 2082 | { |
2122 | | (*pit)->SetRecordingPriority2( |
2123 | | (*pit)->GetRecordingPriority2() + |
2124 | | (baseValue / 3) + (baseValue * hrs / 24 / 4)); |
| 2083 | score += (baseValue / 3) + (baseValue * hrs / 24 / 4); |
2125 | 2084 | } |
2126 | 2085 | } |
2127 | 2086 | else if ((hrs / 24) < m_watchListMaxAge) |
2128 | 2087 | { |
2129 | | (*pit)->SetRecordingPriority2( |
2130 | | (*pit)->GetRecordingPriority2() + |
2131 | | hrs / 24); |
| 2088 | score += hrs / 24; |
2132 | 2089 | } |
2133 | 2090 | else |
2134 | 2091 | { |
2135 | | (*pit)->SetRecordingPriority2( |
2136 | | (*pit)->GetRecordingPriority2() + |
2137 | | m_watchListMaxAge); |
| 2092 | score += m_watchListMaxAge; |
2138 | 2093 | } |
2139 | 2094 | } |
2140 | 2095 | } |
… |
… |
bool PlaybackBox::UpdateUILists(void) |
2145 | 2100 | |
2146 | 2101 | if (avgd < 100) |
2147 | 2102 | { |
2148 | | (*pit)->SetRecordingPriority2( |
2149 | | (*pit)->GetRecordingPriority2() * (200 - delaypct) / 100); |
| 2103 | score = score * (200 - delaypct) / 100; |
2150 | 2104 | } |
2151 | 2105 | else if (avgd > 100) |
2152 | 2106 | { |
2153 | | (*pit)->SetRecordingPriority2( |
2154 | | (*pit)->GetRecordingPriority2() * 100 / delaypct); |
| 2107 | score = score * 100 / delaypct; |
2155 | 2108 | } |
2156 | 2109 | |
2157 | | LOG(VB_FILE, LOG_INFO, QString(" %1 %2 %3") |
2158 | | .arg(MythDate::toString((*pit)->GetScheduledStartTime(), |
2159 | | MythDate::kDateShort)) |
2160 | | .arg((*pit)->GetRecordingPriority2()) |
2161 | | .arg((*pit)->GetTitle())); |
| 2110 | // use score as primary key in top 32 bits, |
| 2111 | // use age in secs as a secondary key in low 32 bits to ensure equal |
| 2112 | // scores are ordered oldest first. Copes with progs up to 136 yrs old |
| 2113 | score_type longScore = (static_cast<score_type>(score) << 32) |
| 2114 | | p->GetScheduledStartTime().secsTo(now); |
| 2115 | |
| 2116 | watchList.insert(longScore, p); |
2162 | 2117 | |
2163 | | ++pit; |
| 2118 | ++it; |
| 2119 | |
| 2120 | LOG(VB_GUI, LOG_DEBUG, QString("Watchlist:%1 %2 %3 %4") |
| 2121 | .arg(score, 5) |
| 2122 | .arg(longScore, 14) |
| 2123 | .arg(p->GetTitle()) |
| 2124 | .arg(MythDate::toString(p->GetScheduledStartTime(), |
| 2125 | MythDate::kDateShort))); |
2164 | 2126 | } |
2165 | | std::stable_sort(m_progLists[m_watchGroupLabel].begin(), |
2166 | | m_progLists[m_watchGroupLabel].end(), |
2167 | | comp_recpriority2_less_than); |
| 2127 | |
| 2128 | // populate watchlist group; |
| 2129 | // duplicate keys will appear in reverse alphabetic order |
| 2130 | foreach (ProgramInfo* wp, watchList) |
| 2131 | m_progLists[m_watchGroupLabel].push_front(wp); |
| 2132 | |
| 2133 | m_progLists[m_watchGroupLabel].setAutoDelete(false); |
2168 | 2134 | } |
2169 | 2135 | |
2170 | 2136 | m_titleList = QStringList(""); |
diff --git a/mythtv/programs/mythfrontend/progdetails.cpp b/mythtv/programs/mythfrontend/progdetails.cpp
index 60fff6e..e66a3d4 100644
a
|
b
|
void ProgDetails::loadPage(void) |
589 | 589 | QString lastRecorded; |
590 | 590 | QString nextRecording; |
591 | 591 | QString averageTimeShift; |
592 | | QString watchListScore; |
593 | | QString watchListStatus; |
594 | 592 | QString searchPhrase; |
595 | 593 | |
596 | 594 | if (m_progInfo.GetRecordingRuleID()) |
… |
… |
void ProgDetails::loadPage(void) |
619 | 617 | averageTimeShift = tr("%n hour(s)", "", |
620 | 618 | query.value(2).toInt()); |
621 | 619 | } |
622 | | if (recorded) |
623 | | { |
624 | | if (m_progInfo.GetRecordingPriority2() > 0) |
625 | | watchListScore = |
626 | | QString::number(m_progInfo.GetRecordingPriority2()); |
627 | | |
628 | | if (m_progInfo.GetRecordingPriority2() < 0) |
629 | | { |
630 | | switch (m_progInfo.GetRecordingPriority2()) |
631 | | { |
632 | | case wlExpireOff: |
633 | | watchListStatus = tr("Auto-expire off"); |
634 | | break; |
635 | | case wlWatched: |
636 | | watchListStatus = tr("Marked as 'watched'"); |
637 | | break; |
638 | | case wlEarlier: |
639 | | watchListStatus = tr("Not the earliest episode"); |
640 | | break; |
641 | | case wlDeleted: |
642 | | watchListStatus = tr("Recently deleted episode"); |
643 | | break; |
644 | | } |
645 | | } |
646 | | } |
647 | 620 | if (record->m_searchType != kManualSearch && |
648 | 621 | record->m_description != m_progInfo.GetDescription()) |
649 | 622 | { |
… |
… |
void ProgDetails::loadPage(void) |
655 | 628 | addItem("LAST_RECORDED", tr("Last Recorded"), lastRecorded); |
656 | 629 | addItem("NEXT_RECORDING", tr("Next Recording"), nextRecording); |
657 | 630 | addItem("AVERAGE_TIME_SHIFT", tr("Average Time Shift"), averageTimeShift); |
658 | | addItem("WATCH_LIST_SCORE", tr("Watch List Score"), watchListScore); |
659 | | addItem("WATCH_LIST_STATUS", tr("Watch List Status"), watchListStatus); |
| 631 | addItem("WATCH_LIST_SCORE", "",""); |
| 632 | addItem("WATCH_LIST_STATUS", "",""); |
660 | 633 | addItem("SEARCH_PHRASE", tr("Search Phrase"), searchPhrase); |
661 | 634 | |
662 | 635 | s.clear(); |
diff --git a/mythtv/themes/MythCenter-wide/htmls/progdetails_page2.html b/mythtv/themes/MythCenter-wide/htmls/progdetails_page2.html
index e35b5fc..98567da 100644
a
|
b
|
|
32 | 32 | <h1>%LAST_RECORDED_LABEL%</h1> <p>%LAST_RECORDED%</p> |
33 | 33 | <h1>%NEXT_RECORDING_LABEL%</h1> <p>%NEXT_RECORDING%</p> |
34 | 34 | <h1>%AVERAGE_TIME_SHIFT_LABEL%</h1> <p>%AVERAGE_TIME_SHIFT%</p> |
35 | | <h1>%WATCH_LIST_SCORE_LABEL%</h1> <p>%WATCH_LIST_SCORE%</p> |
36 | | <h1>%WATCH_LIST_STATUS_LABEL%</h1> <p>%WATCH_LIST_STATUS%</p> |
37 | 35 | <h1>%SEARCH_PHRASE_LABEL%</h1> <p>%SEARCH_PHRASE%</p> |
38 | 36 | <h1>%FINDID_LABEL%</h1> <p>%FINDID%</p> |
39 | 37 | <h1>%RECORDING_HOST_LABEL%</h1> <p>%RECORDING_HOST%</p> |
diff --git a/mythtv/themes/MythCenter/htmls/progdetails_page2.html b/mythtv/themes/MythCenter/htmls/progdetails_page2.html
index 2fa3ea3..af6199d 100644
a
|
b
|
|
34 | 34 | <h1>%LAST_RECORDED_LABEL%</h1> <p>%LAST_RECORDED%</p> |
35 | 35 | <h1>%NEXT_RECORDING_LABEL%</h1> <p>%NEXT_RECORDING%</p> |
36 | 36 | <h1>%AVERAGE_TIME_SHIFT_LABEL%</h1> <p>%AVERAGE_TIME_SHIFT%</p> |
37 | | <h1>%WATCH_LIST_SCORE_LABEL%</h1> <p>%WATCH_LIST_SCORE%</p> |
38 | | <h1>%WATCH_LIST_STATUS_LABEL%</h1> <p>%WATCH_LIST_STATUS%</p> |
39 | 37 | <h1>%SEARCH_PHRASE_LABEL%</h1> <p>%SEARCH_PHRASE%</p> |
40 | 38 | <h1>%FINDID_LABEL%</h1> <p>%FINDID%</p> |
41 | 39 | <h1>%RECORDING_HOST_LABEL%</h1> <p>%RECORDING_HOST%</p> |
diff --git a/mythtv/themes/Terra/htmls/progdetails_page2.html b/mythtv/themes/Terra/htmls/progdetails_page2.html
index a1426d6..02963cd 100644
a
|
b
|
|
36 | 36 | <h1>%LAST_RECORDED_LABEL%</h1> <p>%LAST_RECORDED%</p> |
37 | 37 | <h1>%NEXT_RECORDING_LABEL%</h1> <p>%NEXT_RECORDING%</p> |
38 | 38 | <h1>%AVERAGE_TIME_SHIFT_LABEL%</h1> <p>%AVERAGE_TIME_SHIFT%</p> |
39 | | <h1>%WATCH_LIST_SCORE_LABEL%</h1> <p>%WATCH_LIST_SCORE%</p> |
40 | | <h1>%WATCH_LIST_STATUS_LABEL%</h1> <p>%WATCH_LIST_STATUS%</p> |
41 | 39 | <h1>%SEARCH_PHRASE_LABEL%</h1> <p>%SEARCH_PHRASE%</p> |
42 | 40 | <h1>%FINDID_LABEL%</h1> <p>%FINDID%</p> |
43 | 41 | <h1>%RECORDING_HOST_LABEL%</h1> <p>%RECORDING_HOST%</p> |
diff --git a/mythtv/themes/default/htmls/progdetails_page2.html b/mythtv/themes/default/htmls/progdetails_page2.html
index 40fb94b..4a17980 100644
a
|
b
|
|
33 | 33 | <h1>%LAST_RECORDED_LABEL%</h1> <p>%LAST_RECORDED%</p> |
34 | 34 | <h1>%NEXT_RECORDING_LABEL%</h1> <p>%NEXT_RECORDING%</p> |
35 | 35 | <h1>%AVERAGE_TIME_SHIFT_LABEL%</h1> <p>%AVERAGE_TIME_SHIFT%</p> |
36 | | <h1>%WATCH_LIST_SCORE_LABEL%</h1> <p>%WATCH_LIST_SCORE%</p> |
37 | | <h1>%WATCH_LIST_STATUS_LABEL%</h1> <p>%WATCH_LIST_STATUS%</p> |
38 | 36 | <h1>%SEARCH_PHRASE_LABEL%</h1> <p>%SEARCH_PHRASE%</p> |
39 | 37 | <h1>%FINDID_LABEL%</h1> <p>%FINDID%</p> |
40 | 38 | <h1>%RECORDING_HOST_LABEL%</h1> <p>%RECORDING_HOST%</p> |