rpms/mythtv/F-20 ChangeLog, 1.17, 1.18 mythbackend.service, 1.9, 1.10 mythtv-0.27-fixes.patch, 1.8, 1.9 mythtv.spec, 1.142, 1.143

Richard Shaw hobbes1069 at rpmfusion.org
Sun Jan 4 22:10:26 CET 2015


Author: hobbes1069

Update of /cvs/free/rpms/mythtv/F-20
In directory old02.ovh.rpmfusion.lan:/tmp/cvs-serv30965

Modified Files:
	ChangeLog mythbackend.service mythtv-0.27-fixes.patch 
	mythtv.spec 
Log Message:
* Sun Jan  4 2015 Richard Shaw <hobbes1069 at gmail.com> - 0.27.4-3
- Update to latest bugfix release.
- Change systemd dependency from network.target to network-online.target, fixes
  BZ#3482.



Index: ChangeLog
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-20/ChangeLog,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- ChangeLog	3 Nov 2014 20:06:10 -0000	1.17
+++ ChangeLog	4 Jan 2015 21:10:24 -0000	1.18
@@ -1,3 +1,237 @@
+commit 40506c2ba7d81fa8e65bf8bb783c998ffe65c7af
+Author: Stuart Morgan <smorgan at mythtv.org>
+Date:   Thu Dec 11 15:49:35 2014 +0000
+
+    SSDP: Missed changes when reverting [52cb0b5]
+    
+    Fixes #12333
+    
+    (cherry picked from commit 3461b407b0dd0f4188108395709eb129ec32e652)
+
+commit ea73ed3989d210efbaf822d3cee029b0c8d6b553
+Author: Paul Harrison <pharrison at mythtv.org>
+Date:   Tue Dec 9 20:50:00 2014 +0000
+
+    MythUIImage: extend the random image feature to reload if a delay is used
+    
+    If the <filename> is set to a directory and the <delay> is set to a value > 0
+    then keep reloading a random image from the directory after <delay>
+    milliseconds has passed.
+    
+    For example this will display a random image from the themes 'background'
+    directory changing the image every minute (60000ms) :-
+    
+    <imagetype name="background">
+        <area>0,0,1280,720</area>
+        <filename>backgrounds/</filename>
+        <delay>60000</delay>
+    </imagetype>
+    
+    (cherry picked from commit 78a827b8fdbf0d4fab4525a8007c2c8c7deb4cc1)
+
+commit 86ff53a7a178f5da5e2858f0ffd889cf2eab301b
+Author: Karl Dietz <dekarl at mythtv.org>
+Date:   Fri Apr 25 15:49:24 2014 +0200
+
+    draft patch to add support for private data specifiers and upc private data
+    
+    Fixes #12091
+    (cherry picked from commit 30df98ce5d11b69d0b5c5114a9007cdfc79a7e9b)
+    
+    Conflicts:
+    
+    	mythtv/libs/libmythtv/test/test_mpegtables/test_mpegtables.h
+
+commit c32f254cd6aefdc5138e504afdf829c290878437
+Author: Karl Dietz <dekarl at mythtv.org>
+Date:   Thu Jul 10 00:41:00 2014 +0200
+
+    Don't use the CRIDs from the authority eventis.nl
+    
+    they are not fit for our scheduler (multiple IDs per series/episode
+    and multiple series/episodes per ID)
+    (cherry picked from commit 494dfa6eef01aabe1ed7bf3d0f3139f20a8b7678)
+
+commit 141b4f3e0ac970a185be60a81bc64f88f0ccd563
+Author: Paul Harrison <pharrison at mythtv.org>
+Date:   Thu Dec 4 23:16:54 2014 +0000
+
+    MythDownloadManager: unlock m_infoLock before continuing after an error condition
+    
+    Problem spotted by nouglywires on the forums.
+    
+    (cherry picked from commit 8e6678a00f81fffcd8a3bf71947066db1fffbd30)
+
+commit 70653f18a203680d5bff5b8d6ceff12b5e39fd4c
+Author: Karl Dietz <dekarl at mythtv.org>
+Date:   Sun Nov 30 23:41:58 2014 +0100
+
+    fix braino in c12af87
+    (cherry picked from commit 0f7d7ff0660a12022b76cdb8d6d6bceda032f540)
+
+commit 6fdb2d1a02e0867483e9025a8ab9477f2444af06
+Author: Stuart Morgan <smorgan at mythtv.org>
+Date:   Sat Nov 29 22:53:27 2014 +0000
+
+    SSDP: Disable reflection attack mitigation for now, it's triggering false positives.
+    
+    (cherry picked from commit 02e92a265c1e9825bb58806156fbf31bd740515a)
+
+commit bd762efd166f3969e5acc0ac0f7a11770a44a9d3
+Author: Karl Dietz <dekarl at mythtv.org>
+Date:   Tue Nov 25 23:37:30 2014 +0100
+
+    Properly translate star ratings in XMLTV parser.
+    
+    Convert from zero based star-ratings in XMLTV to one based star-ratings
+    in MythTV.
+    (cherry picked from commit c12af87629629295975fdb1ede28072ad2fc1247)
+
+commit 65d92fd36ecf796d8e8a18b3196286d31b28501e
+Author: Stuart Morgan <smorgan at mythtv.org>
+Date:   Wed Nov 19 12:32:59 2014 +0000
+
+    SSDP: Check that the peer address is available before doing the local network check.
+    
+    Refs #12305
+    
+    (cherry picked from commit d20c163ee82c38f9d8fe4652b7a811af61925de7)
+
+commit 9a72d02cb7e9a89135b5044e9179f148a45b0cf6
+Author: Paul Harrison <pharrison at mythtv.org>
+Date:   Wed Nov 19 12:47:47 2014 +0000
+
+    Revert "Prevent --syslog, --logpath and --enable-dblog if --nologserver is used"
+    
+    Seems those options are valid for --nologserver. That option just means don't run
+    the external mythlogserver but do the logging internally.
+    
+    Refs #11992.
+    
+    This reverts commit ec06dfba8e22008ac97af81f997e9b521eca62ae.
+
+commit 4572a55538303df215d28c02dae24bde757a7fde
+Author: David Engel <dengel at mythtv.org>
+Date:   Tue Nov 18 13:27:45 2014 -0600
+
+    Fix missed cases in earlier channel-specific rules change.
+    
+    Refs #12267
+    
+    (cherry picked from commit d3f5031e08c0a9e0fa783310afa4d293bacf6ce0)
+
+commit 99688ed2df3e17b2776fc951dc1bc33c12e1a359
+Author: Stuart Morgan <smorgan at mythtv.org>
+Date:   Thu Nov 13 16:17:36 2014 +0000
+
+    Add support for explicitly recognising QAM-256 with DVB-T2. This _may_ help with scanning on devices that don't support 'auto' modulation detection.
+    
+    (cherry picked from commit 864d985786a6f0f0fe2b93b4539c12ee2b0e09e2)
+    (cherry picked from commit 376955a091dbf69f7cc233fa1bf3255401e80367)
+
+commit 76da983bb8aec8a91e8d897150e85d3a5256596d
+Author: David Engel <dengel at mythtv.org>
+Date:   Tue Nov 11 16:18:37 2014 -0600
+
+    Properly identify channel-specific rules in Recording Rules.
+    
+    This was broken when channel rules were converted to all rules using
+    the this channel filter.  Based on a patch from lomion at aon.at.
+    
+    Refs #12267
+    
+    (cherry picked from commit a397b94ffb5cf201aef4fdd9ccd2b28780713bed)
+
+commit ec06dfba8e22008ac97af81f997e9b521eca62ae
+Author: Bill Meek <keemllib at gmail.com>
+Date:   Tue Nov 11 00:07:53 2014 +0000
+
+    Prevent --syslog, --logpath and --enable-dblog if --nologserver is used
+    
+    Fixes #11992.
+    
+    Signed-off-by: Paul Harrison <pharrison at mythtv.org>
+    (cherry picked from commit be72636b9e34b1b9fb032a1da578a742d562d0b9)
+
+commit be0005e12cd65ee5e3311c3511a80e7e2a8159f0
+Author: Rebecca Sutton Koeser <rlskoeser at gmail.com>
+Date:   Mon Nov 10 22:31:07 2014 +0000
+
+    Python bindings: fix typo in MythXML getPreviewImage()
+    
+    Fixes #11515.
+    
+    Signed-off-by: Paul Harrison <pharrison at mythtv.org>
+    (cherry picked from commit e42e1d8351703798e3dc08cb01597577794bab32)
+
+commit 6eb4afbd48652a99a2ec4cddd774de2101aacc83
+Author: Jonatan Lindblad <jlindblad at mythtv.org>
+Date:   Mon Nov 10 15:17:57 2014 +0000
+
+    Fix using ##x## for season and episode in templated text
+    
+    Fixes #12003.
+    
+    Signed-off-by: Paul Harrison <pharrison at mythtv.org>
+    (cherry picked from commit acdc9f86988379b842f56b89089f4e8d029dec37)
+
+commit 4cea476f411f5a2f146398ca20bd0b1046cb1f72
+Author: Paul Harrison <pharrison at mythtv.org>
+Date:   Mon Nov 10 12:41:52 2014 +0000
+
+    mythfilldatabase: remove the redundant assign to userid
+    
+    Refs #12300.
+    
+    (cherry picked from commit 2f2261d6e3bb78f029dbb38e4746314d6ca0a2b6)
+
+commit ee025527aec0f1bed588664d3061c69fb97a642b
+Author: Bill Meek <keemllib at gmail.com>
+Date:   Mon Nov 10 12:03:41 2014 +0000
+
+    mythfilldatabase: remove Schedules Direct userid from temporary file names
+    
+    This removes the userid from the file name so it wont be exposed in any logs.
+    
+    Fixes #12300.
+    
+    Signed-off-by: Paul Harrison <pharrison at mythtv.org>
+    (cherry picked from commit 6750b358ec33c09bd651507ed57eb993ae5e5a39)
+
+commit a1096aa9fa4177a66a0cc45196c9e8179944efbd
+Author: faginbagin <mythtv at hbuus.com>
+Date:   Mon Nov 10 11:33:22 2014 +0000
+
+    DTVRecorder: Fix 32 to 64 bit integer arithmetic in FindPSKeyFrames()
+    
+    This is reported to fix commercial flagging of PVR-150/300/500 recordings
+    possibly only affecting 32 bit O/Ss due to a bad conversion from a 32 bit
+    unsigned int to a 64 bit signed int.
+    
+    Fixes #12313.
+    
+    Signed-off-by: Paul Harrison <pharrison at mythtv.org>
+    (cherry picked from commit eb0e5050a4af098b9c9dd392c324e1993b2c590e)
+
+commit 0f0e67871b38abc9de21e588a1a9670d7d7603e5
+Author: Richard Hulme <peper03 at mythtv.org>
+Date:   Thu Oct 30 22:43:05 2014 +0100
+
+    Make PID filtering work properly by removing the streams and not just the entries from the PAT.
+    (cherry picked from commit 61f9ac9a8d7f6eb5cf1fac74376245e8b82e42f1)
+
+commit f01bd1d9607bfcad8049515592b4fda0f7a9274c
+Author: Stuart Morgan <smorgan at mythtv.org>
+Date:   Sat Sep 7 17:02:32 2013 +0100
+
+    Add a setting to control MHEG interaction channel, patch by Lawrence Rust
+    
+    This also disables the interaction channel (and iplayer) by default as
+    it appears that this is currently broken, possibly by an upstream
+    change at the BBC.
+    
+    (cherry picked from commit 03c11f466a9cd8960a17e5d2d2c2c54b6bf42cc9)
+
 commit e0b002787e32d2e21ec57d9686ec4a8411c0fa60
 Author: lomion <lomion at aon.at>
 Date:   Sun Oct 26 17:50:57 2014 -0400


