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
// 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;
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", "=");
.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()));
}
-*/