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> |