]> git.sur5r.net Git - minitube/blobdiff - src/video.cpp
Fixed pause action status tip
[minitube] / src / video.cpp
index 96bb81f515bb12f66fb86d7cdce457b0c7190cb6..c4c3575955c077264ca9ac99e0679c0684095ba0 100644 (file)
@@ -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<QMainWindow*>(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()));
 }
-*/