]> git.sur5r.net Git - minitube/blob - src/yt3listparser.cpp
Upload 3.9.3-2 to unstable
[minitube] / src / yt3listparser.cpp
1 #include "yt3listparser.h"
2 #include "datautils.h"
3 #include "video.h"
4
5 #include <QRegularExpression>
6
7 namespace {
8
9 QString decodeEntities(const QString &s) {
10     return QTextDocumentFragment::fromHtml(s).toPlainText();
11 }
12
13 } // namespace
14
15 YT3ListParser::YT3ListParser(const QByteArray &bytes) {
16     QJsonDocument doc = QJsonDocument::fromJson(bytes);
17     QJsonObject obj = doc.object();
18
19     nextPageToken = obj[QLatin1String("nextPageToken")].toString();
20
21     const QJsonArray items = obj[QLatin1String("items")].toArray();
22     videos.reserve(items.size());
23     for (const QJsonValue &v : items) {
24         QJsonObject item = v.toObject();
25         parseItem(item);
26     }
27 }
28
29 void YT3ListParser::parseItem(const QJsonObject &item) {
30     Video *video = new Video();
31
32     QJsonValue id = item[QLatin1String("id")];
33     if (id.isString())
34         video->setId(id.toString());
35     else {
36         QString videoId = id.toObject()[QLatin1String("videoId")].toString();
37         video->setId(videoId);
38     }
39
40     QJsonObject snippet = item[QLatin1String("snippet")].toObject();
41
42     bool isLiveBroadcastContent =
43             snippet[QLatin1String("liveBroadcastContent")].toString() != QLatin1String("none");
44     if (isLiveBroadcastContent) {
45         delete video;
46         return;
47     }
48
49     QString publishedAt = snippet[QLatin1String("publishedAt")].toString();
50     QDateTime publishedDateTime = QDateTime::fromString(publishedAt, Qt::ISODate);
51     video->setPublished(publishedDateTime);
52
53     video->setChannelId(snippet[QLatin1String("channelId")].toString());
54
55     QString title = snippet[QLatin1String("title")].toString();
56     static const QChar ampersand('&');
57     if (title.contains(ampersand)) title = decodeEntities(title);
58     video->setTitle(title);
59     video->setDescription(snippet[QLatin1String("description")].toString());
60
61     QJsonObject thumbnails = snippet[QLatin1String("thumbnails")].toObject();
62     QLatin1String url("url");
63     video->setThumbnailUrl(thumbnails[QLatin1String("medium")].toObject()[url].toString());
64     video->setMediumThumbnailUrl(thumbnails[QLatin1String("high")].toObject()[url].toString());
65     video->setLargeThumbnailUrl(thumbnails[QLatin1String("standard")].toObject()[url].toString());
66
67     video->setChannelTitle(snippet[QLatin1String("channelTitle")].toString());
68
69     // These are only for "videos" requests
70
71     QJsonValue contentDetails = item[QLatin1String("contentDetails")];
72     if (contentDetails.isObject()) {
73         QString isoPeriod = contentDetails.toObject()[QLatin1String("duration")].toString();
74         int duration = DataUtils::parseIsoPeriod(isoPeriod);
75         video->setDuration(duration);
76     }
77
78     QJsonValue statistics = item[QLatin1String("statistics")];
79     if (statistics.isObject()) {
80         int viewCount = statistics.toObject()[QLatin1String("viewCount")].toString().toInt();
81         video->setViewCount(viewCount);
82     }
83
84     videos.append(video);
85 }