#include "yt3listparser.h"
-#include "video.h"
#include "datautils.h"
+#include "video.h"
+
+#include <QRegularExpression>
+
+namespace {
+
+QString decodeEntities(const QString &s) {
+ return QTextDocumentFragment::fromHtml(s).toPlainText();
+}
+
+} // namespace
YT3ListParser::YT3ListParser(const QByteArray &bytes) {
+ QJsonDocument doc = QJsonDocument::fromJson(bytes);
+ QJsonObject obj = doc.object();
- QScriptEngine engine;
- QScriptValue json = engine.evaluate("(" + QString::fromUtf8(bytes) + ")");
-
- nextPageToken = json.property("nextPageToken").toString();
-
- QScriptValue items = json.property("items");
- videos.reserve(items.property("length").toInt32() - 1);
- if (items.isArray()) {
- QScriptValueIterator it(items);
- while (it.hasNext()) {
- it.next();
- QScriptValue item = it.value();
- // For some reason the array has an additional element containing its size.
- if (item.isObject()) parseItem(item);
- }
- }
+ nextPageToken = obj[QLatin1String("nextPageToken")].toString();
- // TODO suggestions!
+ const QJsonArray items = obj[QLatin1String("items")].toArray();
+ videos.reserve(items.size());
+ for (const QJsonValue &v : items) {
+ QJsonObject item = v.toObject();
+ parseItem(item);
+ }
}
-void YT3ListParser::parseItem(const QScriptValue &item) {
+void YT3ListParser::parseItem(const QJsonObject &item) {
Video *video = new Video();
- QScriptValue id = item.property("id");
- if (id.isString()) video->setId(id.toString());
+ QJsonValue id = item[QLatin1String("id")];
+ if (id.isString())
+ video->setId(id.toString());
else {
- QString videoId = id.property("videoId").toString();
+ QString videoId = id.toObject()[QLatin1String("videoId")].toString();
video->setId(videoId);
}
- QScriptValue snippet = item.property("snippet");
+ QJsonObject snippet = item[QLatin1String("snippet")].toObject();
- bool isLiveBroadcastContent = snippet.property("liveBroadcastContent").toString() != QLatin1String("none");
+ bool isLiveBroadcastContent =
+ snippet[QLatin1String("liveBroadcastContent")].toString() != QLatin1String("none");
if (isLiveBroadcastContent) {
delete video;
return;
}
- QString publishedAt = snippet.property("publishedAt").toString();
+ QString publishedAt = snippet[QLatin1String("publishedAt")].toString();
QDateTime publishedDateTime = QDateTime::fromString(publishedAt, Qt::ISODate);
video->setPublished(publishedDateTime);
- video->setChannelId(snippet.property("channelId").toString());
+ video->setChannelId(snippet[QLatin1String("channelId")].toString());
- video->setTitle(snippet.property("title").toString());
- video->setDescription(snippet.property("description").toString());
+ QString title = snippet[QLatin1String("title")].toString();
+ static const QChar ampersand('&');
+ if (title.contains(ampersand)) title = decodeEntities(title);
+ video->setTitle(title);
+ video->setDescription(snippet[QLatin1String("description")].toString());
- QScriptValue thumbnails = snippet.property("thumbnails");
- video->setThumbnailUrl(thumbnails.property("medium").property("url").toString());
- video->setMediumThumbnailUrl(thumbnails.property("high").property("url").toString());
+ QJsonObject thumbnails = snippet[QLatin1String("thumbnails")].toObject();
+ // TODO
- video->setChannelTitle(snippet.property("channelTitle").toString());
+ video->setChannelTitle(snippet[QLatin1String("channelTitle")].toString());
// These are only for "videos" requests
- QScriptValue contentDetails = item.property("contentDetails");
+ QJsonValue contentDetails = item[QLatin1String("contentDetails")];
if (contentDetails.isObject()) {
- QString isoPeriod = contentDetails.property("duration").toString();
+ QString isoPeriod = contentDetails.toObject()[QLatin1String("duration")].toString();
int duration = DataUtils::parseIsoPeriod(isoPeriod);
video->setDuration(duration);
}
- QScriptValue statistics = item.property("statistics");
+ QJsonValue statistics = item[QLatin1String("statistics")];
if (statistics.isObject()) {
- uint viewCount = statistics.property("viewCount").toUInt32();
+ int viewCount = statistics.toObject()[QLatin1String("viewCount")].toString().toInt();
video->setViewCount(viewCount);
}