X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fvideo.cpp;h=c4c3575955c077264ca9ac99e0679c0684095ba0;hb=0817201dd8aa205f3532c3d850e63786b728e649;hp=96bb81f515bb12f66fb86d7cdce457b0c7190cb6;hpb=5292732687187d91db89a2220b190f9e6b8024c8;p=minitube diff --git a/src/video.cpp b/src/video.cpp index 96bb81f..c4c3575 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -26,12 +26,11 @@ const QImage Video::thumbnail() const { return m_thumbnail; } -bool Video::getVideoUrl() { +void Video::scrapeStreamUrl() { // https://develop.participatoryculture.org/trac/democracy/browser/trunk/tv/portable/flashscraper.py - QUrl webpage = m_webpage;\ - // if (webpage == ) return false; + QUrl webpage = m_webpage; // qDebug() << webpage.toString(); // Get Video ID @@ -39,8 +38,11 @@ bool Video::getVideoUrl() { // QRegExp re("^((?:http://)?(?:\\w+\\.)?youtube\\.com/(?:(?:v/)|(?:(?:watch(?:\\.php)?)?\\?(?:.+&)?v=)))?([0-9A-Za-z_-]+)(?(1).+)?$"); QRegExp re("^http://www\\.youtube\\.com/watch\\?v=([0-9A-Za-z_-]+)$"); bool match = re.exactMatch(webpage.toString()); - if (!match || re.numCaptures() < 1) return false; - QString videoId = re.cap(1); + if (!match || re.numCaptures() < 1) { + emit errorStreamUrl(QString("Cannot get video id for %1").arg(webpage.toString())); + return; + } + videoId = re.cap(1); // if (!videoId) return false; // qDebug() << videoId; @@ -48,51 +50,39 @@ bool Video::getVideoUrl() { QUrl normalizedUrl = QUrl(QString("http://www.youtube.com/get_video_info?video_id=") .append(videoId).append("&el=embedded&ps=default&eurl=")); - /* QObject *reply = The::http()->get(normalizedUrl); connect(reply, SIGNAL(data(QByteArray)), SLOT(gotVideoInfo(QByteArray))); - return true; - */ - - QString videoInfo = The::http()->syncGetString(normalizedUrl); - // qDebug() << videoInfo; - re = QRegExp("^.*&token=([^&]+).*$"); - match = re.exactMatch(videoInfo); - if (!match || re.numCaptures() < 1) return false; - QString videoToken = re.cap(1); - // FIXME proper decode - videoToken = videoToken.replace("%3D", "="); - // qDebug() << "token" << videoToken; - - m_streamUrl = QUrl(QString("http://www.youtube.com/get_video?video_id=") - .append(videoId) - .append("&t=").append(videoToken) - .append("&eurl=&el=embedded&ps=default&fmt=18")); - - // qDebug() << videoUrl; + connect(reply, SIGNAL(error(QNetworkReply*)), SLOT(errorVideoInfo(QNetworkReply*))); - // follow redirects - /* - while (true) { - QHttpResponseHeader headers = syncHttp->head(videoUrl); - qDebug() << headers.values(); - if (headers.hasKey("Location")) { - videoUrl = QUrl(headers.value("Location"), QUrl::StrictMode); - // qDebug() << videoUrl; - } else break; - }*/ - - return true; + // see you in gotVideoInfo... } - -/* void Video::gotVideoInfo(QByteArray data) { QString videoInfo = QString::fromUtf8(data); - // qDebug() << videoInfo; + QRegExp re = QRegExp("^.*&token=([^&]+).*$"); bool match = re.exactMatch(videoInfo); - if (!match || re.numCaptures() < 1) return; + + // on regexp failure, stop and report error + if (!match || re.numCaptures() < 1) { + qDebug() << videoInfo; + re = QRegExp("^.*&reason=([^&]+).*$"); + match = re.exactMatch(videoInfo); + if (match) { + // report the error in the status bar + QMainWindow* mainWindow = dynamic_cast(qApp->topLevelWidgets().first()); + QString errorMessage = QUrl::fromEncoded(re.cap(1).toUtf8()).toString().replace("+", " "); + int indexOfTag = errorMessage.indexOf("<"); + if (indexOfTag != -1) { + errorMessage = errorMessage.left(indexOfTag); + } + if (mainWindow) mainWindow->statusBar()->showMessage(errorMessage); + emit errorStreamUrl(errorMessage); + } else + emit errorStreamUrl("Error parsing video info"); + return; + } + QString videoToken = re.cap(1); // FIXME proper decode videoToken = videoToken.replace("%3D", "="); @@ -104,5 +94,10 @@ void Video::gotVideoInfo(QByteArray data) { .append("&eurl=&el=embedded&ps=default&fmt=18")); m_streamUrl = videoUrl; + + emit gotStreamUrl(videoUrl); +} + +void Video::errorVideoInfo(QNetworkReply *reply) { + emit errorStreamUrl(tr("Network error: %1 for %2").arg(reply->errorString(), reply->url().toString())); } -*/