]> git.sur5r.net Git - minitube/blobdiff - src/yt3listparser.cpp
Upload 3.9.3-2 to unstable
[minitube] / src / yt3listparser.cpp
index 45aa536e91454a34de83129c867a1eb6040ee14c..604be190c25179ce780525aa3cc2cc4553ca3371 100644 (file)
@@ -1,74 +1,80 @@
 #include "yt3listparser.h"
-#include "video.h"
 #include "datautils.h"
+#include "video.h"
+
+#include <QRegularExpression>
+
+namespace {
+
+QString decodeEntities(const QString &s) {
+    return QTextDocumentFragment::fromHtml(s).toPlainText();
+}
+
+} // namespace
 
 YT3ListParser::YT3ListParser(const QByteArray &bytes) {
-    QScriptEngine engine;
-    QScriptValue json = engine.evaluate("(" + QString::fromUtf8(bytes) + ")");
-
-    nextPageToken = json.property("nextPageToken").toString();
-
-    QScriptValue items = json.property("items");
-    videos.reserve(items.property("length").toInt32() - 1);
-    if (items.isArray()) {
-        QScriptValueIterator it(items);
-        while (it.hasNext()) {
-            it.next();
-            QScriptValue item = it.value();
-            // For some reason the array has an additional element containing its size.
-            if (item.isObject()) parseItem(item);
-        }
-    }
+    QJsonDocument doc = QJsonDocument::fromJson(bytes);
+    QJsonObject obj = doc.object();
 
-    // TODO suggestions!
+    nextPageToken = obj[QLatin1String("nextPageToken")].toString();
+
+    const QJsonArray items = obj[QLatin1String("items")].toArray();
+    videos.reserve(items.size());
+    for (const QJsonValue &v : items) {
+        QJsonObject item = v.toObject();
+        parseItem(item);
+    }
 }
 
-void YT3ListParser::parseItem(const QScriptValue &item) {
+void YT3ListParser::parseItem(const QJsonObject &item) {
     Video *video = new Video();
 
-    QScriptValue id = item.property("id");
-    if (id.isString()) video->setId(id.toString());
+    QJsonValue id = item[QLatin1String("id")];
+    if (id.isString())
+        video->setId(id.toString());
     else {
-        QString videoId = id.property("videoId").toString();
+        QString videoId = id.toObject()[QLatin1String("videoId")].toString();
         video->setId(videoId);
     }
 
-    QScriptValue snippet = item.property("snippet");
+    QJsonObject snippet = item[QLatin1String("snippet")].toObject();
 
-    bool isLiveBroadcastContent = snippet.property("liveBroadcastContent").toString() != QLatin1String("none");
+    bool isLiveBroadcastContent =
+            snippet[QLatin1String("liveBroadcastContent")].toString() != QLatin1String("none");
     if (isLiveBroadcastContent) {
         delete video;
         return;
     }
 
-    QString publishedAt = snippet.property("publishedAt").toString();
+    QString publishedAt = snippet[QLatin1String("publishedAt")].toString();
     QDateTime publishedDateTime = QDateTime::fromString(publishedAt, Qt::ISODate);
     video->setPublished(publishedDateTime);
 
-    video->setChannelId(snippet.property("channelId").toString());
+    video->setChannelId(snippet[QLatin1String("channelId")].toString());
 
-    video->setTitle(snippet.property("title").toString());
-    video->setDescription(snippet.property("description").toString());
+    QString title = snippet[QLatin1String("title")].toString();
+    static const QChar ampersand('&');
+    if (title.contains(ampersand)) title = decodeEntities(title);
+    video->setTitle(title);
+    video->setDescription(snippet[QLatin1String("description")].toString());
 
-    QScriptValue thumbnails = snippet.property("thumbnails");
-    video->setThumbnailUrl(thumbnails.property("medium").property("url").toString());
-    video->setMediumThumbnailUrl(thumbnails.property("high").property("url").toString());
-    video->setLargeThumbnailUrl(thumbnails.property("standard").property("url").toString());
+    QJsonObject thumbnails = snippet[QLatin1String("thumbnails")].toObject();
+    // TODO
 
-    video->setChannelTitle(snippet.property("channelTitle").toString());
+    video->setChannelTitle(snippet[QLatin1String("channelTitle")].toString());
 
     // These are only for "videos" requests
 
-    QScriptValue contentDetails = item.property("contentDetails");
+    QJsonValue contentDetails = item[QLatin1String("contentDetails")];
     if (contentDetails.isObject()) {
-        QString isoPeriod = contentDetails.property("duration").toString();
+        QString isoPeriod = contentDetails.toObject()[QLatin1String("duration")].toString();
         int duration = DataUtils::parseIsoPeriod(isoPeriod);
         video->setDuration(duration);
     }
 
-    QScriptValue statistics = item.property("statistics");
+    QJsonValue statistics = item[QLatin1String("statistics")];
     if (statistics.isObject()) {
-        uint viewCount = statistics.property("viewCount").toUInt32();
+        int viewCount = statistics.toObject()[QLatin1String("viewCount")].toString().toInt();
         video->setViewCount(viewCount);
     }