]> git.sur5r.net Git - minitube/blob - src/yt3listparser.cpp
New upstream version 3.9.1
[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     // TODO
63
64     video->setChannelTitle(snippet[QLatin1String("channelTitle")].toString());
65
66     // These are only for "videos" requests
67
68     QJsonValue contentDetails = item[QLatin1String("contentDetails")];
69     if (contentDetails.isObject()) {
70         QString isoPeriod = contentDetails.toObject()[QLatin1String("duration")].toString();
71         int duration = DataUtils::parseIsoPeriod(isoPeriod);
72         video->setDuration(duration);
73     }
74
75     QJsonValue statistics = item[QLatin1String("statistics")];
76     if (statistics.isObject()) {
77         int viewCount = statistics.toObject()[QLatin1String("viewCount")].toString().toInt();
78         video->setViewCount(viewCount);
79     }
80
81     videos.append(video);
82 }