]> git.sur5r.net Git - minitube/blobdiff - src/paginatedvideosource.cpp
New upstream version 2.9
[minitube] / src / paginatedvideosource.cpp
index 115cf1f1c06a6d9e066f67f7bba48d98f8788d35..aa44efe8223dcd84569139ff2a999b4995c2b0ab 100644 (file)
@@ -23,24 +23,20 @@ $END_LICENSE */
 #include "yt3.h"
 #include "yt3listparser.h"
 #include "datautils.h"
-#include "compatibility/qurlqueryhelper.h"
 
 #include "video.h"
-#include "networkaccess.h"
-
-namespace The {
-NetworkAccess* http();
-QHash<QString, QAction*>* globalActions();
-}
+#include "http.h"
+#include "httputils.h"
 
 PaginatedVideoSource::PaginatedVideoSource(QObject *parent) : VideoSource(parent)
   , tokenTimestamp(0)
+  , reloadingToken(false)
   , currentMax(0)
   , currentStartIndex(0)
-  , reloadingToken(false)
   , asyncDetails(false) { }
 
 bool PaginatedVideoSource::hasMoreVideos() {
+    qDebug() << __PRETTY_FUNCTION__ << nextPageToken;
     return !nextPageToken.isEmpty();
 }
 
@@ -50,7 +46,7 @@ bool PaginatedVideoSource::maybeReloadToken(int max, int startIndex) {
 
     if (nextPageToken.isEmpty()) {
         // previous request did not return a page token. Game over.
-        // emit gotVideos(QList<Video*>());
+        // emit gotVideos(QVector<Video*>());
         emit finished(0);
         return true;
     }
@@ -86,19 +82,21 @@ bool PaginatedVideoSource::isPageTokenExpired() {
 
 void PaginatedVideoSource::reloadToken() {
     qDebug() << "Reloading pageToken";
-    QObject *reply = The::http()->get(lastUrl);
+    QObject *reply = HttpUtils::yt().get(lastUrl);
     connect(reply, SIGNAL(data(QByteArray)), SLOT(parseResults(QByteArray)));
-    connect(reply, SIGNAL(error(QNetworkReply*)), SLOT(requestError(QNetworkReply*)));
+    connect(reply, SIGNAL(error(QString)), SLOT(requestError(QString)));
 }
 
-void PaginatedVideoSource::loadVideoDetails(const QList<Video*> &videos) {
+void PaginatedVideoSource::loadVideoDetails(const QVector<Video*> &videos) {
+    this->videos = videos;
     QString videoIds;
-    foreach (Video *video, videos) {
+    videoIds.reserve(videos.size()*12);
+    videoMap.reserve(videos.size());
+    for (Video *video : videos) {
         // TODO get video details from cache
-        if (!videoIds.isEmpty()) videoIds += ",";
-        videoIds += video->id();
-        this->videos = videos;
-        videoMap.insert(video->id(), video);
+        if (!videoIds.isEmpty()) videoIds += QLatin1Char(',');
+        videoIds += video->getId();
+        videoMap.insert(video->getId(), video);
     }
 
     if (videoIds.isEmpty()) {
@@ -110,44 +108,40 @@ void PaginatedVideoSource::loadVideoDetails(const QList<Video*> &videos) {
     }
 
     QUrl url = YT3::instance().method("videos");
-    {
-        QUrlQueryHelper urlHelper(url);
-        urlHelper.addQueryItem("part", "contentDetails,statistics");
-        urlHelper.addQueryItem("id", videoIds);
-    }
+    QUrlQuery q(url);
+    q.addQueryItem(QStringLiteral("part"), QStringLiteral("contentDetails,statistics"));
+    q.addQueryItem(QStringLiteral("id"), videoIds);
+    url.setQuery(q);
 
-    QObject *reply = The::http()->get(url);
+    QObject *reply = HttpUtils::yt().get(url);
     connect(reply, SIGNAL(data(QByteArray)), SLOT(parseVideoDetails(QByteArray)));
-    connect(reply, SIGNAL(error(QNetworkReply*)), SLOT(requestError(QNetworkReply*)));
+    connect(reply, SIGNAL(error(QString)), SLOT(requestError(QString)));
 }
 
 void PaginatedVideoSource::parseVideoDetails(const QByteArray &bytes) {
+    QJsonDocument doc = QJsonDocument::fromJson(bytes);
+    QJsonObject obj = doc.object();
 
-    QScriptEngine engine;
-    QScriptValue json = engine.evaluate("(" + QString::fromUtf8(bytes) + ")");
-
-    QScriptValue items = json.property("items");
+    QJsonValue items = obj["items"];
     if (items.isArray()) {
-        QScriptValueIterator it(items);
-        while (it.hasNext()) {
-            it.next();
-            QScriptValue item = it.value();
-            if (!item.isObject()) continue;
+        const auto array = items.toArray();
+        for (const QJsonValue &v : array) {
+            if (!v.isObject()) continue;
 
-            // qDebug() << item.toString();
+            QJsonObject item = v.toObject();
 
-            QString id = item.property("id").toString();
+            QString id = item["id"].toString();
             Video *video = videoMap.value(id);
             if (!video) {
                 qWarning() << "No video for id" << id;
                 continue;
             }
 
-            QString isoPeriod = item.property("contentDetails").property("duration").toString();
+            QString isoPeriod = item["contentDetails"].toObject()["duration"].toString();
             int duration = DataUtils::parseIsoPeriod(isoPeriod);
             video->setDuration(duration);
 
-            uint viewCount = item.property("statistics").property("viewCount").toUInt32();
+            int viewCount = item["statistics"].toObject()["viewCount"].toString().toInt();
             video->setViewCount(viewCount);
 
             // TODO cache by etag?