From e3e511dcba6d38b84d6ae4adfdea89a0af594a4b Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Fri, 29 Jan 2021 20:25:42 +0100 Subject: [PATCH] save --- resources/graphics/misc/freshrss.png | Bin 0 -> 6218 bytes resources/graphics/misc/theoldreader.png | Bin 0 -> 4034 bytes resources/rssguard.qrc | 2 + resources/scripts/7za | 2 +- .../network-web/networkfactory.cpp | 5 +- .../services/greader/definitions.h | 3 + .../services/greader/greadernetwork.cpp | 77 ++++++++++++++---- .../services/greader/greadernetwork.h | 3 +- .../services/greader/greaderserviceroot.cpp | 14 ++++ 9 files changed, 86 insertions(+), 20 deletions(-) create mode 100644 resources/graphics/misc/freshrss.png create mode 100644 resources/graphics/misc/theoldreader.png diff --git a/resources/graphics/misc/freshrss.png b/resources/graphics/misc/freshrss.png new file mode 100644 index 0000000000000000000000000000000000000000..c090eff0460ba2b8550d194fc7f96d88b4be25b4 GIT binary patch literal 6218 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 literal 0 HcmV?d00001 diff --git a/resources/graphics/misc/theoldreader.png b/resources/graphics/misc/theoldreader.png new file mode 100644 index 0000000000000000000000000000000000000000..6863efd89751c77164845b3277bfaf7afad6e144 GIT binary patch literal 4034 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 literal 0 HcmV?d00001 diff --git a/resources/rssguard.qrc b/resources/rssguard.qrc index 3c58b674a..60a4f36fd 100755 --- a/resources/rssguard.qrc +++ b/resources/rssguard.qrc @@ -16,11 +16,13 @@ graphics/misc/adblock.png graphics/misc/adblock-disabled.png + graphics/misc/freshrss.png graphics/misc/gmail.png graphics/misc/google.png graphics/misc/image-placeholder.png graphics/misc/inoreader.png graphics/misc/nextcloud.png + graphics/misc/theoldreader.png graphics/misc/tt-rss.png graphics/misc/flags/cs.png 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 57a6221d4..2e84624a0 100644 --- a/src/librssguard/network-web/networkfactory.cpp +++ b/src/librssguard/network-web/networkfactory.cpp @@ -137,8 +137,9 @@ QString NetworkFactory::networkErrorText(QNetworkReply::NetworkError error_code) } } -QNetworkReply::NetworkError NetworkFactory::downloadIcon(const QList& urls, int timeout, QIcon& output, const QNetworkProxy& custom_proxy) { - QNetworkReply::NetworkError network_result = QNetworkReply::UnknownNetworkError; +QNetworkReply::NetworkError NetworkFactory::downloadIcon(const QList& urls, int timeout, + QIcon& output, const QNetworkProxy& custom_proxy) { + QNetworkReply::NetworkError network_result = QNetworkReply::NetworkError::UnknownNetworkError; for (const QString& url : urls) { QByteArray icon_data; diff --git a/src/librssguard/services/greader/definitions.h b/src/librssguard/services/greader/definitions.h index 4249394ae..f7f75a923 100755 --- a/src/librssguard/services/greader/definitions.h +++ b/src/librssguard/services/greader/definitions.h @@ -23,6 +23,9 @@ #define GREADER_API_EDIT_TAG_BATCH 200 #define GREADER_API_ANY_LABEL "user/-/label" +// The Old Reader. +#define TOR_SPONSORED_STREAM_ID "tor/sponsored" + // FreshRSS. #define FRESHRSS_BASE_URL_PATH "api/greader.php/" diff --git a/src/librssguard/services/greader/greadernetwork.cpp b/src/librssguard/services/greader/greadernetwork.cpp index 98bc7b87e..cb709bc59 100755 --- a/src/librssguard/services/greader/greadernetwork.cpp +++ b/src/librssguard/services/greader/greadernetwork.cpp @@ -179,18 +179,42 @@ RootItem* GreaderNetwork::categoriesFeedsLabelsTree(bool obtain_icons, const QNe return nullptr; } - auto root = decodeTagsSubscriptions(output_labels, output_feeds, obtain_icons); - - return root; + return decodeTagsSubscriptions(output_labels, output_feeds, obtain_icons, proxy); } -RootItem* GreaderNetwork::decodeTagsSubscriptions(const QString& categories, const QString& feeds, bool obtain_icons) { +RootItem* GreaderNetwork::decodeTagsSubscriptions(const QString& categories, const QString& feeds, + bool obtain_icons, const QNetworkProxy& proxy) { auto* parent = new RootItem(); auto timeout = qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(); - QJsonArray json = QJsonDocument::fromJson(categories.toUtf8()).object()["tags"].toArray(); QMap cats; QList lbls; + QJsonArray json; + if (m_service == GreaderServiceRoot::Service::Bazqux) { + // We need to process subscription list first and extract categories. + json = QJsonDocument::fromJson(feeds.toUtf8()).object()["subscriptions"].toArray(); + + for (const QJsonValue& feed : json) { + auto subscription = feed.toObject(); + + for (const QJsonValue& cat : subscription["categories"].toArray()) { + auto cat_obj = cat.toObject(); + auto cat_id = simplifyStreamId(cat_obj["id"].toString()); + + if (!cats.contains(cat_id)) { + auto* category = new Category(); + + category->setTitle(cat_id.mid(cat_id.lastIndexOf(QL1C('/')) + 1)); + category->setCustomId(cat_id); + + cats.insert(category->customId(), category); + parent->appendChild(category); + } + } + } + } + + json = QJsonDocument::fromJson(categories.toUtf8()).object()["tags"].toArray(); cats.insert(QString(), parent); for (const QJsonValue& obj : json) { @@ -218,6 +242,19 @@ RootItem* GreaderNetwork::decodeTagsSubscriptions(const QString& categories, con new_lbl->setCustomId(label_id); lbls.append(new_lbl); } + else if (m_service == GreaderServiceRoot::Service::Bazqux && + label_id.contains(QSL("/label/"))) { + label_id = simplifyStreamId(label_id); + + if (!cats.contains(label_id)) { + // This stream is not a category, it is label, bitches! + QString plain_name = QRegularExpression(".+\\/([^\\/]+)").match(label_id).captured(1); + auto* new_lbl = new Label(plain_name, TextFactory::generateColorFromText(label_id)); + + new_lbl->setCustomId(label_id); + lbls.append(new_lbl); + } + } } json = QJsonDocument::fromJson(feeds.toUtf8()).object()["subscriptions"].toArray(); @@ -230,11 +267,15 @@ RootItem* GreaderNetwork::decodeTagsSubscriptions(const QString& categories, con QString parent_label; QJsonArray assigned_categories = subscription["categories"].toArray(); + if (id.startsWith(TOR_SPONSORED_STREAM_ID)) { + continue; + } + for (const QJsonValue& cat : assigned_categories) { QString potential_id = cat.toObject()["id"].toString(); if (potential_id.contains(QSL("/label/"))) { - parent_label = potential_id; + parent_label = m_service == GreaderServiceRoot::Service::Bazqux ? simplifyStreamId(potential_id) : potential_id; break; } } @@ -248,7 +289,9 @@ RootItem* GreaderNetwork::decodeTagsSubscriptions(const QString& categories, con feed->setCustomId(id); if (obtain_icons) { - QString icon_url = subscription["iconUrl"].toString(); + QString icon_url = subscription.contains(QSL("iconUrl")) + ? subscription["iconUrl"].toString() + : subscription["htmlUrl"].toString(); if (!icon_url.isEmpty()) { QByteArray icon_data; @@ -257,15 +300,13 @@ RootItem* GreaderNetwork::decodeTagsSubscriptions(const QString& categories, con icon_url = QUrl(baseUrl()).scheme() + QSL(":") + icon_url; } - if (NetworkFactory::performNetworkOperation(icon_url, timeout, - {}, icon_data, - QNetworkAccessManager::Operation::GetOperation).first == - QNetworkReply::NetworkError::NoError) { - // Icon downloaded, set it up. - QPixmap icon_pixmap; + QIcon icon; - icon_pixmap.loadFromData(icon_data); - feed->setIcon(QIcon(icon_pixmap)); + if (NetworkFactory::downloadIcon({ icon_url }, + timeout, + icon, + proxy) == QNetworkReply::NetworkError::NoError) { + feed->setIcon(icon); } } } @@ -378,7 +419,7 @@ QString GreaderNetwork::serviceToString(GreaderServiceRoot::Service service) { return QSL("Bazqux"); case GreaderServiceRoot::Service::TheOldReader: - return QSL("TheOldReader"); + return QSL("The Old Reader"); default: return tr("Unknown service"); @@ -408,6 +449,10 @@ bool GreaderNetwork::ensureLogin(const QNetworkProxy& proxy, QNetworkReply::Netw return true; } +QString GreaderNetwork::simplifyStreamId(const QString& stream_id) const { + return QString(stream_id).replace(QRegularExpression("\\/\\d+\\/"), QSL("/-/")); +} + QList GreaderNetwork::decodeStreamContents(ServiceRoot* root, const QString& stream_json_data, const QString& stream_id) { diff --git a/src/librssguard/services/greader/greadernetwork.h b/src/librssguard/services/greader/greadernetwork.h index 5574082ba..a203cf55a 100755 --- a/src/librssguard/services/greader/greadernetwork.h +++ b/src/librssguard/services/greader/greadernetwork.h @@ -70,8 +70,9 @@ class GreaderNetwork : public QObject { // Make sure we are logged in and if we are not, return error. bool ensureLogin(const QNetworkProxy& proxy, QNetworkReply::NetworkError* output = nullptr); + QString simplifyStreamId(const QString& stream_id) const; QList decodeStreamContents(ServiceRoot* root, const QString& stream_json_data, const QString& stream_id); - RootItem* decodeTagsSubscriptions(const QString& categories, const QString& feeds, bool obtain_icons); + RootItem* decodeTagsSubscriptions(const QString& categories, const QString& feeds, bool obtain_icons, const QNetworkProxy& proxy); QString sanitizedBaseUrl() const; QString generateFullUrl(Operations operation) const; diff --git a/src/librssguard/services/greader/greaderserviceroot.cpp b/src/librssguard/services/greader/greaderserviceroot.cpp index 026b13a18..dc2022e0f 100755 --- a/src/librssguard/services/greader/greaderserviceroot.cpp +++ b/src/librssguard/services/greader/greaderserviceroot.cpp @@ -142,6 +142,20 @@ void GreaderServiceRoot::saveAllCachedData(bool ignore_errors) { void GreaderServiceRoot::updateTitle() { setTitle(QString("%1 (%2)").arg(m_network->username(), m_network->serviceToString(m_network->service()))); + + switch (m_network->service()) { + case Service::TheOldReader: + setIcon(qApp->icons()->miscIcon(QSL("theoldreader"))); + break; + + case Service::FreshRss: + setIcon(qApp->icons()->miscIcon(QSL("freshrss"))); + break; + + default: + setIcon(GreaderEntryPoint().icon()); + break; + } } void GreaderServiceRoot::saveAccountDataToDatabase(bool creating_new) {