string TgTypeParser::parseMessage(const Message::Ptr& object) const { if (!object) { return ""; } string result; result += '{'; appendToJson(result, "message_id", object->messageId); appendToJson(result, "from", parseUser(object->from)); appendToJson(result, "date", object->date); appendToJson(result, "chat", parseChat(object->chat)); appendToJson(result, "forward_from", parseUser(object->forwardFrom)); appendToJson(result, "forward_date", object->forwardDate); appendToJson(result, "reply_to_message", parseMessage(object->replyToMessage)); appendToJson(result, "text", object->text); appendToJson(result, "audio", parseAudio(object->audio)); appendToJson(result, "document", parseDocument(object->document)); appendToJson(result, "photo", parseArray(&TgTypeParser::parsePhotoSize, object->photo)); appendToJson(result, "sticker", parseSticker(object->sticker)); appendToJson(result, "video", parseVideo(object->video)); appendToJson(result, "contact", parseContact(object->contact)); appendToJson(result, "location", parseLocation(object->location)); appendToJson(result, "new_chat_participant", parseUser(object->newChatParticipant)); appendToJson(result, "left_chat_participant", parseUser(object->leftChatParticipant)); appendToJson(result, "new_chat_title", object->newChatTitle); appendToJson(result, "new_chat_photo", parseArray(&TgTypeParser::parsePhotoSize, object->newChatPhoto)); appendToJson(result, "delete_chat_photo", object->deleteChatPhoto); appendToJson(result, "group_chat_created", object->groupChatCreated); appendToJson(result, "caption", object->caption); result.erase(result.length() - 1); result += '}'; return result; }
void video::handleDownloads() { switch (this->_step) { case 1: { handler->downloads.at(0)->tempFile->close(); handler->downloads.at(0)->tempFile->open(); QByteArray data = handler->downloads.at(0)->tempFile->readAll(); handler->downloads.at(0)->tempFile->close(); QString html = QString::fromUtf8(data, data.size()); handler->clearDownloads(); parseVideo(html); break; } case 3: { if (handler->downloads.size() == 1) { this->downloadFile = handler->downloads.at(0)->tempFile; emit downloadFinished(); } else { this->_step = 4; converter_ffmpeg* ffmpeg = new converter_ffmpeg; QList<QFile*> files; for (int i=0; i < handler->downloads.size(); i++) { files << handler->downloads.at(i)->tempFile; } this->_progressBar->setMinimum(0); this->_progressBar->setMaximum(0); for (int i = 0; i <= 3; i++) { this->_treeItem->setToolTip(i, "<strong>" + tr("Converting ...") + "</strong>"); } this->downloadFile = new QTemporaryFile(QDir::tempPath() + "/clipgrab-concat--XXXXXX"); this->downloadFile->open(QIODevice::ReadOnly); this->downloadFile->close(); qDebug() << this->downloadFile; connect(ffmpeg, SIGNAL(conversionFinished()), this, SLOT(handleDownloads())); ffmpeg->concatenate(files, this->downloadFile); } break; } case 4: { emit downloadFinished(); break; } } }
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; }
ProgInfo *XMLTVParser::parseProgram( QDomElement &element, int localTimezoneOffset) { QString uniqueid, seriesid, season, episode; int dd_progid_done = 0; ProgInfo *pginfo = new ProgInfo; pginfo->previouslyshown = false; pginfo->subtitletype = pginfo->videoproperties = pginfo->audioproperties = 0; pginfo->subtitle = pginfo->title = pginfo->desc = pginfo->category = pginfo->content = pginfo->catType = pginfo->syndicatedepisodenumber = pginfo->partnumber = pginfo->parttotal = pginfo->showtype = pginfo->colorcode = pginfo->stars = ""; pginfo->originalairdate = "0000-00-00"; QString text = element.attribute("start", ""); fromXMLTVDate(text, pginfo->start, localTimezoneOffset); pginfo->startts = text; text = element.attribute("stop", ""); fromXMLTVDate(text, pginfo->end, localTimezoneOffset); pginfo->endts = text; text = element.attribute("channel", ""); QStringList split = QStringList::split(" ", text); pginfo->channel = split[0]; text = element.attribute("clumpidx", ""); if (!text.isEmpty()) { split = QStringList::split("/", text); 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 == "") { pginfo->title = getFirstText(info); } } else if (info.tagName() == "sub-title" && pginfo->subtitle == "") { pginfo->subtitle = getFirstText(info); } else if (info.tagName() == "content") { pginfo->content = getFirstText(info); } else if (info.tagName() == "desc" && pginfo->desc == "") { pginfo->desc = getFirstText(info); } else if (info.tagName() == "category") { const QString cat = getFirstText(info); const QString lcat = cat.lower(); if (lcat == "movie" || lcat == "series" || lcat == "sports" || lcat == "tvshow") { if (pginfo->catType.isEmpty()) pginfo->catType = lcat; } else if (pginfo->category.isEmpty()) { pginfo->category = cat; } if (lcat == "film") { // Hack for tv_grab_uk_rt pginfo->catType = "movie"; } } else if (info.tagName() == "date" && pginfo->airdate == "") { // Movie production year QString date = getFirstText(info); pginfo->airdate = date.left(4); } else if (info.tagName() == "star-rating") { QDomNodeList values = info.elementsByTagName("value"); QDomElement item; QString stars, num, den; float avg = 0.0; // not sure why the XML suggests multiple ratings, // but the following will average them anyway. for (unsigned int i = 0; i < values.length(); i++) { item = values.item(i).toElement(); if (item.isNull()) continue; stars = getFirstText(item); num = stars.section('/', 0, 0); den = stars.section('/', 1, 1); if (0.0 >= den.toFloat()) continue; avg *= i/(i+1); avg += (num.toFloat()/den.toFloat()) / (i+1); } pginfo->stars.setNum(avg); } 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; ProgRating rating; rating.system = info.attribute("system", ""); rating.rating = getFirstText(item); if ("" != rating.system) pginfo->ratings.append(rating); } else if (info.tagName() == "previously-shown") { pginfo->previouslyshown = true; QString prevdate = info.attribute("start"); pginfo->originalairdate = prevdate; } else if (info.tagName() == "credits") { parseCredits(info, pginfo); } else if (info.tagName() == "subtitles" && info.attribute("type") == "teletext") { pginfo->subtitletype |= SUB_NORMAL; } else if (info.tagName() == "subtitles" && info.attribute("type") == "onscreen") { pginfo->subtitletype |= SUB_ONSCREEN; } else if (info.tagName() == "subtitles" && 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" && info.attribute("system") == "dd_progid") { QString episodenum(getFirstText(info)); // if this field includes a dot, strip it out int idx = episodenum.find('.'); if (idx != -1) episodenum.remove(idx, 1); pginfo->programid = episodenum; dd_progid_done = 1; } else if (info.tagName() == "episode-num" && info.attribute("system") == "xmltv_ns") { int tmp; QString episodenum(getFirstText(info)); episode = episodenum.section('.',1,1); episode = episode.section('/',0,0).stripWhiteSpace(); season = episodenum.section('.',0,0).stripWhiteSpace(); QString part(episodenum.section('.',2,2)); QString partnumber(part.section('/',0,0).stripWhiteSpace()); QString parttotal(part.section('/',1,1).stripWhiteSpace()); pginfo->catType = "series"; 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)); } if (!partnumber.isEmpty()) { tmp = partnumber.toInt() + 1; partnumber = QString::number(tmp); } if (partnumber != 0 && parttotal >= partnumber && !parttotal.isEmpty()) { pginfo->parttotal = parttotal; pginfo->partnumber = partnumber; } } else if (info.tagName() == "episode-num" && info.attribute("system") == "onscreen" && pginfo->subtitle.isEmpty()) { pginfo->catType = "series"; pginfo->subtitle = getFirstText(info); } } } if (pginfo->category.isEmpty() && !pginfo->catType.isEmpty()) pginfo->category = pginfo->catType; /* Hack for teveblad grabber to do something with the content tag*/ if (pginfo->content != "") { if (pginfo->category == "film") { pginfo->subtitle = pginfo->desc; pginfo->desc = pginfo->content; } else if (pginfo->desc != "") { pginfo->desc = pginfo->desc + " - " + pginfo->content; } else if (pginfo->desc == "") { pginfo->desc = pginfo->content; } } if (pginfo->airdate.isEmpty()) pginfo->airdate = QDate::currentDate().toString("yyyy"); /* Let's build ourself a programid */ QString programid; if (pginfo->catType == "movie") programid = "MV"; else if (pginfo->catType == "series") programid = "EP"; else if (pginfo->catType == "sports") programid = "SP"; else programid = "SH"; if (!uniqueid.isEmpty()) // we already have a unique id ready for use programid.append(uniqueid); else { if (seriesid.isEmpty()) //need to hash ourself a seriesid from the title { seriesid = QString::number(ELFHash(pginfo->title)); } pginfo->seriesid = seriesid; programid.append(seriesid); if (!episode.isEmpty() && !season.isEmpty()) { programid.append(episode); programid.append(season); if (!pginfo->partnumber.isEmpty() && !pginfo->parttotal.isEmpty()) { programid.append(pginfo->partnumber); programid.append(pginfo->parttotal); } } else { /* No ep/season info? Well then remove the programid and rely on normal dupchecking methods instead. */ if (pginfo->catType != "movie") programid = ""; } } if (dd_progid_done == 0) pginfo->programid = programid; return pginfo; }