Ignore:
Timestamp:
Oct 9, 2014, 2:54:21 PM (11 years ago)
Author:
Silvan Scherrer
Message:

SMPlayer: updated trunk to 14.9.0

Location:
smplayer/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • smplayer/trunk

  • smplayer/trunk/src/youtube/retrieveyoutubeurl.cpp

    r165 r170  
    3232
    3333QString RetrieveYoutubeUrl::user_agent;
     34bool RetrieveYoutubeUrl::use_https_main = false;
     35bool RetrieveYoutubeUrl::use_https_vi = false;
    3436
    3537RetrieveYoutubeUrl::RetrieveYoutubeUrl( QObject* parent ) : QObject(parent)
     
    4547
    4648void RetrieveYoutubeUrl::fetchPage(const QString & url) {
    47         QString agent = user_agent;
    48         if (agent.isEmpty()) agent = "Mozilla/5.0 (X11; Linux x86_64; rv:5.0.1) Gecko/20100101 Firefox/5.0.1";
    49         qDebug("RetrieveYoutubeUrl::fetchPage: user agent: %s", agent.toLatin1().constData());
     49        qDebug("RetrieveYoutubeUrl::fetchPage: url: %s", url.toUtf8().constData());
     50        qDebug("RetrieveYoutubeUrl::fetchPage: user agent: '%s'", user_agent.toLatin1().constData());
    5051
    5152        QNetworkRequest req(url);
    52         req.setRawHeader("User-Agent", agent.toLatin1());
     53        req.setRawHeader("User-Agent", user_agent.toLatin1());
     54        req.setRawHeader("Accept-Language", "en-us,en;q=0.5");
    5355        reply = manager->get(req);
    5456        connect(reply, SIGNAL(finished()), this, SLOT(gotResponse()));
     
    6365
    6466#ifdef YT_GET_VIDEOINFO
    65 void RetrieveYoutubeUrl::fetchVideoInfoPage() {
    66         QString url = QString("http://www.youtube.com/get_video_info?el=detailpage&ps=default&eurl=&gl=US&hl=en&video_id=%1").arg(video_id);
    67         //qDebug("RetrieveYoutubeUrl::fetchVideoInfoPage: url: %s", url.toUtf8().constData());
     67void RetrieveYoutubeUrl::fetchVideoInfoPage(QString url) {
     68        if (url.isEmpty()) {
     69                QString scheme = use_https_vi ? "https" : "http";
     70                url = QString("%2://www.youtube.com/get_video_info?el=detailpage&ps=default&eurl=&gl=US&hl=en&video_id=%1").arg(video_id).arg(scheme);
     71        }
     72        qDebug("RetrieveYoutubeUrl::fetchVideoInfoPage: url: %s...", url.left(20).toUtf8().constData());
     73
     74        qDebug("RetrieveYoutubeUrl::fetchPage: user agent: '%s'", user_agent.toLatin1().constData());
    6875
    6976        YTSig::check(url);
    7077        QNetworkRequest req(url);
    7178        req.setRawHeader("User-Agent", user_agent.toLatin1());
     79        req.setRawHeader("Accept-Language", "en-us,en;q=0.5");
    7280        reply = manager->get(req);
    7381        connect(reply, SIGNAL(finished()), this, SLOT(gotVideoInfoResponse()));
     
    8290
    8391void RetrieveYoutubeUrl::gotResponse() {
     92        qDebug("RetrieveYoutubeUrl::gotResponse");
     93
    8494        QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
    8595
     
    97107                }
    98108        } else {
     109                qDebug("RetrieveYoutubeUrl::gotResponse: error %d: '%s'", (int)reply->error(), reply->errorString().toUtf8().constData());
    99110                emit errorOcurred((int)reply->error(), reply->errorString());
    100111                return;
     
    109120        QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
    110121
    111         if (reply->error() != QNetworkReply::NoError) {
     122        if (reply->error() == QNetworkReply::NoError) {
     123                int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
     124                qDebug("RetrieveYoutubeUrl::gotVideoInfoResponse: status: %d", status);
     125                switch (status) {
     126                        case 301:
     127                        case 302:
     128                        case 307:
     129                                QString r_url = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl().toString();
     130                                //qDebug("RetrieveYoutubeUrl::gotVideoInfoResponse: redirected: %s", r_url.toLatin1().constData());
     131                                fetchVideoInfoPage(r_url);
     132                                return;
     133                }
     134        } else {
     135                qDebug("RetrieveYoutubeUrl::gotVideoInfoResponse: error %d: '%s'", (int)reply->error(), reply->errorString().toUtf8().constData());
    112136                emit errorOcurred((int)reply->error(), reply->errorString());
    113137                return;
     
    136160
    137161        QString player;
    138         QRegExp rxplayer("html5player-([\\d,\\w,-]+)\\.js");
     162        QRegExp rxplayer("html5player-([\\d,\\w,-]+)\\\\");
    139163        if (rxplayer.indexIn(replyString) != -1) {
    140164                player = rxplayer.cap(1);
     
    142166        }
    143167
     168        QString fmtArray;
    144169        QRegExp regex("\\\"url_encoded_fmt_stream_map\\\"\\s*:\\s*\\\"([^\\\"]*)");
    145         regex.indexIn(replyString);
    146         QString fmtArray = regex.cap(1);
     170        if (regex.indexIn(replyString) != -1) {
     171                fmtArray = regex.cap(1);
     172        }
     173
     174#ifdef YT_DASH_SUPPORT
     175        QRegExp regex2("\\\"adaptive_fmts\\\"\\s*:\\s*\\\"([^\\\"]*)");
     176        if (regex2.indexIn(replyString) != -1) {
     177                if (!fmtArray.isEmpty()) fmtArray += ",";
     178                fmtArray += regex2.cap(1);
     179        }
     180#endif
     181
    147182        fmtArray = sanitizeForUnicodePoint(fmtArray);
    148183        fmtArray.replace(QRegExp("\\\\(.)"), "\\1");
     
    216251                        q->removeAllQueryItems("type");
    217252
     253                        if (!q->hasQueryItem("ratebypass")) q->addQueryItem("ratebypass", "yes");
     254
    218255                        if ((q->hasQueryItem("itag")) && (q->hasQueryItem("signature"))) {
    219256                                QString itag = q->queryItemValue("itag");
    220                                 q->removeAllQueryItems("itag"); // Remove duplicated itag
    221                                 q->addQueryItem("itag", itag);
     257
     258                                // Remove duplicated queries
     259                                QPair <QString,QString> item;
     260                                QList<QPair<QString, QString> > items = q->queryItems();
     261                                foreach(item, items) {
     262                                        q->removeAllQueryItems(item.first);
     263                                        q->addQueryItem(item.first, item.second);
     264                                }
     265
    222266                                #if QT_VERSION >= 0x050000
    223267                                line.setQuery(q->query(QUrl::FullyDecoded));
    224268                                #endif
     269
     270                                #ifdef YT_GET_VIDEOINFO
     271                                if (!line.toString().startsWith("https")) {
     272                                        urlMap[itag.toInt()] = line.toString();
     273                                }
     274                                #else
    225275                                urlMap[itag.toInt()] = line.toString();
    226                                 //qDebug("line: %s", line.toString().toLatin1().constData());
     276                                #endif
     277
     278                                //qDebug("itag: %s line: %s", itag.toLatin1().constData(), line.toString().toLatin1().constData());
    227279                        }
    228280                }
     
    255307                emit gotUrls(urlMap);
    256308                emit gotPreferredUrl(p_url);
     309                #ifdef YT_GET_VIDEOINFO
     310                emit gotVideoInfo(urlMap, url_title, video_id);
     311                #endif
    257312        } else {
    258313                 emit gotEmptyList();
     
    318373        QString r;
    319374        QString ID = getVideoID(url);
    320         if (!ID.isEmpty()) r = "http://www.youtube.com/watch?v=" + ID;
     375        if (!ID.isEmpty()) {
     376                QString scheme = use_https_main ? "https" : "http";
     377                r = scheme + "://www.youtube.com/watch?v=" + ID;
     378        }
    321379        return r;
    322380}
     
    329387        QUrlQuery all;
    330388        all.setQuery(text);
    331         QByteArray fmtArray = all.queryItemValue("url_encoded_fmt_stream_map").toLatin1();
    332389        #else
    333390        QUrl all;
    334391        all.setEncodedQuery(text);
    335         QByteArray fmtArray = all.queryItemValue("url_encoded_fmt_stream_map").toLatin1();
    336392        #endif
     393
     394        QByteArray fmtArray;
     395        fmtArray = all.queryItemValue("url_encoded_fmt_stream_map").toLatin1();
     396
     397#ifdef YT_DASH_SUPPORT
     398        if (!fmtArray.isEmpty()) fmtArray += ",";
     399        fmtArray += all.queryItemValue("adaptive_fmts").toLatin1();
     400#endif
    337401
    338402        /*
     
    400464                        q->removeAllQueryItems("fallback_host");
    401465                        q->removeAllQueryItems("type");
     466
     467                        if (!q->hasQueryItem("ratebypass")) q->addQueryItem("ratebypass", "yes");
     468
    402469                        if ((q->hasQueryItem("itag")) && (q->hasQueryItem("signature"))) {
    403470                                QString itag = q->queryItemValue("itag");
    404                                 q->removeAllQueryItems("itag"); // Remove duplicated itag
    405                                 q->addQueryItem("itag", itag);
     471
     472                                // Remove duplicated queries
     473                                QPair <QString,QString> item;
     474                                QList<QPair<QString, QString> > items = q->queryItems();
     475                                foreach(item, items) {
     476                                        q->removeAllQueryItems(item.first);
     477                                        q->addQueryItem(item.first, item.second);
     478                                }
     479
    406480                                #if QT_VERSION >= 0x050000
    407481                                line.setQuery(q->query(QUrl::FullyDecoded));
    408482                                #endif
    409483                                urlMap[itag.toInt()] = line.toString();
    410                                 //qDebug("line: %s", line.toString().toLatin1().constData());
     484                                //qDebug("itag: %s line: %s", itag.toLatin1().constData(), line.toString().toLatin1().constData());
    411485                        }
    412486                }
     
    431505                emit gotUrls(urlMap);
    432506                emit gotPreferredUrl(p_url);
     507                #ifdef YT_GET_VIDEOINFO
     508                emit gotVideoInfo(urlMap, url_title, video_id);
     509                #endif
    433510        } else {
    434511                 emit gotEmptyList();
     
    506583        return p_url;
    507584}
     585
     586#ifdef YT_DASH_SUPPORT
     587QString RetrieveYoutubeUrl::findBestAudio(const QMap<int, QString>& urlMap) {
     588        QString url;
     589
     590        url = urlMap.value(DASH_AUDIO_MP4_256, QString());
     591        if (!url.isEmpty()) return url;
     592
     593        url = urlMap.value(DASH_AUDIO_WEBM_192, QString());
     594        if (!url.isEmpty()) return url;
     595
     596        url = urlMap.value(DASH_AUDIO_MP4_128, QString());
     597        if (!url.isEmpty()) return url;
     598
     599        url = urlMap.value(DASH_AUDIO_WEBM_128, QString());
     600        if (!url.isEmpty()) return url;
     601
     602        url = urlMap.value(DASH_AUDIO_MP4_48, QString());
     603        if (!url.isEmpty()) return url;
     604
     605        return url;
     606}
     607#endif
    508608
    509609QString RetrieveYoutubeUrl::sanitizeForUnicodePoint(QString string) {
Note: See TracChangeset for help on using the changeset viewer.