// 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;
+ 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;
QObject *reply = The::http()->get(normalizedUrl);
connect(reply, SIGNAL(data(QByteArray)), SLOT(gotVideoInfo(QByteArray)));
+ connect(reply, SIGNAL(error(QNetworkReply*)), SLOT(errorVideoInfo(QNetworkReply*)));
// 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", "=");
emit gotStreamUrl(videoUrl);
}
+
+void Video::errorVideoInfo(QNetworkReply *reply) {
+ emit errorStreamUrl(tr("Network error: %1 for %2").arg(reply->errorString(), reply->url().toString()));
+}