Index: mythbackend.service
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-20/mythbackend.service,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- mythbackend.service	7 Jan 2014 20:01:40 -0000	1.9
+++ mythbackend.service	4 Jan 2015 21:10:24 -0000	1.10
@@ -30,7 +30,7 @@
 
 [Unit]
 Description=MythTV backend service
-After=network.target mariadb.service mysqld.service time-sync.target
+After=network-online.target mariadb.service mysqld.service time-sync.target
 # Uncomment the following line if you will be using the mythweb plugin on the
 # same system as mythbackend.
 #Wants=httpd.service
@@ -61,5 +61,12 @@
 # Whether systemd will continue over-watch and restart on any halt
 #Restart=always
 
+# MariaDB seems to have a systemd related bug and tells systemd that it is
+# ready to accept connections before it really is. If you have this problem
+# try uncommenting the following lines:
+# Restart=on-failure
+# StartLimitBurst=5
+# StartLimitInterval=1
+
 [Install]
 WantedBy=multi-user.target

mythtv-0.27-fixes.patch:
 bindings/python/MythTV/methodheap.py                    |    2 
 libs/libmythbase/mythdownloadmanager.cpp                |    3 
 libs/libmythbase/mythversion.h                          |    2 
 libs/libmythtv/datadirect.cpp                           |   56 +-
 libs/libmythtv/datadirect.h                             |    2 
 libs/libmythtv/eithelper.cpp                            |   36 +
 libs/libmythtv/mhegic.cpp                               |    9 
 libs/libmythtv/mpeg/dvbdescriptors.h                    |   50 +
 libs/libmythtv/mpeg/mpegdescriptors.h                   |   16 
 libs/libmythtv/mpeg/mpegstreamdata.cpp                  |    9 
 libs/libmythtv/recorders/dtvrecorder.cpp                |    7 
 libs/libmythtv/test/test_mpegtables/test_mpegtables.h   |   52 ++
 libs/libmythtv/test/test_mpegtables/test_mpegtables.pro |    4 
 libs/libmythui/mythuibuttonlist.cpp                     |    2 
 libs/libmythui/mythuiimage.cpp                          |  122 ++--
 libs/libmythui/mythuiimage.h                            |    5 
 libs/libmythui/mythuitext.cpp                           |    2 
 libs/libmythupnp/ssdp.cpp                               |    2 
 locales/de_at.xml                                       |   37 +
 programs/mythfilldatabase/xmltvparser.cpp               |   19 
 programs/mythfrontend/globalsettings.cpp                |   13 
 programs/mythfrontend/programrecpriority.cpp            |   69 +-
 themes/default/keyboard/el.xml                          |  270 ++++++++++
 themes/default/keyboard/el_ui.xml                       |  410 ++++++++++++++++
 24 files changed, 1081 insertions(+), 118 deletions(-)

Index: mythtv-0.27-fixes.patch
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-20/mythtv-0.27-fixes.patch,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- mythtv-0.27-fixes.patch	3 Nov 2014 20:06:10 -0000	1.8
+++ mythtv-0.27-fixes.patch	4 Jan 2015 21:10:24 -0000	1.9
@@ -1,12 +1,57 @@
- mythtv/libs/libmythbase/mythversion.h    |   2 +-
- mythtv/libs/libmythtv/datadirect.cpp     |  52 +++-
- mythtv/libs/libmythtv/datadirect.h       |   2 +
- mythtv/libs/libmythupnp/ssdp.cpp         |  30 ++-
- mythtv/locales/de_at.xml                 |  37 +++
- mythtv/themes/default/keyboard/el.xml    | 270 ++++++++++++++++++++
- mythtv/themes/default/keyboard/el_ui.xml | 410 +++++++++++++++++++++++++++++++
- 7 files changed, 792 insertions(+), 11 deletions(-)
+ mythtv/bindings/python/MythTV/methodheap.py        |   2 +-
+ mythtv/libs/libmythbase/mythdownloadmanager.cpp    |   3 +
+ mythtv/libs/libmythbase/mythversion.h              |   2 +-
+ mythtv/libs/libmythtv/datadirect.cpp               |  56 ++-
+ mythtv/libs/libmythtv/datadirect.h                 |   2 +
+ mythtv/libs/libmythtv/eithelper.cpp                |  36 +-
+ mythtv/libs/libmythtv/mhegic.cpp                   |   9 +-
+ mythtv/libs/libmythtv/mpeg/dvbdescriptors.h        |  50 ++-
+ mythtv/libs/libmythtv/mpeg/mpegdescriptors.h       |  16 +
+ mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp      |   9 +-
+ mythtv/libs/libmythtv/recorders/dtvrecorder.cpp    |   7 +-
+ .../test/test_mpegtables/test_mpegtables.h         |  52 +++
+ .../test/test_mpegtables/test_mpegtables.pro       |   4 +
+ mythtv/libs/libmythui/mythuibuttonlist.cpp         |   2 +-
+ mythtv/libs/libmythui/mythuiimage.cpp              | 122 +++---
+ mythtv/libs/libmythui/mythuiimage.h                |   5 +
+ mythtv/libs/libmythui/mythuitext.cpp               |   2 +-
+ mythtv/libs/libmythupnp/ssdp.cpp                   |   2 +-
+ mythtv/locales/de_at.xml                           |  37 ++
+ mythtv/programs/mythfilldatabase/xmltvparser.cpp   |  19 +-
+ mythtv/programs/mythfrontend/globalsettings.cpp    |  13 +
+ .../programs/mythfrontend/programrecpriority.cpp   |  69 ++--
+ mythtv/themes/default/keyboard/el.xml              | 270 ++++++++++++++
+ mythtv/themes/default/keyboard/el_ui.xml           | 410 +++++++++++++++++++++
+ 24 files changed, 1081 insertions(+), 118 deletions(-)
 
