bool XMLTVParser::parseFile( QString filename, QList<ChanInfo> *chanlist, QMap<QString, QList<ProgInfo> > *proglist) { QDomDocument doc; QFile f; if (!dash_open(f, filename, QIODevice::ReadOnly)) { VERBOSE(VB_IMPORTANT, QString("Error unable to open '%1' for reading.") .arg(filename)); return false; } QString errorMsg = "unknown"; int errorLine = 0; int errorColumn = 0; if (!doc.setContent(&f, &errorMsg, &errorLine, &errorColumn)) { VERBOSE(VB_IMPORTANT, QString("Error in %1:%2: %3") .arg(errorLine).arg(errorColumn).arg(errorMsg)); f.close(); return true; } f.close(); // now we calculate the localTimezoneOffset, so that we can fix // the programdata if needed QString config_offset = gCoreContext->GetSetting("TimeOffset", "None"); // we disable this feature by setting it invalid (> 840min = 14hr) int localTimezoneOffset = 841; if (config_offset == "Auto") { // we mark auto with the -ve of the disable magic number localTimezoneOffset = -841; } else if (config_offset != "None") { localTimezoneOffset = TimezoneToInt(config_offset); if (abs(localTimezoneOffset) > 840) { VERBOSE(VB_XMLTV, QString("Ignoring invalid TimeOffset %1") .arg(config_offset)); localTimezoneOffset = 841; } } QDomElement docElem = doc.documentElement(); QUrl baseUrl(docElem.attribute("source-data-url", "")); QUrl sourceUrl(docElem.attribute("source-info-url", "")); if (sourceUrl.toString() == "http://labs.zap2it.com/") { VERBOSE(VB_IMPORTANT, "Don't use tv_grab_na_dd, use the" "internal datadirect grabber."); exit(GENERIC_EXIT_SETUP_ERROR); } QString aggregatedTitle; QString aggregatedDesc; QString groupingTitle; QString groupingDesc; QDomNode n = docElem.firstChild(); while (!n.isNull()) { QDomElement e = n.toElement(); if (!e.isNull()) { if (e.tagName() == "channel") { ChanInfo *chinfo = parseChannel(e, baseUrl); chanlist->push_back(*chinfo); delete chinfo; } else if (e.tagName() == "programme") { ProgInfo *pginfo = parseProgram(e, localTimezoneOffset); if (pginfo->startts == pginfo->endts) { /* Not a real program : just a grouping marker */ if (!pginfo->title.isEmpty()) groupingTitle = pginfo->title + " : "; if (!pginfo->description.isEmpty()) groupingDesc = pginfo->description + " : "; } else { if (pginfo->clumpidx.isEmpty()) { if (!groupingTitle.isEmpty()) { pginfo->title.prepend(groupingTitle); groupingTitle.clear(); } if (!groupingDesc.isEmpty()) { pginfo->description.prepend(groupingDesc); groupingDesc.clear(); } (*proglist)[pginfo->channel].push_back(*pginfo); } else { /* append all titles/descriptions from one clump */ if (pginfo->clumpidx.toInt() == 0) { aggregatedTitle.clear(); aggregatedDesc.clear(); } if (!pginfo->title.isEmpty()) { if (!aggregatedTitle.isEmpty()) aggregatedTitle.append(" | "); aggregatedTitle.append(pginfo->title); } if (!pginfo->description.isEmpty()) { if (!aggregatedDesc.isEmpty()) aggregatedDesc.append(" | "); aggregatedDesc.append(pginfo->description); } if (pginfo->clumpidx.toInt() == pginfo->clumpmax.toInt() - 1) { pginfo->title = aggregatedTitle; pginfo->description = aggregatedDesc; (*proglist)[pginfo->channel].push_back(*pginfo); } } } delete pginfo; } } n = n.nextSibling(); } return true; }
bool XMLTVParser::parseFile( QString filename, ChannelInfoList *chanlist, QMap<QString, QList<ProgInfo> > *proglist) { QDomDocument doc; QFile f; if (!dash_open(f, filename, QIODevice::ReadOnly)) { LOG(VB_GENERAL, LOG_ERR, QString("Error unable to open '%1' for reading.") .arg(filename)); return false; } QString errorMsg = "unknown"; int errorLine = 0; int errorColumn = 0; if (!doc.setContent(&f, &errorMsg, &errorLine, &errorColumn)) { LOG(VB_GENERAL, LOG_ERR, QString("Error in %1:%2: %3") .arg(errorLine).arg(errorColumn).arg(errorMsg)); f.close(); return true; } f.close(); QDomElement docElem = doc.documentElement(); QUrl baseUrl(docElem.attribute("source-data-url", "")); //QUrl sourceUrl(docElem.attribute("source-info-url", "")); QString aggregatedTitle; QString aggregatedDesc; QDomNode n = docElem.firstChild(); while (!n.isNull()) { QDomElement e = n.toElement(); if (!e.isNull()) { if (e.tagName() == "channel") { ChannelInfo *chinfo = parseChannel(e, baseUrl); if (!chinfo->xmltvid.isEmpty()) chanlist->push_back(*chinfo); delete chinfo; } else if (e.tagName() == "programme") { ProgInfo *pginfo = parseProgram(e); if (pginfo->startts == pginfo->endts) { LOG(VB_GENERAL, LOG_WARNING, QString("Invalid programme (%1), " "identical start and end " "times, skipping") .arg(pginfo->title)); } else { if (pginfo->clumpidx.isEmpty()) (*proglist)[pginfo->channel].push_back(*pginfo); else { /* append all titles/descriptions from one clump */ if (pginfo->clumpidx.toInt() == 0) { aggregatedTitle.clear(); aggregatedDesc.clear(); } if (!pginfo->title.isEmpty()) { if (!aggregatedTitle.isEmpty()) aggregatedTitle.append(" | "); aggregatedTitle.append(pginfo->title); } if (!pginfo->description.isEmpty()) { if (!aggregatedDesc.isEmpty()) aggregatedDesc.append(" | "); aggregatedDesc.append(pginfo->description); } if (pginfo->clumpidx.toInt() == pginfo->clumpmax.toInt() - 1) { pginfo->title = aggregatedTitle; pginfo->description = aggregatedDesc; (*proglist)[pginfo->channel].push_back(*pginfo); } } } delete pginfo; } } n = n.nextSibling(); } return true; }