Ticket #2080: freebox-xmltvid.diff
File freebox-xmltvid.diff, 8.9 KB (added by , 19 years ago) |
---|
-
libs/libmythtv/freeboxchannelinfo.h
7 7 class FreeboxChannelInfo 8 8 { 9 9 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) {} 11 14 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) {} 14 19 15 20 bool isValid(void) const 16 21 { … … 20 25 public: 21 26 QString m_name; 22 27 QString m_url; 28 QString m_xmltvid; 23 29 }; 24 30 25 31 typedef QMap<QString,FreeboxChannelInfo> fbox_chan_map_t; -
libs/libmythtv/freeboxchannelfetcher.cpp
14 14 #define LOC QString("FBChanFetch: ") 15 15 #define LOC_ERR QString("FBChanFetch, Error: ") 16 16 17 static bool parse_chan_info( 18 const QString &line1, QString &channum, QString &name); 17 static bool parse_chan_info(const QString &rawdata, 18 FreeboxChannelInfo &info, 19 QString &channum, 20 uint &lineNum); 21 static bool parse_extinf(const QString &data, 22 QString &channum, QString &name); 19 23 20 24 FreeboxChannelFetcher::FreeboxChannelFetcher(unsigned _sourceid, 21 25 unsigned _cardid) : … … 119 123 { 120 124 QString channum = it.key(); 121 125 QString name = (*it).m_name; 126 QString xmltvid = (*it).m_xmltvid.isEmpty() ? "" : (*it).m_xmltvid; 122 127 QString msg = tr("Channel #%1 : %2").arg(channum).arg(name); 123 128 124 129 int chanid = ChannelUtil::GetChanID(sourceid, channum); … … 128 133 chanid = ChannelUtil::CreateChanID(sourceid, channum); 129 134 ChannelUtil::CreateChannel( 130 135 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); 132 138 } 133 139 else 134 140 { 135 141 emit ServiceScanUpdateText(tr("Updating %1").arg(msg)); 136 142 ChannelUtil::UpdateChannel( 137 143 0, sourceid, chanid, name, name, channum, 0, 0, 0, 0); 144 //TODO Update the xmltvid 138 145 } 139 146 140 147 SetNumChannelsInserted(i); … … 187 194 return QString::fromUtf8(tmp); 188 195 } 189 196 197 static 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 190 213 fbox_chan_map_t FreeboxChannelFetcher::ParsePlaylist( 191 214 const QString &rawdata, FreeboxChannelFetcher *fetcher) 192 215 { … … 206 229 } 207 230 208 231 // estimate number of channels 209 for (uint i = 1; fetcher; i += 2)232 if (fetcher) 210 233 { 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); 221 238 } 222 239 223 240 // 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)) 225 246 { 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; 232 248 QString msg = tr("Encountered malformed channel"); 233 if ( parse_chan_info(tmp, channum, name))249 if (!channum.isEmpty()) 234 250 { 235 chanmap[channum] = FreeboxChannelInfo(name, url); 236 251 chanmap[channum] = info; 237 252 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); 240 254 VERBOSE(VB_CHANNEL, msg); 241 242 255 msg = QString::null; // don't tell fetcher 243 256 } 244 257 … … 246 259 { 247 260 if (!msg.isEmpty()) 248 261 fetcher->SetMessage(msg); 249 fetcher->SetNumChannelsParsed( 1+(i>>1));262 fetcher->SetNumChannelsParsed(nbParsed); 250 263 } 251 264 } 252 265 253 266 return chanmap; 254 267 } 255 268 256 static bool parse_chan_info(const QString &line1, 257 QString &channum, QString &name) 269 static bool parse_chan_info(const QString &rawdata, 270 FreeboxChannelInfo &info, 271 QString &channum, 272 uint &lineNum) 258 273 { 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 262 278 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; 265 286 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 } 274 315 } 316 } 275 317 318 static 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 276 326 // Parse extension portion 277 pos = line1.find(",", pos + 1);327 int pos = line1.find(","); 278 328 if (pos < 0) 279 329 { 280 330 VERBOSE(VB_IMPORTANT, msg); 281 331 return false; 282 332 } 283 //list.push_back(line1.mid(oldPos, pos - oldPos));284 333 285 334 // Parse freebox channel number 286 335 int oldpos = pos + 1; -
libs/libmythtv/rtspcomms.cpp
395 395 while ((subsession = mit.next())) /* <- extra braces for pedantic gcc */ 396 396 { 397 397 FreeboxMediaSink *sink = NULL; 398 if ( sink = dynamic_cast<FreeboxMediaSink*>(subsession->sink))398 if ((sink = dynamic_cast<FreeboxMediaSink*>(subsession->sink))) 399 399 sink->AddListener(item); 400 400 } 401 401 VERBOSE(VB_RECORD, LOC + "AddListener("<<item<<") -- end 2"); … … 430 430 while ((subsession = mit.next())) /* <- extra braces for pedantic gcc */ 431 431 { 432 432 FreeboxMediaSink *sink = NULL; 433 if ( sink = dynamic_cast<FreeboxMediaSink*>(subsession->sink))433 if ((sink = dynamic_cast<FreeboxMediaSink*>(subsession->sink))) 434 434 sink->RemoveListener(item); 435 435 } 436 436 VERBOSE(VB_RECORD, LOC + "RemoveListener("<<item<<") -- end 3");