+diff --git a/mythtv/bindings/python/MythTV/methodheap.py b/mythtv/bindings/python/MythTV/methodheap.py
+index d598b2f..b41b2da 100644
+--- a/mythtv/bindings/python/MythTV/methodheap.py
++++ b/mythtv/bindings/python/MythTV/methodheap.py
+@@ -1202,7 +1202,7 @@ class MythXML( XMLConnection ):
+         if height: args['Height'] = height
+         if secsin: args['SecsIn'] = secsin
+ 
+-        return self._result('Content/GetPreviewImage', **args).read()
++        return self._request('Content/GetPreviewImage', **args).read()
+ 
+ class MythMusic( MusicSchema, DBCache ):
+     """
+diff --git a/mythtv/libs/libmythbase/mythdownloadmanager.cpp b/mythtv/libs/libmythbase/mythdownloadmanager.cpp
+index 02d27a0..63e2e51 100644
+--- a/mythtv/libs/libmythbase/mythdownloadmanager.cpp
++++ b/mythtv/libs/libmythbase/mythdownloadmanager.cpp
+@@ -312,7 +312,10 @@ void MythDownloadManager::run(void)
+             m_downloadQueue.pop_front();
+ 
+             if (!dlInfo)
++            {
++                m_infoLock->unlock();
+                 continue;
++            }
+ 
+             QUrl qurl(dlInfo->m_url);
+             if (m_downloadInfos.contains(qurl.toString()))
 diff --git a/mythtv/libs/libmythbase/mythversion.h b/mythtv/libs/libmythbase/mythversion.h
 index b097b21..26d37ff 100644
 --- a/mythtv/libs/libmythbase/mythversion.h
@@ -21,7 +66,7 @@
  /** \brief Increment this whenever the MythTV network protocol changes.
   *
 diff --git a/mythtv/libs/libmythtv/datadirect.cpp b/mythtv/libs/libmythtv/datadirect.cpp
-index 77cdef5..714a0c1 100644
+index 77cdef5..4ec9f92 100644
 --- a/mythtv/libs/libmythtv/datadirect.cpp
 +++ b/mythtv/libs/libmythtv/datadirect.cpp
 @@ -539,8 +539,8 @@ DataDirectProcessor::DataDirectProcessor(uint lp, QString user, QString pass) :
@@ -93,7 +138,20 @@
      file.write(postdata);
      file.close();
  
-@@ -1833,6 +1855,18 @@ QString DataDirectProcessor::GetCookieFilename(bool &ok) const
+@@ -1161,11 +1183,9 @@ bool DataDirectProcessor::GrabData(const QDateTime &pstartDate,
+ 
+     if (m_cacheData)
+     {
+-        QByteArray userid = GetUserID().toLatin1();
+         cache_dd_data = m_tmpDir +
+-            QString("/mythtv_dd_cache_%1_%2_UTC_%3_to_%4")
++            QString("/mythtv_dd_cache_%1_UTC_%2_to_%3")
+             .arg(GetListingsProvider())
+-            .arg(userid.constData())
+             .arg(MythDate::toString(pstartDate, MythDate::kFilename))
+             .arg(MythDate::toString(pendDate, MythDate::kFilename));
+ 
+@@ -1833,6 +1853,18 @@ QString DataDirectProcessor::GetCookieFilename(bool &ok) const
      return m_cookieFile;
  }
  
@@ -112,7 +170,7 @@
  void DataDirectProcessor::SetUserID(const QString &uid)
  {
      m_userid = uid;
-@@ -1877,7 +1911,11 @@ bool DataDirectProcessor::Post(QString url, const PostList &list,
+@@ -1877,7 +1909,11 @@ bool DataDirectProcessor::Post(QString url, const PostList &list,
          return true;
  
      QFile file(documentFile);
@@ -145,51 +203,577 @@
      mutable QString m_cookieFile;
      QDateTime       m_cookieFileDT;
  
-diff --git a/mythtv/libs/libmythupnp/ssdp.cpp b/mythtv/libs/libmythupnp/ssdp.cpp
-index 9e503eb..ebe3bcb 100644
---- a/mythtv/libs/libmythupnp/ssdp.cpp
-+++ b/mythtv/libs/libmythupnp/ssdp.cpp
-@@ -314,6 +314,33 @@ void SSDP::run()
+diff --git a/mythtv/libs/libmythtv/eithelper.cpp b/mythtv/libs/libmythtv/eithelper.cpp
+index bf980ed..e34714f 100644
+--- a/mythtv/libs/libmythtv/eithelper.cpp
++++ b/mythtv/libs/libmythtv/eithelper.cpp
+@@ -566,17 +566,49 @@ void EITHelper::AddEIT(const DVBEventInformationTable *eit)
+                     // The CRID is a URI.  It could contain UTF8 sequences encoded
+                     // as %XX but there's no advantage in decoding them.
+                     // The BBC currently uses private types 0x31 and 0x32.
++                    // IDs from the authority eventis.nl are not fit for our scheduler
+                     if (desc.ContentType(k) == 0x01 || desc.ContentType(k) == 0x31)
+-                        programId = desc.ContentId(k);
++                    {
++                        if (!desc.ContentId(k).startsWith ("eventis.nl/"))
++                        {
++                            programId = desc.ContentId(k);
++                        }
++                    }
+                     else if (desc.ContentType(k) == 0x02 || desc.ContentType(k) == 0x32)
+                     {
+-                        seriesId = desc.ContentId(k);
++                        if (!desc.ContentId(k).startsWith ("eventis.nl/"))
++                        {
++                            seriesId = desc.ContentId(k);
++                        }
+                         category_type = ProgramInfo::kCategorySeries;
+                     }
+                 }
+             }
+         }
+ 
++        /* if we don't have a subtitle, try to parse one from private descriptors */
++        if (subtitle.isEmpty()) {
++            bool isUPC = false;
++            /* is this event carrying UPC private data? */
++            desc_list_t private_data_specifiers = MPEGDescriptor::FindAll(list, DescriptorID::private_data_specifier);
++            for (uint j = 0; j < private_data_specifiers.size(); j++) {
++                PrivateDataSpecifierDescriptor desc(private_data_specifiers[j]);
++                if (desc.PrivateDataSpecifier() == PrivateDataSpecifierID::UPC1) {
++                    isUPC = true;
++                }
++            }
++
++            if (isUPC) {
++                desc_list_t subtitles = MPEGDescriptor::FindAll(list, PrivateDescriptorID::upc_event_episode_title);
++                for (uint j = 0; j < subtitles.size(); j++) {
++                    PrivateUPCCablecomEpisodeTitleDescriptor desc(subtitles[j]);
++
++                    subtitle = desc.Text();
++                }
++            }
++        }
++
++
+         QDateTime starttime = eit->StartTimeUTC(i);
+         // fix starttime only if the duration is a multiple of a minute
+         if (!(eit->DurationInSeconds(i) % 60))
+diff --git a/mythtv/libs/libmythtv/mhegic.cpp b/mythtv/libs/libmythtv/mhegic.cpp
+index d8a5fbb..31456c1 100644
+--- a/mythtv/libs/libmythtv/mhegic.cpp
++++ b/mythtv/libs/libmythtv/mhegic.cpp
+@@ -18,6 +18,7 @@ using std::getenv;
+ // Myth
+ #include "netstream.h"
+ #include "mythlogging.h"
++#include "mythcorecontext.h"
+ 
+ #define LOC QString("[mhegic] ")
+ 
+@@ -48,14 +49,16 @@ MHInteractionChannel::EStatus MHInteractionChannel::status()
+         return kInactive;
+     }
+ 
+-    // TODO get this from mythdb
++    if (!gCoreContext->GetNumSetting("EnableMHEG", 0))
++        return kDisabled;
++
+     QStringList opts = QString(getenv("MYTHMHEG")).split(':');
+     if (opts.contains("noice", Qt::CaseInsensitive))
+         return kDisabled;
+     else if (opts.contains("ice", Qt::CaseInsensitive))
+         return kActive;
+-    else // Default
+-        return kActive;
++
++    return gCoreContext->GetNumSetting("EnableMHEGic", 1) ? kActive : kDisabled;
+ }
+ 
+ static inline bool isCached(const QString& csPath)
+diff --git a/mythtv/libs/libmythtv/mpeg/dvbdescriptors.h b/mythtv/libs/libmythtv/mpeg/dvbdescriptors.h
+index 682e5b5..f5a74bf 100644
+--- a/mythtv/libs/libmythtv/mpeg/dvbdescriptors.h
++++ b/mythtv/libs/libmythtv/mpeg/dvbdescriptors.h
+@@ -926,12 +926,13 @@ class TerrestrialDeliverySystemDescriptor : public MPEGDescriptor
+         kConstellationQPSK  = 0x0,
+         kConstellationQAM16 = 0x1,
+         kConstellationQAM64 = 0x2,
++        kConstellationQAM256 = 0x3,
+     };
+     uint Constellation(void) const { return _data[7]>>6; }
+     QString ConstellationString(void) const
+     {
+-        static QString cs[] = { "qpsk", "qam_16", "qam_64" };
+-        return (Constellation() <= kConstellationQAM64) ?
++        static QString cs[] = { "qpsk", "qam_16", "qam_64", "qam_256" };
++        return (Constellation() <= kConstellationQAM256) ?
+             cs[Constellation()] : "auto";
+     }
+     // hierarchy_information    3   7.2
+@@ -1357,6 +1358,10 @@ class PrivateDataSpecifierDescriptor : public MPEGDescriptor
+     // descriptor_length        8   1.0
+ 
+     // private_data_specifier  32   2.0
++    uint32_t PrivateDataSpecifier (void) const
++    {
++        return (_data[2] << 24 | _data[3] << 16 | _data[4] << 8 | _data[5]);
++    }
+ };
+ 
+ // DVB Bluebook A038 (Sept 2011) p 79
+@@ -2070,4 +2075,45 @@ class DefaultAuthorityDescriptor : public MPEGDescriptor
+     }
+ };
+ 
++/*
++ * private UPC Cablecom (Austria) episode descriptor for Horizon middleware
++ */
++class PrivateUPCCablecomEpisodeTitleDescriptor : public MPEGDescriptor
++{
++    public:
++     PrivateUPCCablecomEpisodeTitleDescriptor(const unsigned char *data, int len = 300) :
++         MPEGDescriptor(data, len, PrivateDescriptorID::upc_event_episode_title) { }
++    //       Name             bits  loc  expected value
++    // descriptor_tag           8   0.0       0xa7
++    // descriptor_length        8   1.0
++
++    // ISO_639_language_code   24   2.0
++    int LanguageKey(void) const
++    {
++        return iso639_str3_to_key(&_data[2]);
++    }
++    QString LanguageString(void) const
++    {
++        return iso639_key_to_str3(LanguageKey());
++    }
++    int CanonicalLanguageKey(void) const
++    {
++        return iso639_key_to_canonical_key(LanguageKey());
++    }
++    QString CanonicalLanguageString(void) const
++    {
++        return iso639_key_to_str3(CanonicalLanguageKey());
++    }
++
++    uint TextLength(void) const
++    {
++        return _data[1] - 3;
++    }
++
++    QString Text(void) const
++    {
++        return dvb_decode_text(&_data[5], TextLength());
++    }
++};
++
+ #endif
+diff --git a/mythtv/libs/libmythtv/mpeg/mpegdescriptors.h b/mythtv/libs/libmythtv/mpeg/mpegdescriptors.h
+index 1efd30a..626bc5a 100644
+--- a/mythtv/libs/libmythtv/mpeg/mpegdescriptors.h
++++ b/mythtv/libs/libmythtv/mpeg/mpegdescriptors.h
+@@ -191,6 +191,9 @@ class PrivateDescriptorID
+         dish_event_vchip            = 0x95, /* implemented */
+         dish_event_tags             = 0x96, /* implemented */
  
- void SSDP::ProcessData( MSocketDevice *pSocket )
++        // Private -- CH UPC Cablecom
++        upc_event_episode_title     = 0xA7,
++
+         // Private -- premiere.de
+         premiere_content_order        = 0xF0,
+         premiere_parental_information = 0xF1,
+@@ -198,6 +201,19 @@ class PrivateDescriptorID
+     };
+ };
+ 
++/*
++ * Private_Data_Specifier_ID from http://www.dvbservices.com/identifiers/private_data_spec_id
++ */
++class PrivateDataSpecifierID
++{
++  public:
++    enum
++    {
++        /* UPC Cablecom */
++        UPC1 = 0x00000600,
++    };
++};
++
+ class MTV_PUBLIC MPEGDescriptor
+ {
+   public:
+diff --git a/mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp b/mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp
+index e295975..9738c7f 100644
+--- a/mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp
++++ b/mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp
+@@ -147,9 +147,8 @@ void MPEGStreamData::SetRecordingType(const QString &recording_type)
  {
-+    QHostAddress  peerAddress = pSocket->peerAddress();
-+    quint16       peerPort    = pSocket->peerPort   ();
+     _recording_type = recording_type;
+     _recording_type.detach();
+-    uint neededVideo = (_recording_type == "tv")    ? 1 : 0;
+     uint neededAudio = (_recording_type == "audio") ? 1 : 0;
+-    SetVideoStreamsRequired(neededVideo);
++    SetVideoStreamsRequired(0);
+     SetAudioStreamsRequired(neededAudio);
+ }
+ 
+@@ -578,6 +577,12 @@ bool MPEGStreamData::CreatePMTSingleProgram(const ProgramMapTable &pmt)
+             audio_cnt++;
+             audioPIDs.push_back(pid);
+         }
++        else if (_recording_type == "audio" )
++        {
++            // If not an audio PID but we only want audio,
++            // ignore this PID.
++            continue;
++        }
+ 
+ #ifdef DEBUG_MPEG_RADIO
+         if (is_video)
+diff --git a/mythtv/libs/libmythtv/recorders/dtvrecorder.cpp b/mythtv/libs/libmythtv/recorders/dtvrecorder.cpp
+index 099f8a6..df05491 100644
+--- a/mythtv/libs/libmythtv/recorders/dtvrecorder.cpp
++++ b/mythtv/libs/libmythtv/recorders/dtvrecorder.cpp
+@@ -1135,7 +1135,7 @@ void DTVRecorder::FindPSKeyFrames(const uint8_t *buffer, uint len)
+         if (hasKeyFrame)
+         {
+             _last_keyframe_seen = _frames_seen_count;
+-            HandleKeyframe(_payload_buffer.size() - (bufptr - bufstart));
++            HandleKeyframe((int64_t)_payload_buffer.size() - (bufptr - bufstart));
+         }
+ 
+         if ((aspectRatio > 0) && (aspectRatio != m_videoAspect))
+@@ -1336,6 +1336,11 @@ bool DTVRecorder::ProcessTSPacket(const TSPacket &tspacket)
+         FindOtherKeyframes(&tspacket);
+         _buffer_packets = false;
+     }
++    else if (_stream_id[pid] == 0)
++    {
++        // Ignore this packet if the PID should be stripped
++        return true;
++    }
+     else
+     {
+         // There are audio/video streams. Only write the packet
+diff --git a/mythtv/libs/libmythtv/test/test_mpegtables/test_mpegtables.h b/mythtv/libs/libmythtv/test/test_mpegtables/test_mpegtables.h
+index fa1412b..84e9a6d 100644
+--- a/mythtv/libs/libmythtv/test/test_mpegtables/test_mpegtables.h
++++ b/mythtv/libs/libmythtv/test/test_mpegtables/test_mpegtables.h
+@@ -204,4 +204,56 @@ class TestMPEGTables: public QObject
+         QCOMPARE (descriptor2.ContentId(), QString("eventis.nl/00000000-0000-1000-0608-000000003F9C"));
+         QCOMPARE (descriptor.ContentId(1), QString("eventis.nl/00000000-0000-1000-0608-000000003F9C"));
+     }
++
++    /* test for coverity 1047220: Incorrect deallocator used:
++     * Calling "PSIPTable::~PSIPTable()" frees "(&psip)->_fullbuffer"
++     * using "free" but it should have been freed using "operator delete[]".
++     *
++     * _allocSize should be 0 thus we are not freeing something we didn't
++     * allocate in the first place (false positive)
++     */
++    void clone_test(void)
++    {
++        unsigned char *si_data = new unsigned char[8];
++        si_data[0] = 0x70; /* pp....37 */
++        si_data[1] = 0x70;
++        si_data[2] = 0x05;
++        si_data[3] = 0xdc;
++        si_data[4] = 0xa9;
++        si_data[5] = 0x12;
++        si_data[6] = 0x33;
++        si_data[7] = 0x37;
++
++        const PSIPTable si_table(si_data);
++
++        QVERIFY (!si_table.IsClone());
++    }
++
++    /* test PrivateDataSpecifierDescriptor */
++    void PrivateDataSpecifierDescriptor_test (void)
++    {
++        /* from https://code.mythtv.org/trac/ticket/12091 */
++        const unsigned char si_data[] = { 
++            0x5f, 0x04, 0x00, 0x00, 0x06, 0x00
++        };
++        PrivateDataSpecifierDescriptor desc(si_data);
++        QCOMPARE (desc.PrivateDataSpecifier(), (uint32_t) PrivateDataSpecifierID::UPC1);
++    }
++
++    /* test for https://code.mythtv.org/trac/ticket/12091
++     * UPC Cablecom switched from standard DVB key/value set to
++     * custom descriptors
++     */
++    void PrivateUPCCablecomEpisodetitleDescriptor_test (void)
++    {
++        const unsigned char si_data[] = {
++            0xa7, 0x13, 0x67, 0x65, 0x72, 0x05, 0x4b, 0x72,  0x61, 0x6e, 0x6b, 0x20, 0x76, 0x6f, 0x72, 0x20,  /* ..ger.Krank vor  */
++            0x4c, 0x69, 0x65, 0x62, 0x65                                                                      /* Liebe            */
++        };
++
++        PrivateUPCCablecomEpisodeTitleDescriptor descriptor(si_data);
++        QCOMPARE (descriptor.CanonicalLanguageString(), QString("ger"));
++        QCOMPARE (descriptor.TextLength(), (uint) 16);
++        QCOMPARE (descriptor.Text(), QString("Krank vor Liebe"));
++    }
+ };
+diff --git a/mythtv/libs/libmythtv/test/test_mpegtables/test_mpegtables.pro b/mythtv/libs/libmythtv/test/test_mpegtables/test_mpegtables.pro
+index 2ed5ac6..b33b3fd 100644
+--- a/mythtv/libs/libmythtv/test/test_mpegtables/test_mpegtables.pro
++++ b/mythtv/libs/libmythtv/test/test_mpegtables/test_mpegtables.pro
+@@ -14,6 +14,10 @@ TARGET = test_mpegtables
+ DEPENDPATH += . ../..
+ INCLUDEPATH += . ../.. ../../mpeg ../../../libmythui ../../../libmyth ../../../libmythbase
+ 
++LIBS += ../../dvbdescriptors.o
++LIBS += ../../iso6937tables.o
++LIBS += ../../freesat_huffman.o
++
+ LIBS += -L../../../libmythbase -lmythbase-$$LIBVERSION
+ LIBS += -L../../../libmythui -lmythui-$$LIBVERSION
+ LIBS += -L../../../libmythupnp -lmythupnp-$$LIBVERSION
+diff --git a/mythtv/libs/libmythui/mythuibuttonlist.cpp b/mythtv/libs/libmythui/mythuibuttonlist.cpp
+index 95966a5..24669b5 100644
+--- a/mythtv/libs/libmythui/mythuibuttonlist.cpp
++++ b/mythtv/libs/libmythui/mythuibuttonlist.cpp
+@@ -3508,7 +3508,7 @@ void MythUIButtonListItem::SetToRealButton(MythUIStateType *button, bool selecte
+ 
+             QString newText = text->GetTemplateText();
+ 
+-            QRegExp regexp("%(([^\\|%]+)?\\||\\|(.))?(\\w+)(\\|(.+))?%");
++            QRegExp regexp("%(([^\\|%]+)?\\||\\|(.))?(\\S+)(\\|(.+))?%");
+             regexp.setMinimal(true);
+ 
+             if (!newText.isEmpty() && newText.contains(regexp))
+diff --git a/mythtv/libs/libmythui/mythuiimage.cpp b/mythtv/libs/libmythui/mythuiimage.cpp
+index 4707f01..5674bf1 100644
+--- a/mythtv/libs/libmythui/mythuiimage.cpp
++++ b/mythtv/libs/libmythui/mythuiimage.cpp
+@@ -654,6 +654,8 @@ void MythUIImage::Init(void)
+     m_animatedImage = false;
+ 
+     m_runningThreads = 0;
 +
-+    // Mitigate against SSDP Reflection DDOS attacks
-+    // Disallow device discovery from non-local addresses
-+    // Security Advisory (Akamai):
-+    // https://www.prolexic.com/kcresources/prolexic-threat-advisories/prolexic-threat-advisory-ssdp-reflection-ddos-attacks/ssdp-reflection-attacks-cybersecurity-locked.html
-+    // https://www.prolexic.com/knowledge-center-ddos-threat-advisory-ssdp-reflection-ddos-attacks.html
-+    //
-+    // TODO: We may want to restrict this to the same subnet as the server
-+    //       for added security
-+    if (((peerAddress.protocol() == QAbstractSocket::IPv4Protocol) &&
-+            (!peerAddress.isInSubnet(QHostAddress("172.16.0.0"), 12) &&
-+            !peerAddress.isInSubnet(QHostAddress("192.168.0.0"), 16) &&
-+            !peerAddress.isInSubnet(QHostAddress("10.0.0.0"), 8))) ||
-+        ((peerAddress.protocol() == QAbstractSocket::IPv6Protocol) &&
-+            !peerAddress.isInSubnet(pSocket->address(), 64))) // default subnet size is assumed to be /64
-+    {
-+        LOG(VB_GENERAL, LOG_CRIT, QString("SSDP Request from WAN IP "
-+                                            "address (%1). Possible SSDP "
-+                                            "Reflection attempt. Ignoring as "
-+                                            "security risk.")
-+                                                .arg(peerAddress.toString()));
-+        pSocket->readAll(); // Discard the data in the socket buffer
-+        return;
-+    }
-+
-     QByteArray buffer;
-     long nBytes = 0;
-     int retries = 0;
-@@ -365,9 +392,6 @@ void SSDP::ProcessData( MSocketDevice *pSocket )
-         if (buffer.isEmpty())
-             continue;
++    m_showingRandomImage = false;
+ }
+ 
+ /**
+@@ -1103,7 +1105,7 @@ bool MythUIImage::Load(bool allowLoadInBackground, bool forceStat)
+  */
+ void MythUIImage::Pulse(void)
+ {
+-    QWriteLocker updateLocker(&d->m_UpdateLock);
++    d->m_UpdateLock.lockForWrite();
  
--        QHostAddress  peerAddress = pSocket->peerAddress();
--        quint16       peerPort    = pSocket->peerPort   ();
+     int delay = -1;
+ 
+@@ -1115,39 +1117,51 @@ void MythUIImage::Pulse(void)
+     if (delay > 0 &&
+         abs(m_LastDisplay.msecsTo(QTime::currentTime())) > delay)
+     {
+-        m_ImagesLock.lock();
+-
+-        if (m_animationCycle == kCycleStart)
++        if (m_showingRandomImage)
+         {
+-            ++m_CurPos;
+-
+-            if (m_CurPos >= (uint)m_Images.size())
+-                m_CurPos = 0;
++            FindRandomImage();
++            d->m_UpdateLock.unlock();
++            Load();
++            d->m_UpdateLock.lockForWrite();
+         }
+-        else if (m_animationCycle == kCycleReverse)
++        else
+         {
+-            if ((m_CurPos + 1) >= (uint)m_Images.size())
++            m_ImagesLock.lock();
++
++            if (m_animationCycle == kCycleStart)
+             {
+-                m_animationReverse = true;
++                ++m_CurPos;
++
++                if (m_CurPos >= (uint)m_Images.size())
++                    m_CurPos = 0;
+             }
+-            else if (m_CurPos == 0)
++            else if (m_animationCycle == kCycleReverse)
+             {
+-                m_animationReverse = false;
++                if ((m_CurPos + 1) >= (uint)m_Images.size())
++                {
++                    m_animationReverse = true;
++                }
++                else if (m_CurPos == 0)
++                {
++                    m_animationReverse = false;
++                }
++
++                if (m_animationReverse)
++                    --m_CurPos;
++                else
++                    ++m_CurPos;
+             }
+ 
+-            if (m_animationReverse)
+-                --m_CurPos;
+-            else
+-                ++m_CurPos;
++            m_ImagesLock.unlock();
+         }
+ 
+-        m_ImagesLock.unlock();
 -
+         SetRedraw();
+         m_LastDisplay = QTime::currentTime();
+     }
+ 
+     MythUIType::Pulse();
++
++    d->m_UpdateLock.unlock();
+ }
+ 
+ /**
+@@ -1245,34 +1259,10 @@ bool MythUIImage::ParseElement(
+ 
+         if (m_imageProperties.filename.endsWith('/'))
+         {
+-            QDir imageDir(m_imageProperties.filename);
++            m_showingRandomImage = true;
++            m_imageDirectory = m_imageProperties.filename;
+ 
+-            if (!imageDir.exists())
+-            {
+-                QString themeDir = GetMythUI()->GetThemeDir() + '/';
+-                imageDir = themeDir + m_imageProperties.filename;
+-            }
+-
+-            QStringList imageTypes;
+-
+-            QList< QByteArray > exts = QImageReader::supportedImageFormats();
+-            QList< QByteArray >::Iterator it = exts.begin();
+-
+-            for (; it != exts.end(); ++it)
+-            {
+-                imageTypes.append(QString("*.").append(*it));
+-            }
+-
+-            imageDir.setNameFilters(imageTypes);
+-
+-            QStringList imageList = imageDir.entryList();
+-            QString randFile;
+-
+-            if (imageList.size())
+-                randFile = QString("%1%2").arg(m_imageProperties.filename)
+-                           .arg(imageList.takeAt(random() % imageList.size()));
+-
+-            m_OrigFilename = m_imageProperties.filename = randFile;
++            FindRandomImage();
+         }
+     }
+     else if (element.tagName() == "filepattern")
+@@ -1432,6 +1422,9 @@ void MythUIImage::CopyFrom(MythUIType *base)
+     m_animationCycle = im->m_animationCycle;
+     m_animatedImage = im->m_animatedImage;
+ 
++    m_showingRandomImage = im->m_showingRandomImage;
++    m_imageDirectory = im->m_imageDirectory;
++
+     MythUIType::CopyFrom(base);
+ 
+     // We need to update forceSize in case the parent area has changed
+@@ -1621,6 +1614,43 @@ void MythUIImage::customEvent(QEvent *event)
+         // No Images were loaded, so trigger Reset to default
+         Reset();
+     }
++}
++
++void MythUIImage::FindRandomImage(void)
++{
++    QDir imageDir(m_imageDirectory);
++
++    if (!imageDir.exists())
++    {
++        QString themeDir = GetMythUI()->GetThemeDir() + '/';
++        imageDir = themeDir + m_imageDirectory;
++    }
++
++    QStringList imageTypes;
++
++    QList< QByteArray > exts = QImageReader::supportedImageFormats();
++    QList< QByteArray >::Iterator it = exts.begin();
++
++    for (; it != exts.end(); ++it)
++    {
++        imageTypes.append(QString("*.").append(*it));
++    }
++
++    imageDir.setNameFilters(imageTypes);
+ 
++    QStringList imageList = imageDir.entryList();
++    QString randFile;
++
++    if (imageList.size())
++    {
++        // try to find a different image
++        do
++        {
++            randFile = QString("%1%2").arg(m_imageDirectory)
++                                      .arg(imageList.takeAt(random() % imageList.size()));
++
++        } while (imageList.size() > 1 && randFile == m_OrigFilename);
++    }
+ 
++    m_OrigFilename = m_imageProperties.filename = randFile;
+ }
+diff --git a/mythtv/libs/libmythui/mythuiimage.h b/mythtv/libs/libmythui/mythuiimage.h
+index 90901d3..a90ee3f 100644
+--- a/mythtv/libs/libmythui/mythuiimage.h
++++ b/mythtv/libs/libmythui/mythuiimage.h
+@@ -142,6 +142,8 @@ class MUI_PUBLIC MythUIImage : public MythUIType
+     void SetCropRect(int x, int y, int width, int height);
+     void SetCropRect(const MythRect &rect);
+ 
++    void FindRandomImage(void);
++
+     QString m_Filename;
+     QString m_OrigFilename;
+ 
+@@ -162,6 +164,9 @@ class MUI_PUBLIC MythUIImage : public MythUIType
+ 
+     int m_runningThreads;
+ 
++    bool m_showingRandomImage;
++    QString m_imageDirectory;
++
+     MythUIImagePrivate *d;
+ 
+     enum AnimationCycle {kCycleStart, kCycleReverse};
+diff --git a/mythtv/libs/libmythui/mythuitext.cpp b/mythtv/libs/libmythui/mythuitext.cpp
+index 0f7a6f6..60fa71f 100644
+--- a/mythtv/libs/libmythui/mythuitext.cpp
++++ b/mythtv/libs/libmythui/mythuitext.cpp
+@@ -196,7 +196,7 @@ void MythUIText::SetTextFromMap(const InfoMap &map)
+     if (newText.isEmpty())
+         newText = GetDefaultText();
+ 
+-    QRegExp regexp("%(([^\\|%]+)?\\||\\|(.))?(\\w+)(\\|(.+))?%");
++    QRegExp regexp("%(([^\\|%]+)?\\||\\|(.))?(\\S+)(\\|(.+))?%");
+     regexp.setMinimal(true);
+ 
+     if (!newText.isEmpty() && newText.contains(regexp))
+diff --git a/mythtv/libs/libmythupnp/ssdp.cpp b/mythtv/libs/libmythupnp/ssdp.cpp
+index 9e503eb..b1a4ba0 100644
+--- a/mythtv/libs/libmythupnp/ssdp.cpp
++++ b/mythtv/libs/libmythupnp/ssdp.cpp
+@@ -367,7 +367,7 @@ void SSDP::ProcessData( MSocketDevice *pSocket )
+ 
+         QHostAddress  peerAddress = pSocket->peerAddress();
+         quint16       peerPort    = pSocket->peerPort   ();
+-
++        
          // ------------------------------------------------------------------
          QString     str          = QString(buffer.constData());
          QStringList lines        = str.split("\r\n", QString::SkipEmptyParts);
@@ -236,6 +820,173 @@
 +    <!-- MythArchive -->
 +    <setting name="MythArchiveVideoFormat">PAL</setting>
 +</mythlocale>
+diff --git a/mythtv/programs/mythfilldatabase/xmltvparser.cpp b/mythtv/programs/mythfilldatabase/xmltvparser.cpp
+index d05649d..b843acb 100644
+--- a/mythtv/programs/mythfilldatabase/xmltvparser.cpp
++++ b/mythtv/programs/mythfilldatabase/xmltvparser.cpp
+@@ -359,7 +359,8 @@ ProgInfo *XMLTVParser::parseProgram(QDomElement &element)
+             {
+                 QDomNodeList values = info.elementsByTagName("value");
+                 QDomElement item;
+-                QString stars, num, den;
++                QString stars;
++                float num, den;
+                 float rating = 0.0;
+ 
+                 // Use the first rating to appear in the xml, this should be
+@@ -371,14 +372,22 @@ ProgInfo *XMLTVParser::parseProgram(QDomElement &element)
+                 // In the case of uk_rt it's not unknown for a recommendation
+                 // to be given to programmes which are 'so bad, you have to
+                 // watch!'
++                //
++                // XMLTV uses zero based ratings and signals no rating by absence.
++                // A rating from 1 to 5 is encoded as 0/4 to 4/4.
++                // MythTV uses zero to signal no rating!
++                // The same rating is encoded as 0.2 to 1.0 with steps of 0.2, it
++                // is not encoded as 0.0 to 1.0 with steps of 0.25 because
++                // 0 signals no rating!
++                // See http://xmltv.cvs.sourceforge.net/viewvc/xmltv/xmltv/xmltv.dtd?revision=1.47&view=markup#l539
+                 item = values.item(0).toElement();
+                 if (!item.isNull())
+                 {
+                     stars = getFirstText(item);
+-                    num = stars.section('/', 0, 0);
+-                    den = stars.section('/', 1, 1);
+-                    if (0.0 < den.toFloat())
+-                        rating = num.toFloat()/den.toFloat();
++                    num = stars.section('/', 0, 0).toFloat() + 1;
++                    den = stars.section('/', 1, 1).toFloat() + 1;
++                    if (0.0 < den)
++                        rating = num/den;
+                 }
+ 
+                 pginfo->stars.setNum(rating);
+diff --git a/mythtv/programs/mythfrontend/globalsettings.cpp b/mythtv/programs/mythfrontend/globalsettings.cpp
+index a487a49..ad99e0b 100644
+--- a/mythtv/programs/mythfrontend/globalsettings.cpp
++++ b/mythtv/programs/mythfrontend/globalsettings.cpp
+@@ -1604,6 +1604,18 @@ static HostCheckBox *EnableMHEG()
+     return gc;
+ }
+ 
++static HostCheckBox *EnableMHEGic()
++{
++    HostCheckBox *gc = new HostCheckBox("EnableMHEGic");
++    gc->setLabel(QObject::tr("Enable network access for interactive TV"));
++    gc->setValue(false);
++    gc->setHelpText(QObject::tr(
++                        "If enabled, interactive TV applications (MHEG) will "
++                        "be able to access interactive content over the "
++                        "internet. This is used for BBC iPlayer."));
++    return gc;
++}
++
+ static HostCheckBox *PersistentBrowseMode()
+ {
+     HostCheckBox *gc = new HostCheckBox("PersistentBrowseMode");
+@@ -4051,6 +4063,7 @@ OSDSettings::OSDSettings()
+     osd->setLabel(tr("On-screen Display"));
+ 
+     osd->addChild(EnableMHEG());
++    osd->addChild(EnableMHEGic());
+     osd->addChild(PersistentBrowseMode());
+     osd->addChild(BrowseAllTuners());
+     osd->addChild(DefaultCCMode());
+diff --git a/mythtv/programs/mythfrontend/programrecpriority.cpp b/mythtv/programs/mythfrontend/programrecpriority.cpp
+index 22e561a..ea6914b 100644
+--- a/mythtv/programs/mythfrontend/programrecpriority.cpp
++++ b/mythtv/programs/mythfrontend/programrecpriority.cpp
+@@ -1483,25 +1483,20 @@ void ProgramRecPriority::UpdateList()
+         item->SetText(tempTime, "lastrecordedtime", state);
+ 
+         QString channame = progInfo->channame;
+-        if ((progInfo->recType == kAllRecord) ||
+-            (progInfo->recType == kOneRecord) ||
+-            (progInfo->recType == kDailyRecord) ||
+-            (progInfo->recType == kWeeklyRecord))
+-            channame = tr("Any");
+-        item->SetText(channame, "channel", state);
+         QString channum = progInfo->chanstr;
+-        if ((progInfo->recType == kAllRecord) ||
+-            (progInfo->recType == kOneRecord) ||
+-            (progInfo->recType == kDailyRecord) ||
+-            (progInfo->recType == kWeeklyRecord))
+-            channum = tr("Any");
+-        item->SetText(channum, "channum", state);
+         QString callsign = progInfo->chansign;
+-        if ((progInfo->recType == kAllRecord) ||
+-            (progInfo->recType == kOneRecord) ||
+-            (progInfo->recType == kDailyRecord) ||
+-            (progInfo->recType == kWeeklyRecord))
++        if (progInfo->recType != kSingleRecord &&
++            progInfo->recType != kOverrideRecord &&
++            progInfo->recType != kDontRecord &&
++            !(progInfo->GetRecordingRule()->m_filter & 1024) &&
++            progInfo->GetRecordingRule()->m_searchType != kManualSearch)
++        {
++            channame = tr("Any");
++            channum = tr("Any");
+             callsign = tr("Any");
++        }
++        item->SetText(channame, "channel", state);
++        item->SetText(channum, "channum", state);
+         item->SetText(callsign, "callsign", state);
+ 
+         QString profile = progInfo->profile;
+@@ -1600,37 +1595,27 @@ void ProgramRecPriority::updateInfo(MythUIButtonListItem *item)
+         m_lastRecordedTimeText->SetText(tempTime);
+     }
+ 
+-    if (m_channameText)
++    if (m_channameText || m_channumText || m_callsignText)
+     {
+         QString channame = pgRecInfo->channame;
+-        if ((pgRecInfo->rectype == kAllRecord) ||
+-            (pgRecInfo->rectype == kOneRecord) ||
+-            (pgRecInfo->rectype == kDailyRecord) ||
+-            (pgRecInfo->rectype == kWeeklyRecord))
+-            channame = tr("Any");
+-        m_channameText->SetText(channame);
+-    }
+-
+-    if (m_channumText)
+-    {
+         QString channum = pgRecInfo->chanstr;
+-        if ((pgRecInfo->rectype == kAllRecord) ||
+-            (pgRecInfo->rectype == kOneRecord) ||
+-            (pgRecInfo->rectype == kDailyRecord) ||
+-            (pgRecInfo->rectype == kWeeklyRecord))
+-            channum = tr("Any");
+-        m_channumText->SetText(channum);
+-    }
+-
+-    if (m_callsignText)
+-    {
+         QString callsign = pgRecInfo->chansign;
+-        if ((pgRecInfo->rectype == kAllRecord) ||
+-            (pgRecInfo->rectype == kOneRecord) ||
+-            (pgRecInfo->rectype == kDailyRecord) ||
+-            (pgRecInfo->rectype == kWeeklyRecord))
++        if (pgRecInfo->recType != kSingleRecord &&
++            pgRecInfo->recType != kOverrideRecord &&
++            pgRecInfo->recType != kDontRecord &&
++            !(pgRecInfo->GetRecordingRule()->m_filter & 1024) &&
++            pgRecInfo->GetRecordingRule()->m_searchType != kManualSearch)
++        {
++            channame = tr("Any");
++            channum = tr("Any");
+             callsign = tr("Any");
+-        m_callsignText->SetText(callsign);
++        }
++        if (m_channameText)
++            m_channameText->SetText(channame);
++        if (m_channumText)
++            m_channumText->SetText(channum);
++        if (m_callsignText)
++            m_callsignText->SetText(callsign);
+     }
+ 
+     if (m_recProfileText)
 diff --git a/mythtv/themes/default/keyboard/el.xml b/mythtv/themes/default/keyboard/el.xml
 new file mode 100644
 index 0000000..da192cf


Index: mythtv.spec
===================================================================
RCS file: /cvs/free/rpms/mythtv/F-20/mythtv.spec,v
retrieving revision 1.142
retrieving revision 1.143
diff -u -r1.142 -r1.143
--- mythtv.spec	3 Nov 2014 20:06:10 -0000	1.142
+++ mythtv.spec	4 Jan 2015 21:10:25 -0000	1.143
@@ -60,7 +60,7 @@
 %define desktop_vendor RPMFusion
 
 # MythTV Version string -- preferably the output from git --describe
-%define vers_string v0.27.4-6-ge0b0027
+%define vers_string v0.27.4-27-g40506c2
 %define branch fixes/0.27
 
 # Git revision and branch ID
@@ -78,7 +78,7 @@
 %if "%{branch}" == "master"
 Release:        0.1.git.%{_gitrev}%{?dist}
 %else
-Release:        2%{?dist}
+Release:        3%{?dist}
 %endif
 
 # The primary license is GPLv2+, but bits are borrowed from a number of
@@ -1423,8 +1423,13 @@
 
 
 %changelog
-* Mon Nov  3 2014 Richard Shaw <hobbes1069 at gmail.com> - 0.27.4-2
-- Update to latest bugfix release, 0.27.4.
+* Sun Jan  4 2015 Richard Shaw <hobbes1069 at gmail.com> - 0.27.4-3
+- Update to latest bugfix release.
+- Change systemd dependency from network.target to network-online.target, fixes
+  BZ#3482.
+
+* Tue Nov 04 2014 Nicolas Chauvet <kwizart at gmail.com> - 0.27.4-2
+- Rebuilt for vaapi 0.36
 
 * Mon Oct 13 2014 Richard Shaw <hobbes1069 at gmail.com> - 0.27.3-2.1
 - Update to latest fixes.


More information about the rpmfusion-commits mailing list