]> git.sur5r.net Git - minitube/blob - src/video.cpp
96bb81f515bb12f66fb86d7cdce457b0c7190cb6
[minitube] / src / video.cpp
1 #include "video.h"
2 #include "networkaccess.h"
3 #include <QtNetwork>
4
5 namespace The {
6     NetworkAccess* http();
7 }
8
9 Video::Video() : m_thumbnailUrls(QList<QUrl>()) {
10     m_duration = 0;
11     m_viewCount = -1;
12 }
13
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)));
18 }
19
20 void Video::setThumbnail(QByteArray bytes) {
21     m_thumbnail = QImage::fromData(bytes);
22     emit gotThumbnail();
23 }
24
25 const QImage Video::thumbnail() const {
26     return m_thumbnail;
27 }
28
29 bool Video::getVideoUrl() {
30
31     // https://develop.participatoryculture.org/trac/democracy/browser/trunk/tv/portable/flashscraper.py
32
33     QUrl webpage = m_webpage;\
34     // if (webpage == ) return false;
35     // qDebug() << webpage.toString();
36
37     // Get Video ID
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;
46
47     // Get Video Token
48     QUrl normalizedUrl = QUrl(QString("http://www.youtube.com/get_video_info?video_id=")
49                               .append(videoId).append("&el=embedded&ps=default&eurl="));
50
51     /*
52     QObject *reply = The::http()->get(normalizedUrl);
53     connect(reply, SIGNAL(data(QByteArray)), SLOT(gotVideoInfo(QByteArray)));
54     return true;
55     */
56
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;
66
67     m_streamUrl = QUrl(QString("http://www.youtube.com/get_video?video_id=")
68                          .append(videoId)
69                          .append("&t=").append(videoToken)
70                          .append("&eurl=&el=embedded&ps=default&fmt=18"));
71
72     // qDebug() << videoUrl;
73
74     // follow redirects
75     /*
76     while (true) {
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;
82         } else break;
83     }*/
84
85     return true;
86 }
87
88
89 /*
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;
100
101     QUrl videoUrl = QUrl(QString("http://www.youtube.com/get_video?video_id=")
102                          .append(videoId)
103                          .append("&t=").append(videoToken)
104                          .append("&eurl=&el=embedded&ps=default&fmt=18"));
105
106     m_streamUrl = videoUrl;
107 }
108 */