diff --git a/src/rss/rss_imp.cpp b/src/rss/rss_imp.cpp index 3ae2df323..9e847f0ad 100644 --- a/src/rss/rss_imp.cpp +++ b/src/rss/rss_imp.cpp @@ -761,6 +761,8 @@ void RSSImp::on_rssDownloaderBtn_clicked() { AutomatedRssDownloader dlg(m_rssManager, this); dlg.exec(); - if (dlg.isRssDownloaderEnabled()) + if (dlg.isRssDownloaderEnabled()) { + m_rssManager->recheckRssItemsForDownload(); refreshAllFeeds(); + } } diff --git a/src/rss/rssarticle.cpp b/src/rss/rssarticle.cpp index 7868b5f78..5267bd991 100644 --- a/src/rss/rssarticle.cpp +++ b/src/rss/rssarticle.cpp @@ -89,10 +89,9 @@ const QString& RssArticle::link() const { return m_link; } -const QString& RssArticle::description() const { - if (m_description.isNull()) - return ""; - return m_description; +QString RssArticle::description() const +{ + return m_description.isNull() ? "" : m_description; } const QDateTime& RssArticle::date() const { diff --git a/src/rss/rssarticle.h b/src/rss/rssarticle.h index 7b7086816..ca0559b87 100644 --- a/src/rss/rssarticle.h +++ b/src/rss/rssarticle.h @@ -54,7 +54,7 @@ public: const QString& author() const; const QString& torrentUrl() const; const QString& link() const; - const QString& description() const; + QString description() const; const QDateTime& date() const; bool isRead() const; // Setters diff --git a/src/rss/rssfeed.cpp b/src/rss/rssfeed.cpp index c399b723a..88f7e9e2e 100644 --- a/src/rss/rssfeed.cpp +++ b/src/rss/rssfeed.cpp @@ -313,6 +313,34 @@ void RssFeed::handleFeedTitle(const QString& feedUrl, const QString& title) m_manager->forwardFeedInfosChanged(feedUrl, title, m_unreadCount); } +void RssFeed::downloadArticleTorrentIfMatching(RssDownloadRuleList* rules, const RssArticlePtr& article) +{ + Q_ASSERT(RssSettings().isRssDownloadingEnabled()); + RssDownloadRulePtr matching_rule = rules->findMatchingRule(m_url, article->title()); + if (!matching_rule) + return; + + // Torrent was downloaded, consider article as read + article->markAsRead(); + // Download the torrent + const QString& torrent_url = article->torrentUrl(); + QBtSession::instance()->addConsoleMessage(tr("Automatically downloading %1 torrent from %2 RSS feed...").arg(article->title()).arg(displayName())); + if (torrent_url.startsWith("magnet:", Qt::CaseInsensitive)) + QBtSession::instance()->addMagnetSkipAddDlg(torrent_url, matching_rule->savePath(), matching_rule->label()); + else + QBtSession::instance()->downloadUrlAndSkipDialog(torrent_url, matching_rule->savePath(), matching_rule->label()); +} + +void RssFeed::recheckRssItemsForDownload() +{ + Q_ASSERT(RssSettings().isRssDownloadingEnabled()); + RssDownloadRuleList* rules = m_manager->downloadRules(); + foreach (const RssArticlePtr& article, m_articlesByDate) { + if (!article->isRead()) + downloadArticleTorrentIfMatching(rules, article); + } +} + void RssFeed::handleNewArticle(const QString& feedUrl, const QVariantHash& articleData) { if (feedUrl != m_url) @@ -329,20 +357,8 @@ void RssFeed::handleNewArticle(const QString& feedUrl, const QVariantHash& artic addArticle(article); // Download torrent if necessary. - if (RssSettings().isRssDownloadingEnabled()) { - RssDownloadRulePtr matching_rule = m_manager->downloadRules()->findMatchingRule(m_url, article->title()); - if (matching_rule) { - // Torrent was downloaded, consider article as read - article->markAsRead(); - // Download the torrent - QString torrent_url = article->torrentUrl(); - QBtSession::instance()->addConsoleMessage(tr("Automatically downloading %1 torrent from %2 RSS feed...").arg(article->title()).arg(displayName())); - if (torrent_url.startsWith("magnet:", Qt::CaseInsensitive)) - QBtSession::instance()->addMagnetSkipAddDlg(torrent_url, matching_rule->savePath(), matching_rule->label()); - else - QBtSession::instance()->downloadUrlAndSkipDialog(torrent_url, matching_rule->savePath(), matching_rule->label()); - } - } + if (RssSettings().isRssDownloadingEnabled()) + downloadArticleTorrentIfMatching(m_manager->downloadRules(), article); m_manager->forwardFeedInfosChanged(m_url, displayName(), m_unreadCount); // FIXME: We should forward the information here but this would seriously decrease diff --git a/src/rss/rssfeed.h b/src/rss/rssfeed.h index 4c2165cf1..df28cba3a 100644 --- a/src/rss/rssfeed.h +++ b/src/rss/rssfeed.h @@ -40,6 +40,7 @@ class RssFeed; class RssManager; +class RssDownloadRuleList; typedef QHash RssArticleHash; typedef QSharedPointer RssFeedPtr; @@ -75,6 +76,7 @@ public: const RssArticleHash& articleHash() const { return m_articles; } virtual RssArticleList unreadArticleListByDateDesc() const; void decrementUnreadCount(); + void recheckRssItemsForDownload(); private slots: void handleFinishedDownload(const QString& url, const QString &file_path); @@ -87,6 +89,7 @@ private: QString iconUrl() const; void loadItemsFromDisk(); void addArticle(const RssArticlePtr& article); + void downloadArticleTorrentIfMatching(RssDownloadRuleList* rules, const RssArticlePtr& article); private: RssManager* m_manager; diff --git a/src/rss/rssfile.h b/src/rss/rssfile.h index 8467d9e8a..3d8d95f4e 100644 --- a/src/rss/rssfile.h +++ b/src/rss/rssfile.h @@ -65,6 +65,7 @@ public: virtual RssArticleList unreadArticleListByDateDesc() const = 0; virtual void removeAllSettings() = 0; virtual void saveItemsToDisk() = 0; + virtual void recheckRssItemsForDownload() = 0; QStringList pathHierarchy() const; protected: diff --git a/src/rss/rssfolder.cpp b/src/rss/rssfolder.cpp index 37a14b0a4..d6b73d8d6 100644 --- a/src/rss/rssfolder.cpp +++ b/src/rss/rssfolder.cpp @@ -251,3 +251,12 @@ RssFilePtr RssFolder::takeChild(const QString &childId) { return m_children.take(childId); } + +void RssFolder::recheckRssItemsForDownload() +{ + RssFileHash::ConstIterator it = m_children.begin(); + RssFileHash::ConstIterator itend = m_children.end(); + for ( ; it != itend; ++it) { + it.value()->recheckRssItemsForDownload(); + } +} diff --git a/src/rss/rssfolder.h b/src/rss/rssfolder.h index 38b804ee2..b3210fbac 100644 --- a/src/rss/rssfolder.h +++ b/src/rss/rssfolder.h @@ -70,6 +70,7 @@ public: void removeAllItems(); void renameChildFolder(const QString &old_name, const QString &new_name); RssFilePtr takeChild(const QString &childId); + void recheckRssItemsForDownload(); public slots: virtual bool refresh();