QString ContentDescriptor::toString() const { QString tmp("ContentDescriptor: "); for (uint i = 0; i < Count(); i++) tmp += myth_category_type_to_string(GetMythCategory(i)) + " : " + GetDescription(i) + ", "; return tmp; }
ProgInfo *XMLTVParser::parseProgram( QDomElement &element, int localTimezoneOffset) { QString uniqueid, season, episode; int dd_progid_done = 0; ProgInfo *pginfo = new ProgInfo(); QString text = element.attribute("start", ""); fromXMLTVDate(text, pginfo->starttime, localTimezoneOffset); pginfo->startts = text; text = element.attribute("stop", ""); fromXMLTVDate(text, pginfo->endtime, localTimezoneOffset); pginfo->endts = text; text = element.attribute("channel", ""); QStringList split = text.split(" "); pginfo->channel = split[0]; text = element.attribute("clumpidx", ""); if (!text.isEmpty()) { split = text.split('/'); pginfo->clumpidx = split[0]; pginfo->clumpmax = split[1]; } for (QDomNode child = element.firstChild(); !child.isNull(); child = child.nextSibling()) { QDomElement info = child.toElement(); if (!info.isNull()) { if (info.tagName() == "title") { if (isJapan) { if (info.attribute("lang") == "ja_JP") { pginfo->title = getFirstText(info); } else if (info.attribute("lang") == "ja_JP@kana") { pginfo->title_pronounce = getFirstText(info); } } else if (pginfo->title.isEmpty()) { pginfo->title = getFirstText(info); } } else if (info.tagName() == "sub-title" && pginfo->subtitle.isEmpty()) { pginfo->subtitle = getFirstText(info); } else if (info.tagName() == "desc" && pginfo->description.isEmpty()) { pginfo->description = getFirstText(info); } else if (info.tagName() == "category") { const QString cat = getFirstText(info).toLower(); if (kCategoryNone == pginfo->categoryType && string_to_myth_category_type(cat) != kCategoryNone) { pginfo->categoryType = string_to_myth_category_type(cat); } else if (pginfo->category.isEmpty()) { pginfo->category = cat; } if (cat == "film") { // Hack for tv_grab_uk_rt pginfo->categoryType = kCategoryMovie; } } else if (info.tagName() == "date" && !pginfo->airdate) { // Movie production year QString date = getFirstText(info); pginfo->airdate = date.left(4).toUInt(); } else if (info.tagName() == "star-rating" && pginfo->stars.isEmpty()) { QDomNodeList values = info.elementsByTagName("value"); QDomElement item; QString stars, num, den; float rating = 0.0; // Use the first rating to appear in the xml, this should be // the most important one. // // Averaging is not a good idea here, any subsequent ratings // are likely to represent that days recommended programmes // which on a bad night could given to an average programme. // 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!' 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(); } pginfo->stars.setNum(rating); } else if (info.tagName() == "rating") { // again, the structure of ratings seems poorly represented // in the XML. no idea what we'd do with multiple values. QDomNodeList values = info.elementsByTagName("value"); QDomElement item = values.item(0).toElement(); if (item.isNull()) continue; EventRating rating; rating.system = info.attribute("system", ""); rating.rating = getFirstText(item); pginfo->ratings.append(rating); } else if (info.tagName() == "previously-shown") { pginfo->previouslyshown = true; QString prevdate = info.attribute("start"); if (!prevdate.isEmpty()) { QDateTime date; fromXMLTVDate(prevdate, date, localTimezoneOffset); pginfo->originalairdate = date.date(); } } else if (info.tagName() == "credits") { parseCredits(info, pginfo); } else if (info.tagName() == "subtitles") { if (info.attribute("type") == "teletext") pginfo->subtitleType |= SUB_NORMAL; else if (info.attribute("type") == "onscreen") pginfo->subtitleType |= SUB_ONSCREEN; else if (info.attribute("type") == "deaf-signed") pginfo->subtitleType |= SUB_SIGNED; } else if (info.tagName() == "audio") { parseAudio(info, pginfo); } else if (info.tagName() == "video") { parseVideo(info, pginfo); } else if (info.tagName() == "episode-num") { if (info.attribute("system") == "dd_progid") { QString episodenum(getFirstText(info)); // if this field includes a dot, strip it out int idx = episodenum.indexOf('.'); if (idx != -1) episodenum.remove(idx, 1); pginfo->programId = episodenum; dd_progid_done = 1; } else if (info.attribute("system") == "xmltv_ns") { int tmp; QString episodenum(getFirstText(info)); episode = episodenum.section('.',1,1); episode = episode.section('/',0,0).trimmed(); season = episodenum.section('.',0,0).trimmed(); QString part(episodenum.section('.',2,2)); QString partnumber(part.section('/',0,0).trimmed()); QString parttotal(part.section('/',1,1).trimmed()); pginfo->categoryType = kCategorySeries; if (!episode.isEmpty()) { tmp = episode.toInt() + 1; episode = QString::number(tmp); pginfo->syndicatedepisodenumber = QString('E' + episode); } if (!season.isEmpty()) { tmp = season.toInt() + 1; season = QString::number(tmp); pginfo->syndicatedepisodenumber.append(QString('S' + season)); } uint partno = 0; if (!partnumber.isEmpty()) { bool ok; partno = partnumber.toUInt(&ok) + 1; partno = (ok) ? partno : 0; } if (!parttotal.isEmpty() && partno > 0) { bool ok; uint partto = parttotal.toUInt(&ok) + 1; if (ok && partnumber <= parttotal) { pginfo->parttotal = partto; pginfo->partnumber = partno; } } } else if (info.attribute("system") == "onscreen" && pginfo->subtitle.isEmpty()) { pginfo->categoryType = kCategorySeries; pginfo->subtitle = getFirstText(info); } } } } if (pginfo->category.isEmpty() && pginfo->categoryType != kCategoryNone) pginfo->category = myth_category_type_to_string(pginfo->categoryType); if (!pginfo->airdate) pginfo->airdate = current_year; /* Let's build ourself a programid */ QString programid; if (kCategoryMovie == pginfo->categoryType) programid = "MV"; else if (kCategorySeries == pginfo->categoryType) programid = "EP"; else if (kCategorySports == pginfo->categoryType) programid = "SP"; else programid = "SH"; if (!uniqueid.isEmpty()) // we already have a unique id ready for use programid.append(uniqueid); else { QString seriesid = QString::number(ELFHash(pginfo->title.toLocal8Bit() .constData())); pginfo->seriesId = seriesid; programid.append(seriesid); if (!episode.isEmpty() && !season.isEmpty()) { /* Append unpadded episode and season number to the seriesid (to maintain consistency with historical encoding), but limit the season number representation to a single base-36 character to ensure unique programid generation. */ int season_int = season.toInt(); if (season_int > 35) { // Cannot represent season as a single base-36 character, so // remove the programid and fall back to normal dup matching. if (kCategoryMovie != pginfo->categoryType) programid.clear(); } else { programid.append(episode); programid.append(QString::number(season_int, 36)); if (pginfo->partnumber && pginfo->parttotal) { programid += QString::number(pginfo->partnumber); programid += QString::number(pginfo->parttotal); } } } else { /* No ep/season info? Well then remove the programid and rely on normal dupchecking methods instead. */ if (kCategoryMovie != pginfo->categoryType) programid.clear(); } } if (dd_progid_done == 0) pginfo->programId = programid; return pginfo; }