Advertisement
Guest User

Untitled

a guest
Jul 29th, 2012
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* ==================================================================== */
  2. /* === Thanks to Stuart Howarth aka marxian for the code used here! === */
  3. void YoutubeLinkHandler::getVideoUrl(const QString &videoId) {
  4.     qDebug() << videoId;
  5.     QString playerUrl = "http://www.youtube.com/get_video_info?&video_id=" + videoId + "&el=detailpage&ps=default&eurl=&gl=US&hl=en";
  6.     QNetworkAccessManager *manager = new QNetworkAccessManager(this);
  7.     QNetworkRequest request;
  8.     request.setUrl(QUrl(playerUrl));
  9.     connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(parseVideoPage(QNetworkReply*)));
  10.     manager->get(request);
  11. }
  12.  
  13. void YoutubeLinkHandler::parseVideoPage(QNetworkReply *reply) {
  14.     QNetworkAccessManager *manager = qobject_cast<QNetworkAccessManager*>(sender());
  15.     m_cookiesList.clear();
  16.     m_cookiesList = manager->cookieJar()->cookiesForUrl(reply->request().url());
  17.  
  18.     QMap<int, QByteArray> formats;
  19.     QByteArray response = QByteArray::fromPercentEncoding(reply->readAll());
  20.     qDebug() << response;
  21.     int pos = response.indexOf("fmt_url_map=") + 12;
  22.     int pos2 = response.indexOf("&allow_ratings", pos);
  23.     int pos3 = response.indexOf("&leanback", pos);
  24.     if ((pos3 > 0) && (pos3 < pos2)) {
  25.         pos2 = pos3;
  26.     }
  27.     response = response.mid(pos, pos2 - pos);
  28.     QList<QByteArray> parts = response.split('|');
  29.     int key = parts.first().toInt();
  30.     for (int i = 1; i < parts.length(); i++) {
  31.         QByteArray part = parts[i];
  32.         QList<QByteArray> keyAndValue = part.split(',');
  33.         QByteArray url = keyAndValue.first().replace("%2C", ",");
  34.         formats[key] = url;
  35.         key = keyAndValue.last().toInt();
  36.     }
  37.     QList<int> flist;
  38.     flist << 22 << 35 << 34 << 18 << 5;
  39.     QByteArray videoUrl;
  40.     int index = flist.indexOf(18);
  41.     while ((videoUrl.isEmpty()) && index < flist.size()) {
  42.         videoUrl = formats.value(flist.at(index), "");
  43.         index++;
  44.     }
  45.  
  46.     if (videoUrl.isEmpty())
  47.         index = flist.indexOf(5);
  48.  
  49.     while ((videoUrl.isEmpty()) && index < flist.size()) {
  50.         videoUrl = formats.value(flist.at(index), "");
  51.         index++;
  52.     }
  53.  
  54.     if (videoUrl.isEmpty()) {
  55.         qDebug() << tr("Error: Unable to retrieve video");
  56.         emit videoUrlError();
  57.     } else {
  58.         emit gotVideoUrl(QString(videoUrl));
  59.         playUrl(videoUrl);
  60.         QTimer::singleShot(5000, this, SLOT(deleteLater()));
  61.     }
  62.     reply->deleteLater();
  63.     manager->deleteLater();
  64. }
  65. /* ==================================================================== */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement