$END_LICENSE */
#include "ytcategories.h"
-#include "networkaccess.h"
-#ifdef APP_YT3
+#include "http.h"
+#include "httputils.h"
#include "datautils.h"
#include "yt3.h"
#include "ytregions.h"
-#include <QtScript>
-#endif
-#include "compatibility/qurlqueryhelper.h"
-
-namespace The {
-NetworkAccess* http();
-}
YTCategories::YTCategories(QObject *parent) : QObject(parent) { }
void YTCategories::loadCategories(QString language) {
- if (language.isEmpty())
- language = QLocale::system().uiLanguages().first();
+ if (language.isEmpty()) {
+ language = QLocale::system().uiLanguages().at(0);
+ int index = language.indexOf('-');
+ if (index > 0) language = language.mid(0, index);
+ }
lastLanguage = language;
-#ifdef APP_YT3
QUrl url = YT3::instance().method("videoCategories");
- {
- QUrlQueryHelper urlHelper(url);
- urlHelper.addQueryItem("part", "snippet");
- urlHelper.addQueryItem("hl", language);
-
- QString regionCode = YTRegions::currentRegionId();
- if (regionCode.isEmpty()) regionCode = "us";
- urlHelper.addQueryItem("regionCode", regionCode);
- }
-#else
- QString url = "http://gdata.youtube.com/schemas/2007/categories.cat?hl=" + language;
-#endif
-
-
- QObject *reply = The::http()->get(url);
- connect(reply, SIGNAL(data(QByteArray)), SLOT(parseCategories(QByteArray)));
- connect(reply, SIGNAL(error(QNetworkReply*)), SLOT(requestError(QNetworkReply*)));
-}
-
-#ifdef APP_YT3
-
-void YTCategories::parseCategories(QByteArray bytes) {
- QList<YTCategory> categories;
- QScriptEngine engine;
- QScriptValue json = engine.evaluate("(" + QString::fromUtf8(bytes) + ")");
+ QUrlQuery q(url);
+ q.addQueryItem("part", "snippet");
+ q.addQueryItem("hl", language);
- QScriptValue items = json.property("items");
+ QString regionCode = YTRegions::currentRegionId();
+ if (regionCode.isEmpty()) regionCode = "us";
+ q.addQueryItem("regionCode", regionCode);
+ url.setQuery(q);
- 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()) continue;
-
- QScriptValue snippet = item.property("snippet");
-
- bool isAssignable = snippet.property("assignable").toBool();
- if (!isAssignable) continue;
-
- YTCategory category;
- category.term = item.property("id").toString();
- category.label = snippet.property("title").toString();
- categories << category;
- }
- }
-
- emit categoriesLoaded(categories);
+ QObject *reply = HttpUtils::yt().get(url);
+ connect(reply, SIGNAL(data(QByteArray)), SLOT(parseCategories(QByteArray)));
+ connect(reply, SIGNAL(error(QString)), SLOT(requestError(QString)));
}
-#else
-
-void YTCategories::parseCategories(QByteArray bytes) {
- QList<YTCategory> categories;
-
- QXmlStreamReader xml(bytes);
- while (!xml.atEnd()) {
- xml.readNext();
- if (xml.isStartElement() && xml.name() == QLatin1String("category")) {
- QString term = xml.attributes().value("term").toString();
- QString label = xml.attributes().value("label").toString();
- while(xml.readNextStartElement())
- if (xml.name() == QLatin1String("assignable")) {
- YTCategory category;
- category.term = term;
- category.label = label;
- categories << category;
- } else xml.skipCurrentElement();
- }
- }
-
- if (xml.hasError()) {
- emit error(xml.errorString());
- return;
+void YTCategories::parseCategories(const QByteArray &bytes) {
+ QJsonDocument doc = QJsonDocument::fromJson(bytes);
+ QJsonObject obj = doc.object();
+ const QJsonArray items = obj["items"].toArray();
+
+ QVector<YTCategory> categories;
+ categories.reserve(items.size());
+ for (const QJsonValue &v : items) {
+ QJsonObject item = v.toObject();
+ QJsonObject snippet = item["snippet"].toObject();
+ bool isAssignable = snippet["assignable"].toBool();
+ if (!isAssignable) continue;
+
+ YTCategory category;
+ category.term = item["id"].toString();
+ category.label = snippet["title"].toString();
+ // if (category.label.startsWith(QLatin1String("News"))) continue;
+ categories << category;
}
emit categoriesLoaded(categories);
}
-#endif
-
-void YTCategories::requestError(QNetworkReply *reply) {
+void YTCategories::requestError(const QString &message) {
if (lastLanguage != "en") loadCategories("en");
- else emit error(reply->errorString());
+ else emit error(message);
}