From d94b8f08ab8e1199a1fcb06437f5df62de7d8f7e Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Mon, 21 May 2018 12:21:54 +0300 Subject: [PATCH] Use RSS feed update time as a fallback Some sites omit publication date in its RSS feed articles that prevents "Ignore Subsequent Matches" to work properly. Closes #8959. --- src/base/rss/rss_article.cpp | 21 +++++++++++++++++---- src/base/rss/rss_feed.cpp | 8 +++++++- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/base/rss/rss_article.cpp b/src/base/rss/rss_article.cpp index c53d3bfca..47264b79e 100644 --- a/src/base/rss/rss_article.cpp +++ b/src/base/rss/rss_article.cpp @@ -38,6 +38,19 @@ using namespace RSS; +namespace +{ + QVariantHash articleDataFromJSON(const QJsonObject &jsonObj) + { + auto varHash = jsonObj.toVariantHash(); + // JSON object store DateTime as string so we need to convert it + varHash[Article::KeyDate] = + QDateTime::fromString(jsonObj.value(Article::KeyDate).toString(), Qt::RFC2822Date); + + return varHash; + } +} + const QString Article::KeyId(QStringLiteral("id")); const QString Article::KeyDate(QStringLiteral("date")); const QString Article::KeyTitle(QStringLiteral("title")); @@ -60,6 +73,9 @@ Article::Article(Feed *feed, const QVariantHash &varHash) , m_isRead(varHash.value(KeyIsRead, false).toBool()) , m_data(varHash) { + if (!m_date.isValid()) + throw std::runtime_error("Bad RSS Article data"); + // If item does not have a guid, fall back to some other identifier if (m_guid.isEmpty()) m_guid = varHash.value(KeyTorrentURL).toString(); @@ -77,11 +93,8 @@ Article::Article(Feed *feed, const QVariantHash &varHash) } Article::Article(Feed *feed, const QJsonObject &jsonObj) - : Article(feed, jsonObj.toVariantHash()) + : Article(feed, articleDataFromJSON(jsonObj)) { - // JSON object store DateTime as string so we need to convert it - m_date = QDateTime::fromString(jsonObj.value(KeyDate).toString(), Qt::RFC2822Date); - m_data[KeyDate] = m_date; } QString Article::guid() const diff --git a/src/base/rss/rss_feed.cpp b/src/base/rss/rss_feed.cpp index 2647f446a..1679024b9 100644 --- a/src/base/rss/rss_feed.cpp +++ b/src/base/rss/rss_feed.cpp @@ -212,7 +212,13 @@ void Feed::handleParsingFinished(const RSS::Private::ParsingResult &result) m_lastBuildDate = result.lastBuildDate; int newArticlesCount = 0; - for (const QVariantHash &varHash : result.articles) { + const QDateTime now {QDateTime::currentDateTime()}; + for (QVariantHash varHash : result.articles) { + // if article has no publication date we use feed update time as a fallback + QVariant &articleDate = varHash[Article::KeyDate]; + if (!articleDate.toDateTime().isValid()) + articleDate = now; + try { auto article = new Article(this, varHash); if (addArticle(article))