From a639f06891656ca3fb3f91ea66ddf3a30d364e29 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Wed, 23 Mar 2022 09:12:58 +0100 Subject: [PATCH] replace invalid article dates with current date, fix date/time for gmail when standard "Date" header is missing --- src/librssguard/core/message.cpp | 7 +++---- .../services/gmail/gmailnetworkfactory.cpp | 17 ++++++++++++++--- .../services/gmail/gmailnetworkfactory.h | 1 + 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/librssguard/core/message.cpp b/src/librssguard/core/message.cpp index 5507f56dd..bf186d084 100644 --- a/src/librssguard/core/message.cpp +++ b/src/librssguard/core/message.cpp @@ -101,10 +101,9 @@ void Message::sanitize(const Feed* feed, bool fix_future_datetimes) { } // Fix datetimes in future. - if (fix_future_datetimes && - m_createdFromFeed && - m_created.toUTC() > QDateTime::currentDateTimeUtc()) { - qWarningNN << LOGSEC_CORE << "Fixing future date of article" << QUOTE_W_SPACE(m_title) << "from invalid date/time" + if ((fix_future_datetimes && m_createdFromFeed && m_created.toUTC() > QDateTime::currentDateTimeUtc()) || + (m_createdFromFeed && !m_created.isValid())) { + qWarningNN << LOGSEC_CORE << "Fixing date of article" << QUOTE_W_SPACE(m_title) << "from invalid date/time" << QUOTE_W_SPACE_DOT(m_created); m_createdFromFeed = false; diff --git a/src/librssguard/services/gmail/gmailnetworkfactory.cpp b/src/librssguard/services/gmail/gmailnetworkfactory.cpp index c713717c0..142f58f15 100644 --- a/src/librssguard/services/gmail/gmailnetworkfactory.cpp +++ b/src/librssguard/services/gmail/gmailnetworkfactory.cpp @@ -189,6 +189,8 @@ QList GmailNetworkFactory::messages(const QString& stream_id, return {}; } + const bool is_spam_feed = QString::compare(stream_id, QSL("SPAM"), Qt::CaseSensitivity::CaseInsensitive) == 0; + // 1. Get unread IDs for a feed. // 2. Get read IDs for a feed. // 3. Get starred IDs for a feed. @@ -196,11 +198,11 @@ QList GmailNetworkFactory::messages(const QString& stream_id, QStringList remote_read_ids_list, remote_unread_ids_list, remote_starred_ids_list; try { - remote_starred_ids_list = list(stream_id, {}, 0, QSL("is:starred"), custom_proxy); - remote_unread_ids_list = list(stream_id, {}, batchSize(), QSL("is:unread"), custom_proxy); + remote_starred_ids_list = list(stream_id, {}, 0, is_spam_feed, QSL("is:starred"), custom_proxy); + remote_unread_ids_list = list(stream_id, {}, batchSize(), is_spam_feed, QSL("is:unread"), custom_proxy); if (!downloadOnlyUnreadMessages()) { - remote_read_ids_list = list(stream_id, {}, batchSize(), QSL("is:read"), custom_proxy); + remote_read_ids_list = list(stream_id, {}, batchSize(), is_spam_feed, QSL("is:read"), custom_proxy); } } catch (const NetworkException& net_ex) { @@ -379,6 +381,7 @@ QNetworkReply::NetworkError GmailNetworkFactory::markMessagesStarred(RootItem::I QStringList GmailNetworkFactory::list(const QString& stream_id, const QStringList& label_ids, int max_results, + bool include_spam, const QString& query, const QNetworkProxy& custom_proxy) { QList message_ids; @@ -401,6 +404,10 @@ QStringList GmailNetworkFactory::list(const QString& stream_id, target_url += QSL("&q=%1").arg(query); } + if (include_spam) { + target_url += QSL("&includeSpamTrash=true"); + } + int remaining = max_results - message_ids.size(); if (max_results <= 0 || remaining > 500) { @@ -550,6 +557,10 @@ bool GmailNetworkFactory::fillFullMessage(Message& msg, const QJsonObject& json, msg.m_createdFromFeed = true; msg.m_created = TextFactory::parseDateTime(headers[QSL("Date")]); + if (!msg.m_created.isValid()) { + msg.m_created = TextFactory::parseDateTime(headers[QSL("date")]); + } + if (msg.m_title.isEmpty()) { msg.m_title = tr("No subject"); } diff --git a/src/librssguard/services/gmail/gmailnetworkfactory.h b/src/librssguard/services/gmail/gmailnetworkfactory.h index 5e02a459c..7f34ce22a 100644 --- a/src/librssguard/services/gmail/gmailnetworkfactory.h +++ b/src/librssguard/services/gmail/gmailnetworkfactory.h @@ -53,6 +53,7 @@ class GmailNetworkFactory : public QObject { QStringList list(const QString& stream_id, const QStringList& label_ids, int max_results, + bool include_spam, const QString& query, const QNetworkProxy& custom_proxy); QVariantHash getProfile(const QNetworkProxy& custom_proxy);