mirror of
https://github.com/d47081/qBittorrent.git
synced 2025-02-08 21:04:26 +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);
|
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
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
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();
|
||||||
|
@ -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…
x
Reference in New Issue
Block a user