Browse Source

- Fix several bugs in RSS plugin

* RSS downloader takes into consideration maximum number of articles per feed
  * Fix possible issue with RSS folder deletion
  * Clear persistant data whenever a RSS feed is deleted
adaptive-webui-19844
Christophe Dumez 15 years ago
parent
commit
af1b06c5be
  1. 10
      src/feedList.h
  2. 80
      src/rss.cpp
  3. 26
      src/rss.h
  4. 2
      src/rss_imp.cpp

10
src/feedList.h

@ -47,10 +47,16 @@ public:
} }
} }
void itemRemoved(QTreeWidgetItem *item) { void itemAboutToBeRemoved(QTreeWidgetItem *item) {
RssFile* file = mapping.take(item); RssFile* file = mapping.take(item);
if(file->getType() == RssFile::STREAM) if(file->getType() == RssFile::STREAM) {
feeds_items.remove(file->getID()); feeds_items.remove(file->getID());
} else {
QList<RssStream*> feeds = ((RssFolder*)file)->getAllFeeds();
foreach(RssStream* feed, feeds) {
feeds_items.remove(feed->getID());
}
}
} }
bool hasFeed(QString url) const { bool hasFeed(QString url) const {

80
src/rss.cpp

@ -90,8 +90,12 @@ void RssFolder::refreshAll(){
} }
void RssFolder::removeFile(QString ID) { void RssFolder::removeFile(QString ID) {
if(this->contains(ID)) if(this->contains(ID)) {
delete this->take(ID); RssFile* child = this->take(ID);
child->removeAllSettings();
child->removeAllItems();
delete child;
}
} }
RssFolder* RssFolder::addFolder(QString name) { RssFolder* RssFolder::addFolder(QString name) {
@ -427,6 +431,20 @@ void RssStream::removeAllItems() {
this->clear(); this->clear();
} }
void RssStream::removeAllSettings() {
QSettings qBTRSS("qBittorrent", "qBittorrent-rss");
QHash<QString, QVariant> feeds_w_downloader = qBTRSS.value("downloader_on", QHash<QString, QVariant>()).toHash();
if(feeds_w_downloader.contains(url)) {
feeds_w_downloader.remove(url);
qBTRSS.setValue("downloader_on", feeds_w_downloader);
}
QHash<QString, QVariant> all_feeds_filters = qBTRSS.value("feed_filters", QHash<QString, QVariant>()).toHash();
if(all_feeds_filters.contains(url)) {
all_feeds_filters.remove(url);
qBTRSS.setValue("feed_filters", all_feeds_filters);
}
}
bool RssStream::itemAlreadyExists(QString name) { bool RssStream::itemAlreadyExists(QString name) {
return this->contains(name); return this->contains(name);
} }
@ -579,36 +597,7 @@ short RssStream::readDoc(const QDomDocument& doc) {
(*this)[title] = item; (*this)[title] = item;
} else { } else {
delete item; delete item;
item = this->value(title);
} }
QString torrent_url;
if(item->has_attachment())
torrent_url = item->getTorrentUrl();
else
torrent_url = item->getLink();
// Check if the item should be automatically downloaded
if(!already_exists || !(*this)[item->getTitle()]->isRead()) {
FeedFilter * matching_filter = FeedFilters::getFeedFilters(url).matches(item->getTitle());
if(matching_filter != 0) {
// Download the torrent
BTSession->addConsoleMessage(tr("Automatically downloading %1 torrent from %2 RSS feed...").arg(item->getTitle()).arg(getName()));
if(matching_filter->isValid()) {
QString save_path = matching_filter->getSavePath();
if(save_path.isEmpty())
BTSession->downloadUrlAndSkipDialog(torrent_url);
else
BTSession->downloadUrlAndSkipDialog(torrent_url, save_path);
} else {
// All torrents are downloaded from this feed
BTSession->downloadUrlAndSkipDialog(torrent_url);
}
// Item was downloaded, consider it as Read
(*this)[item->getTitle()]->setRead();
// Clean up
delete matching_filter;
}
}
} else { } else {
delete item; delete item;
} }
@ -619,6 +608,35 @@ short RssStream::readDoc(const QDomDocument& doc) {
channel = channel.nextSibling().toElement(); channel = channel.nextSibling().toElement();
} }
resizeList(); resizeList();
// RSS Feed Downloader
foreach(RssItem* item, values()) {
if(item->isRead()) continue;
QString torrent_url;
if(item->has_attachment())
torrent_url = item->getTorrentUrl();
else
torrent_url = item->getLink();
// Check if the item should be automatically downloaded
FeedFilter * matching_filter = FeedFilters::getFeedFilters(url).matches(item->getTitle());
if(matching_filter != 0) {
// Download the torrent
BTSession->addConsoleMessage(tr("Automatically downloading %1 torrent from %2 RSS feed...").arg(item->getTitle()).arg(getName()));
if(matching_filter->isValid()) {
QString save_path = matching_filter->getSavePath();
if(save_path.isEmpty())
BTSession->downloadUrlAndSkipDialog(torrent_url);
else
BTSession->downloadUrlAndSkipDialog(torrent_url, save_path);
} else {
// All torrents are downloaded from this feed
BTSession->downloadUrlAndSkipDialog(torrent_url);
}
// Item was downloaded, consider it as Read
item->setRead();
// Clean up
delete matching_filter;
}
}
return 0; return 0;
} }

