#include "yt3.h"
#include "yt3listparser.h"
#include "datautils.h"
-#include "compatibility/qurlqueryhelper.h"
#include "video.h"
-#include "networkaccess.h"
-
-namespace The {
-NetworkAccess* http();
-QHash<QString, QAction*>* globalActions();
-}
+#include "http.h"
+#include "httputils.h"
PaginatedVideoSource::PaginatedVideoSource(QObject *parent) : VideoSource(parent)
, tokenTimestamp(0)
+ , reloadingToken(false)
, currentMax(0)
, currentStartIndex(0)
- , reloadingToken(false)
, asyncDetails(false) { }
bool PaginatedVideoSource::hasMoreVideos() {
+ qDebug() << __PRETTY_FUNCTION__ << nextPageToken;
return !nextPageToken.isEmpty();
}
if (nextPageToken.isEmpty()) {
// previous request did not return a page token. Game over.
- // emit gotVideos(QList<Video*>());
+ // emit gotVideos(QVector<Video*>());
emit finished(0);
return true;
}
void PaginatedVideoSource::reloadToken() {
qDebug() << "Reloading pageToken";
- QObject *reply = The::http()->get(lastUrl);
+ QObject *reply = HttpUtils::yt().get(lastUrl);
connect(reply, SIGNAL(data(QByteArray)), SLOT(parseResults(QByteArray)));
- connect(reply, SIGNAL(error(QNetworkReply*)), SLOT(requestError(QNetworkReply*)));
+ connect(reply, SIGNAL(error(QString)), SLOT(requestError(QString)));
}
-void PaginatedVideoSource::loadVideoDetails(const QList<Video*> &videos) {
+void PaginatedVideoSource::loadVideoDetails(const QVector<Video*> &videos) {
+ this->videos = videos;
QString videoIds;
- foreach (Video *video, videos) {
+ videoIds.reserve(videos.size()*12);
+ videoMap.reserve(videos.size());
+ for (Video *video : videos) {
// TODO get video details from cache
- if (!videoIds.isEmpty()) videoIds += ",";
- videoIds += video->id();
- this->videos = videos;
- videoMap.insert(video->id(), video);
+ if (!videoIds.isEmpty()) videoIds += QLatin1Char(',');
+ videoIds += video->getId();
+ videoMap.insert(video->getId(), video);
}
if (videoIds.isEmpty()) {
}
QUrl url = YT3::instance().method("videos");
- {
- QUrlQueryHelper urlHelper(url);
- urlHelper.addQueryItem("part", "contentDetails,statistics");
- urlHelper.addQueryItem("id", videoIds);
- }
+ QUrlQuery q(url);
+ q.addQueryItem(QStringLiteral("part"), QStringLiteral("contentDetails,statistics"));
+ q.addQueryItem(QStringLiteral("id"), videoIds);
+ url.setQuery(q);
- QObject *reply = The::http()->get(url);
+ QObject *reply = HttpUtils::yt().get(url);
connect(reply, SIGNAL(data(QByteArray)), SLOT(parseVideoDetails(QByteArray)));
- connect(reply, SIGNAL(error(QNetworkReply*)), SLOT(requestError(QNetworkReply*)));
+ connect(reply, SIGNAL(error(QString)), SLOT(requestError(QString)));
}
void PaginatedVideoSource::parseVideoDetails(const QByteArray &bytes) {
+ QJsonDocument doc = QJsonDocument::fromJson(bytes);
+ QJsonObject obj = doc.object();
- QScriptEngine engine;
- QScriptValue json = engine.evaluate("(" + QString::fromUtf8(bytes) + ")");
-
- QScriptValue items = json.property("items");
+ QJsonValue items = obj["items"];
if (items.isArray()) {
- QScriptValueIterator it(items);
- while (it.hasNext()) {
- it.next();
- QScriptValue item = it.value();
- if (!item.isObject()) continue;
+ const auto array = items.toArray();
+ for (const QJsonValue &v : array) {
+ if (!v.isObject()) continue;
- // qDebug() << item.toString();
+ QJsonObject item = v.toObject();
- QString id = item.property("id").toString();
+ QString id = item["id"].toString();
Video *video = videoMap.value(id);
if (!video) {
qWarning() << "No video for id" << id;
continue;
}
- QString isoPeriod = item.property("contentDetails").property("duration").toString();
+ QString isoPeriod = item["contentDetails"].toObject()["duration"].toString();
int duration = DataUtils::parseIsoPeriod(isoPeriod);
video->setDuration(duration);
- uint viewCount = item.property("statistics").property("viewCount").toUInt32();
+ int viewCount = item["statistics"].toObject()["viewCount"].toString().toInt();
video->setViewCount(viewCount);
// TODO cache by etag?