X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fpaginatedvideosource.cpp;fp=src%2Fpaginatedvideosource.cpp;h=aa44efe8223dcd84569139ff2a999b4995c2b0ab;hb=533489a63a9716c645a11a99ca446978b20eedd0;hp=115cf1f1c06a6d9e066f67f7bba48d98f8788d35;hpb=994e6e5e95196b0e36c680b1fd496f12d71739c9;p=minitube diff --git a/src/paginatedvideosource.cpp b/src/paginatedvideosource.cpp index 115cf1f..aa44efe 100644 --- a/src/paginatedvideosource.cpp +++ b/src/paginatedvideosource.cpp @@ -23,24 +23,20 @@ $END_LICENSE */ #include "yt3.h" #include "yt3listparser.h" #include "datautils.h" -#include "compatibility/qurlqueryhelper.h" #include "video.h" -#include "networkaccess.h" - -namespace The { -NetworkAccess* http(); -QHash* 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(); } @@ -50,7 +46,7 @@ bool PaginatedVideoSource::maybeReloadToken(int max, int startIndex) { if (nextPageToken.isEmpty()) { // previous request did not return a page token. Game over. - // emit gotVideos(QList()); + // emit gotVideos(QVector()); emit finished(0); return true; } @@ -86,19 +82,21 @@ bool PaginatedVideoSource::isPageTokenExpired() { 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 &videos) { +void PaginatedVideoSource::loadVideoDetails(const QVector &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()) { @@ -110,44 +108,40 @@ void PaginatedVideoSource::loadVideoDetails(const QList &videos) { } 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?