Skip to content

Commit 91ef135

Browse files
WebUI interface + Gtk3 fix
1 parent 1b8c9f3 commit 91ef135

File tree

6 files changed

+267
-31
lines changed

6 files changed

+267
-31
lines changed

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ To get Deluge's output on Windows, run this in a terminal ("cmd" works):
3737
## TODO:
3838

3939
* log the added trackers so we can remove them from torrents when they are deleted from the default list
40-
* WebUI version
4140

4241
[1]: http://deluge-torrent.org/
43-
[2]: https://github.com/stefantalpalaru/deluge-default-trackers/raw/master/egg/DefaultTrackers-0.3-py3.7.egg
42+
[2]: https://github.com/stefantalpalaru/deluge-default-trackers/raw/master/egg
4443

defaulttrackers/common.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
#
1+
# -*- coding: utf-8 -*-
22
# common.py
33
#
4-
# Copyright (C) 2013-2019 Stefan Talpalaru <[email protected]>
4+
# Copyright (C) 2013-2022 Ștefan Talpalaru <[email protected]>
55
#
66
# Basic plugin template created by:
77
# Copyright (C) 2008 Martijn Voncken <[email protected]>
@@ -39,9 +39,8 @@
3939
#
4040

4141

42-
from __future__ import absolute_import, unicode_literals
42+
import os
43+
from pkg_resources import resource_filename
4344

4445
def get_resource(filename):
45-
import pkg_resources, os
46-
return pkg_resources.resource_filename("defaulttrackers",
47-
os.path.join("data", filename))
46+
return resource_filename(__package__, os.path.join("data", filename))

defaulttrackers/data/defaulttrackers.js

Lines changed: 94 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Script: defaulttrackers.js
33
The client-side javascript code for the DefaultTrackers plugin.
44
55
Copyright:
6-
(C) Stefan Talpalaru 2013-2016 <[email protected]>
6+
(C) Ștefan Talpalaru 2013-2022 <[email protected]>
77
This program is free software; you can redistribute it and/or modify
88
it under the terms of the GNU General Public License as published by
99
the Free Software Foundation; either version 3, or (at your option)
@@ -31,20 +31,107 @@ Copyright:
3131
statement from all source files in the program, then also delete it here.
3232
*/
3333

