From 6fa55946656b9284f3cccc67d8d8743135336c67 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Wed, 27 Sep 2017 11:42:41 +0200 Subject: [PATCH] More or less working message downloading - no state changes so far. --- src/services/inoreader/definitions.h | 6 ++ .../network/inoreadernetworkfactory.cpp | 79 ++++++++++++++++++- .../network/inoreadernetworkfactory.h | 1 + 3 files changed, 82 insertions(+), 4 deletions(-) diff --git a/src/services/inoreader/definitions.h b/src/services/inoreader/definitions.h index d75232d92..8dc9e4c51 100755 --- a/src/services/inoreader/definitions.h +++ b/src/services/inoreader/definitions.h @@ -24,12 +24,18 @@ #define INOREADER_OAUTH_AUTH_URL "https://www.inoreader.com/oauth2/auth" #define INOREADER_OAUTH_CLI_ID "1000000604" #define INOREADER_OAUTH_CLI_KEY "gsStoZ3aAoQJCgQxoFSuXkWI7Sly87yK" + #define INOREADER_REFRESH_TOKEN_KEY "refresh_token" #define INOREADER_ACCESS_TOKEN_KEY "access_token" + #define INOREADER_DEFAULT_BATCH_SIZE 100 #define INOREADER_MAX_BATCH_SIZE 999 #define INOREADER_MIN_BATCH_SIZE 20 +#define INOREADER_STATE_READING_LIST "state/com.google/reading-list" +#define INOREADER_STATE_READ "state/com.google/read" +#define INOREADER_STATE_IMPORTANT "state/com.google/starred" + #define INOREADER_API_FEED_CONTENTS "https://www.inoreader.com/reader/api/0/stream/contents" #define INOREADER_API_LIST_LABELS "https://www.inoreader.com/reader/api/0/tag/list" #define INOREADER_API_LIST_FEEDS "https://www.inoreader.com/reader/api/0/subscription/list" diff --git a/src/services/inoreader/network/inoreadernetworkfactory.cpp b/src/services/inoreader/network/inoreadernetworkfactory.cpp index 3503ea142..3c71b458f 100755 --- a/src/services/inoreader/network/inoreadernetworkfactory.cpp +++ b/src/services/inoreader/network/inoreadernetworkfactory.cpp @@ -102,20 +102,91 @@ RootItem* InoreaderNetworkFactory::feedsCategories(bool obtain_icons) { } QList InoreaderNetworkFactory::messages(const QString& stream_id, bool* is_error) { - QList messages; Downloader downloader; QEventLoop loop; QString target_url = INOREADER_API_FEED_CONTENTS; - target_url += QSL("/") + QUrl::toPercentEncoding(stream_id) + QString("/?n=").arg(batchSize()); - + target_url += QSL("/") + QUrl::toPercentEncoding(stream_id) + QString("?n=%1").arg(batchSize()); downloader.appendRawHeader(QString("Authorization").toLocal8Bit(), m_oauth2->bearer().toLocal8Bit()); + IOFactory::writeTextFile("aa.bb", target_url.toUtf8()); + // We need to quit event loop when the download finishes. connect(&downloader, &Downloader::completed, &loop, &QEventLoop::quit); - downloader.manipulateData(INOREADER_API_FEED_CONTENTS, QNetworkAccessManager::Operation::GetOperation); + downloader.manipulateData(target_url, QNetworkAccessManager::Operation::GetOperation); loop.exec(); + if (downloader.lastOutputError() != QNetworkReply::NetworkError::NoError) { + *is_error = true; + return QList(); + } + else { + QString messages_data = downloader.lastOutputData(); + + return decodeMessages(messages_data, stream_id); + } +} + +QList InoreaderNetworkFactory::decodeMessages(const QString& messages_json_data, const QString& stream_id) { + QList messages; + QJsonArray json = QJsonDocument::fromJson(messages_json_data.toUtf8()).object()["items"].toArray(); + + IOFactory::writeTextFile("aa.aa", messages_json_data.toUtf8()); + + messages.reserve(json.count()); + + foreach (const QJsonValue& obj, json) { + auto message_obj = obj.toObject(); + Message message; + + message.m_title = message_obj["title"].toString(); + message.m_author = message_obj["author"].toString(); + message.m_created = QDateTime::fromMSecsSinceEpoch(message_obj["published"].toInt()); + message.m_createdFromFeed = true; + message.m_customId = message_obj["id"].toString(); + + auto alternates = message_obj["alternate"].toArray(); + auto enclosures = message_obj["enclosure"].toArray(); + auto categories = message_obj["categories"].toArray(); + + foreach (const QJsonValue& alt, alternates) { + auto alt_obj = alt.toObject(); + QString mime = alt_obj["type"].toString(); + QString href = alt_obj["href"].toString(); + + if (mime == QL1S("text/html")) { + message.m_url = href; + } + else { + message.m_enclosures.append(Enclosure(href, mime)); + } + } + + foreach (const QJsonValue& enc, enclosures) { + auto enc_obj = enc.toObject(); + QString mime = enc_obj["type"].toString(); + QString href = enc_obj["href"].toString(); + + message.m_enclosures.append(Enclosure(href, mime)); + } + + foreach (const QJsonValue& cat, categories) { + QString category = cat.toString(); + + if (category.contains(INOREADER_STATE_READ)) { + message.m_isRead = !category.contains(INOREADER_STATE_READING_LIST); + } + else if (category.contains(INOREADER_STATE_IMPORTANT)) { + message.m_isImportant = category.contains(INOREADER_STATE_IMPORTANT); + } + } + + message.m_contents = message_obj["summary"].toObject()["content"].toString(); + message.m_feedId = stream_id; + + messages.append(message); + } + return messages; } diff --git a/src/services/inoreader/network/inoreadernetworkfactory.h b/src/services/inoreader/network/inoreadernetworkfactory.h index d8fc7388d..b05503d82 100755 --- a/src/services/inoreader/network/inoreadernetworkfactory.h +++ b/src/services/inoreader/network/inoreadernetworkfactory.h @@ -51,6 +51,7 @@ class InoreaderNetworkFactory : public QObject { QList messages(const QString& stream_id, bool* is_error); private: + QList decodeMessages(const QString& messages_json_data, const QString& stream_id); RootItem* decodeFeedCategoriesData(const QString& categories, const QString& feeds, bool obtain_icons); void initializeOauth();