2 #include "networkaccess.h"
9 Video::Video() : m_thumbnailUrls(QList<QUrl>()) {
14 void Video::preloadThumbnail() {
15 if (m_thumbnailUrls.isEmpty()) return;
16 QObject *reply = The::http()->get(m_thumbnailUrls.first());
17 connect(reply, SIGNAL(data(QByteArray)), SLOT(setThumbnail(QByteArray)));
20 void Video::setThumbnail(QByteArray bytes) {
21 m_thumbnail = QImage::fromData(bytes);
25 const QImage Video::thumbnail() const {
29 bool Video::getVideoUrl() {
31 // https://develop.participatoryculture.org/trac/democracy/browser/trunk/tv/portable/flashscraper.py
33 QUrl webpage = m_webpage;\
34 // if (webpage == ) return false;
35 // qDebug() << webpage.toString();
38 // youtube-dl line 428
39 // QRegExp re("^((?:http://)?(?:\\w+\\.)?youtube\\.com/(?:(?:v/)|(?:(?:watch(?:\\.php)?)?\\?(?:.+&)?v=)))?([0-9A-Za-z_-]+)(?(1).+)?$");
40 QRegExp re("^http://www\\.youtube\\.com/watch\\?v=([0-9A-Za-z_-]+)$");
41 bool match = re.exactMatch(webpage.toString());
42 if (!match || re.numCaptures() < 1) return false;
43 QString videoId = re.cap(1);
44 // if (!videoId) return false;
45 // qDebug() << videoId;
48 QUrl normalizedUrl = QUrl(QString("http://www.youtube.com/get_video_info?video_id=")
49 .append(videoId).append("&el=embedded&ps=default&eurl="));
52 QObject *reply = The::http()->get(normalizedUrl);
53 connect(reply, SIGNAL(data(QByteArray)), SLOT(gotVideoInfo(QByteArray)));
57 QString videoInfo = The::http()->syncGetString(normalizedUrl);
58 // qDebug() << videoInfo;
59 re = QRegExp("^.*&token=([^&]+).*$");
60 match = re.exactMatch(videoInfo);
61 if (!match || re.numCaptures() < 1) return false;
62 QString videoToken = re.cap(1);
63 // FIXME proper decode
64 videoToken = videoToken.replace("%3D", "=");
65 // qDebug() << "token" << videoToken;
67 m_streamUrl = QUrl(QString("http://www.youtube.com/get_video?video_id=")
69 .append("&t=").append(videoToken)
70 .append("&eurl=&el=embedded&ps=default&fmt=18"));
72 // qDebug() << videoUrl;
77 QHttpResponseHeader headers = syncHttp->head(videoUrl);
78 qDebug() << headers.values();
79 if (headers.hasKey("Location")) {
80 videoUrl = QUrl(headers.value("Location"), QUrl::StrictMode);
81 // qDebug() << videoUrl;
90 void Video::gotVideoInfo(QByteArray data) {
91 QString videoInfo = QString::fromUtf8(data);
92 // qDebug() << videoInfo;
93 QRegExp re = QRegExp("^.*&token=([^&]+).*$");
94 bool match = re.exactMatch(videoInfo);
95 if (!match || re.numCaptures() < 1) return;
96 QString videoToken = re.cap(1);
97 // FIXME proper decode
98 videoToken = videoToken.replace("%3D", "=");
99 // qDebug() << "token" << videoToken;
101 QUrl videoUrl = QUrl(QString("http://www.youtube.com/get_video?video_id=")
103 .append("&t=").append(videoToken)
104 .append("&eurl=&el=embedded&ps=default&fmt=18"));
106 m_streamUrl = videoUrl;