34-
DefaultTrackersPlugin = Ext.extend(Deluge.Plugin, {
34+
DefaultTrackersPanel = Ext.extend(Ext.form.FormPanel, {
3535
constructor: function(config) {
3636
config = Ext.apply({
37-
name: "DefaultTrackers"
37+
border: false,
38+
title: ("Default Trackers"),
39+
autoHeight: true,
3840
}, config);
39-
DefaultTrackersPlugin.superclass.constructor.call(this, config);
41+
DefaultTrackersPanel.superclass.constructor.call(this, config);
4042
},
43+
initComponent: function() {
44+
DefaultTrackersPanel.superclass.initComponent.call(this);
45+
this.opts = new Deluge.OptionsManager();
4146

42-
onDisable: function() {
47+
var fieldset = this.add({
48+
xtype: 'fieldset',
49+
title: ('Dynamic tracker list (optional)'),
50+
autoHeight: true,
51+
autoWidth: true,
52+
});
53+
this.opts.bind('dynamic_trackerlist_url', fieldset.add({
54+
xtype: 'textarea',
55+
fieldLabel: ('tracker list URL'),
56+
anchor: '100%',
57+
name: 'dynamic_trackerlist_url',
58+
autoWidth: true,
59+
}));
60+
fieldset.add({
61+
xtype: 'displayfield',
62+
fieldLabel: 'E.g.',
63+
value: 'https://newtrackon.com/api/stable or<br>https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_all.txt',
64+
});
65+
this.opts.bind('dynamic_trackers_update_interval', fieldset.add({
66+
xtype: 'textfield',
67+
fieldLabel: ('reload every X days'),
68+
anchor: '100%',
69+
name: 'dynamic_trackers_update_interval',
70+
autoWidth: true,
71+
}));
72+
73+
fieldset = this.add({
74+
xtype: 'fieldset',
75+
title: ('Default trackers'),
76+
autoHeight: true,
77+
autoWidth: true,
78+
});
79+
this.opts.bind('trackers_ta', fieldset.add({
80+
xtype: 'textarea',
81+
fieldLabel: (''),
82+
anchor: '100%',
83+
name: 'trackers_ta',
84+
height: '200px',
85+
autoWidth: true,
86+
}));
4387

88+
deluge.preferences.on('show', this.onPreferencesShow, this);
4489
},
4590

46-
onEnable: function() {
91+
onPreferencesShow: function() {
92+
deluge.client.defaulttrackers.get_config({
93+
success: function(config) {
94+
config.trackers_ta = config.trackers
95+
.map(function(tracker){return tracker.url})
96+
.join('\n');
4797

98+
this.opts.set(config);
99+
},
100+
scope: this,
101+
});
102+
},
103+
onApply: function(e) {
104+
var changed = this.opts.getDirty();
105+
if (!Ext.isObjectEmpty(changed)) {
106+
if (Ext.isDefined(changed['trackers_ta'])) {
107+
changed.trackers = changed.trackers_ta
108+
.split('\n')
109+
.filter(function(line){return line != ''})
110+
.map(function(url){return {'url': url}});
111+
}
112+
113+
deluge.client.defaulttrackers.set_config(changed, {
114+
success: this.onSetConfig,
115+
scope: this,
116+
});
117+
}
118+
},
119+
onSetConfig: function() {
120+
this.opts.commit();
121+
},
122+
});
123+
124+
DefaultTrackersPlugin = Ext.extend(Deluge.Plugin, {
125+
name: "Default Trackers",
126+
127+
onDisable: function() {
128+
deluge.preferences.removePage(this.prefsPage);
129+
},
130+
131+
onEnable: function() {
132+
this.prefsPage = new DefaultTrackersPanel();
133+
this.prefsPage = deluge.preferences.addPage(this.prefsPage);
48134
}
49135
});
50-
new DefaultTrackersPlugin();
136+
137+
Deluge.registerPlugin("Default Trackers", DefaultTrackersPlugin);

defaulttrackers/data/options.ui

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
<?xml version="1.0"?>
2+
<interface>
3+
<!-- interface-requires gtk+ 2.24 -->
4+
<!-- interface-naming-policy project-wide -->
5+
<object class="GtkDialog" id="options_dialog">
6+
<property name="can_focus">False</property>
7+
<property name="border_width">10</property>
8+
<property name="title" translatable="yes">Tracker Properties</property>
9+
<property name="modal">True</property>
10+
<property name="default_width">250</property>
11+
<property name="type_hint">dialog</property>
12+
<signal name="close" handler="on_options_dialog_close"/>
13+
<child internal-child="vbox">
14+
<object class="GtkVBox" id="dialog-vbox1">
15+
<property name="visible">True</property>
16+
<property name="can_focus">False</property>
17+
<property name="spacing">2</property>
18+
<child>
19+
<object class="GtkFrame" id="frame1">
20+
<property name="visible">True</property>
21+
<property name="can_focus">False</property>
22+
<property name="label_xalign">0</property>
23+
<property name="label_yalign">0</property>
24+
<property name="shadow_type">none</property>
25+
<child>
26+
<object class="GtkAlignment" id="alignment1">
27+
<property name="visible">True</property>
28+
<property name="can_focus">False</property>
29+
<child>
30+
<object class="GtkTextView" id="tracker_entry">
31+
<property name="height_request">134</property>
32+
<property name="visible">True</property>
33+
<property name="can_focus">True</property>
34+
</object>
35+
</child>
36+
</object>
37+
</child>
38+
<child type="label">
39+
<object class="GtkLabel" id="label1">
40+
<property name="visible">True</property>
41+
<property name="can_focus">False</property>
42+
<property name="label" translatable="yes">&lt;b&gt;Trackers&lt;/b&gt; (one per line)</property>
43+
<property name="use_markup">True</property>
44+
</object>
45+
</child>
46+
</object>
47+
<packing>
48+
<property name="expand">True</property>
49+
<property name="fill">False</property>
50+
<property name="position">0</property>
51+
</packing>
52+
</child>
53+
<child>
54+
<object class="GtkVBox" id="vbox1">
55+
<property name="visible">True</property>
56+
<property name="can_focus">False</property>
57+
<child>
58+
<object class="GtkLabel" id="label2">
59+
<property name="visible">True</property>
60+
<property name="can_focus">False</property>
61+
<property name="xalign">0</property>
62+
<property name="xpad">5</property>
63+
<property name="ypad">5</property>
64+
<property name="label">
65+
&lt;b&gt;Examples:&lt;/b&gt;
66+
67+
udp://tracker.opentrackr.org:1337/announce
68+
udp://tracker.openbittorrent.com:80
69+
udp://tracker.publicbt.com:80
70+
udp://tracker.istole.it:80
71+
udp://tracker.ccc.de:80
72+
http://tracker.coppersurfer.tk:6969
73+
udp://open.demonii.com:1337
74+
http://tracker.baravik.org:6970/announce
75+
http://tracker2.wasabii.com.tw:6969/announce
76+
udp://9.rarbg.me:2710/announce
77+
udp://tracker.zer0day.to:1337/announce
78+
</property>
79+
<property name="use_markup">True</property>
80+
<property name="selectable">True</property>
81+
</object>
82+
<packing>
83+
<property name="expand">True</property>
84+
<property name="fill">True</property>
85+
<property name="position">0</property>
86+
</packing>
87+
</child>
88+
</object>
89+
<packing>
90+
<property name="expand">True</property>
91+
<property name="fill">True</property>
92+
<property name="position">1</property>
93+
</packing>
94+
</child>
95+
<child internal-child="action_area">
96+
<object class="GtkHButtonBox" id="dialog-action_area1">
97+
<property name="visible">True</property>
98+
<property name="can_focus">False</property>
99+
<property name="layout_style">center</property>
100+
<child>
101+
<object class="GtkButton" id="opts_cancel_button">
102+
<property name="label">gtk-cancel</property>
103+
<property name="visible">True</property>
104+
<property name="can_focus">True</property>
105+
<property name="receives_default">False</property>
106+
<property name="use_stock">True</property>
107+
<signal name="clicked" handler="on_opts_cancel_button_clicked"/>
108+
</object>
109+
<packing>
110+
<property name="expand">False</property>
111+
<property name="fill">False</property>
112+
<property name="position">0</property>
113+
</packing>
114+
</child>
115+
<child>
116+
<object class="GtkButton" id="opts_add_button">
117+
<property name="label">gtk-add</property>
118+
<property name="visible">True</property>
119+
<property name="can_focus">True</property>
120+
<property name="receives_default">False</property>
121+
<property name="use_stock">True</property>
122+
<signal name="clicked" handler="on_opts_add_button_clicked"/>
123+
</object>
124+
<packing>
125+
<property name="expand">False</property>
126+
<property name="fill">False</property>
127+
<property name="position">1</property>
128+
</packing>
129+
</child>
130+
<child>
131+
<object class="GtkButton" id="opts_apply_button">
132+
<property name="label">gtk-apply</property>
133+
<property name="visible">True</property>
134+
<property name="can_focus">True</property>
135+
<property name="receives_default">False</property>
136+
<property name="use_stock">True</property>
137+
<signal name="clicked" handler="on_opts_apply_button_clicked"/>
138+
</object>
139+
<packing>
140+
<property name="expand">False</property>
141+
<property name="fill">False</property>
142+
<property name="position">2</property>
143+
</packing>
144+
</child>
145+
</object>
146+
<packing>
147+
<property name="expand">False</property>
148+
<property name="fill">True</property>
149+
<property name="pack_type">end</property>
150+
<property name="position">2</property>
151+
</packing>
152+
</child>
153+
</object>
154+
</child>
155+
</object>
156+
</interface>

defaulttrackers/gtk3ui.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# -*- coding: utf-8 -*-
22
# gtkui.py
33
#
4-
# Copyright (C) 2013-2019 Ștefan Talpalaru <[email protected]>
4+
# Copyright (C) 2013-2022 Ștefan Talpalaru <[email protected]>
55
#
66
# Basic plugin template created by:
77
# Copyright (C) 2008 Martijn Voncken <[email protected]>
@@ -41,6 +41,7 @@
4141
from __future__ import absolute_import, unicode_literals
4242
from gi.repository import Gtk
4343
import logging
44+
import os
4445

4546
from deluge.ui.client import client
4647
from deluge.plugins.pluginbase import Gtk3PluginBase
@@ -67,7 +68,7 @@ def __init__(self, gtkui):
6768
self.gtkui = gtkui
6869

6970
def show(self, options=None, item_id=None, item_index=None):
70-
self.builder = Gtk.Builder.new_from_file(get_resource("config.ui"))
71+
self.builder = Gtk.Builder.new_from_file(get_resource("options.ui"))
7172
self.builder.connect_signals({
7273
"on_opts_add_button_clicked": self.on_add,
7374
"on_opts_apply_button_clicked": self.on_apply,
@@ -110,14 +111,15 @@ def on_add(self, widget):
110111
if not self.in_store(url):
111112
self.gtkui.store.append([url])
112113
self.gtkui.trackers.append({"url": url})
114+
self.dialog.response(Gtk.ResponseType.DELETE_EVENT)
113115
except Exception as err:
114116
dialogs.ErrorDialog("Error", str(err), self.dialog).run()
115117

116118
def generate_opts(self):
117119
# generate options dict based on gtk objects
118120
buffer = self.builder.get_object("tracker_entry").get_buffer()
119121
options = {
120-
"urls": buffer.get_text(*buffer.get_bounds()).split(),
122+
"urls": buffer.get_text(*buffer.get_bounds(), False).split(),
121123
}
122124
if len(options["urls"]) == 0:
123125
raise Exception("no URLs")
@@ -128,6 +130,7 @@ def on_apply(self, widget):
128130
options = self.generate_opts()
129131
self.gtkui.store[self.item_id][0] = options["urls"][0]
130132
self.gtkui.trackers[self.item_index]["url"] = options["urls"][0]
133+
self.dialog.response(Gtk.ResponseType.DELETE_EVENT)
131134
except Exception as err:
132135
dialogs.ErrorDialog("Error", str(err), self.dialog).run()
133136

defaulttrackers/webui.py

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
#
1+
# -*- coding: utf-8 -*-
22
# webui.py
33
#
4-
# Copyright (C) 2013-2019 Stefan Talpalaru <[email protected]>
4+
# Copyright (C) 2013-2022 Ștefan Talpalaru <[email protected]>
55
#
66
# Basic plugin template created by:
77
# Copyright (C) 2008 Martijn Voncken <[email protected]>
@@ -38,22 +38,14 @@
3838
# statement from all source files in the program, then also delete it here.
3939
#
4040

41-
from __future__ import absolute_import, unicode_literals
42-
import logging
43-
from deluge.ui.client import client
44-
from deluge import component
41+
from __future__ import absolute_import
4542
from deluge.plugins.pluginbase import WebPluginBase
4643

4744
from .common import get_resource
4845

49-
log = logging.getLogger(__name__)
50-
5146
class WebUI(WebPluginBase):
5247

5348
scripts = [get_resource("defaulttrackers.js")]
5449

55-
def enable(self):
56-
pass
57-
58-
def disable(self):
59-
pass
50+
def __init__(self, plugin_name):
51+
super(WebUI, self).__init__(plugin_name)

0 commit comments

Comments
 (0)