From 241621e6798320489109473d9fdfafc72487c82c Mon Sep 17 00:00:00 2001
From: Karl Dietz <dekarl@mythtv.org>
Date: Thu, 9 Jan 2014 20:45:02 +0100
Subject: [PATCH 2/2] extend IPTV recorder to handle MTPS input
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

By parsing VLC style program_number from the playlist the recorder
can select a specific program from the stream. The program_number
is also known as the service_id in DVB vocabulary.

Example playlist:

    #EXTM3U
    #EXTINF:0,1 - name of the program
    #EXTVLCOPT:program=61200
    http://192.168.1.100:8001/1:0:19:EF10:421:1:C00000:0:0:0:

Original patch by Torbjörn Jansson
Refs #11487
---
 .../libmythtv/channelscan/iptvchannelfetcher.cpp   |   13 ++++++++++---
 .../libmythtv/channelscan/iptvchannelfetcher.h     |    6 ++++--
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/mythtv/libs/libmythtv/channelscan/iptvchannelfetcher.cpp b/mythtv/libs/libmythtv/channelscan/iptvchannelfetcher.cpp
index d09a713..5f32f6c 100644
--- a/mythtv/libs/libmythtv/channelscan/iptvchannelfetcher.cpp
+++ b/mythtv/libs/libmythtv/channelscan/iptvchannelfetcher.cpp
@@ -140,6 +140,7 @@ void IPTVChannelFetcher::run(void)
         QString channum = it.key();
         QString name    = (*it).m_name;
         QString xmltvid = (*it).m_xmltvid.isEmpty() ? "" : (*it).m_xmltvid;
+        uint programnumber = (*it).m_programnumber;
         //: %1 is the channel number, %2 is the channel name
         QString msg = tr("Channel #%1 : %2").arg(channum).arg(name);
 
@@ -157,7 +158,7 @@ void IPTVChannelFetcher::run(void)
             chanid = ChannelUtil::CreateChanID(_sourceid, channum);
             ChannelUtil::CreateChannel(
                 0, _sourceid, chanid, name, name, channum,
-                0, 0, 0, false, false, false, QString::null,
+                programnumber, 0, 0, false, false, false, QString::null,
                 QString::null, "Default", xmltvid);
             ChannelUtil::CreateIPTVTuningData(chanid, (*it).m_tuning);
         }
@@ -170,7 +171,7 @@ void IPTVChannelFetcher::run(void)
             }
             ChannelUtil::UpdateChannel(
                 0, _sourceid, chanid, name, name, channum,
-                0, 0, 0, false, false, false, QString::null,
+                programnumber, 0, 0, false, false, false, QString::null,
                 QString::null, "Default", xmltvid);
             ChannelUtil::UpdateIPTVTuningData(chanid, (*it).m_tuning);
         }
@@ -350,6 +351,7 @@ static bool parse_chan_info(const QString   &rawdata,
     // #EXTMYTHTV:fecurl1=URL                <-- optional line (myth specific)
     // #EXTMYTHTV:fecbitrate0=BITRATE        <-- optional line (myth specific)
     // #EXTMYTHTV:fecbitrate1=BITRATE        <-- optional line (myth specific)
+    // #EXTVLCOPT:program=program_number     <-- optional line (used by MythTV and VLC)
     // #...                                  <-- ignored comments
     // rtsp://maiptv.iptv.fr/iptvtv/201 <-- url
 
@@ -376,6 +378,10 @@ static bool parse_chan_info(const QString   &rawdata,
                 if (!key.isEmpty())
                     values[key] = data.mid(data.indexOf('=')+1);
             }
+            else if (line.startsWith("#EXTVLCOPT:program="))
+            {
+                values["programnumber"] = line.mid(line.indexOf('=')+1);
+            }
             continue;
         }
 
@@ -394,7 +400,8 @@ static bool parse_chan_info(const QString   &rawdata,
             line, values["bitrate"].toUInt(),
             values["fectype"],
             values["fecurl0"], values["fecbitrate0"].toUInt(),
-            values["fecurl1"], values["fecbitrate1"].toUInt());
+            values["fecurl1"], values["fecbitrate1"].toUInt(),
+            values["programnumber"].toUInt());
         return true;
     }
 }
diff --git a/mythtv/libs/libmythtv/channelscan/iptvchannelfetcher.h b/mythtv/libs/libmythtv/channelscan/iptvchannelfetcher.h
index 030da62..af728b5 100644
--- a/mythtv/libs/libmythtv/channelscan/iptvchannelfetcher.h
+++ b/mythtv/libs/libmythtv/channelscan/iptvchannelfetcher.h
@@ -35,8 +35,9 @@ class IPTVChannelInfo
                     const QString &fec_url0,
                     uint fec_bitrate0,
                     const QString &fec_url1,
-                    uint fec_bitrate1) :
-        m_name(name), m_xmltvid(xmltvid),
+                    uint fec_bitrate1,
+                    uint programnumber) :
+        m_name(name), m_xmltvid(xmltvid), m_programnumber(programnumber),
         m_tuning(data_url, data_bitrate,
                  fec_type, fec_url0, fec_bitrate0, fec_url1, fec_bitrate1)
     {
@@ -50,6 +51,7 @@ class IPTVChannelInfo
   public:
     QString m_name;
     QString m_xmltvid;
+    uint m_programnumber;
     IPTVTuningData m_tuning;
 };
 typedef QMap<QString,IPTVChannelInfo> fbox_chan_map_t;
-- 
1.7.9.5

