1 #include "yt3listparser.h"
5 #include <QRegularExpression>
9 QString decodeEntities(const QString &s) {
10 return QTextDocumentFragment::fromHtml(s).toPlainText();
15 YT3ListParser::YT3ListParser(const QByteArray &bytes) {
16 QJsonDocument doc = QJsonDocument::fromJson(bytes);
17 QJsonObject obj = doc.object();
19 nextPageToken = obj[QLatin1String("nextPageToken")].toString();
21 const QJsonArray items = obj[QLatin1String("items")].toArray();
22 videos.reserve(items.size());
23 for (const QJsonValue &v : items) {
24 QJsonObject item = v.toObject();
29 void YT3ListParser::parseItem(const QJsonObject &item) {
30 Video *video = new Video();
32 QJsonValue id = item[QLatin1String("id")];
34 video->setId(id.toString());
36 QString videoId = id.toObject()[QLatin1String("videoId")].toString();
37 video->setId(videoId);
40 QJsonObject snippet = item[QLatin1String("snippet")].toObject();
42 bool isLiveBroadcastContent =
43 snippet[QLatin1String("liveBroadcastContent")].toString() != QLatin1String("none");
44 if (isLiveBroadcastContent) {
49 QString publishedAt = snippet[QLatin1String("publishedAt")].toString();
50 QDateTime publishedDateTime = QDateTime::fromString(publishedAt, Qt::ISODate);
51 video->setPublished(publishedDateTime);
53 video->setChannelId(snippet[QLatin1String("channelId")].toString());
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());
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());
67 video->setChannelTitle(snippet[QLatin1String("channelTitle")].toString());
69 // These are only for "videos" requests
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);
78 QJsonValue statistics = item[QLatin1String("statistics")];
79 if (statistics.isObject()) {
80 int viewCount = statistics.toObject()[QLatin1String("viewCount")].toString().toInt();
81 video->setViewCount(viewCount);