]> git.sur5r.net Git - minitube/blobdiff - src/ytcategories.cpp
New upstream version 2.9
[minitube] / src / ytcategories.cpp
index 8ac7a4249ad513824730801beb6a558d70ff13cf..4a34ce2d7f3be042068cda0f7d8e3374bbab6808 100644 (file)
@@ -19,112 +19,62 @@ along with Minitube.  If not, see <http://www.gnu.org/licenses/>.
 $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);
 }