+void Video::parseFmtUrlMap(const QString &fmtUrlMap, bool fromWebPage) {
+ const QString definitionName = QSettings().value("definition", "360p").toString();
+ const VideoDefinition& definition = VideoDefinition::getDefinitionFor(definitionName);
+
+ // qDebug() << "fmtUrlMap" << fmtUrlMap;
+ const QStringList formatUrls = fmtUrlMap.split(',', QString::SkipEmptyParts);
+ QHash<int, QString> urlMap;
+ foreach(const QString &formatUrl, formatUrls) {
+ // qDebug() << "formatUrl" << formatUrl;
+ const QStringList urlParams = formatUrl.split('&', QString::SkipEmptyParts);
+ // qDebug() << "urlParams" << urlParams;
+
+ int format = -1;
+ QString url;
+ QString sig;
+ foreach(const QString &urlParam, urlParams) {
+ // qWarning() << urlParam;
+ if (urlParam.startsWith("itag=")) {
+ int separator = urlParam.indexOf("=");
+ format = urlParam.mid(separator + 1).toInt();
+ } else if (urlParam.startsWith("url=")) {
+ int separator = urlParam.indexOf("=");
+ url = urlParam.mid(separator + 1);
+ url = QByteArray::fromPercentEncoding(url.toUtf8());
+ } else if (urlParam.startsWith("sig=")) {
+ int separator = urlParam.indexOf("=");
+ sig = urlParam.mid(separator + 1);
+ sig = QByteArray::fromPercentEncoding(sig.toUtf8());
+ } else if (urlParam.startsWith("s=")) {
+ if (fromWebPage || ageGate) {
+ int separator = urlParam.indexOf("=");
+ sig = urlParam.mid(separator + 1);
+ sig = QByteArray::fromPercentEncoding(sig.toUtf8());
+ if (ageGate)
+ sig = JsFunctions::instance()->decryptAgeSignature(sig);
+ else {
+ sig = decryptSignature(sig);
+ if (sig.isEmpty())
+ sig = JsFunctions::instance()->decryptSignature(sig);
+ }
+ } else {
+
+ QUrl url("http://www.youtube.com/watch");
+ {
+ QUrlQueryHelper urlHelper(url);
+ urlHelper.addQueryItem("v", videoId);
+ urlHelper.addQueryItem("gl", "US");
+ urlHelper.addQueryItem("hl", "en");
+ urlHelper.addQueryItem("has_verified", "1");
+ }
+ // qDebug() << "Loading webpage" << url;
+ QObject *reply = The::http()->get(url);
+ connect(reply, SIGNAL(data(QByteArray)), SLOT(scrapeWebPage(QByteArray)));
+ connect(reply, SIGNAL(error(QNetworkReply*)), SLOT(errorVideoInfo(QNetworkReply*)));
+ // see you in scrapWebPage(QByteArray)
+ return;
+ }
+ }
+ }
+ if (format == -1 || url.isNull()) continue;
+
+ url += "&signature=" + sig;