Ticket #2080: freebox-xmltvid.diff

File freebox-xmltvid.diff, 8.9 KB (added by mythtv@…, 19 years ago)

The patch

  • libs/libmythtv/freeboxchannelinfo.h

     
    77class FreeboxChannelInfo
    88{
    99  public:
    10     FreeboxChannelInfo() : m_name(QString::null), m_url(QString::null) {}
     10    FreeboxChannelInfo() :
     11        m_name(QString::null),
     12        m_url(QString::null),
     13        m_xmltvid(QString::null) {}
    1114
    12     FreeboxChannelInfo(const QString &name, const QString &url) :
    13         m_name(name), m_url(url) {}
     15    FreeboxChannelInfo(const QString &name,
     16                       const QString &url,
     17                       const QString &xmltvid) :
     18        m_name(name), m_url(url), m_xmltvid(xmltvid) {}
    1419
    1520    bool isValid(void) const
    1621    {
     
    2025  public:
    2126    QString m_name;
    2227    QString m_url;
     28    QString m_xmltvid;
    2329};
    2430
    2531typedef QMap<QString,FreeboxChannelInfo> fbox_chan_map_t;
  • libs/libmythtv/freeboxchannelfetcher.cpp

     
    1414#define LOC QString("FBChanFetch: ")
    1515#define LOC_ERR QString("FBChanFetch, Error: ")
    1616
    17 static bool parse_chan_info(
    18     const QString &line1, QString &channum, QString &name);
     17static bool parse_chan_info(const QString      &rawdata,
     18                            FreeboxChannelInfo &info,
     19                            QString            &channum,
     20                            uint               &lineNum);
     21static bool parse_extinf(const QString &data,
     22                         QString &channum, QString &name);
    1923
    2024FreeboxChannelFetcher::FreeboxChannelFetcher(unsigned _sourceid,
    2125                                             unsigned _cardid) :
     
    119123    {
    120124        QString channum = it.key();
    121125        QString name    = (*it).m_name;
     126        QString xmltvid = (*it).m_xmltvid.isEmpty() ? "" : (*it).m_xmltvid;
    122127        QString msg     = tr("Channel #%1 : %2").arg(channum).arg(name);
    123128
    124129        int chanid = ChannelUtil::GetChanID(sourceid, channum);
     
    128133            chanid = ChannelUtil::CreateChanID(sourceid, channum);
    129134            ChannelUtil::CreateChannel(
    130135                0, sourceid, chanid, name, name, channum,
    131                 0, 0, 0, false, false, false, 0);
     136                0, 0, 0, false, false, false, 0,
     137                "", "Default", xmltvid);
    132138        }
    133139        else
    134140        {
    135141            emit ServiceScanUpdateText(tr("Updating %1").arg(msg));
    136142            ChannelUtil::UpdateChannel(
    137143                0, sourceid, chanid, name, name, channum, 0, 0, 0, 0);
     144            //TODO Update the xmltvid
    138145        }
    139146
    140147        SetNumChannelsInserted(i);
     
    187194    return QString::fromUtf8(tmp);
    188195}
    189196
     197static uint EstimateNbChannels(const QString &rawdata)
     198{
     199    uint result = 0;
     200    uint numLine = 1;
     201    while (true)
     202    {
     203        QString url = rawdata.section("\n", numLine, numLine);
     204        if (url.isEmpty())
     205            return result;
     206
     207        ++numLine;
     208        if (!url.startsWith("#")) // ignore comments
     209            ++result;
     210    }
     211}
     212
    190213fbox_chan_map_t FreeboxChannelFetcher::ParsePlaylist(
    191214    const QString &rawdata, FreeboxChannelFetcher *fetcher)
    192215{
     
    206229    }
    207230
    208231    // estimate number of channels
    209     for (uint i = 1; fetcher; i += 2)
     232    if (fetcher)
    210233    {
    211         QString url = rawdata.section("\n", i+1, i+1);
    212         if (url.isEmpty())
    213         {
    214             fetcher->SetTotalNumChannels(i>>1);
    215 
    216             VERBOSE(VB_CHANNEL, "Estimating there are "<<(i>>1)
    217                     <<" channels in playlist");
    218 
    219             break;
    220         }
     234        uint nbChannels = EstimateNbChannels(rawdata);
     235        VERBOSE(VB_CHANNEL, "Estimating there are "<<nbChannels
     236                <<" channels in playlist");
     237        fetcher->SetTotalNumChannels(nbChannels);
    221238    }
    222239
    223240    // Parse each channel
    224     for (int i = 1; true; i += 2)
     241    uint lineNum = 1;
     242    uint nbParsed = 0;
     243    QString channum;
     244    FreeboxChannelInfo info;
     245    while (parse_chan_info(rawdata, info, channum, lineNum))
    225246    {
    226         QString tmp = rawdata.section("\n", i+0, i+0);
    227         QString url = rawdata.section("\n", i+1, i+1);
    228         if (tmp.isEmpty() || url.isEmpty())
    229             break;
    230 
    231         QString channum, name;
     247        ++nbParsed;
    232248        QString msg = tr("Encountered malformed channel");
    233         if (parse_chan_info(tmp, channum, name))
     249        if (!channum.isEmpty())
    234250        {
    235             chanmap[channum] = FreeboxChannelInfo(name, url);
    236 
     251            chanmap[channum] = info;
    237252            msg = tr("Parsing Channel #%1 : %2 : %3")
    238                 .arg(channum).arg(name).arg(url);
    239 
     253                .arg(channum).arg(info.m_name).arg(info.m_url);
    240254            VERBOSE(VB_CHANNEL, msg);
    241 
    242255            msg = QString::null; // don't tell fetcher
    243256        }
    244257
     
    246259        {
    247260            if (!msg.isEmpty())
    248261                fetcher->SetMessage(msg);
    249             fetcher->SetNumChannelsParsed(1+(i>>1));
     262            fetcher->SetNumChannelsParsed(nbParsed);
    250263        }
    251264    }
    252265
    253266    return chanmap;
    254267}
    255268
    256 static bool parse_chan_info(const QString &line1,
    257                             QString &channum, QString &name)
     269static bool parse_chan_info(const QString      &rawdata,
     270                            FreeboxChannelInfo &info,
     271                            QString            &channum,
     272                            uint               &lineNum)
    258273{
    259     // each line contains ://
    260     // header:extension,channelNum - channelName rtsp://channelUrl
    261     //#EXTINF:0,2 - France 2 rtsp://mafreebox.freebox.fr/freeboxtv/201
     274    // #EXTINF:0,2 - France 2                <-- duration,channum - channame
     275    // #EXTMYTHTV:xmltvid=C2.telepoche.com   <-- optional line (myth specific)
     276    // #...                                  <-- ignored comments
     277    // rtsp://mafreebox.freebox.fr/freeboxtv/201 <-- url
    262278
    263     QString msg = LOC_ERR +
    264         QString("Invalid header in channel list line \n\t\t\t%1").arg(line1);
     279    QString name;
     280    QString xmltvid;
     281    while (true)
     282    {
     283        QString line = rawdata.section("\n", lineNum, lineNum);
     284        if (line.isEmpty())
     285            return false;
    265286
    266     channum = name = QString::null;
    267 
    268     // Verify Line Header
    269     int pos = line1.find(":", 0);
    270     if ((pos < 0) || (line1.mid(0, pos) != "#EXTINF"))
    271     {
    272         VERBOSE(VB_IMPORTANT, msg);
    273         return false;
     287        ++lineNum;
     288        if (line.startsWith("#"))
     289        {
     290            if (line.startsWith("#EXTINF:"))
     291            {
     292                parse_extinf(line.mid(line.find(':')+1), channum, name);
     293            }
     294            else if (line.startsWith("#EXTMYTHTV:"))
     295            {
     296                QString data = line.mid(line.find(':')+1);
     297                if (data.startsWith("xmltvid="))
     298                {
     299                    xmltvid = data.mid(data.find('=')+1);
     300                }
     301            }
     302            else
     303            {
     304                // Just ignore other comments
     305            }
     306        }
     307        else
     308        {
     309            if (name.isEmpty())
     310                return false;
     311            QString url = line;
     312            info = FreeboxChannelInfo(name, url, xmltvid);
     313            return true;
     314        }
    274315    }
     316}
    275317
     318static bool parse_extinf(const QString &line1,
     319                         QString &channum, QString &name)
     320{
     321    // data is supposed to contain the "0,2 - France 2" part
     322    QString msg = LOC_ERR +
     323        QString("Invalid header in channel list line \n\t\t\tEXTINF:%1")
     324        .arg(line1);
     325
    276326    // Parse extension portion
    277     pos = line1.find(",", pos + 1);
     327    int pos = line1.find(",");
    278328    if (pos < 0)
    279329    {
    280330        VERBOSE(VB_IMPORTANT, msg);
    281331        return false;
    282332    }
    283     //list.push_back(line1.mid(oldPos, pos - oldPos));
    284333
    285334    // Parse freebox channel number
    286335    int oldpos = pos + 1;
  • libs/libmythtv/rtspcomms.cpp

     
    395395    while ((subsession = mit.next())) /* <- extra braces for pedantic gcc */
    396396    {
    397397        FreeboxMediaSink *sink = NULL;
    398         if (sink = dynamic_cast<FreeboxMediaSink*>(subsession->sink))
     398        if ((sink = dynamic_cast<FreeboxMediaSink*>(subsession->sink)))
    399399            sink->AddListener(item);
    400400    }
    401401    VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end 2");
     
    430430    while ((subsession = mit.next())) /* <- extra braces for pedantic gcc */
    431431    {
    432432        FreeboxMediaSink *sink = NULL;
    433         if (sink = dynamic_cast<FreeboxMediaSink*>(subsession->sink))
     433        if ((sink = dynamic_cast<FreeboxMediaSink*>(subsession->sink)))
    434434            sink->RemoveListener(item);
    435435    }
    436436    VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end 3");