X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fvideo.cpp;h=d414990ddf2538be47dac24eb4d6bc678ad6cecc;hb=df8b2c951e66b538dd4d191220e883d86b700864;hp=35e837109f7fd927321dfe56d4666ab75b38de94;hpb=cf75eb2cad1aaf10db2b932c516ce7d26dad9199;p=minitube diff --git a/src/video.cpp b/src/video.cpp index 35e8371..d414990 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -76,6 +76,9 @@ void Video::getVideoInfo() { static const QStringList elTypes = QStringList() << "&el=embedded" << "&el=vevo" << "&el=detailpage" << ""; if (elIndex > elTypes.size() - 1) { + loadingStreamUrl = false; + emit errorStreamUrl("Cannot get video info"); + /* // Don't panic! We have a plan B. // get the youtube video webpage qDebug() << "Scraping" << webpage().toString(); @@ -83,6 +86,7 @@ void Video::getVideoInfo() { connect(reply, SIGNAL(data(QByteArray)), SLOT(scrapeWebPage(QByteArray))); connect(reply, SIGNAL(error(QNetworkReply*)), SLOT(errorVideoInfo(QNetworkReply*))); // see you in scrapWebPage(QByteArray) + */ return; } @@ -102,6 +106,8 @@ void Video::getVideoInfo() { void Video::gotVideoInfo(QByteArray data) { QString videoInfo = QString::fromUtf8(data); + // qDebug() << "videoInfo" << videoInfo; + // get video token QRegExp re = QRegExp("^.*&token=([^&]+).*$"); bool match = re.exactMatch(videoInfo); @@ -118,9 +124,8 @@ void Video::gotVideoInfo(QByteArray data) { // qDebug() << "videoToken" << videoToken; this->videoToken = videoToken; - /* // get fmt_url_map - re = QRegExp("^.*&fmt_url_map=([^&]+).*$"); + re = QRegExp("^.*&url_encoded_fmt_stream_map=([^&]+).*$"); match = re.exactMatch(videoInfo); // handle regexp failure if (!match || re.numCaptures() < 1) { @@ -129,32 +134,71 @@ void Video::gotVideoInfo(QByteArray data) { getVideoInfo(); return; } + QString fmtUrlMap = re.cap(1); + fmtUrlMap = QByteArray::fromPercentEncoding(fmtUrlMap.toUtf8()); - while (fmtUrlMap.contains('%')) - fmtUrlMap = QByteArray::fromPercentEncoding(fmtUrlMap.toAscii()); + QSettings settings; + QString definitionName = settings.value("definition").toString(); + int definitionCode = VideoDefinition::getDefinitionCode(definitionName); - qDebug() << "fmtUrlMap" << fmtUrlMap; + // qDebug() << "fmtUrlMap" << fmtUrlMap; QStringList formatUrls = fmtUrlMap.split(",", QString::SkipEmptyParts); + QHash urlMap; foreach(QString formatUrl, formatUrls) { - int separator = formatUrl.indexOf("|"); - if (separator == -1) continue; - int format = formatUrl.left(separator).toInt(); - QString url = formatUrl.mid(separator + 1); - qDebug() << format << url; + // qDebug() << "formatUrl" << formatUrl; + QStringList urlParams = formatUrl.split("&", QString::SkipEmptyParts); + // qDebug() << "urlParams" << urlParams; + + int format = -1; + QString url; + foreach(QString urlParam, urlParams) { + 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()); + } + } + if (format == -1 || url.isNull()) continue; + + if (format == definitionCode) { + qDebug() << "Found format" << definitionCode; + QUrl videoUrl = QUrl::fromEncoded(url.toUtf8(), QUrl::StrictMode); + m_streamUrl = videoUrl; + this->definitionCode = definitionCode; + emit gotStreamUrl(videoUrl); + loadingStreamUrl = false; + return; + } + + urlMap.insert(format, url); } - */ - QSettings settings; - QString definitionName = settings.value("definition").toString(); - int definitionCode = VideoDefinition::getDefinitionCode(definitionName); - if (definitionCode == 18) { - // This is assumed always available - foundVideoUrl(videoToken, 18); - } else { - findVideoUrl(definitionCode); + QList definitionCodes = VideoDefinition::getDefinitionCodes(); + int currentIndex = definitionCodes.indexOf(definitionCode); + int previousIndex = 0; + while (currentIndex >= 0) { + previousIndex = currentIndex - 1; + if (previousIndex < 0) previousIndex = 0; + int definitionCode = definitionCodes.at(previousIndex); + if (urlMap.contains(definitionCode)) { + qDebug() << "Found format" << definitionCode; + QString url = urlMap.value(definitionCode); + QUrl videoUrl = QUrl::fromEncoded(url.toUtf8(), QUrl::StrictMode); + m_streamUrl = videoUrl; + this->definitionCode = definitionCode; + emit gotStreamUrl(videoUrl); + loadingStreamUrl = false; + return; + } + currentIndex--; } + emit errorStreamUrl(tr("Cannot get video stream for %1").arg(m_webpage.toString())); + } void Video::foundVideoUrl(QString videoToken, int definitionCode) { @@ -165,13 +209,13 @@ void Video::foundVideoUrl(QString videoToken, int definitionCode) { ).arg(videoId, videoToken, QString::number(definitionCode))); m_streamUrl = videoUrl; - emit gotStreamUrl(videoUrl); loadingStreamUrl = false; + emit gotStreamUrl(videoUrl); } void Video::errorVideoInfo(QNetworkReply *reply) { - emit errorStreamUrl(tr("Network error: %1 for %2").arg(reply->errorString(), reply->url().toString())); loadingStreamUrl = false; + emit errorStreamUrl(tr("Network error: %1 for %2").arg(reply->errorString(), reply->url().toString())); } void Video::scrapeWebPage(QByteArray data) {