]> git.sur5r.net Git - minitube/blob - src/yt3listparser.cpp
Imported Upstream version 2.4
[minitube] / src / yt3listparser.cpp
1 #include "yt3listparser.h"
2 #include "video.h"
3 #include "datautils.h"
4
5 YT3ListParser::YT3ListParser(const QByteArray &bytes) {
6
7     QScriptEngine engine;
8     QScriptValue json = engine.evaluate("(" + QString::fromUtf8(bytes) + ")");
9
10     nextPageToken = json.property("nextPageToken").toString();
11
12     QScriptValue items = json.property("items");
13     videos.reserve(items.property("length").toInt32() - 1);
14     if (items.isArray()) {
15         QScriptValueIterator it(items);
16         while (it.hasNext()) {
17             it.next();
18             QScriptValue item = it.value();
19             // For some reason the array has an additional element containing its size.
20             if (item.isObject()) parseItem(item);
21         }
22     }
23
24     // TODO suggestions!
25 }
26
27 void YT3ListParser::parseItem(const QScriptValue &item) {
28     Video *video = new Video();
29
30     QScriptValue id = item.property("id");
31     if (id.isString()) video->setId(id.toString());
32     else {
33         QString videoId = id.property("videoId").toString();
34         video->setId(videoId);
35     }
36
37     QScriptValue snippet = item.property("snippet");
38
39     bool isLiveBroadcastContent = snippet.property("liveBroadcastContent").toString() != QLatin1String("none");
40     if (isLiveBroadcastContent) {
41         delete video;
42         return;
43     }
44
45     QString publishedAt = snippet.property("publishedAt").toString();
46     QDateTime publishedDateTime = QDateTime::fromString(publishedAt, Qt::ISODate);
47     video->setPublished(publishedDateTime);
48
49     video->setChannelId(snippet.property("channelId").toString());
50
51     video->setTitle(snippet.property("title").toString());
52     video->setDescription(snippet.property("description").toString());
53
54     QScriptValue thumbnails = snippet.property("thumbnails");
55     video->setThumbnailUrl(thumbnails.property("medium").property("url").toString());
56     video->setMediumThumbnailUrl(thumbnails.property("high").property("url").toString());
57
58     video->setChannelTitle(snippet.property("channelTitle").toString());
59
60     // These are only for "videos" requests
61
62     QScriptValue contentDetails = item.property("contentDetails");
63     if (contentDetails.isObject()) {
64         QString isoPeriod = contentDetails.property("duration").toString();
65         int duration = DataUtils::parseIsoPeriod(isoPeriod);
66         video->setDuration(duration);
67     }
68
69     QScriptValue statistics = item.property("statistics");
70     if (statistics.isObject()) {
71         uint viewCount = statistics.property("viewCount").toUInt32();
72         video->setViewCount(viewCount);
73     }
74
75     videos.append(video);
76 }