26
src/rss.h

@ -97,11 +97,13 @@ public:
virtual FileType getType() const = 0; virtual FileType getType() const = 0;
virtual QString getName() const = 0; virtual QString getName() const = 0;
virtual QString getID() const = 0; virtual QString getID() const = 0;
virtual void removeAllItems() = 0;
virtual void rename(QString new_name) = 0; virtual void rename(QString new_name) = 0;
virtual void markAllAsRead() = 0; virtual void markAllAsRead() = 0;
virtual RssFolder* getParent() const = 0; virtual RssFolder* getParent() const = 0;
virtual void setParent(RssFolder*) = 0; virtual void setParent(RssFolder*) = 0;
virtual void refresh() = 0; virtual void refresh() = 0;
virtual void removeAllSettings() = 0;
virtual QList<RssItem*> getNewsList() const = 0; virtual QList<RssItem*> getNewsList() const = 0;
virtual QList<RssItem*> getUnreadNewsList() const = 0; virtual QList<RssItem*> getUnreadNewsList() const = 0;
QStringList getPath() const { QStringList getPath() const {
@ -225,11 +227,11 @@ protected:
negOffset = true; // military zone: RFC 2822 treats as '-0000' negOffset = true; // military zone: RFC 2822 treats as '-0000'
else if (zone != "UT" && zone != "GMT") { // treated as '+0000' else if (zone != "UT" && zone != "GMT") { // treated as '+0000'
offset = (zone == "EDT") ? -4*3600 offset = (zone == "EDT") ? -4*3600
: (zone == "EST" || zone == "CDT") ? -5*3600 : (zone == "EST" || zone == "CDT") ? -5*3600
: (zone == "CST" || zone == "MDT") ? -6*3600 : (zone == "CST" || zone == "MDT") ? -6*3600
: (zone == "MST" || zone == "PDT") ? -7*3600 : (zone == "MST" || zone == "PDT") ? -7*3600
: (zone == "PST") ? -8*3600 : (zone == "PST") ? -8*3600
: 0; : 0;
if (!offset) { if (!offset) {
// Check for any other alphabetic time zone // Check for any other alphabetic time zone
bool nonalpha = false; bool nonalpha = false;
@ -408,6 +410,7 @@ public:
void refresh(); void refresh();
QString getID() const { return url; } QString getID() const { return url; }
void removeAllItems(); void removeAllItems();
void removeAllSettings();
bool itemAlreadyExists(QString hash); bool itemAlreadyExists(QString hash);
void setLoading(bool val); void setLoading(bool val);
bool isLoading(); bool isLoading();
@ -464,6 +467,19 @@ public:
bool hasChild(QString ID) { return this->contains(ID); } bool hasChild(QString ID) { return this->contains(ID); }
QList<RssItem*> getNewsList() const; QList<RssItem*> getNewsList() const;
QList<RssItem*> getUnreadNewsList() const; QList<RssItem*> getUnreadNewsList() const;
void removeAllSettings() {
foreach(RssFile* child, values()) {
child->removeAllSettings();
}
}
void removeAllItems() {
foreach(RssFile* child, values()) {
child->removeAllItems();
}
qDeleteAll(values());
clear();
}
public slots: public slots:
void refreshAll(); void refreshAll();

2
src/rss_imp.cpp

@ -219,7 +219,7 @@ void RSSImp::deleteSelectedItems() {
} }
RssFile *rss_item = listStreams->getRSSItem(item); RssFile *rss_item = listStreams->getRSSItem(item);
// Notify TreeWidget // Notify TreeWidget
listStreams->itemRemoved(item); listStreams->itemAboutToBeRemoved(item);
// Actually delete the item // Actually delete the item
rss_item->getParent()->removeFile(rss_item->getID()); rss_item->getParent()->removeFile(rss_item->getID());
delete item; delete item;

Loading…
Cancel
Save