Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* ==================================================================== */
- /* === Thanks to Stuart Howarth aka marxian for the code used here! === */
- void YoutubeLinkHandler::getVideoUrl(const QString &videoId) {
- qDebug() << videoId;
- QString playerUrl = "http://www.youtube.com/get_video_info?&video_id=" + videoId + "&el=detailpage&ps=default&eurl=&gl=US&hl=en";
- QNetworkAccessManager *manager = new QNetworkAccessManager(this);
- QNetworkRequest request;
- request.setUrl(QUrl(playerUrl));
- connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(parseVideoPage(QNetworkReply*)));
- manager->get(request);
- }
- void YoutubeLinkHandler::parseVideoPage(QNetworkReply *reply) {
- QNetworkAccessManager *manager = qobject_cast<QNetworkAccessManager*>(sender());
- m_cookiesList.clear();
- m_cookiesList = manager->cookieJar()->cookiesForUrl(reply->request().url());
- QMap<int, QByteArray> formats;
- QByteArray response = QByteArray::fromPercentEncoding(reply->readAll());
- qDebug() << response;
- int pos = response.indexOf("fmt_url_map=") + 12;
- int pos2 = response.indexOf("&allow_ratings", pos);
- int pos3 = response.indexOf("&leanback", pos);
- if ((pos3 > 0) && (pos3 < pos2)) {
- pos2 = pos3;
- }
- response = response.mid(pos, pos2 - pos);
- QList<QByteArray> parts = response.split('|');
- int key = parts.first().toInt();
- for (int i = 1; i < parts.length(); i++) {
- QByteArray part = parts[i];
- QList<QByteArray> keyAndValue = part.split(',');
- QByteArray url = keyAndValue.first().replace("%2C", ",");
- formats[key] = url;
- key = keyAndValue.last().toInt();
- }
- QList<int> flist;
- flist << 22 << 35 << 34 << 18 << 5;
- QByteArray videoUrl;
- int index = flist.indexOf(18);
- while ((videoUrl.isEmpty()) && index < flist.size()) {
- videoUrl = formats.value(flist.at(index), "");
- index++;
- }
- if (videoUrl.isEmpty())
- index = flist.indexOf(5);
- while ((videoUrl.isEmpty()) && index < flist.size()) {
- videoUrl = formats.value(flist.at(index), "");
- index++;
- }
- if (videoUrl.isEmpty()) {
- qDebug() << tr("Error: Unable to retrieve video");
- emit videoUrlError();
- } else {
- emit gotVideoUrl(QString(videoUrl));
- playUrl(videoUrl);
- QTimer::singleShot(5000, this, SLOT(deleteLater()));
- }
- reply->deleteLater();
- manager->deleteLater();
- }
- /* ==================================================================== */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement