From 0ee1d034c7e3c0b39ffba46fc0ef1643e5202dd3 Mon Sep 17 00:00:00 2001 From: Luca Beltrame Date: Thu, 27 Aug 2015 19:29:55 +0200 Subject: [PATCH] Account for difference between boards when parsing XML Apparently there's nothing similar among these boards: Gelbooru and Konachan use xml attributes, and Danbooru uses proper tags. This is workarounded by adding a new parameter to parseDanbooruResult() which takes into account the difference between the two calls. Hopefully JSON isn't broken in Danbooru so I never have to use XML... --- src/libdanbooru/utils.cpp | 81 +++++++++++++++++++++++++-------------- src/libdanbooru/utils.h | 2 +- 2 files changed, 54 insertions(+), 29 deletions(-) diff --git a/src/libdanbooru/utils.cpp b/src/libdanbooru/utils.cpp index 91604a8..1c018e9 100644 --- a/src/libdanbooru/utils.cpp +++ b/src/libdanbooru/utils.cpp @@ -126,49 +126,74 @@ QUrl requestUrl(QUrl &url, const QString &path, const QString &username, return danbooruUrl; } -QList< QVariant > parseDanbooruResult(QByteArray data, QString xlmElement, bool *result) +QList< QVariant > parseDanbooruResult(QByteArray data, QString xlmElement, bool *result, ApiType apiType) { QXmlStreamReader reader; reader.addData(data); - QList postData; - while (!reader.atEnd() && !reader.hasError()) { + if (apiType != ApiType::OriginalDanbooru) { - QXmlStreamReader::TokenType token = reader.readNext(); + while (!reader.atEnd() && !reader.hasError()) { - if (token == QXmlStreamReader::StartDocument) { - continue; - } + QXmlStreamReader::TokenType token = reader.readNext(); - if (token == QXmlStreamReader::StartElement && - reader.name() == xlmElement) { - - QVariantMap values; - - QXmlStreamAttributes attributes = reader.attributes(); - -// qCDebug(LIBDANBOORU) << attributes; - - for (auto attribute : attributes) { - values.insert(attribute.name().toString(), - attribute.value().toString()); + if (token == QXmlStreamReader::StartDocument) { + continue; } - if (values.isEmpty()) { - *result = false; - qCWarning(LIBDANBOORU) << "No results found when parsing XML"; - return QList(); + if (token == QXmlStreamReader::StartElement && + reader.name() == xlmElement) { + + QVariantMap values; + + QXmlStreamAttributes attributes = reader.attributes(); + + // qCDebug(LIBDANBOORU) << attributes; + + for (auto attribute : attributes) { + values.insert(attribute.name().toString(), + attribute.value().toString()); + } + + if (values.isEmpty()) { + *result = false; + qCWarning(LIBDANBOORU) << "No results found when parsing XML"; + return QList(); + } + + QVariant converted = QVariant(values); + + postData.append(converted); + } + } + *result = true; + return postData; + } else { + QString plural = xlmElement + QString("s"); + while(reader.readNextStartElement()) { + + if (reader.name() == xlmElement) { + + QVariantMap values; + + while(reader.readNextStartElement()) { + values.insert(reader.name().toString(), reader.readElementText()); + } + QVariant converted = QVariant(values); + postData.append(converted); } - QVariant converted = QVariant(values); - - postData.append(converted); } + if (postData.isEmpty()) { + *result = false; + qCWarning(LIBDANBOORU) << "No results found when parsing XML"; + return QList(); + } + *result = true; + return postData; } - *result = true; - return postData; } QVariant parseDanbooruResult(QByteArray data, bool *result) diff --git a/src/libdanbooru/utils.h b/src/libdanbooru/utils.h index b844869..e097691 100644 --- a/src/libdanbooru/utils.h +++ b/src/libdanbooru/utils.h @@ -102,7 +102,7 @@ QUrl requestUrl(QUrl &url, const QString &path, const QString &username, const QString &password); QList parseDanbooruResult(QByteArray data, QString xlmElement, - bool *result); + bool *result, ApiType=ApiType::KonachanDanbooru); QVariant parseDanbooruResult(QByteArray data, bool *result); /**