]> git.sur5r.net Git - minitube/blobdiff - src/yt/invidious/ivlistparser.cpp
Update upstream source from tag 'upstream/3.8'
[minitube] / src / yt / invidious / ivlistparser.cpp
diff --git a/src/yt/invidious/ivlistparser.cpp b/src/yt/invidious/ivlistparser.cpp
new file mode 100644 (file)
index 0000000..7c03e6f
--- /dev/null
@@ -0,0 +1,68 @@
+#include "ivlistparser.h"
+
+#include "video.h"
+
+namespace {
+
+QString decodeEntities(const QString &s) {
+    return QTextDocumentFragment::fromHtml(s).toPlainText();
+}
+
+} // namespace
+
+IVListParser::IVListParser(const QJsonArray &items) {
+    videos.reserve(items.size());
+    for (const QJsonValue &v : items) {
+        QJsonObject item = v.toObject();
+        parseItem(item);
+    }
+}
+
+void IVListParser::parseItem(const QJsonObject &item) {
+    Video *video = new Video();
+
+    QJsonValue id = item[QLatin1String("videoId")];
+    video->setId(id.toString());
+
+    bool isLiveBroadcastContent = item[QLatin1String("liveNow")].toBool();
+    if (isLiveBroadcastContent) {
+        delete video;
+        return;
+    }
+
+    int publishedAt = item[QLatin1String("published")].toInt();
+    QDateTime publishedDateTime = QDateTime::fromSecsSinceEpoch(publishedAt);
+    video->setPublished(publishedDateTime);
+
+    video->setChannelId(item[QLatin1String("authorId")].toString());
+
+    QString title = item[QLatin1String("title")].toString();
+    static const QChar ampersand('&');
+    if (title.contains(ampersand)) title = decodeEntities(title);
+    video->setTitle(title);
+    video->setDescription(item[QLatin1String("descriptionHtml")].toString());
+
+    const auto thumbnails = item[QLatin1String("videoThumbnails")].toArray();
+    for (const auto &thumbnail : thumbnails) {
+        auto q = thumbnail["quality"];
+        if (q == QLatin1String("medium")) {
+            video->setThumbnailUrl(thumbnail["url"].toString());
+        } else if (q == QLatin1String("high")) {
+            video->setMediumThumbnailUrl(thumbnail["url"].toString());
+        } else if (q == QLatin1String("sddefault")) {
+            video->setLargeThumbnailUrl(thumbnail["url"].toString());
+        }
+    }
+
+    video->setChannelTitle(item[QLatin1String("author")].toString());
+
+    // These are only for "videos" requests
+
+    int duration = item[QLatin1String("lengthSeconds")].toInt();
+    video->setDuration(duration);
+
+    int viewCount = item[QLatin1String("viewCount")].toInt();
+    video->setViewCount(viewCount);
+
+    videos.append(video);
+}