From 01240dda2470af56545172de328665d0398b324a Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Mon, 15 Feb 2021 19:56:17 +0100 Subject: [PATCH] #105 can fetch list of categories and feeds, lang sync --- localization/rssguard_ru.ts | 24 +++++------ localization/rssguard_sv.ts | 38 ++++++++--------- resources/scripts/7za | 2 +- .../network-web/networkfactory.cpp | 6 ++- .../services/feedly/feedlynetwork.cpp | 42 ++++++++++++++++--- .../services/feedly/feedlynetwork.h | 4 +- .../services/feedly/feedlyserviceroot.cpp | 10 ++++- 7 files changed, 84 insertions(+), 42 deletions(-) diff --git a/localization/rssguard_ru.ts b/localization/rssguard_ru.ts index a79f21fd7..2570f54e3 100644 --- a/localization/rssguard_ru.ts +++ b/localization/rssguard_ru.ts @@ -573,11 +573,11 @@ Status: %3 Developer access token - + Токен доступа разработчика Get token - + Получить токен message(s) @@ -605,11 +605,11 @@ Status: %3 Your %1 build has official Feedly support. You do not have to use "developer acess token". You can therefore leave corresponding field empty. - + У вашей сборки %1 есть официальная поддержка Feedly. Вам не обязательно использовать «токен доступа разработчика». Поэтому вы можете оставить соответствующее поле пустым. Your %1 does not offer official Feedly support, thus you must authorize via special authorization code called "developer access token". These tokens are usually valid only for 1 month and allow only 250 API calls each day. - + %1 не предлагает официальную поддержку Feedly, поэтому вы должны авторизоваться с помощью специального кода авторизации, который называется «токен доступа разработчика». Эти токены обычно действительны только в течение 1 месяца и допускают только 250 вызовов API в день. = unlimited @@ -649,15 +649,15 @@ Status: %3 Login was successful. - + Вход прошел успешно. Make sure your "development access token" is correct and your internet works. - + Убедитесь, что ваш «токен доступа разработки» правильный и нет проблем с Интернет-сетью. Some problems. - + Некоторые проблемы. Username cannot be empty. @@ -669,18 +669,18 @@ Status: %3 Access token is empty. - + Токен доступа пуст. Access token is okay. - + Токен доступа в порядке. FeedlyNetwork Feedly: authentication error - + Feedly: ошибка аутентификации Click this to login again. Error is: '%1' @@ -688,7 +688,7 @@ Status: %3 Feedly: authorization denied - + Feedly: авторизация отклонена Click this to login again. @@ -700,7 +700,7 @@ Status: %3 Your login to Feedly was authorized. - + Ваш логин в Feedly был авторизован. diff --git a/localization/rssguard_sv.ts b/localization/rssguard_sv.ts index 499015da6..567749e4c 100644 --- a/localization/rssguard_sv.ts +++ b/localization/rssguard_sv.ts @@ -573,11 +573,11 @@ Status: %3 Developer access token - + Åtkomst-token för utvecklare Get token - + Hämta token message(s) @@ -605,11 +605,11 @@ Status: %3 Your %1 build has official Feedly support. You do not have to use "developer acess token". You can therefore leave corresponding field empty. - + Din %1 har officiellt Feedly-stöd. Du behöver inte använda "Åtkomst-token för utvecklare". Du kan därför lämna motsvarande fält tomt. Your %1 does not offer official Feedly support, thus you must authorize via special authorization code called "developer access token". These tokens are usually valid only for 1 month and allow only 250 API calls each day. - + Din %1 har inte officiellt Feedly-stöd. Därför måste du använda en speciell auktoriseringskod kallad "Åtkomst-token för utvecklare". Dessa token är vanligtvis giltiga i endast en månad och tillåter bara 250 API-anrop per dag. = unlimited @@ -649,15 +649,15 @@ Status: %3 Login was successful. - + Inloggning slutförd Make sure your "development access token" is correct and your internet works. - + Tillse att din "Åtkomst-token för utvecklare" är korrekt och att din internetuppkoppling fungerar. Some problems. - + Lite problem. Username cannot be empty. @@ -669,18 +669,18 @@ Status: %3 Access token is empty. - + Åtkomst-token saknas. Access token is okay. - + Åtkomst-token är OK. FeedlyNetwork Feedly: authentication error - + Feedly: Autentiseringsfel Click this to login again. Error is: '%1' @@ -688,7 +688,7 @@ Status: %3 Feedly: authorization denied - + Feedly: Autentisering nekad Click this to login again. @@ -700,7 +700,7 @@ Status: %3 Your login to Feedly was authorized. - + Din inloggning till Feedly godkändes. @@ -1173,7 +1173,7 @@ att funktionen inte är implementerad än. FormEditFeedlyAccount Service setup - + Tjänstinställning @@ -2695,7 +2695,7 @@ Inloggningstoken upphör: %2 GreaderNetwork Other services - + Andra tjänster @@ -3637,7 +3637,7 @@ genom att klicka på denna popup-avisering. Keep up with the topics and trends you care about, without the overwhelm. Feedly is a secure space where you can privately organize and research the topics and trends that matter to you. - + Håll koll på de ämnen och trender du bryr dig om, utan att överdriva. Feedly är ett säkert utrymme där du privat kan organisera och utforska de ämnen och trender som är viktiga för dig. @@ -4631,19 +4631,19 @@ Typ: %3 The source does not seem to use "#" separator for arguments. - + Källan verkar inte använda "#" som separator för argument. Command is ok. - + Kommandot är OK. Command not seem to use "#" separator for arguments. - + Kommandot verkar inte använda "#" som separator för argument. Command is empty. - + Kommano saknas. diff --git a/resources/scripts/7za b/resources/scripts/7za index 47f412575..9c10723bf 160000 --- a/resources/scripts/7za +++ b/resources/scripts/7za @@ -1 +1 @@ -Subproject commit 47f4125753452eff8800dbd6600c5a05540b15d9 +Subproject commit 9c10723bfbaf6cb85107d6ee16e0324e9e487749 diff --git a/src/librssguard/network-web/networkfactory.cpp b/src/librssguard/network-web/networkfactory.cpp index 2e84624a0..82ac35c2a 100644 --- a/src/librssguard/network-web/networkfactory.cpp +++ b/src/librssguard/network-web/networkfactory.cpp @@ -142,11 +142,15 @@ QNetworkReply::NetworkError NetworkFactory::downloadIcon(const QList& u QNetworkReply::NetworkError network_result = QNetworkReply::NetworkError::UnknownNetworkError; for (const QString& url : urls) { + if (url.isEmpty()) { + continue; + } + QByteArray icon_data; network_result = performNetworkOperation(url, timeout, - QByteArray(), + {}, icon_data, QNetworkAccessManager::Operation::GetOperation, {}, diff --git a/src/librssguard/services/feedly/feedlynetwork.cpp b/src/librssguard/services/feedly/feedlynetwork.cpp index 9e737ffab..b1cd2ba34 100755 --- a/src/librssguard/services/feedly/feedlynetwork.cpp +++ b/src/librssguard/services/feedly/feedlynetwork.cpp @@ -70,10 +70,11 @@ RootItem* FeedlyNetwork::collections(bool obtain_icons) { throw NetworkException(result.first); } - return decodeCollections(output_msgs); + return decodeCollections(output_msgs, obtain_icons, m_service->networkProxy(), timeout); } -RootItem* FeedlyNetwork::decodeCollections(const QByteArray& json, bool obtain_url) const { +RootItem* FeedlyNetwork::decodeCollections(const QByteArray& json, bool obtain_icons, + const QNetworkProxy& proxy, int timeout) const { QJsonDocument doc = QJsonDocument::fromJson(json); auto* parent = new RootItem(); QList used_feeds; @@ -87,18 +88,45 @@ RootItem* FeedlyNetwork::decodeCollections(const QByteArray& json, bool obtain_u for (const QJsonValue& fee : cat["feeds"].toArray()) { QJsonObject fee_obj = fee.toObject(); + + if (used_feeds.contains(fee_obj["id"].toString())) { + qWarningNN << LOGSEC_FEEDLY + << "Feed" + << QUOTE_W_SPACE(fee_obj["id"].toString()) + << "is already decoded and cannot be placed under several categories."; + continue; + } + auto* feed = new FeedlyFeed(category); feed->setTitle(fee_obj["title"].toString()); feed->setDescription(fee_obj["description"].toString()); feed->setCustomId(fee_obj["id"].toString()); - if (obtain_url) { - // TODO: TODO + if (obtain_icons) { + QIcon icon; + auto result = NetworkFactory::downloadIcon({ fee_obj["iconUrl"].toString(), + fee_obj["logo"].toString(), + fee_obj["website"].toString() }, + timeout, + icon, + proxy); + + if (result == QNetworkReply::NetworkError::NoError && !icon.isNull()) { + feed->setIcon(icon); + } } + + used_feeds.append(feed->customId()); + category->appendChild(feed); } - parent->appendChild(category); + if (category->childCount() == 0) { + delete category; + } + else { + parent->appendChild(category); + } } return parent; @@ -136,6 +164,10 @@ QVariantHash FeedlyNetwork::profile(const QNetworkProxy& network_proxy) { return QJsonDocument::fromJson(output_msgs).object().toVariantHash(); } +QList FeedlyNetwork::tags() { + return {}; +} + QString FeedlyNetwork::username() const { return m_username; } diff --git a/src/librssguard/services/feedly/feedlynetwork.h b/src/librssguard/services/feedly/feedlynetwork.h index 54bb8736d..94ce765d8 100755 --- a/src/librssguard/services/feedly/feedlynetwork.h +++ b/src/librssguard/services/feedly/feedlynetwork.h @@ -22,7 +22,7 @@ class FeedlyNetwork : public QObject { // API operations. QVariantHash profile(const QNetworkProxy& network_proxy); - + QList tags(); RootItem* collections(bool obtain_icons); // Getters and setters. @@ -55,7 +55,7 @@ class FeedlyNetwork : public QObject { QString fullUrl(Service service) const; QString bearer() const; - RootItem* decodeCollections(const QByteArray& json, bool obtain_url) const; + RootItem* decodeCollections(const QByteArray& json, bool obtain_icons, const QNetworkProxy& proxy, int timeout = 0) const; QPair bearerHeader(const QString& bearer) const; private: diff --git a/src/librssguard/services/feedly/feedlyserviceroot.cpp b/src/librssguard/services/feedly/feedlyserviceroot.cpp index 9ce5e1152..694da0ddb 100755 --- a/src/librssguard/services/feedly/feedlyserviceroot.cpp +++ b/src/librssguard/services/feedly/feedlyserviceroot.cpp @@ -9,6 +9,7 @@ #include "miscellaneous/mutex.h" #include "miscellaneous/textfactory.h" #include "services/abstract/importantnode.h" +#include "services/abstract/labelsnode.h" #include "services/abstract/recyclebin.h" #include "services/feedly/feedlyentrypoint.h" #include "services/feedly/feedlyfeed.h" @@ -112,9 +113,14 @@ void FeedlyServiceRoot::saveAccountDataToDatabase(bool creating_new) { } RootItem* FeedlyServiceRoot::obtainNewTreeForSyncIn() const { - return nullptr; + auto tree = m_network->collections(true); + auto* lblroot = new LabelsNode(tree); + auto labels = m_network->tags(); - //return m_network->categoriesFeedsLabelsTree(true, networkProxy()); + lblroot->setChildItems(labels); + tree->appendChild(lblroot); + + return tree; } void FeedlyServiceRoot::loadFromDatabase() {