diff --git a/defaulttrackers/core.py b/defaulttrackers/core.py index 602a97e..7de57ec 100644 --- a/defaulttrackers/core.py +++ b/defaulttrackers/core.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # core.py # -# Copyright (C) 2013-2019 Ștefan Talpalaru +# Copyright (C) 2013-2024 Ștefan Talpalaru # # Basic plugin template created by: # Copyright (C) 2008 Martijn Voncken @@ -86,27 +86,36 @@ def update_trackerlist_from_url(self): now = datetime.datetime.utcnow() last_update = datetime.datetime.utcfromtimestamp(self.config["last_dynamic_trackers_update"]) if now - last_update > datetime.timedelta(days=self.config["dynamic_trackers_update_interval"]): + new_trackers = [] + seen_trackers = set() + headers = { + 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', + 'Accept-Encoding': 'none', + 'Accept-Language': 'en-US,en;q=0.8', + } try: - headers = { - 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0', - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', - 'Accept-Encoding': 'none', - 'Accept-Language': 'en-US,en;q=0.8', - } - - req = urllib.request.Request(self.config["dynamic_trackerlist_url"], headers=headers) - try: - page = urllib.request.urlopen(req, context=ssl._create_unverified_context()).read() - except: - # maybe an older Python version without a "context" argument - page = urllib.request.urlopen(req).read() - new_trackers = [decode_bytes(url) for url in re.findall(b'\w+://[\w\-.:/]+', page) if is_url(decode_bytes(url))] + for url_line in self.config["dynamic_trackerlist_url"].splitlines(): + url_line = url_line.strip() + if not url_line: + continue + req = urllib.request.Request(url_line, headers=headers) + try: + page = urllib.request.urlopen(req, context=ssl._create_unverified_context()).read() + except: + # maybe an older Python version without a "context" argument + page = urllib.request.urlopen(req).read() + # we need to avoid duplicates here + for new_tracker in [decode_bytes(u) for u in re.findall(rb'\w+://[\w\-.:/]+', page) if is_url(decode_bytes(u))]: + if new_tracker not in seen_trackers: + seen_trackers.add(new_tracker) + new_trackers.append(new_tracker) + if new_trackers: # replace all existing trackers - self.config["trackers"] = [] - for new_tracker in new_trackers: - self.config["trackers"].append({"url": new_tracker}) + self.config["trackers"] = [{"url": t} for t in new_trackers] + self.config["last_dynamic_trackers_update"] = time.mktime(now.timetuple()) except: traceback.print_exc() @@ -143,3 +152,11 @@ def get_config(self): """Returns the config dictionary""" return self.config.config + @export + def apply_to_existing(self): + """Apply the tracker list to existings torrents""" + + for torrent_id in component.get("TorrentManager").torrents: + self.on_torrent_added(torrent_id) + return True + diff --git a/defaulttrackers/data/config.glade b/defaulttrackers/data/config.glade index 1a580fd..0629e10 100644 --- a/defaulttrackers/data/config.glade +++ b/defaulttrackers/data/config.glade @@ -40,14 +40,9 @@ - + True True - - False - False - True - True True diff --git a/defaulttrackers/data/config.ui b/defaulttrackers/data/config.ui index fd13d31..f2f1eda 100644 --- a/defaulttrackers/data/config.ui +++ b/defaulttrackers/data/config.ui @@ -40,14 +40,9 @@ - + True True - - False - False - True - True True diff --git a/defaulttrackers/data/defaulttrackers.js b/defaulttrackers/data/defaulttrackers.js index 0df6ce6..a7c5c00 100644 --- a/defaulttrackers/data/defaulttrackers.js +++ b/defaulttrackers/data/defaulttrackers.js @@ -85,6 +85,19 @@ DefaultTrackersPanel = Ext.extend(Ext.form.FormPanel, { autoWidth: true, })); + var applyToExisting = this.add({ + fieldLabel: _(''), + name: 'trackers_apply', + xtype: 'container', + layout: 'hbox', + items: [{ + xtype: 'button', + text: 'Apply to existing torrents', + }] + }); + + applyToExisting.getComponent(0).setHandler(this.onApplyToExisting, this); + deluge.preferences.on('show', this.onPreferencesShow, this); }, @@ -119,6 +132,14 @@ DefaultTrackersPanel = Ext.extend(Ext.form.FormPanel, { onSetConfig: function() { this.opts.commit(); }, + onApplyToExisting: function() { + deluge.client.defaulttrackers.apply_to_existing({ + success: function() { + Ext.Msg.alert('Success', 'Default trackers applied to existing torrents'); + }, + scope: this, + }); + } }); DefaultTrackersPlugin = Ext.extend(Deluge.Plugin, { diff --git a/defaulttrackers/gtk3ui.py b/defaulttrackers/gtk3ui.py index 00f77fd..b40bb2c 100644 --- a/defaulttrackers/gtk3ui.py +++ b/defaulttrackers/gtk3ui.py @@ -181,9 +181,12 @@ def on_apply_prefs(self): update_interval = int(self.builder.get_object("tracker_list_update_interval").get_text() or 1) except: update_interval = 1 + tracker_list_buffer = self.builder.get_object("tracker_list_url").get_buffer() + start_iter, end_iter = tracker_list_buffer.get_bounds() + tracker_list_text = tracker_list_buffer.get_text(start_iter, end_iter, False) self.config.update({ "trackers": [{"url": str(row[0])} for row in self.store], - "dynamic_trackerlist_url": self.builder.get_object("tracker_list_url").get_text(), + "dynamic_trackerlist_url": tracker_list_text, "dynamic_trackers_update_interval": update_interval, }) client.defaulttrackers.set_config(self.config) @@ -196,7 +199,7 @@ def cb_get_config(self, config): self.config = config # dynamic tracker list if config["dynamic_trackerlist_url"]: - self.builder.get_object("tracker_list_url").set_text(config["dynamic_trackerlist_url"]) + self.builder.get_object("tracker_list_url").get_buffer().set_text(config["dynamic_trackerlist_url"]) self.builder.get_object("tracker_list_update_interval").set_text(str(config["dynamic_trackers_update_interval"])) # trackers self.trackers = list(config["trackers"]) diff --git a/defaulttrackers/gtkui.py b/defaulttrackers/gtkui.py index cdc2da9..9e8bc49 100644 --- a/defaulttrackers/gtkui.py +++ b/defaulttrackers/gtkui.py @@ -178,9 +178,12 @@ def on_apply_prefs(self): update_interval = int(self.glade.get_widget("tracker_list_update_interval").get_text() or 1) except: update_interval = 1 + tracker_list_buffer = self.glade.get_widget("tracker_list_url").get_buffer() + start_iter, end_iter = tracker_list_buffer.get_bounds() + tracker_list_text = tracker_list_buffer.get_text(start_iter, end_iter, False) self.config.update({ "trackers": [{"url": str(row[0])} for row in self.store], - "dynamic_trackerlist_url": self.glade.get_widget("tracker_list_url").get_text(), + "dynamic_trackerlist_url": tracker_list_text, "dynamic_trackers_update_interval": update_interval, }) client.defaulttrackers.set_config(self.config) @@ -193,7 +196,7 @@ def cb_get_config(self, config): self.config = config # dynamic tracker list if config["dynamic_trackerlist_url"]: - self.glade.get_widget("tracker_list_url").set_text(config["dynamic_trackerlist_url"]) + self.glade.get_widget("tracker_list_url").get_buffer().set_text(config["dynamic_trackerlist_url"]) self.glade.get_widget("tracker_list_update_interval").set_text(str(config["dynamic_trackers_update_interval"])) # trackers self.trackers = list(config["trackers"]) diff --git a/egg/DefaultTrackers-0.4-py3.9.egg b/egg/DefaultTrackers-0.4-py3.9.egg deleted file mode 100644 index 665b920..0000000 Binary files a/egg/DefaultTrackers-0.4-py3.9.egg and /dev/null differ diff --git a/egg/DefaultTrackers-0.6-py3.12.egg b/egg/DefaultTrackers-0.6-py3.12.egg new file mode 100644 index 0000000..43a56c8 Binary files /dev/null and b/egg/DefaultTrackers-0.6-py3.12.egg differ diff --git a/setup.py b/setup.py index 0bc0329..1c41832 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ # # setup.py # -# Copyright (C) 2013-2022 Ștefan Talpalaru +# Copyright (C) 2013-2024 Ștefan Talpalaru # # Basic plugin template created by: # Copyright (C) 2008 Martijn Voncken @@ -45,10 +45,10 @@ __plugin_name__ = "DefaultTrackers" __author__ = u"Ștefan Talpalaru" __author_email__ = "stefantalpalaru@yahoo.com" -__version__ = "0.5" +__version__ = "0.7" __url__ = "https://github.com/stefantalpalaru/deluge-default-trackers" __license__ = "GPLv3" -__description__ = "Add a list of default trackers to all the public torrents" +__description__ = "Add default trackers to all public torrents" __long_description__ = """ Create a list of default trackers that will be added to new public torrents (and old ones after restarting Deluge). The plugin will not duplicate existing