]> git.sur5r.net Git - minitube/blob - src/yt3listparser.cpp
Imported Upstream version 2.5.1
[minitube] / src / yt3listparser.cpp
1 #include "yt3listparser.h"
2 #include "video.h"
3 #include "datautils.h"
4
5 YT3ListParser::YT3ListParser(const QByteArray &bytes) {
6     QScriptEngine engine;
7     QScriptValue json = engine.evaluate("(" + QString::fromUtf8(bytes) + ")");
8
9     nextPageToken = json.property("nextPageToken").toString();
10
11     QScriptValue items = json.property("items");
12     videos.reserve(items.property("length").toInt32() - 1);
13     if (items.isArray()) {
14         QScriptValueIterator it(items);
15         while (it.hasNext()) {
16             it.next();
17             QScriptValue item = it.value();
18             // For some reason the array has an additional element containing its size.
19             if (item.isObject()) parseItem(item);
20         }
21     }
22
23     // TODO suggestions!
24 }
25
26 void YT3ListParser::parseItem(const QScriptValue &item) {
27     Video *video = new Video();
28
29     QScriptValue id = item.property("id");
30     if (id.isString()) video->setId(id.toString());
31     else {
32         QString videoId = id.property("videoId").toString();
33         video->setId(videoId);
34     }
35
36     QScriptValue snippet = item.property("snippet");
37
38     bool isLiveBroadcastContent = snippet.property("liveBroadcastContent").toString() != QLatin1String("none");
39     if (isLiveBroadcastContent) {
40         delete video;
41         return;
42     }
43
44     QString publishedAt = snippet.property("publishedAt").toString();
45     QDateTime publishedDateTime = QDateTime::fromString(publishedAt, Qt::ISODate);
46     video->setPublished(publishedDateTime);
47
48     video->setChannelId(snippet.property("channelId").toString());
49
50     video->setTitle(snippet.property("title").toString());
51     video->setDescription(snippet.property("description").toString());
52
53     QScriptValue thumbnails = snippet.property("thumbnails");
54     video->setThumbnailUrl(thumbnails.property("medium").property("url").toString());
55     video->setMediumThumbnailUrl(thumbnails.property("high").property("url").toString());
56     video->setLargeThumbnailUrl(thumbnails.property("standard").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 }