1 #include "ytjstrending.h"
8 QDateTime parsePublishedText(const QString &s) {
10 const auto parts = s.splitRef(' ');
11 for (const auto &part : parts) {
15 if (num == 0) return QDateTime();
17 auto now = QDateTime::currentDateTimeUtc();
18 if (s.contains("hour")) {
19 return now.addSecs(-num * 3600);
20 } else if (s.contains("day")) {
21 return now.addDays(-num);
22 } else if (s.contains("week")) {
23 return now.addDays(-num * 7);
24 } else if (s.contains("month")) {
25 return now.addMonths(-num);
26 } else if (s.contains("year")) {
27 return now.addDays(-num * 365);
34 YTJSTrending::YTJSTrending(QString name, QVariantMap params, QObject *parent)
35 : VideoSource(parent), name(name), params(params) {}
37 void YTJSTrending::loadVideos(int max, int startIndex) {
40 auto &js = JS::instance();
42 QJSValue options = js.getEngine().toScriptValue(params);
44 js.callFunction(new JSResult(this), "trending", {options})
45 .onJson([this](auto &doc) {
46 const auto items = doc.array();
48 QVector<Video *> videos;
49 videos.reserve(items.size());
51 for (const auto &i : items) {
52 QString type = i["type"].toString();
53 if (type != "video") continue;
55 Video *video = new Video();
57 QString id = i["videoId"].toString();
60 QString title = i["title"].toString();
61 video->setTitle(title);
63 QString desc = i["description"].toString();
64 if (desc.isEmpty()) desc = i["desc"].toString();
65 video->setDescription(desc);
67 const auto thumbs = i["videoThumbnails"].toArray();
68 for (const auto &t : thumbs) {
69 video->addThumb(t["width"].toInt(), t["height"].toInt(),
73 int views = i["viewCount"].toInt();
74 video->setViewCount(views);
76 int duration = i["lengthSeconds"].toInt();
77 video->setDuration(duration);
79 auto published = parsePublishedText(i["publishedText"].toString());
80 if (published.isValid()) video->setPublished(published);
82 QString channelName = i["author"].toString();
83 video->setChannelTitle(channelName);
84 QString channelId = i["authorId"].toString();
85 video->setChannelId(channelId);
90 emit gotVideos(videos);
91 emit finished(videos.size());
93 .onError([this, max, startIndex](auto &msg) {
94 static int retries = 0;
96 qDebug() << "Retrying...";
97 QTimer::singleShot(0, this,
98 [this, max, startIndex] { loadVideos(max, startIndex); });