Browse Source

Do not mark articles read if download has failed

This change includes: always try to download unread articles matching ruleset already present in list (aka redownload failed items)
adaptive-webui-19844
Nick Tiskov 12 years ago
parent
commit
b6c59fd70b
  1. 1
      src/qtlibtorrent/qbtsession.cpp
  2. 1
      src/qtlibtorrent/qbtsession.h
  3. 7
      src/rss/rssarticle.cpp
  4. 9
      src/rss/rssarticle.h
  5. 43
      src/rss/rssfeed.cpp
  6. 1
      src/rss/rssfeed.h

1
src/qtlibtorrent/qbtsession.cpp

@ -2725,6 +2725,7 @@ void QBtSession::processDownloadedFile(QString url, QString file_path) {
// Pause torrent if necessary // Pause torrent if necessary
if (h.is_valid() && pref.addTorrentsInPause() && Preferences().useAdditionDialog()) if (h.is_valid() && pref.addTorrentsInPause() && Preferences().useAdditionDialog())
h.pause(); h.pause();
emit newDownloadedTorrentFromRss(url);
} }
} }

1
src/qtlibtorrent/qbtsession.h

@ -212,6 +212,7 @@ signals:
void trackerError(const QString &hash, QString time, QString msg); void trackerError(const QString &hash, QString time, QString msg);
void trackerAuthenticationRequired(const QTorrentHandle& h); void trackerAuthenticationRequired(const QTorrentHandle& h);
void newDownloadedTorrent(QString path, QString url); void newDownloadedTorrent(QString path, QString url);
void newDownloadedTorrentFromRss(QString url);
void newMagnetLink(const QString& link); void newMagnetLink(const QString& link);
void updateFileSize(const QString &hash); void updateFileSize(const QString &hash);
void downloadFromUrlFailure(QString url, QString reason); void downloadFromUrlFailure(QString url, QString reason);

7
src/rss/rssarticle.cpp

@ -120,3 +120,10 @@ const QString& RssArticle::title() const
{ {
return m_title; return m_title;
} }
void RssArticle::handleTorrentDownloadSuccess(const QString &url) {
if (url == m_torrentUrl || url == m_link) {
markAsRead();
emit articleWasRead();
}
}

9
src/rss/rssarticle.h

@ -42,7 +42,8 @@ class RssArticle;
typedef QSharedPointer<RssArticle> RssArticlePtr; typedef QSharedPointer<RssArticle> RssArticlePtr;
// Item of a rss stream, single information // Item of a rss stream, single information
class RssArticle { class RssArticle : public QObject {
Q_OBJECT
public: public:
RssArticle(RssFeed* parent, const QString& guid); RssArticle(RssFeed* parent, const QString& guid);
@ -62,6 +63,12 @@ public:
// Serialization // Serialization
QVariantHash toHash() const; QVariantHash toHash() const;
signals:
void articleWasRead();
public slots:
void handleTorrentDownloadSuccess(const QString& url);
friend RssArticlePtr hashToRssArticle(RssFeed* parent, const QVariantHash& hash); friend RssArticlePtr hashToRssArticle(RssFeed* parent, const QVariantHash& hash);
private: private:

43
src/rss/rssfeed.cpp

@ -114,9 +114,13 @@ void RssFeed::loadItemsFromDisk()
} }
} }
void RssFeed::addArticle(const RssArticlePtr& article) void RssFeed::addArticle(const RssArticlePtr& article) {
{ int lbIndex = -1;
Q_ASSERT(!m_articles.contains(article->guid())); int max_articles = RssSettings().getRSSMaxArticlesPerFeed();
if (!m_articles.contains(article->guid())) {
markAsDirty();
// Update unreadCount // Update unreadCount
if (!article->isRead()) if (!article->isRead())
++m_unreadCount; ++m_unreadCount;
@ -125,9 +129,7 @@ void RssFeed::addArticle(const RssArticlePtr& article)
// Insertion sort // Insertion sort
RssArticleList::Iterator lowerBound = qLowerBound(m_articlesByDate.begin(), m_articlesByDate.end(), article, rssArticleDateRecentThan); RssArticleList::Iterator lowerBound = qLowerBound(m_articlesByDate.begin(), m_articlesByDate.end(), article, rssArticleDateRecentThan);
m_articlesByDate.insert(lowerBound, article); m_articlesByDate.insert(lowerBound, article);
const int lbIndex = m_articlesByDate.indexOf(article); lbIndex = m_articlesByDate.indexOf(article);
// Restrict size
const int max_articles = RssSettings().getRSSMaxArticlesPerFeed();
if (m_articlesByDate.size() > max_articles) { if (m_articlesByDate.size() > max_articles) {
RssArticlePtr oldestArticle = m_articlesByDate.takeLast(); RssArticlePtr oldestArticle = m_articlesByDate.takeLast();
m_articles.remove(oldestArticle->guid()); m_articles.remove(oldestArticle->guid());
@ -142,6 +144,18 @@ void RssFeed::addArticle(const RssArticlePtr& article)
downloadArticleTorrentIfMatching(m_manager->downloadRules(), article); downloadArticleTorrentIfMatching(m_manager->downloadRules(), article);
} }
} }
else {
// m_articles.contains(article->guid())
// Try to download skipped articles
if (RssSettings().isRssDownloadingEnabled()) {
RssArticlePtr skipped = m_articles.value(article->guid(), RssArticlePtr());
if (skipped) {
if (!skipped->isRead())
downloadArticleTorrentIfMatching(m_manager->downloadRules(), skipped);
}
}
}
}
QList<QNetworkCookie> RssFeed::feedCookies() const QList<QNetworkCookie> RssFeed::feedCookies() const
{ {
@ -338,16 +352,17 @@ void RssFeed::downloadArticleTorrentIfMatching(RssDownloadRuleList* rules, const
if (!matching_rule) if (!matching_rule)
return; return;
// Torrent was downloaded, consider article as read
article->markAsRead();
// Download the torrent // Download the torrent
const QString& torrent_url = article->torrentUrl(); const QString& torrent_url = article->torrentUrl();
QBtSession::instance()->addConsoleMessage(tr("Automatically downloading %1 torrent from %2 RSS feed...").arg(article->title()).arg(displayName())); QBtSession::instance()->addConsoleMessage(tr("Automatically downloading %1 torrent from %2 RSS feed...").arg(article->title()).arg(displayName()));
if (torrent_url.startsWith("magnet:", Qt::CaseInsensitive)) if (torrent_url.startsWith("magnet:", Qt::CaseInsensitive))
QBtSession::instance()->addMagnetSkipAddDlg(torrent_url, matching_rule->savePath(), matching_rule->label()); QBtSession::instance()->addMagnetSkipAddDlg(torrent_url, matching_rule->savePath(), matching_rule->label());
else else {
connect(QBtSession::instance(), SIGNAL(newDownloadedTorrentFromRss(QString)), article.data(), SLOT(handleTorrentDownloadSuccess(const QString&)), Qt::UniqueConnection);
connect(article.data(), SIGNAL(articleWasRead()), SLOT(handleArticleStateChanged()), Qt::UniqueConnection);
QBtSession::instance()->downloadUrlAndSkipDialog(torrent_url, matching_rule->savePath(), matching_rule->label(), feedCookies()); QBtSession::instance()->downloadUrlAndSkipDialog(torrent_url, matching_rule->savePath(), matching_rule->label(), feedCookies());
} }
}
void RssFeed::recheckRssItemsForDownload() void RssFeed::recheckRssItemsForDownload()
{ {
@ -364,12 +379,6 @@ void RssFeed::handleNewArticle(const QString& feedUrl, const QVariantHash& artic
if (feedUrl != m_url) if (feedUrl != m_url)
return; return;
const QString guid = articleData["id"].toString();
if (m_articles.contains(guid))
return;
markAsDirty();
RssArticlePtr article = hashToRssArticle(this, articleData); RssArticlePtr article = hashToRssArticle(this, articleData);
Q_ASSERT(article); Q_ASSERT(article);
addArticle(article); addArticle(article);
@ -400,6 +409,10 @@ void RssFeed::handleFeedParsingFinished(const QString& feedUrl, const QString& e
saveItemsToDisk(); saveItemsToDisk();
} }
void RssFeed::handleArticleStateChanged() {
m_manager->forwardFeedInfosChanged(m_url, displayName(), m_unreadCount);
}
void RssFeed::decrementUnreadCount() void RssFeed::decrementUnreadCount()
{ {
--m_unreadCount; --m_unreadCount;

1
src/rss/rssfeed.h

@ -86,6 +86,7 @@ private slots:
void handleFeedTitle(const QString& feedUrl, const QString& title); void handleFeedTitle(const QString& feedUrl, const QString& title);
void handleNewArticle(const QString& feedUrl, const QVariantHash& article); void handleNewArticle(const QString& feedUrl, const QVariantHash& article);
void handleFeedParsingFinished(const QString& feedUrl, const QString& error); void handleFeedParsingFinished(const QString& feedUrl, const QString& error);
void handleArticleStateChanged();
private: private:
QString iconUrl() const; QString iconUrl() const;

Loading…
Cancel
Save