mirror of
https://github.com/d47081/qBittorrent.git
synced 2025-02-02 09:55:55 +00:00
- 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
This commit is contained in:
parent
4732c8565d
commit
af1b06c5be
@ -47,10 +47,16 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void itemRemoved(QTreeWidgetItem *item) {
|
||||
void itemAboutToBeRemoved(QTreeWidgetItem *item) {
|
||||
RssFile* file = mapping.take(item);
|
||||
if(file->getType() == RssFile::STREAM)
|
||||
if(file->getType() == RssFile::STREAM) {
|
||||
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 {
|
||||
|
80
src/rss.cpp
80
src/rss.cpp
@ -90,8 +90,12 @@ void RssFolder::refreshAll(){
|
||||
}
|
||||
|
||||
void RssFolder::removeFile(QString ID) {
|
||||
if(this->contains(ID))
|
||||
delete this->take(ID);
|
||||
if(this->contains(ID)) {
|
||||
RssFile* child = this->take(ID);
|
||||
child->removeAllSettings();
|
||||
child->removeAllItems();
|
||||
delete child;
|
||||
}
|
||||
}
|
||||
|
||||
RssFolder* RssFolder::addFolder(QString name) {
|
||||
@ -427,6 +431,20 @@ void RssStream::removeAllItems() {
|
||||
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) {
|
||||
return this->contains(name);
|
||||
}
|
||||
@ -579,36 +597,7 @@ short RssStream::readDoc(const QDomDocument& doc) {
|
||||
(*this)[title] = item;
|
||||
} else {
|
||||
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 {
|
||||
delete item;
|
||||
}
|
||||
@ -619,6 +608,35 @@ short RssStream::readDoc(const QDomDocument& doc) {
|
||||
channel = channel.nextSibling().toElement();
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
|
26
src/rss.h
26
src/rss.h
@ -97,11 +97,13 @@ public:
|
||||
virtual FileType getType() const = 0;
|
||||
virtual QString getName() const = 0;
|
||||
virtual QString getID() const = 0;
|
||||
virtual void removeAllItems() = 0;
|
||||
virtual void rename(QString new_name) = 0;
|
||||
virtual void markAllAsRead() = 0;
|
||||
virtual RssFolder* getParent() const = 0;
|
||||
virtual void setParent(RssFolder*) = 0;
|
||||
virtual void refresh() = 0;
|
||||
virtual void removeAllSettings() = 0;
|
||||
virtual QList<RssItem*> getNewsList() const = 0;
|
||||
virtual QList<RssItem*> getUnreadNewsList() const = 0;
|
||||
QStringList getPath() const {
|
||||
@ -225,11 +227,11 @@ protected:
|
||||
negOffset = true; // military zone: RFC 2822 treats as '-0000'
|
||||
else if (zone != "UT" && zone != "GMT") { // treated as '+0000'
|
||||
offset = (zone == "EDT") ? -4*3600
|
||||
: (zone == "EST" || zone == "CDT") ? -5*3600
|
||||
: (zone == "CST" || zone == "MDT") ? -6*3600
|
||||
: (zone == "MST" || zone == "PDT") ? -7*3600
|
||||
: (zone == "PST") ? -8*3600
|
||||
: 0;
|
||||
: (zone == "EST" || zone == "CDT") ? -5*3600
|
||||
: (zone == "CST" || zone == "MDT") ? -6*3600
|
||||
: (zone == "MST" || zone == "PDT") ? -7*3600
|
||||
: (zone == "PST") ? -8*3600
|
||||
: 0;
|
||||
if (!offset) {
|
||||
// Check for any other alphabetic time zone
|
||||
bool nonalpha = false;
|
||||
@ -408,6 +410,7 @@ public:
|
||||
void refresh();
|
||||
QString getID() const { return url; }
|
||||
void removeAllItems();
|
||||
void removeAllSettings();
|
||||
bool itemAlreadyExists(QString hash);
|
||||
void setLoading(bool val);
|
||||
bool isLoading();
|
||||
@ -464,6 +467,19 @@ public:
|
||||
bool hasChild(QString ID) { return this->contains(ID); }
|
||||
QList<RssItem*> getNewsList() 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:
|
||||
void refreshAll();
|
||||
|
@ -219,7 +219,7 @@ void RSSImp::deleteSelectedItems() {
|
||||
}
|
||||
RssFile *rss_item = listStreams->getRSSItem(item);
|
||||
// Notify TreeWidget
|
||||
listStreams->itemRemoved(item);
|
||||
listStreams->itemAboutToBeRemoved(item);
|
||||
// Actually delete the item
|
||||
rss_item->getParent()->removeFile(rss_item->getID());
|
||||
delete item;
|
||||
|
Loading…
x
Reference in New Issue
Block a user