Compare commits

..

1141 Commits

Author SHA1 Message Date
196458399e Update version number 2012-04-09 18:53:16 -07:00
1d243d5967 Remove some additional DLLs 2012-04-09 18:51:55 -07:00
418037dd43 Update version 2012-04-09 18:42:25 -07:00
900907a545 Update Changelog 2012-04-09 17:28:31 +01:00
b3a721b539 Update Translations from Launchpad 2012-04-09 17:17:12 +01:00
d783b8ead7 WebUI: Increase focus delay for password field cursor 2012-04-09 17:14:11 +01:00
5572f61022 Fix #2071 : KeyError in gtkui when file priority set to value '3'
Bug results from setting file priority value in core which does not
exist in the FILE_PRIORITY dict used by UIs.
2012-04-08 23:35:34 +01:00
fe6e9ec467 Gtkui: move height request to child widget in create dialog 2012-04-08 17:50:55 +01:00
675a64e213 Fix missing semi-colon in deluge.desktop 2012-04-08 12:04:59 +02:00
931b8aec71 Console: Fix prefixed space for tab completing commands
The join command adds space if 'p' is empty string.
2012-03-26 19:08:28 +01:00
f19caf69e0 Console: Fix missing trailing space for command options with tab complete 2012-03-26 19:04:55 +01:00
56a24f16f2 Only assign prioritize_first_last_pieces to torrent options if actually changed 2012-03-26 17:06:51 +01:00
275c939b95 Remove unnecessary translation from connection manager 2012-03-24 00:24:10 +00:00
8238c63156 Use (documented) formatdate over format_date_time 2012-03-23 19:23:01 +11:00
c19718b66a Grey out file priorities for 'is_seed:True' seeding torrents 2012-03-22 01:22:31 +00:00
eac52dec73 Bring MainWindow to front when opening another instance of gtkui 2012-03-22 01:14:41 +00:00
124daaf8b2 Update translations po files 2012-03-21 21:32:58 +00:00
5d6fa23011 Hide unused Infohash button in WebUI 2012-03-14 00:22:48 +00:00
0da64f7db4 Update ChangeLog 2012-03-13 00:05:44 +11:00
b9030dfb8b Preserve order when moving multiple torrents in the queue 2012-03-12 23:46:19 +11:00
3528549430 Add get_queue_position & use it for sorting ids 2012-03-12 23:46:19 +11:00
39a04aae20 Fix not properly detecting when torrent is at end of queue 2012-03-12 23:45:51 +11:00
72a2ace0a1 Update Changelog, deluge.pot and js compress 2012-03-11 19:33:06 +00:00
4240345daf Label Plugin: Mark 'Label Options' for translation 2012-03-11 18:40:04 +00:00
cb9867a26f Label Plugin: Defer translate No Label text in submenu 2012-03-11 18:26:53 +00:00
07e166b94a Label Plugin: Disable menu items for 'All' in sidebar 2012-03-11 18:26:53 +00:00
3c7f492451 Fix Label Plugin text 'All' for translation in sidebar 2012-03-11 18:26:18 +00:00
aeca5dd1e7 Mark torrent menu Pause text for translation 2012-03-11 17:17:29 +00:00
c194f6bbe4 Fix #2052 : Progress bar state text marked for deferred translation 2012-03-11 17:13:25 +00:00
4d77241603 Modified fix for #1957 non-acsii columns 2012-03-10 22:31:43 +00:00
a2a45f1a0b Fix gtk sidebar text for translation 2012-03-10 22:31:17 +00:00
217087a2fe Fix for Up Speed column not sorting in Webui 2012-03-10 13:17:24 +00:00
bb89a355e5 Merge branch '1.3-stable' of deluge-torrent.org:deluge into 1.3-stable 2012-03-04 16:41:43 -08:00
954c0e2d4d Change some of the win32 build/installer scripts to support bundling GTK
in with the installer
2012-03-04 16:41:13 -08:00
9ce738e39a Fix adding magnet error in webui when started from classic mode 2012-03-03 23:41:24 +00:00
911d583ff0 Bump version to 1.3.4 2012-03-03 11:55:13 -08:00
07bc1322dd update depends 2012-03-03 02:32:50 +00:00
1058435700 Set process name to match application using setproctitle
Using the setproctitle module the process name displayed in top
and other places will correctly reflect the binary name. This is an
optional dependency
2012-03-03 02:29:42 +00:00
0676aaf918 Properly wait for the component.shutdown deferred on shutdown. This should prevent the daemon from exiting before all the state has been saved. 2012-03-02 09:15:35 -08:00
5d0dace131 Fix #2045 : UnicodeDecodeError when using non-ascii chars in info
Input arg string needed decoding otherwise comparing with unicode
torrent name fails.
2012-03-02 15:42:15 +00:00
be75d5021b Execute: log stdout/stderr when command fails 2012-03-02 13:03:01 +11:00
b0029517eb Execute: make running commands asynchronous
This prevents deluge from hanging while it waits
for a command to finish.
This also prevents a deadlock from occuring
(c.f. warning at
 http://docs.python.org/library/subprocess.html#subprocess.Popen.wait)
2012-03-02 12:57:47 +11:00
2ae936df44 Remove setting torrent.is_finished in the resume alert
Set torrent.is_finished to false when torrent is in a Checking or Downloading state
2012-02-29 15:20:59 -08:00
1f5cfd16e0 Updates to previous fixes for setting is_finished 2012-02-29 02:56:14 +00:00
b5b0db6c60 Update Changelog and deluge.pot 2012-02-29 01:35:37 +00:00
1f660653ff Set is_finished to match is_seed after checking
Fixes issue where re-downloading data would not change is_finished
2012-02-29 01:35:33 +00:00
7020e5ca90 Blocklist: remove default url as it is outdated 2012-02-29 12:21:18 +11:00
00ebaae67a Blocklist: check for updates iff interval > 0 2012-02-29 12:18:24 +11:00
eb773bba2c Fix preferences dialog not opening with main window on Windows 2012-02-28 22:44:52 +00:00
e10cfb8f8c Fix #1976 : Text entry with trailing newline characters causes issues for Move Storage
Changed most GtkEntry truncate-mutliline properties to True for all single line
entries to prevent similar issues.
2012-02-28 19:29:36 +00:00
fcf26bad45 Add optparse custom version to prevent unnecessary loading of libtorrent 2012-02-28 19:29:35 +00:00
ec373c0ec9 Update translations 2012-02-28 19:29:34 +00:00
933f80c01c Alternative fix for re-enabling plugin issue 2012-02-28 19:29:34 +00:00
89634137b9 Update Changelog 2012-02-27 15:39:08 +00:00
e7dada6afc Fix #2021 : Share ratio limit not obeyed for torrents downloaded outside deluge
Share ratio limit is based upon torrent.is_finished and a seeded torrent added
to the session was not set after checking.
2012-02-27 15:31:53 +00:00
8db789ffe2 Fix #2038 : Chrome 17 disconnecting from webui 2012-02-27 15:31:53 +00:00
dd3aab1cef Catch glade object issue when re-enabling Autoadd
Found an additional glade object from the previous instance of Autoadd
calling cb_get_config resulting in an exceptions.AttributeError.
This workaround simply checks that get_widget is not None.
2012-02-27 15:29:50 +00:00
54769fe190 Fix #2044 : Unable to re-enable execute plugin 2012-02-27 15:22:04 +00:00
fa7edd0bad Fix plugins not showing enabled in webui 2012-02-26 23:00:06 +00:00
2b865273f6 Fix potential keyerror for on_torrent_removed in sessionproxy 2012-02-24 00:34:53 +00:00
403ad26111 Update Changelog 2012-02-23 00:51:29 +00:00
6bc3968ba4 Multiple Magnet links support in autoadd plugin 2012-02-22 18:38:16 +00:00
bbeb11b1e7 Magnet link support in autoadd plugin
Check the watch folders for .magnet files which contain valid magnet links
and add them.
2012-02-22 18:38:05 +00:00
e4840d6b37 tabs to spaces 2012-02-22 15:53:29 +00:00
88db73e244 More fixes for labels plugin webui
Disabled options and remove for filters No Label and All
Removed All from torrent menu
Fixed No Label not working in torrent menu
Bumped version to 0.2
2012-02-22 15:49:49 +00:00
a359374547 Fix #2035: If auto_add_trackers is empty, it is an array 2012-02-22 13:55:06 +00:00
c5e328c3bd Fix #2036: new labels are not sorted on torrent right click 2012-02-22 13:35:14 +00:00
bc425b392a Convert tabs to spaces in label.js 2012-02-22 13:34:57 +00:00
4feb816380 Fix missing desktop file preventing install 2012-02-20 16:56:20 +00:00
ff95d9720a Fix setting daemon listen interface from command line 2012-02-20 14:06:29 +00:00
7847362dbb Catch and log ReactorNotRunning when stopping reactor in gtk 2012-02-19 16:44:12 +00:00
7b1e8862b4 correction for glib.gerror commit 2012-02-19 13:32:45 +00:00
ed883125fd catch and log 'glib.GError: Unrecognized image file format' error 2012-02-19 00:54:33 +00:00
9799c64505 Fix #2037: webui 'Add Torrents' dialog torrents list not scrolling 2012-02-18 20:36:32 +00:00
d1f788ebe3 Further fix for progress bar display in webui
When first loading webui is browser this.style is undefined and p.style
contains the width of the progress column however after this point
p.style contains the width of the previous column so need to use
this.style which now represents the progress column width.
2012-02-18 18:59:13 +00:00
3744bdad69 Build compressed javascript for deluge-all 2012-02-18 18:26:04 +00:00
ea75828f25 Fix progress bar display 2012-02-18 18:23:57 +00:00
966fc6f64f Update extensions to Ext JS 3.4.0 2012-02-18 18:23:52 +00:00
5ff0d61b52 Add Webui keymaps for torrents - Ctrl-A (select all) and Delete 2012-02-18 03:42:00 +00:00
f5956f01e7 Ignore unmaximise event when window isn't visible
This fixes the bug where a maximised main window
will become unmaximised (on restart) after
quitting deluge from the system tray.
2012-02-18 12:34:05 +11:00
717db367e8 Add magnet uri support to Add Url in Webui 2012-02-18 00:39:24 +00:00
e0efe3885a Update Changelog 2012-02-16 16:58:32 +00:00
836da50f78 Remove orientation property from glade files to fix compatibility warnings 2012-02-16 16:44:15 +00:00
85b1753a28 Fix compatibility for Python2.5 and Debian Lenny
Recent commit to handle warnings were >=Py2.6 and glib binding is
unavailable on Debian Lenny.
2012-02-16 16:44:14 +00:00
eb6959fb98 Cleaner log entry if deluged missing 2012-02-16 16:44:14 +00:00
30c142ac4d Fix #1954 : 'invalid literal for float' console error when setting listen interface 2012-02-16 16:44:14 +00:00
08a75bd9f9 Wait for client to shutdown/disconnect before stopping reactor (fixes #2032) 2012-02-16 14:12:03 +11:00
754a5a7f8a Add scheduler plugin page to webui 2012-01-25 01:00:15 +00:00
863fd7d2b7 Webui applies changes when OK clicked in Preferences 2012-01-25 01:00:05 +00:00
56f2283e3e Fix collapsed treeview in Create Torrent dialog 2012-01-24 14:25:09 +00:00
272d2005e0 Add missing columns to WebUI
Added Download,Uploaded,Down Limit, Up Limit & Seeder/Peeds. Also selected
columns start out hidden to match gtkui and the name column has a minimum
width of 150.
2012-01-24 01:55:56 +00:00
375ee2dd1c correction for the comparision in previous commit 2012-01-19 01:28:39 +00:00
98dcc8e3b1 Fix stored file priorities settings
File priorities stored in torrent options were based upon the supplied
funtion values rather than the current values stored in libtorrent. So
if the priorities failed to be set by libtorrent the settings would be
out of sync.
2012-01-19 00:51:54 +00:00
e91458662f ui: fix error in last commit
The last commit assumed that loglevel would always be a string,
take into account that it can sometimes be None
2012-01-17 17:07:09 +00:00
2600785cbb Merge branch '1.3-stable' of deluge-torrent.org:deluge into 1.3-stable 2012-01-17 16:58:29 +00:00
e5576dff1e ui: fix setting capital log level
Whilst providing the log level as a lowercase string has worked
for a long time trying to use DEBUG doesn't work, so lowercase
the string first.
2012-01-17 16:58:18 +00:00
4c648bc09f Update Changelog 2012-01-10 02:08:17 +00:00
17d9739abb create the toolbar with the rest of the UI 2012-01-10 00:53:02 +00:00
c1bf52e8d9 update changelog 2012-01-09 22:38:18 +00:00
d60b436fcb web: rebuild the compressed javascript
There were a few changes when upgrading to ext 3.4 so rebuild and
compress the javascript files
2012-01-09 22:37:29 +00:00
2e0e0fb6b5 Merge branch '1.3-stable' of deluge-torrent.org:deluge into 1.3-stable 2012-01-09 22:34:59 +00:00
fe4f732c12 web: update to extjs 3.4.0
There are numerous fixes to the framework between 3.1.1 and 3.4.0 and
since there are no obvious bugs introduced it's only sensible to pull
the update in to the stable branch
2012-01-09 22:34:47 +00:00
25d930b307 Fix #1929 : Update setup.py to clean deluge*.egg_info dir from root dir 2012-01-09 22:19:24 +00:00
083c7fbb32 Fix #1936 : Referenced before assignment error in json_api 2012-01-09 22:19:24 +00:00
81fc47d080 web: fix gen_gettext script
The script for generating the gettext.js file was outdated and needed
a fix to work with the newer layout of the javascript source code, it
was still looking for Deluge.Something files which no longer exist.
2012-01-09 21:58:20 +00:00
e1745443bf Fix #1895 : Files Tab showing wrong files due to torrent_info race condition 2012-01-09 18:33:10 +00:00
649f933316 Update AUTHORS 2012-01-09 18:32:49 +00:00
8b46ed8bdb Remove unneeded license from blocklist 2012-01-08 14:03:22 +00:00
62aa339fd8 Fix #2010 : Move speed text in titlebar to the beginning 2012-01-08 03:53:30 +00:00
96d8f10080 Strip trailing space and tabs in aboutdialog 2012-01-07 19:53:24 +00:00
3d8e3f4add Webui: Smaller minSize for Sidebar and remove 1px border from mainpanel 2012-01-07 19:22:09 +00:00
08eb6002f8 Remove dotted line on buttons in Firefox 2012-01-06 20:52:04 +00:00
0015c9af86 Add Deluge and icon to start of toolbar in webui 2012-01-06 20:34:29 +00:00
4365e1ff39 Fix clipped Browse button in WebUI 2012-01-06 15:44:38 +00:00
0b6af77d57 Fix plugin uploads from behind a reverse proxy 2012-01-06 15:44:38 +00:00
6b2320d4b6 Fix password box focus issue in Firefox 9 for WebUI 2012-01-06 15:44:38 +00:00
a5742f892d Fix #1915 : Unable to stop the status bar from autohiding 2012-01-06 15:44:38 +00:00
01adb882ea Remove uneeded Title to save space in WebUI 2012-01-06 15:44:38 +00:00
9fd6d3d418 Hide unused Create button in WebUI 2012-01-06 15:44:38 +00:00
d4834bc6c7 web: fix font in loaded html
When dynamically loading the content panels in the details panel they
would sometimes look quite bad since the only font they have been
told to use is verdana. Fix this why using the same as extjs.
2012-01-06 15:06:21 +00:00
e4eda24e8f Update Changelog 2012-01-04 19:00:21 +00:00
39f648684e Fix #1961 : Missing 'All' filter option for Label plugin 2012-01-04 18:40:29 +00:00
56f8e213e3 Update POT and PO files 2012-01-03 00:38:02 +00:00
cb86828fa6 Update About dialog for translation 2012-01-02 19:12:48 +00:00
5cffc8f7e0 Add clean desktop file to setup.py 2012-01-02 16:53:28 +00:00
97912a28e4 Update Win32 README 2011-12-15 17:00:41 +00:00
9d2b0101d6 Fix issue in saving libtorrent session state 2011-12-15 16:10:21 +00:00
e49b7d5c23 Update README file 2011-12-15 15:41:00 +00:00
78a0ffd437 New AUTHORS file 2011-12-15 15:40:38 +00:00
dee8c30968 Add unneeded files for release to export-ignore 2011-12-15 15:33:47 +00:00
a34f224201 Build deluge-all.js 2011-12-07 01:20:21 +00:00
7a3c4440dc Update webui build file to run on Ubuntu 2011-12-07 01:07:19 +00:00
ce0c6d99f2 Revert "Fix #1976 : Trailing newlines in move_storage"
This reverts commit d96fae520d.
2011-12-05 18:14:56 +00:00
d96fae520d Fix #1976 : Trailing newlines in move_storage 2011-12-01 23:49:46 +00:00
d3c3d64cd4 Fix #1938 : AttributeError when attempting to shutdown daemon from client 2011-12-01 23:46:47 +00:00
b530658e20 Fix #1969 : Menu item 'quit & shutdown' available when not connected to daemon 2011-12-01 23:32:19 +00:00
eb70a7a6dc Fix #1984 : KeyError in preferences.py if key not in stored config 2011-12-01 19:30:57 +00:00
370035ffc5 Fix #1934 : Unicode error in AddTorrent Dialog 2011-12-01 19:24:33 +00:00
0941377fac Fix #1957 : Columns don't add resulting in keyerror for non-latin languages 2011-12-01 19:21:13 +00:00
1a8aa4b920 Fix #1898 : Email notifications do not include date/time they were sent 2011-11-30 00:05:13 +00:00
1c8327034d Revert "Fix #1338 Seeds and Peers totals not updating"
Did not fix the issue.
This reverts commit 1a9ae62669.
2011-11-29 17:52:13 +00:00
9ed155c456 Update to the DnD windows fix
Found that the original fix worked fine with GTK v2.24 but with v2.16 on Windows get_uris is empty
2011-11-27 01:44:30 +00:00
3d813ea1f8 Fix #1905 : No email sent to second email address in Notifications plugin 2011-11-26 14:51:49 +00:00
0f962aeda5 Fix #1953 : Console flickering on every update 2011-11-26 14:51:44 +00:00
3a0b6f8a6d Fix #1945 : Mutable default arguments in deluge.ui.client 2011-11-25 14:18:45 +00:00
cade8ee784 Change Windows default download path from '~' to '~\Downloads' 2011-11-25 13:46:34 +00:00
0d27032c06 AddTorrent file dialog now can browse network shares 2011-11-25 09:50:40 +00:00
3b8bbb2e77 Update Changelog 2011-11-22 23:16:27 +00:00
9c9064b246 Fix #1918 : Drag'n'Drop not working in Windows
Moved uri handling from mainwindow into ipcinterface process_args() and fix url to path conversion
2011-11-22 22:48:21 +00:00
d1a3cbebbe Remove code duplication in queuedtorrents.py, use ipcinterface process_args() instead 2011-11-22 22:48:21 +00:00
79f8af688a Modify log message from Error to Warning level 2011-11-22 22:37:51 +00:00
bbba60f34c Fix Webui files-tab menu setting wrong priority 2011-11-21 21:50:54 +00:00
a2d313383c Fix #1921 : GTKUI reports free disk space incorrectly 2011-11-20 18:00:19 +00:00
e336cd64b4 Fix #1967 : IndexError when trying to open a non-json conf file 2011-11-20 18:00:19 +00:00
eff3577505 Fix LP#821577 : UnpicklingError when external selection dragged onto Files Tab 2011-11-20 18:00:19 +00:00
2504b2520a Fix #1964 : Unhandled UnpicklingError with corrupt state file 2011-11-20 18:00:18 +00:00
d8560f5c25 Fix #1944 : Use errno constants for portability 2011-11-20 18:00:18 +00:00
51802f7c54 Fix #1912 : Exit nicely from get_libtorrent.sh if svn not installed 2011-11-20 18:00:18 +00:00
a3538c8937 Fix #1941 : Increase UIs max cache value to 999999 (15GiB) 2011-11-20 18:00:18 +00:00
714b7f3c55 Fix #1960 : Web UI statusbar shows total_payload_download for upload 2011-11-20 18:00:18 +00:00
f0c4a4c766 Fix #1928 : Crash when dragging column header
The fix specifically applied to on_alert_save_resume_data by moving function call str(alert.handle.info_hash()) into the try statement. For completeness any calls to str(alert.handle.info_hash()) also moved into try statements.
2011-11-20 18:00:12 +00:00
683e4be529 Fix #1940 : File & folder renaming issue when using Add Torrent dialog in Windows
The file rename in torrentmanager was calling lt.rename_file directly
so skipping the sanitize function normally applied when renaming.
2011-11-20 17:58:29 +00:00
93a860f2a1 Fix typo in Windows shutdown handler 2011-08-08 10:42:06 -07:00
9c4cd86492 Iterate over values not keys (fixes autoadd error) 2011-08-07 15:16:44 +10:00
fc6f9ebc3b Fix formatting of Changelog and add next version 2011-07-29 00:10:35 +01:00
603ca1b855 Fix i18n sub-dir issue in gitignore
Also fixes trailing whitespace in setup.py
2011-07-28 22:34:20 +01:00
3b89595d38 Update translation 'po' files 2011-07-26 00:49:48 +01:00
448478485a Add my name to author list 2011-07-22 19:28:31 +01:00
4234583fc7 Fix .desktop file creation on Windows by just ignoring it 2011-07-22 11:12:47 -07:00
bdd9bd11b5 Update version 2011-07-22 10:58:01 -07:00
8dbdb02967 Update windows setting 2011-07-19 16:50:32 -07:00
0555fbeb9d Fix python2.5 compatibility with except statements in remove_empty_folders 2011-07-16 14:11:52 +01:00
3126407d74 Update Changelog and ez_setup 2011-07-14 13:42:17 +01:00
2d09035dc4 Fix httpdownloader Tests 2011-07-14 01:00:26 +01:00
ed229d2ace Add intltool to dependencies 2011-07-13 23:29:39 +01:00
9e0d173115 Fix torrent file and folder renaming issues
Adds `sanitize_filepath` for use before passing to libtorrent rename_file
2011-07-13 22:39:23 +01:00
81d4b00ade Localize the Desktop file 2011-07-13 21:28:59 +01:00
1a9be0e9a4 Update Changelog, deluge.pot & gitignore 2011-07-10 17:45:37 +01:00
28fc325db9 Fix UnicodeDecodeError from 'deluge-console --help' with other languages 2011-07-10 16:30:00 +01:00
eb309813ea Fix #1505: Add libtorrent info to --version output 2011-07-09 23:09:17 +01:00
2e7bd90bda Fix #1801: ConsoleUI failed connect results in unhandled defered error and missing error message 2011-07-09 21:57:36 +01:00
f59eca4405 Fixes keyerror with existing file priorities set to High 2011-07-08 23:24:54 +01:00
fa209dfd5f Add handler for drag_data_received to supress warning 2011-07-08 23:15:15 +01:00
8e8717c867 Fix httpdownloader error with existing filename 2011-07-06 22:53:41 +01:00
8644bc219a LP Bug #496265: Peers in PeersTab show non-zero download rate when seeding 2011-07-06 21:33:02 +01:00
7c276f3133 Fix #1263: GTK UI not remembering column width
Removing a column from the treeview on shutdown causes all the
column widths to be zero which are saved to the state file.

The workaround is to not save the state file if all columns are zero.
2011-07-06 19:11:05 +01:00
ce1aca54b5 Fix #948: New Release Dialog does not show server version 2011-07-05 18:30:11 +01:00
54642720e4 Update ubuntu favicon in test_tracker_icons.py 2011-07-05 17:53:11 +10:00
18ebf5b912 Only deregister component if the registry still exists 2011-07-05 17:53:11 +10:00
ff087d133c Fix #1239: Translated Tracker Error text not counted in sidebar Error status 2011-07-04 21:20:59 +01:00
5d4c8241ea Fix translation of KiB/s 2011-07-04 21:13:44 +01:00
fbc664fa14 Fix #1258: Add Magnet and Url support to add command in console 2011-07-02 19:32:43 +01:00
cc130c0085 Fix up/down speed labels in status tab 2011-07-02 19:10:55 +01:00
87802aa965 Update Changelog 2011-07-02 18:57:57 +01:00
678be3ce15 Fix #1715: AddTorrentsDialog does not display filename changes when switching between torrents 2011-07-02 15:30:57 +01:00
52f89270e6 Fix #1582: Wrong path separator returned when moving storage in Windows 2011-07-02 15:30:57 +01:00
1a9ae62669 Fix #1338 Seeds and Peers totals not updating 2011-07-01 02:37:40 +01:00
e7b5be6a60 Fix #1477: Execute Plugin should ignore Added events from state file on startup 2011-06-30 22:38:34 +01:00
7e51c82705 Improved fix for losing Labels upon restart 2011-06-30 22:38:07 +01:00
d6e619c413 Add session_started to determine if TorrentAddedEvent is from state file 2011-06-30 22:33:48 +01:00
ba1cc6ef1f Fix #1232: Improve display of Peers Tab IPv6 addresses 2011-06-30 17:56:43 +01:00
b5a0f32826 Fix append trackers error occuring with magnet uris 2011-06-30 17:19:41 +01:00
2cceb3a349 Update append trackers commit to ignore state file adds 2011-06-28 01:42:26 +01:00
6ad3a770af Add #890: If added torrent already exists, append extra trackers to it 2011-06-28 00:53:02 +01:00
f7c21fd87b Fix #1246: Losing Labels upon restart 2011-06-27 23:09:08 +01:00
01465f583f Adjust file priorities to make Highest actually the highest allowed by libtorrent and High has been changed to what Highest was 2011-06-21 10:51:49 -07:00
d3b0df5788 Update Changelog 2011-06-20 00:18:13 +01:00
4f3c753fc1 Save and restore Preferences dialog size from config 2011-06-19 23:47:39 +01:00
6a873c524e Update potfiles and deluge.pot 2011-06-19 23:12:18 +01:00
010b6dd4af Fix preferencesmanager from failing to stop when trying to stop
loopingcall that wasn't started
2011-06-18 20:14:37 -07:00
00900fef1c Fix uri handling when dragged to gtk window 2011-06-17 22:27:39 +01:00
d2e1d66f43 Fix unhandled 'Connection was refused' error in gtkui 2011-06-17 18:00:40 +01:00
c95ca18b37 Add a file exists check to torrents passed as arg 2011-06-16 21:14:41 +01:00
34f81634e5 Fix path error with torrent files prefixed with 'file://' from Firefox 2011-06-16 21:14:41 +01:00
2cb77d17ce Increase max piece size to 16 MiB in create torrent dialog
Increasing it beyond this will require changes to
createtorrentdialog.py
2011-06-10 13:28:18 +10:00
4c32aa14d0 modify pluginbasemanager to search for egg_info dirs 2011-06-08 22:46:23 +01:00
5d9120b667 Add 2 more commands to setup.py
Two more commands were added to setup.py:
 * develop_plugins - Installs each of the plugins in development mode
 * egg_info_plugins - Create the '.egg-info' distribution directories for each plugin. This will make the plugin discoverable by deluge

Both these commands are intended to be used while developing deluge.
2011-06-08 22:26:28 +01:00
8a3bad9fc2 Fix #1456 - No ETA showing with multiple files 2011-06-05 13:10:02 +01:00
2005691312 Fix #1560 - FilesTab Progress value sorting by int instead of float 2011-06-05 13:10:02 +01:00
47c9cccd74 Merge branch 'translate_updates' into 1.3-stable 2011-06-05 00:28:20 +01:00
2186fdb870 Catch snd_path is None error in Notification Plugin 2011-06-04 23:35:03 +01:00
5b1e43735b Fix systemtray from stopping properly when appindicator is enabled 2011-06-03 14:54:36 -07:00
e54f6c84d6 Fix translations texts in glade and python files 2011-06-03 20:16:54 +01:00
30d91f17dc Remove page x from translatable in pref_diaog glade 2011-06-03 20:16:54 +01:00
af058bbdc7 Change translatable to No for gtk stock labels 2011-06-03 20:16:54 +01:00
7232dc4b01 Add gtk-* items to gettextize 2011-06-03 20:16:54 +01:00
263b10ffd2 Update gettextize to ignore .git folder 2011-06-03 20:16:54 +01:00
36d5ff5040 Fix translate string in notifications plugin 2011-06-03 20:16:54 +01:00
85d4602949 Fix translated string in addtorrentdialog 2011-06-03 20:16:54 +01:00
a75fa41c42 update create_potfiles_in to ignore plugins build dir 2011-06-03 20:16:46 +01:00
e75ae7c81e Merge branch '1.3-stable' of deluge-torrent.org:deluge into 1.3-stable 2011-06-03 09:01:48 -07:00
fad24e93f3 Update setuptools version in ez_setup 2011-06-02 21:49:27 +01:00
94d53ac368 Show errors when trying failing to properly stop a component 2011-06-02 12:04:56 -07:00
52bf08dfd1 Fix #1869: Set the disk io read/write to bypass OS cache in Windows as suggested in http://code.google.com/p/libtorrent/issues/detail?id=166 2011-05-31 09:57:59 -07:00
532973c3d1 Fix #1504 - Win32 run deluged as not logged in user via runas or service 2011-05-30 12:48:23 +01:00
254efa88e5 Add check to key_press_event for keyname returning None 2011-05-29 12:08:55 +01:00
583248f558 Allow a smtp port higher than 100
Add a shadow to scrolled window
2011-05-28 18:25:58 -07:00
69956ad1db Implemented search as you type capabilities to the treeview, ie, when the
treeview has focus and user starts typing, select the first matching
torrent name.
2011-05-28 22:12:32 +01:00
1e274cfb48 Update Changelog 2011-05-27 23:58:52 +01:00
b0e38d7bde Merge branch 'Add-F2' into 1.3-stable 2011-05-27 23:47:43 +01:00
4d643f2cba Fix #1861 - AutoAdd Warning (column number is a boolean) 2011-05-27 23:46:02 +01:00
09a56ae03c Catch an IndexError occurring in Files Tab when scrolling through long list of torrents 2011-05-27 23:46:02 +01:00
c2b5d29c6a Fix #1860 - Files Tab TypeError (could not parse subscript as a tree path) 2011-05-27 23:46:02 +01:00
a3d2b41b54 Fix #1195 - Right-click selecting issue when switching between files and folders 2011-05-27 23:46:02 +01:00
da679371b7 Add F2 key shortcut to rename files in Files Tab 2011-05-27 23:46:02 +01:00
83283cdcf3 Add XDG_DOWNLOAD_DIR for default download folder #1788 2011-05-27 23:45:54 +01:00
e180e2af88 Fix subheading in ChangeLog 2011-05-26 10:10:08 +10:00
14c3655ba1 Properly show the 'Checking Resume Data' state instead of just 7
Show the checking icon for torrents in the 'Checking Resume Data' state
2011-05-25 13:27:16 -07:00
f330469bc9 Set the WM_CLASS name to Deluge 2011-05-25 13:17:41 -07:00
c81fbf788d Update version numbers 2011-05-24 15:16:56 -07:00
a35b2497f3 Update javascript release files 2011-05-24 15:13:50 -07:00
8fe299dc21 Update translations 2011-05-24 11:49:35 -07:00
e66f0cb503 Small text updates 2011-05-24 01:58:40 +01:00
5e129b3c64 Fix up displaying versions in the about dialog 2011-05-24 01:42:35 +01:00
2d40d2b224 PEP-8 2011-05-24 01:41:15 +01:00
ce0234f0ef Change Connection Manager Key Shortcut to Ctrl-M 2011-05-23 22:20:10 +01:00
c225eae189 1862: Fix typo in move storage 2011-05-23 13:41:37 -07:00
afa941df2e Update Changelog 2011-05-23 01:22:18 +01:00
49cbcf1f9c Update certain torrentview columns to default to not visible 2011-05-23 01:00:23 +01:00
3c3b68e2cc Add ability to set columns as not visible by default by setting the kwarg default to False when adding the column 2011-05-22 15:18:17 -07:00
b93477c41e Feature #1308: Add Seeds/Peers ratio to torrent list view 2011-05-22 21:04:59 +01:00
766c48e3ca Feature #1646: Add columns for per torrent upload and download speed limits 2011-05-22 21:04:59 +01:00
1f73476dc3 Fix Up/Down buttons in Edit Trackers Dialog
This fix properly reflects the movement of the tracker in the dialog table rather than by the tracker index.
2011-05-22 21:04:41 +01:00
5bfb98f9a9 Change default value of close_to_tray to False
Prevents default install of Deluge disappearing if tray icon is missing.
2011-05-22 21:04:41 +01:00
d07b53f665 Add key shortcuts for menu items 2011-05-21 18:53:22 +01:00
449be00e33 Supress gobject warning in filtertreeview and torrentview
In console the warning "g_object_set_qdata: assertion `G_IS_OBJECT (object)' failed" will appear. Quick investigation could find no solution with suggestions a python issue.
2011-05-21 18:53:03 +01:00
655af15695 Modify setup scripts to be executable 2011-05-21 18:46:10 +01:00
a549eac063 Add --sort option to deluge-console's "info" command. 2011-05-21 18:46:10 +01:00
6fa2728ddc Add seeding_time, active_time and tracker_status to deluge-console's "info" command. 2011-05-20 19:51:33 +01:00
9060de9b70 Fix spelling error in deluge-console output. 2011-05-20 19:49:22 +01:00
57ac902d50 Updates to desktop file
Add magnet mimetype and tryexec key
Fix exec key to handle files and urls to conform with new desktop-entry spec
Update name, comment and category keys
2011-05-16 22:14:43 +01:00
05578e0c75 Fix LP Bug #779074 - TypeError in on_key_press_event(): cannot concatenate 'str' and 'NoneType' 2011-05-12 18:14:10 +01:00
a0d4141afd fix unrequired requests 2011-05-07 13:19:41 +01:00
493d0ac690 fix a bug when the host_id doesn't exist 2011-05-07 11:51:47 +01:00
fe9fe7977c update changelog 2011-05-07 00:03:27 +01:00
e579a78d26 apply patch from #1742 2011-05-07 00:02:20 +01:00
bf96475840 update changelog 2011-05-07 00:00:18 +01:00
93c49495b2 apply patch from #1548 2011-05-06 23:59:31 +01:00
54ae8a4482 update changelog 2011-05-06 23:44:19 +01:00
d658c8fe47 fix #1537 editing trackers list, trackers have to be reselected 2011-05-06 23:43:40 +01:00
58134925a2 update changelog 2011-05-06 23:25:05 +01:00
244583ef97 Fix #1333 Peer list doesn't update automatically 2011-05-06 23:24:00 +01:00
0b821640bb fix #1481 file uploads from behind a reverse proxy 2011-05-06 22:38:55 +01:00
612ed4123f fix #1323 filter panels not scrollable 2011-05-06 22:32:46 +01:00
91b9eac075 update changelog 2011-05-06 22:23:12 +01:00
5be93cd5d8 Fix #1268, Torrent errors not displayed in webui 2011-05-06 22:22:29 +01:00
816f3ff6d2 update changelog 2011-05-06 22:09:05 +01:00
2e62140d2c fix issue #1567, js from plugins not working with different base setting 2011-05-06 22:08:59 +01:00
2381b1ae28 update changelog 2011-05-06 22:03:18 +01:00
6a131f021e fix issue #1799 2011-05-06 22:00:47 +01:00
871d9ac4b0 apply patch from #1562 2011-05-06 19:14:26 +01:00
0d665d772d fix the widths on the input boxes, whitespace changes too 2011-05-06 19:02:54 +01:00
aef2a83f25 fix the path given by the set-cookie header 2011-05-03 19:05:04 +01:00
e6cd4d17ee Fix #1278 by keeping references.
Conflicts:

	deluge/ui/gtkui/menubar.py
2011-04-28 10:44:18 +01:00
b9c49f27fa Include gif pixmaps in the package data 2011-04-09 22:34:23 +10:00
e2118b6bb2 Merge branch '1.3-stable' of git.deluge-torrent.org:deluge into 1.3-stable 2011-03-28 16:51:34 +01:00
d7ba74f01d split the auto_add_trackers textfield otherwise it breaks the label plugin 2011-03-28 16:50:47 +01:00
bc9abc8bc9 Fix libtorrent not compiling with boost libs 1.46 2011-03-26 17:34:56 +11:00
00ad550a52 Improve autoadd filename matching (fixes #1614) 2011-03-26 17:34:44 +11:00
884bfd777e Apply patch from #1581 to add an option to enable the app indicator
interface
2011-03-22 17:16:03 -07:00
e7db1b285f Fix indentation on Changelog 2011-03-09 00:56:04 +11:00
ee3a17bf37 Update ChangeLog for previous commits 2011-03-09 00:51:33 +11:00
292ffb35ac Handle redirection when adding a torrent by url 2011-03-09 00:37:35 +11:00
fd458fbe64 Handle partial downloads due to incorrect headers (fixes #1517) 2011-03-09 00:05:07 +11:00
b9fdb5a65f Update translation template files 2011-02-19 11:25:00 -08:00
36f92231a6 Updated Changelog 2011-02-15 17:37:50 +00:00
6cb584d53d update changelog 2011-02-15 12:57:09 +00:00
2eb1a51f6b make the edit trackers window resizable 2011-02-15 12:54:25 +00:00
84804d37cc fix scrolling on the edit trackers window 2011-02-15 12:50:38 +00:00
1da7a518b5 Fixes for gtk-ui translations 2011-02-14 23:39:16 +00:00
808d9bfba8 Fix translate issue for Trackers tree in sidebar 2011-02-14 23:39:02 +00:00
53b4a06fd1 Fix: os.join created root path in Remove_Empty_Folder if variable 'folder' had a leading slash 2011-02-14 23:37:33 +00:00
4490cd371a Sidebar: Enabled strings for translation and added icons to Trackers filter 2011-02-11 21:48:49 +00:00
7d36a4fa51 Fix #1527 - Converting unicode to unicode error in move_storage 2011-02-11 21:48:41 +00:00
6f844a86d2 Fix Create Torrent Dialog Box - Some buttons raise Type Error if no row selected 2011-02-11 21:48:35 +00:00
03689a805b Fix #1510 - Cannot create a torrent with only non-zero tier trackers 2011-02-11 21:48:28 +00:00
1d0857964e Fix #1513: Unhandled Twisted Error in test_listen_port 2011-02-11 21:48:20 +00:00
fd3a33af03 #1514 - Indicator Applet Patch 2011-02-09 19:14:33 +00:00
2354eeca7b Fix #690 - Renaming folders does not remove old empty folders 2011-02-08 19:34:16 +00:00
ca0003a7af Catch a possible DivByZero error when moving folders around in fileview tab 2011-02-08 17:38:03 +00:00
2c615e468b Fix #1336 - Uneeded Horizontal Scrollbar shows in Files&Peers Tab 2011-02-08 17:37:53 +00:00
3794773e95 Fix #1248 - Deluge-console unicode support on redirected stdout 2011-02-08 17:01:37 +00:00
1731fd641b Fix #1506 - max speed not restored on a yellow->green transition 2011-02-08 05:00:25 +00:00
c379b6c3b2 Fix #755 - Can't set listen_ports through console UI 2011-02-05 01:08:37 +00:00
e1896d2ace Fix #1450 Trailing white space in paths 2011-02-05 01:08:36 +00:00
5f168f3a25 Fix #1500 - Console crashes on command longer than terminal width. This error is raised if the cursor is off screen and is supressed with try-except 2011-02-05 01:08:33 +00:00
8346b4bb77 Fix #1282 - Text for AutoManaged changed to 'On/Off' and localized 2011-02-05 01:08:31 +00:00
39bbe76436 Updated help text for deluge-console on Windows 2011-02-05 01:08:27 +00:00
3bd28208d1 Fix for deluge-console adding torrent files in Windows 2011-02-05 01:08:26 +00:00
ffebfb9cdf Fix #1508 - TypeError in cell_data_queue() could not convert argument to correct param type 2011-02-05 01:08:24 +00:00
93091fbe23 Fix #1373, #1386 - Creating and moving non-ascii folder names in MS Windows 2011-02-05 01:08:11 +00:00
efd2762255 Fix #1507 - Temporary file race condition in core/core.py:add_torrent_url 2011-02-05 01:08:04 +00:00
4870d34a52 #1494 - Add Downloaded and Uploaded columns to torrent view 2011-02-05 01:06:26 +00:00
26410ca9c1 Apply patch from #1194 2011-02-04 19:49:54 +00:00
c1477e45cb Fix typo 2011-01-27 11:18:40 -08:00
25e58bc8a2 Fix #1498: Use os.path.normpath on new_folder to remove any double slashes or other problems that could be in the string 2011-01-27 11:11:28 -08:00
4d2a0b1856 Fix #1484: trying to access the screen object when not using interactive mode 2011-01-16 15:58:50 -08:00
82fbbad385 fix bug #1355 2010-12-12 00:02:41 +00:00
29a306e378 Merge branch '1.3-stable' of deluge-torrent.org:deluge into 1.3-stable 2010-12-01 10:21:56 +00:00
5cfe3b5601 fix a bug that can occur when upgrading 1.1 config files 2010-12-01 10:21:26 +00:00
3f458e46dd Fix #1283 Consistent icons and add localization to file priorities
Signed-off-by: John Garland <johnnybg+deluge@gmail.com>
2010-11-11 14:02:21 +11:00
1067eb7f98 rebuild the compressed javascript 2010-11-01 09:15:19 +00:00
dca27a4cf9 update the build file to include the spinnerfieldfix file 2010-11-01 09:15:14 +00:00
b0ceae8d28 Fix copying scripts 2010-10-31 10:50:51 -07:00
dc0bf3bc88 Update versions and changelog 2010-10-31 10:15:02 -07:00
3b9d7ff9c3 remove the convert conf script that won't actually work anymore 2010-10-31 14:35:12 +00:00
a165d5d746 fix a silly bug 2010-10-31 10:13:22 +00:00
cc02ebea6a Merge branch '1.3-stable' of deluge-torrent.org:deluge into 1.3-stable 2010-10-31 09:18:36 +00:00
41ffee5d8a change entry_points to a dictionary and split it up into console and gui scripts 2010-10-31 09:16:18 +00:00
14a89b3f8a don't depend on being executed from a specific directory 2010-10-29 10:09:15 +01:00
6f0c2af58a Fix up Changelog (entry was in wrong section) 2010-10-25 09:59:06 +11:00
84cccabf19 update changelog 2010-10-24 23:44:40 +01:00
7fb483adde fix a bug in the MultiOptionsManager that didn't fire the right arguments in the initial event fire 2010-10-24 23:42:29 +01:00
28ce7a70a0 apply patch from #1377 2010-10-24 13:30:39 +01:00
14565977fa include a file that fixes the SpinnerField onBlur method (no idea why it is set to emptyFn) 2010-10-23 22:22:00 +01:00
e4420ef354 fix the path to the loading gif (not that its actually used) 2010-10-23 21:24:05 +01:00
02ad0b93ab Fix hang on quit 2010-10-23 01:14:48 +11:00
6d2a001635 Fix #1373 use of cyrllic paths 2010-10-16 12:56:29 -07:00
2a3eb0578c Fix #1349 force a theme style with expander-size = 15 to show entries in the sidebar properly. 2010-10-15 19:31:36 -07:00
60fac28217 Keep a torrent paused after a forced recheck if it was paused to start. 2010-10-10 12:34:13 -07:00
59e01e7ecf add a check to ensure that the events loop doesn't continue indefinitely 2010-10-10 19:51:50 +01:00
4c52ee4229 Update ChangeLog for previous commit 2010-10-07 22:46:49 +11:00
8428524793 wrap client.disconnect() call with a check to see if its classic mode 2010-10-07 00:14:55 +01:00
21c8d02d9a Update ChangeLog for previous commit 2010-10-03 19:52:33 +11:00
0c687c7684 Make sure config value strings are utf8 encoded (fixes #1369) 2010-10-03 19:24:29 +11:00
78f9efefd9 Move decode_string/utf8_encoded to common 2010-10-03 19:24:27 +11:00
6b228ce31f Fix sidebar not updating (#1365) 2010-10-03 00:01:29 +10:00
40ce4ec731 Use better attribute / method names in blocklist 2010-09-26 11:39:47 +10:00
c029c312e4 Fix attribute error in blocklist plugin 2010-09-26 11:37:29 +10:00
16c38cd027 Set locale to the user's default settings in the gtkui 2010-09-20 02:44:18 +10:00
e23a6b852a Organise latest changes into appropriate sections 2010-09-19 20:59:27 +10:00
90e4de54e9 Do not include unnecessary dlls in windows build 2010-09-18 16:03:21 -07:00
c1505bea3a Update versions 2010-09-18 11:31:31 -07:00
6235e832fe include missing theme images 2010-09-18 00:48:22 +10:00
a71f14c47e include the .order files 2010-09-16 09:23:35 -07:00
ed3b23b0fc add all the other scripts to package_data 2010-09-16 09:23:19 -07:00
6402634ec1 Update win32 build files 2010-09-14 11:48:05 -07:00
3e68733cfd More clean-up of setup.py 2010-09-14 11:40:41 -07:00
f847a7dc4e Remove the custom 'install' class and include_package_data 2010-09-14 11:40:34 -07:00
c7954c20eb Fix preference page index when removing a preference page 2010-09-13 18:22:08 -07:00
dc7ed11601 Update ChangeLog 2010-09-13 16:11:57 -07:00
d898def9ec Fix bugs with unicode torrents in AutoAdd plugin. 2010-09-13 02:22:18 -04:00
3e2f6c4060 Fix bug in AutoAdd plugin where watchdirs would not display in gtkui when first enabled. 2010-09-13 02:22:17 -04:00
321a22a6f0 Increase max piece size to 8 MiB in create torrent dialog (closes #1358) 2010-09-13 08:53:19 +10:00
b4774af2f3 Fix VersionSplit behavior when comparing to a dev version. 2010-09-11 05:39:40 -04:00
d0fd709c74 AutoAdd plugin can now recover when one of the watchfolders has an unhandled exception. 2010-09-03 22:30:24 -04:00
e24212b3f8 Fix "adjustment with non-zero page size" deprication warning in autoadd plugin. 2010-09-03 22:28:41 -04:00
f8f72af6dc Add TorrentFileCompleted event. 2010-09-03 17:11:57 -07:00
b9caa4eeeb Fix issue when adding torrents without a 'session'. This can happen
when a plugin adds a torrent, like how the AutoAdd plugin works.  The
user that adds this torrent will be an empty string.
2010-09-03 14:29:36 -07:00
6c3b216b40 Use a temp filename with add_torrent_url 2010-08-31 00:11:58 +10:00
eaad867885 Update get_free_space test 2010-08-31 00:11:54 +10:00
f6b9f67df8 Fix error in last commit. 2010-08-26 02:33:24 -04:00
24fe3f7fd5 Ensure preferencesmanager only changes intended libtorrent session settings. 2010-08-26 02:23:40 -04:00
da2fb41a3a Fix scheduler so that it keeps current state, even after global settings change. 2010-08-26 01:39:40 -04:00
f8d7f22167 Ignore global stop ratio related settings in logic, so per torrent ones are used. 2010-08-24 22:47:24 -04:00
b75abc70e5 Add max active downloading and seeding options to scheduler. 2010-08-24 00:58:28 -04:00
2d821bd79a Merge branch '1.3-stable' of deluge-torrent.org:deluge into 1.3-stable 2010-08-23 17:35:31 -07:00
12d9a7a5bd Fix key error after enabling a plugin that introduces a new status key 2010-08-23 17:35:19 -07:00
c118fa36a9 Moved xdg import so it is not called on Windows, where it is unused. fixes #1343 2010-08-22 15:38:22 -04:00
82c91cdc51 AutoAdd plugin changes
adds queue to top option
adds ability to append extension instead of deleting torrent once added
2010-08-22 00:01:58 -04:00
5501094214 Fix unhandled exception when adding a torrent to the session 2010-08-21 12:54:19 -07:00
b41aa808be Fix issue where the save_timer is cancelled when it's not active 2010-08-21 12:54:13 -07:00
b9336889f5 Update version 2010-08-20 14:20:51 -07:00
995f5387eb Update windows files 2010-08-20 14:19:42 -07:00
38958d3c4f Update ChangeLog 2010-08-20 14:15:21 -07:00
b45e019f08 Fix man deluged not showing '-u' on its own line 2010-08-20 01:16:09 +10:00
d93fcf6eea Fix #1341 issue where Config would try to cancel the save_timer when it is None. 2010-08-18 12:32:11 -07:00
a2d75a5274 Add cache expiry check by key update times to fix issue where some status updates would not return
correctly if they were done < cache_time from the previous status request
2010-08-18 12:17:31 -07:00
8797c3ce1b Add additional test for get_torrents_status and fix the other one to properly invalidate the cache
time from startup before proceeding
2010-08-18 12:17:23 -07:00
79749cca03 Add test to demonstrate flaw in SessionProxy design. Need to keep track of update times for each
status key individually to fix this.
2010-08-18 11:05:21 -07:00
5fd8628761 fix the script resource on windows 2010-08-14 17:38:31 +01:00
0e80b3ea0a add the apple iOS bookmark icons from #1339 2010-08-14 16:15:18 +01:00
aa61d33ee2 Merge branch '1.3-stable' of deluge-torrent.org:deluge into 1.3-stable 2010-08-14 16:06:00 +01:00
13f29a77dd fix the system.listMethods json call when running in classic mode 2010-08-14 16:05:41 +01:00
97453d1411 Add test suite for SessionProxy 2010-08-10 09:58:28 -07:00
62d02091b3 Fix getting a torrent's status with an empty key list to return all the
torrent's status keys instead of an empty dict
2010-08-06 17:26:23 -07:00
161ad0ff0d use the get_libtorrent.sh script to get libtorrent if it is missing 2010-07-22 21:13:27 +01:00
7f323ec0fc add libtorrent fetch script 2010-07-22 18:17:51 +01:00
05aebbb575 remove the libtorrent submodule 2010-07-22 18:04:49 +01:00
de85e1dcdc a couple of fixes to stop the webui crashing when running within the gtkui 2010-07-18 23:11:02 +01:00
1ce480ff23 Only use an icon if it passes some sanity checks 2010-07-17 17:13:15 +10:00
007a9912d2 Use a blank icon when the tracker icon downloaded isn't a proper image 2010-07-15 19:17:48 -07:00
d793b9e6b8 Attempt to create a move_storage destination path if it doesn't exist 2010-07-15 10:50:15 -07:00
72ec926c1a Do not attempt to move a torrents storage if the destination path does
not exist
2010-07-12 14:45:51 -07:00
0d431ae7db Try to import system rencode before deluge.rencode to allow the use of the new rencode library at: http://code.google.com/p/rencode/ 2010-07-08 16:39:53 -07:00
f1e0e3be15 Add logging the user when a torrent is added or removed 2010-07-05 21:10:16 -07:00
e8bf5eb592 Fix ChangeLog 2010-07-04 02:13:31 +10:00
d9a2c4db72 Fix uncaught exception when closing deluge in classic mode 2010-07-02 02:43:07 +10:00
8fb7277a82 Fix typo 2010-07-02 02:41:30 +10:00
35128cf18f more improvements to the shift select 2010-07-01 14:21:37 +01:00
6ff1da2391 fix select 'upwards' 2010-07-01 14:08:20 +01:00
4614188c62 update changelog 2010-07-01 13:46:27 +01:00
80297b8e45 allow for shift selecting in tree grids 2010-07-01 13:45:22 +01:00
9173a9cfdd Update Changelog 2010-06-22 18:26:43 -07:00
571d1079f6 Fix #1302 an uncaught exception in an state_changed event handler in SessionProxy was preventing the
TorrentManager's stop method from properly saving all the resume data.
2010-06-22 18:25:50 -07:00
0497c407e1 Always look for -mt boost libraries first 2010-06-18 09:51:50 -07:00
8b58c960f3 fix typo 2010-06-12 22:48:00 +01:00
b615ebe1b8 change bits to bytes, thanks to charles 2010-06-11 15:59:33 +01:00
3ed8279219 Fix typo in label plugin - thanks konti 2010-06-11 00:51:46 +10:00
f2944bdeef Handle os.remove failing on windows 2010-06-08 03:20:48 +10:00
0fcd90ee2c Python independent version of previous commit 2010-06-08 01:57:13 +10:00
26460808e7 Fix console ui not liking paths with backslashes on windows (#1293) 2010-06-08 01:30:10 +10:00
7aba1af0b2 Print a more informative error message if the torrent file doesn't exist 2010-06-08 01:26:49 +10:00
4d2b7df49d Fix execute plugin only executing last event (#1306) 2010-06-08 00:20:07 +10:00
bd775d0d40 Only encode if necessary 2010-06-07 20:18:37 +10:00
7fb3c3c04c Fix unicode support in console ui (#1307) 2010-06-07 20:18:35 +10:00
19c27ee8c5 Add some debug logging statements 2010-06-04 18:05:27 +01:00
d69b8e1099 Fix an error in the key 2010-06-04 17:37:45 +01:00
88daf82cb0 Fix saving the correct event name 2010-06-04 16:37:50 +01:00
99c1a61383 Save the execute config after adding/removing/saving commands 2010-06-04 16:30:51 +01:00
2e55769c18 Fix typo in execute plugin 2010-05-20 00:06:18 +10:00
259d2633e7 Fix man deluged not showing '-d' on its own line 2010-05-16 22:32:59 +10:00
8e5aab660c Fix remote save path dialog not disappearing after creating a torrent 2010-05-16 18:13:34 +10:00
fc96e9d02c Fix only being able to click "remote path" once when creating a torrent 2010-05-16 18:13:31 +10:00
821d403a6c Fix deluged crashing on windows when logfile's directory doesn't exist 2010-05-16 13:12:51 +10:00
5e0d988ef0 Revert "Fix trac wiki turning CamelCase words into broken links"
This reverts commit 925ac42f7c.
2010-05-11 23:46:48 +10:00
925ac42f7c Fix trac wiki turning CamelCase words into broken links 2010-05-11 23:29:02 +10:00
1ac72b81b6 Update email address and copyright 2010-05-11 03:52:17 +10:00
3417caf1d2 Fix label plugin not remembering newly created labels 2010-05-09 17:52:29 +10:00
1bcfc91c35 Remove unused code from label plugin 2010-05-09 17:52:25 +10:00
6ee0e5b6be Update docstrings to use names from previous commit 2010-05-09 17:07:11 +10:00
58a74202e1 Use better names for TrackerIcons' args 2010-05-09 17:01:47 +10:00
a4c6f4e8c9 Return the noIcon for empty strings as well 2010-05-09 16:44:12 +10:00
60f3d32de7 Raise IconsError instead of IndexError (fixes infinite looping) 2010-05-09 16:36:54 +10:00
b3eed8a1f0 Add test for tracker_icons for when requesting an icon for host that is "". This test results in an infinite loop. 2010-05-08 20:10:12 -07:00
37137d9b54 Return 0 in get_free_space if the download_location is invalid 2010-05-08 20:09:57 -07:00
4fb14b581d Use previously defined host variable instead of getting the tracker host from the TreeModel 2010-05-08 20:09:49 -07:00
98da4d0291 Do not request a tracker icon if the host is "" 2010-05-08 20:09:37 -07:00
f0c06f4bc5 Update Changelog 2010-05-08 11:50:19 -07:00
63d701305c rebuild deluge-all and ext-extensions 2010-05-08 16:19:40 +01:00
99396afa0c update the build files for deluge-all and ext-extensions 2010-05-08 16:19:40 +01:00
6231dbd1ca fix the null comparison 2010-05-08 16:19:40 +01:00
8f021c7f06 set the baseCls for the add label form panel to x-plain 2010-05-08 16:19:40 +01:00
6bb4559d18 Make host_to_url support redirection and add another test 2010-05-08 16:26:08 +10:00
7c9eea0361 Try favicon.ico if there's a HTMLParseError 2010-05-08 15:50:57 +10:00
15247507d4 Fix relative redirecting in blocklist plugin 2010-05-06 23:31:25 +10:00
10de8d5475 Remove plugins that aren't release ready 2010-05-05 17:48:04 -07:00
e304c1f719 update the ChangeLog 2010-05-05 23:03:19 +01:00
48d3e89d84 Update windows build files 2010-05-05 15:01:52 -07:00
44f9e17a09 Update version
Update ChangeLog
2010-05-05 14:52:18 -07:00
e7907a63ee fix uploading plugins in shit browsers 2010-05-05 12:25:34 +01:00
cee416b1b5 fix expanding nested folders in the files tab 2010-05-05 11:55:21 +01:00
53a9c217e7 Fix tracker_icons not handling relative redirects 2010-05-05 04:05:52 +10:00
d6c8b13041 Handle trackers with incorrect / missing icon mimetypes 2010-05-05 03:19:54 +10:00
ba03356151 Add more HTTP status codes to httpdownloader 2010-05-05 02:49:55 +10:00
d28cf93686 Rename mimetype helper methods and rewrite to use a common dict 2010-05-05 02:31:05 +10:00
452656e09d remove some trailing commas that break the ui in IE 2010-05-04 12:02:49 +01:00
9c460266ac add _trial_temp to the gitignore file 2010-05-04 00:30:54 +01:00
bb0bd36c51 Properly fix creating torrents in the gtkui with non-ascii filenames 2010-05-04 00:28:24 +01:00
5ea7e21943 add some icon preloading and improve the statusbar css classes 2010-05-04 00:09:20 +01:00
facb4669e3 add the ubuntu icon 2010-05-03 22:01:20 +01:00
e4ef17975c stop parsing the html page once the parser has left the <head> of the page 2010-05-03 21:28:25 +01:00
c4b20aa595 Fix error when requesting a tracker icon for None 2010-05-03 13:24:54 -07:00
bc028998d7 Fix some tests in test_core 2010-05-03 13:13:26 -07:00
7e7da94a6e fix the Tracker resource for the webui 2010-05-03 20:52:38 +01:00
53930e0898 handle non-supported images/files in the icons folder 2010-05-03 20:38:57 +01:00
b13adbafbf add an ok icon and use it for the connection restored status 2010-05-03 20:32:22 +01:00
556c8b831a Update translation template 2010-05-03 11:50:16 -07:00
a6d10562f1 Don't request a tracker icon for labels or tracker states 2010-05-04 04:37:41 +10:00
a8ac98bb37 Update web ui to use new TrackerIcons 2010-05-04 04:37:41 +10:00
d7fa383da3 Update gtk ui to use new TrackerIcons 2010-05-04 04:37:41 +10:00
6ded75caef Remove no longer needed fetch_url 2010-05-04 04:37:41 +10:00
88929d4821 Rewrite tracker_icons.py (#995) 2010-05-04 04:37:19 +10:00
8747611e9e Add decorators module and test file 2010-05-04 04:33:21 +10:00
acba442ddb fix encoding issues where the users filesystem isn't utf-8 (needs testing) 2010-05-03 18:43:31 +01:00
5b0f93ba72 improve behaviour when webserver goes away 2010-05-03 02:14:51 +01:00
619092aee0 fix plugin info displaying upon select 2010-05-03 02:01:21 +01:00
89fb5b02d7 move the InstallPluginWindow class out of the PluginsPage file
convert the plugins grid over to a listview
2010-05-03 01:54:25 +01:00
75b69b1f11 fix setting the root node 2010-05-03 00:31:49 +01:00
f5eddafea9 tidy up the code for the files tab 2010-05-02 23:20:45 +01:00
d49e1eda79 fix updating the file tree in the file details tab 2010-05-02 23:00:05 +01:00
e86d2ad4e2 apply unicode patch from nullie, fixes (#1140) 2010-05-02 22:13:14 +01:00
5effdd4cd4 store listen_ports and outgoing_ports as tuples for the config set, fixes #1242 2010-05-02 18:32:21 +01:00
c2b4fad389 implement getting and saving label options 2010-05-02 18:16:07 +01:00
82a5b5262c fix the torrent grid, clear the torrents on disconnect, not logout 2010-05-02 18:16:07 +01:00
1b0e08b3d9 fix disabling the execute plugin 2010-05-02 18:16:06 +01:00
49ec3a1535 remove the paranthesis from the @exports 2010-05-02 18:16:06 +01:00
23544bd6b2 Close the connection manager on shutdown - patch from Jan Steffens 2010-05-02 22:39:25 +10:00
5766e04987 Fix deluge-gtk hanging on shutdown (#1247) - thanks Jan Steffens 2010-05-02 22:39:18 +10:00
0857af98d0 fix the spinner limits in the label options 2010-04-30 22:06:49 +01:00
5e78daf726 fix the spinners on the various preference pages 2010-04-30 22:06:32 +01:00
1efb700ed8 enable and disable the form fields upon the checkbox change 2010-04-30 21:34:28 +01:00
e0153e8bdc disable the JSON component upon webserver stop 2010-04-30 14:11:36 +01:00
b46562d932 disable the webui plugin settings and display an error message when deluge-web is missing 2010-04-30 14:04:15 +01:00
5c8eccdd82 reduce the size of the details panel 2010-04-30 13:31:17 +01:00
c45583e8e7 enable and disable the panel toolbar buttons upon selection change 2010-04-28 17:46:21 +01:00
ce46dcdf7a implement the webui so commands can be modified 2010-04-28 17:42:58 +01:00
63f5c8b116 add the icon-edit class, use the same icon as edit trackers 2010-04-28 16:58:07 +01:00
111bea19d9 fix #1240 and #1208 2010-04-28 16:43:14 +01:00
68f0e9ddc7 renderer the event column correctly and remove the bottom panel 2010-04-28 16:09:53 +01:00
5e1f6a8738 switch the gridpanel to a listview 2010-04-28 15:51:47 +01:00
28a313e74e fix up the label plugin making it more stable and work with the new filter panel api 2010-04-28 15:43:06 +01:00
5b6faa47b0 fix the header click event handler 2010-04-28 15:39:39 +01:00
0f12200f6f store the states as a dictionary 2010-04-28 15:33:05 +01:00
7420c6f12f use the header click event to ensure that the filters get updated
correctly
2010-04-28 15:29:40 +01:00
fb0adbcded return this.states instead of the store contents 2010-04-28 15:25:31 +01:00
59b7a175eb store the states without the zero values removed as this.states 2010-04-28 15:24:49 +01:00
cbcd277d91 remove windows line breaks (grr) 2010-04-28 15:19:28 +01:00
269e0b89b6 dont enable plugins twice 2010-04-28 15:10:58 +01:00
698a5ff475 update the deluge.config dictionary with the new values 2010-04-28 14:20:31 +01:00
fd122db7b7 change the multiple filters to be configurable, deprecating the show trackers with zero torrents option 2010-04-28 14:15:50 +01:00
67905b6f5b fix enabled plugins after connecting to a daemon 2010-04-28 14:00:39 +01:00
7df7f13e26 select the text when focusing the password field 2010-04-28 13:41:09 +01:00
066d199c78 fix setting a custom limit when one is already set
focus and select the spinner contents upon window show
2010-04-28 13:39:56 +01:00
c8c5e3449a add a window that allows you to quickly set a custom bandwidth limit 2010-04-28 13:28:47 +01:00
00dc5f0128 remove the button to launch the unfinished file browser 2010-04-28 13:28:00 +01:00
cd10555a8a construct the statusbar in the ui initialisation 2010-04-28 12:40:54 +01:00
158feaa8e0 integrate the statusbar menus into the statusbar and have the limit change handler in the deluge statusbarmenu class 2010-04-28 12:37:35 +01:00
3310cc636f move the statusbar menu class out into a seperate file 2010-04-28 12:03:07 +01:00
9849a16d2c rename files to match the classes they contain 2010-04-28 11:55:07 +01:00
bf28b3ac31 fix the connection manager when the ui disconnects from a daemon so it doesn't end up in a loop 2010-04-28 11:50:56 +01:00
759ae6356d remove the function wrap from the connection manager 2010-04-28 11:28:51 +01:00
c0fd70a856 fix removing the filter panels upon disconnect 2010-04-28 10:45:38 +01:00
028a35bfc8 fix adding an already removed torrent 2010-04-28 10:42:25 +01:00
fec735f948 fix the first item being selected upon creation 2010-04-28 08:42:29 +01:00
9f185da446 update the proxyfield comboboxes and switch some simplestores to arraystores 2010-04-28 08:24:37 +01:00
8414b9cfa9 fire only one event per check, pass an array of nodes
implement #1161 for the webui
2010-04-28 01:06:28 +01:00
91f44c2ad3 fire the same args as the OptionsManager changed event 2010-04-28 00:48:37 +01:00
31304d3397 lazily set the value if the items aren't rendered yet and re-enable setting the allocation in the add window 2010-04-27 23:58:30 +01:00
310b4bad31 allow the allocation to be changed again 2010-04-27 23:49:11 +01:00
9e7dde8997 change radiogroups so they can be used as a single form field 2010-04-27 23:48:04 +01:00
dfde04561f adjust the width of the columns in the con manager 2010-04-27 23:31:12 +01:00
545e4ef717 fix the change event on the spinner group 2010-04-27 23:26:31 +01:00
b1cf238489 show the preferences window when the protocol traffic and freespace icons are clicked 2010-04-27 23:19:52 +01:00
7fe5d37094 fix the spinnergroup widths 2010-04-27 23:18:03 +01:00
a7940d5bf9 use deferredRender: true on the card layout to fix the spinnergroups and
comboboxes
2010-04-27 22:56:02 +01:00
e0e2b1b350 improve the page switching 2010-04-27 22:05:15 +01:00
a58c391675 use blank classes for the sorter in the edit trackers window 2010-04-27 21:49:27 +01:00
9f46958f20 tidy up and convert the gridpanel to a listview 2010-04-27 21:40:55 +01:00
dd82f95975 split out the add connection window into a seperate file 2010-04-27 11:58:39 +01:00
67e27b9b7a fix reporting connection errors on the console (Closes: #1228) 2010-04-27 11:01:01 +01:00
1cc315878a complete the layout of the label options window 2010-04-27 10:31:53 +01:00
412b96ba55 xml escape notifications sent via libnotify (Closes: #1185) 2010-04-27 10:31:53 +01:00
d6b7917350 Fix test_add_torrent_url_with_cookies 2010-04-27 03:01:54 +10:00
8b23af062a add the layout for the maximum tab 2010-04-26 01:34:35 +01:00
3b1d038d2d add missing getFilter function and improve hasFilter 2010-04-26 01:34:35 +01:00
a47f9bc8dd make enabling the plugin more robust 2010-04-26 01:34:35 +01:00
466b245fdf make it easier to manipulate filters 2010-04-26 01:34:35 +01:00
bfdaa47aff add helper methods for adding and removing columns to the torrent status grid 2010-04-26 01:34:35 +01:00
c3290b4ac2 add the save path column to the grid 2010-04-26 01:34:35 +01:00
342001c642 implement the handler for the torrent menu 2010-04-26 01:34:35 +01:00
b4404feed7 add 2 new methods that return the torrent ids to make rpc calls easier 2010-04-26 01:34:35 +01:00
85c0725f83 add a method to get the current states in the filter 2010-04-26 01:34:35 +01:00
29634505e4 remove the old web templates 2010-04-26 01:34:35 +01:00
faa1752d04 select the first filter if the current selected one is removed 2010-04-26 01:34:35 +01:00
2edf19c187 fix displaying empty '' filters 2010-04-26 01:34:35 +01:00
42b3dc7dde add the ability to add labels
set the filter panel to show_zero
2010-04-26 01:34:35 +01:00
80f151be94 move the state updating into the FilterPanel to allow for a custom show_zero value to
be specified
2010-04-26 01:34:34 +01:00
c8ada0ba07 only enable the extra menu options if it is a label 2010-04-26 01:34:34 +01:00
e05384909a add inital options window layout
implement removing labels
specify a custom template for the label filters
2010-04-26 01:34:34 +01:00
3a12a50f3e allow custom templates to be specified for filters 2010-04-26 01:34:34 +01:00
5b0ce6b3d8 remove the function wrap and deluge.sidebar construction 2010-04-26 01:34:34 +01:00
9cde1f3e45 initial implementation of the label plugin webui, purely a mock up at the moment 2010-04-26 01:34:34 +01:00
1825ce09fb fix removing filters that no longer exist
add a filtercreate event
2010-04-26 01:34:34 +01:00
62158d7861 Renamed raiseError to raisesErrorsAs 2010-04-26 02:54:13 +10:00
4de8e57f56 remove some accidental alerts 2010-04-24 01:44:22 +01:00
a3d9b93480 register the execute plugin 2010-04-24 01:42:11 +01:00
7e12222d33 create a plugin registration system to allow for plugin loading on the fly
remove the plugin event handlers from the event manager
fix enabling/disabling plugins when the preferences page hasn't been rendered yet
2010-04-24 01:40:34 +01:00
bf2fc64ce0 remove an unrequired function() wrapping 2010-04-24 00:43:24 +01:00
3fdfedb7f7 revert previous change, we want remove_script to throw an error if the script doesn't exist
fix remove debug and dev scripts in the pluginmanager
2010-04-24 00:34:42 +01:00
01e847b997 fix the execute plugin disabling and change the namespace of the preferences page 2010-04-23 23:48:29 +01:00
50162694b5 fix plugin disabling 2010-04-23 23:47:10 +01:00
ade5f596f4 don't raise an error if the script isn't in the resource 2010-04-23 23:43:20 +01:00
8b7c1681ae fix the execute plugins webui section 2010-04-23 19:30:40 +01:00
2376e857d2 fix up the deluge-web plugin interface 2010-04-23 19:30:40 +01:00
d024c293ed Revert previous change 2010-04-20 20:08:08 -07:00
54617db03f Allow accessing network shares when adding torrents 2010-04-20 12:25:18 -07:00
70580e35db Fix starting plugins 2010-04-20 08:56:07 -07:00
8d02fc3db6 Fix #1238 starting plugins in the gtkui 2010-04-20 08:50:20 -07:00
112b0dc1f0 fix the zeroPad calls in the date function 2010-04-20 08:32:11 +01:00
3fcdcc8eec couple of tweaks to the plugin page layout 2010-04-19 23:17:27 +01:00
7711239452 add the updated override to FormLayout to allow for the field labels to be hidden/shown with field.show()/field.hide() 2010-04-19 22:29:11 +01:00
283cff7852 Apply patch supplied in #1235 to add the time to fdate 2010-04-19 22:27:12 +01:00
fb4bfe7656 re-add the SpinnerGroup type and enable the Network preferences page 2010-04-19 17:08:08 +01:00
070443f811 only use the fix for webkit browsers 2010-04-19 16:29:40 +01:00
76483bf766 restructure the ext-extensions folder and fix some copyright headers 2010-04-19 15:35:33 +01:00
dd1716c240 improve the selective downloading adding support for directories and don't recreate treenodes 2010-04-19 15:35:33 +01:00
c176ff900f fix updating the columns if the node hasn't yet been rendered 2010-04-19 15:35:33 +01:00
9e8d588a05 add a method to TreeGridNodeUI that allows column values to be updated 2010-04-19 15:35:33 +01:00
0fbbf4ac6c fix setting file download priority in the add window 2010-04-19 15:35:33 +01:00
61dd9a5589 Fix setting config values in the console ui including setting paths with
spaces in them
2010-04-18 18:07:26 -07:00
9a632fc3d3 1234: Add time to the torrents added date - patch from tobbez 2010-04-18 14:52:18 -07:00
e0f2c2473e fix error, use os.makedirs instead of os.mkdir, effectively mkdir -p 2010-04-17 22:13:17 +01:00
80e480854e Fix fsize by initialising gettext 2010-04-16 00:08:56 +10:00
86232cac8e Fix #1113 set move on completed to False after a success storage move 2010-04-14 15:49:21 -07:00
bba825703b refs #1180, old label preferences are removed from torrent when new label is set 2010-04-13 15:21:49 -04:00
3f3f7bb5b4 Fix #1225 by reverting change to fix #1180 since that isn't really
considered a bug and just causes more issues
2010-04-13 10:15:10 -07:00
047bdf9e3e Only pause torrents when importing blocklist on startup 2010-04-12 20:42:37 +10:00
0ae609c6df Apply patch from #1226 to allow use of certificate chain files 2010-04-11 23:14:07 +01:00
76fa8e707a Split out the OptionsPanel into seperate classes and files 2010-04-11 23:11:54 +01:00
fdc7d3d7fc Fix #1098 use triple quotes in the docstrings of the generated methods 2010-04-11 11:24:45 -07:00
35dfcf3a77 Pause transfers until blocklist is imported (#861) 2010-04-12 01:01:02 +10:00
f21dd242f6 Fix renaming files in add torrent dialog 2010-04-12 00:07:50 +10:00
8bafc9f966 tidy up and rename Remove.js to RemoveWindow.js 2010-04-09 22:13:42 +01:00
901d2d715c Fix #1222 do not try to set options on a torrent_id that is no longer in the session 2010-04-09 13:05:02 -07:00
02b71451c6 Fix enabling the Freespace plugin by initalizing self._timer on enable()
Stop the timer on disable()
2010-04-09 11:21:07 -07:00
6e737518d8 Fix splitting folders in add torrent dialog (fixes #1112) 2010-04-10 01:01:08 +10:00
addda6cfcc Fix #640 make file size suffixes translatable 2010-04-08 17:43:57 -07:00
afa283cd2d Add an errback for when calling a component's start() fails and revert it back to a Stopped
state in this case
2010-04-08 17:16:28 -07:00
84b33c3418 Fix get_torrent_status by creating a status dict from the cache after it's been updated 2010-04-08 17:09:55 -07:00
a15500d472 Fix menu item icons and glade warnings 2010-04-08 17:01:43 -07:00
7d4c791241 Fix #1180 properly set default options when switching a torrent label 2010-04-08 16:49:40 -07:00
4be615b084 Fix #1218 improper use of callLater 2010-04-08 15:00:07 -07:00
8e4d88f03c implement moving trackers up/down 2010-04-08 17:51:49 +01:00
38c85cf7bb convert the EditTrackers window to use a ListView and split out the various windows
into seperate files
2010-04-08 17:38:16 +01:00
bc165133d0 Fix get_torrent_status returning all keys when cache is outdated 2010-04-08 00:41:48 +10:00
117fe3bb43 Fix the sessionproxy when using keyworded filters.
The caching of state filters has been removed to simplify things a bit.  This shouldn't have too much
impact since the torrent status requests are still using diffs.
2010-04-02 15:53:03 -07:00
5dab17df89 Fix #1210 save sort column order in files tab -- patch from squisher 2010-04-02 12:46:18 -07:00
3560dac792 convert the PreferencesWindow over to using a ListView rather than a
GridPanel
2010-04-02 16:46:32 +01:00
c970a80030 finish converting the AddWindow over to a ListView 2010-04-02 15:44:26 +01:00
09de50ec18 import PIL.Image rather than just Image 2010-04-01 10:10:56 +01:00
78a1ef0cc5 Fix unintended revert of change 2010-04-01 09:55:16 +01:00
d2d9269c87 Close #1205 add free space icon to gtkui 2010-04-01 09:55:15 +01:00
0d091cdacc replace ∞ with its html code &infin; 2010-04-01 09:55:15 +01:00
ac7a1f0065 fix bug showing the menu via key in the torrentview (Closes #1191) 2010-04-01 08:30:30 +01:00
772653d872 Fix unintended revert of change 2010-03-31 20:14:39 -07:00
ce23ff34a7 Close #1205 add free space icon to gtkui 2010-03-31 18:15:29 -07:00
c1200ed63f use getHeaders which is backwards compatible with twisted 2010-04-01 01:19:46 +01:00
af17346ac6 return a valid version 2 filetree 2010-03-31 20:35:44 +01:00
e9a922f829 Fix #1145 show deluge instead of hiding if it is behind other windows 2010-03-31 11:47:54 -07:00
387ea4a911 fix when there is only 1 file 2010-03-31 17:42:46 +01:00
7f1dadf3cd remove all the trailing commas as ie doesn't like them 2010-03-31 17:21:16 +01:00
2417e8537b resize tracker icons if they are too big and PIL is installed 2010-03-31 15:40:40 +01:00
91692bc966 use object format rather than dictionary 2010-03-31 15:40:40 +01:00
4296344502 handle losing connection to the webserver so we don't get stuck firing off loads of ajax requests 2010-03-31 15:40:39 +01:00
7053163f88 use FileTree2 in the TorrentInfo class when specified
adjust the filetree walking functions to match the server side code
2010-03-31 15:40:39 +01:00
14d9f6b7ba fix displaying directory names
tidy up and fix the size of the files being displayed
tweak the layout of the OptionsTab
2010-03-31 15:40:39 +01:00
692ec5bb1b clean up the Url window a little bit and rename Url.js to UrlWindow.js
create the FileWindow on demand and change the filename to match the classname
2010-03-31 15:40:39 +01:00
6039280fb5 split out the AddWindow file into multiple files for easier management 2010-03-31 15:40:39 +01:00
48876fa45c tidy up the file window and fix using Deluge.Client still 2010-03-31 15:40:39 +01:00
ae54d3fa18 Fix creating remote torrents 2010-03-30 16:44:26 -07:00
47509ee705 fix up the FilterPanel and the css class for the selected item 2010-03-30 19:25:50 +01:00
47a80526b3 begin a tidyup of the sidebar, switching from a GridView to a ListView which is faster 2010-03-30 17:33:56 +01:00
183064f857 store the other menu item when we encounter it looping over for later 2010-03-30 14:31:36 +01:00
7c5dacba5f use Number.MAX_VALUE rather than 99999 2010-03-30 14:27:53 +01:00
1c807ad7c8 fix tracking spinner values 2010-03-30 14:27:41 +01:00
6d83556ba8 clear oldData when clear() is issued which fixes data disappearing in the details tab 2010-03-30 13:45:04 +01:00
de9ba4986d fix a couple of issues with the values in the status tab 2010-03-30 13:31:33 +01:00
2956a7db54 Keep track of newly added torrents in the SessionProxy 2010-03-29 18:49:41 -07:00
76de427b96 remove a needless loop in the update_ui() method call 2010-03-30 00:21:37 +01:00
e9df745dd0 move the ProxyField into the preferences package 2010-03-29 23:43:48 +01:00
bf224b0556 tidy up the encryption page 2010-03-29 23:43:20 +01:00
79e62e6069 add a fix for triggerfields in the preferences page 2010-03-29 23:35:53 +01:00
7b84f54974 make greater use of the SessionProxy 2010-03-29 20:22:15 +01:00
4ca14d68c1 make use of the sessionproxy 2010-03-29 20:12:08 +01:00
ee9c7d1971 Fix #1202 set self.state during instantiation regardless of the libtorrent state 2010-03-29 10:57:29 -07:00
7dff81b60b Fix some typos 2010-03-28 22:20:47 -07:00
66bd2e3030 Add sessionproxy.rst 2010-03-28 12:45:51 -07:00
da9af84dc1 Add new component SessionProxy
Use SessionProxy in place of core.get_torrent_status calls
2010-03-28 12:43:23 -07:00
0b44023f92 update all the copyright headers 2010-03-28 13:02:09 +01:00
dd8400558c use a platform agnostic way of combining paths in the FileTree 2010-03-28 12:16:35 +01:00
61b5659972 fix the toggle field and scrolling in the preferences window 2010-03-28 12:16:35 +01:00
c987b74d61 split out the ProxyField to a seperate file 2010-03-28 12:16:35 +01:00
c430ef9a84 Merge branch 'master' of deluge-torrent.org:deluge 2010-03-27 20:07:51 -07:00
7be5b4c8bc Add 2 new states to Component: Starting and Stopping
Fix issue where a Component could have it's start and stop methods called more than once while waiting for their deferreds to fire
2010-03-27 20:05:20 -07:00
ab38ca2ad4 fix the order of the data directory and add peer record ip address sorting again 2010-03-28 03:45:02 +01:00
4d5d31a2b0 add support for defining order via a .order file 2010-03-28 03:45:02 +01:00
eaa03a6f2c change a Deluge.Events to deluge.events 2010-03-28 03:45:01 +01:00
01bb9c4df5 initial commit of the big javascript refactor 2010-03-28 03:45:01 +01:00
46a6576c68 Fix test_component to properly return deferreds from it's test methods 2010-03-27 19:43:42 -07:00
0182641bbb Use the python diff for *.py 2010-03-27 18:51:50 -07:00
e939f17654 fix updating the peers grid 2010-03-27 15:00:48 +00:00
17903c78d4 update the sorter to point to the correct function 2010-03-27 15:00:47 +00:00
676c59c318 rename Deluge.Sorters to Deluge.data.SortTypes and reflect this within the file 2010-03-27 15:00:47 +00:00
4ec10575f3 fix the records names to match the json object we receieve 2010-03-27 15:00:47 +00:00
323638a751 add a new namespace for data records, Deluge.data
rename Deluge.Torrent to Deluge.data.Torrent
add new file Deluge.data.Peer that contains records in the Peers grid
add a singleton that contains sort functions
2010-03-27 15:00:47 +00:00
ce0dc49572 Update .gitignore file to work with git <= 1.6 2010-03-27 17:28:44 +11:00
3f0edee17a Add win32 files from 1.2-stable to keep in sync 2010-03-26 13:14:51 -07:00
ea65974dc2 Remove old win32 files 2010-03-26 13:13:58 -07:00
ddd0f40d4c Add .gitattributes file 2010-03-26 13:12:30 -07:00
12b2f47762 Merge branch 'master' of deluge-torrent.org:deluge 2010-03-26 13:10:58 -07:00
250471fe47 Add .gitignore file 2010-03-26 13:10:35 -07:00
1a26287a5a Merge branch 'master' into autoadd
Conflicts:
	deluge/plugins/pluginbase.py
2010-03-26 11:16:03 -04:00
5c42cfbf64 Fix pluginbase 2010-03-25 15:01:15 -07:00
1cfc4f522e Merge branch 'master' into autoadd 2010-03-25 17:56:20 -04:00
73db03a33b Fix up some docstrings 2010-03-25 14:43:15 -07:00
efe2c06347 remove some useless code 2010-03-25 17:41:15 -04:00
53fd0a57ee add quotes around attribute name 2010-03-25 15:55:01 -04:00
017d1e058e autoadd plugin will now transfer settings from core autoadd folder 2010-03-25 15:30:54 -04:00
e7e480cf3e Fix up some docstrings 2010-03-25 12:01:40 -07:00
c978c6d016 Fix test_alertmanager 2010-03-25 11:47:05 -07:00
8fb56f0410 Update versions in the man files 2010-03-25 10:49:51 -07:00
211d0bee5d Added autoadd plugin 2010-03-25 12:03:36 -04:00
e7c7b8f4db Fix typo 2010-03-24 22:55:45 -07:00
78f9f22a40 Raise a KeyError exception if trying to stop a component that hasn't
isn't registered
2010-03-24 22:52:03 -07:00
c8f2173a04 Use a hack to get the version instead of relying on pkg_resources. This allows the docs to be built without having to install deluge. 2010-03-24 15:36:28 -07:00
256ae0745c Update year 2010-03-24 14:29:17 -07:00
8dad06cfbd Fix some typos 2010-03-24 14:17:58 -07:00
b8270be10f Add ability for plugins to set their component update interval by
setting a 'update_interval' value in their object.
2010-03-24 13:29:41 -07:00
afbca066d7 Fix typo in super call 2010-03-24 13:24:04 -07:00
ee8531aa24 update the debug and compressed js files 2010-03-24 18:04:06 +00:00
7d27b847fb remove unrequired attributes from the button configs 2010-03-24 18:03:38 +00:00
73ec9b0338 Fix the progress bars for directories, was calculating the progress incorrectly 2010-03-23 23:45:52 +00:00
4005003003 remove the last of the resources that used absolute paths and move them to css with relative paths 2010-03-23 23:20:03 +00:00
3e4f2f94dd fix the progress bar usage 2010-03-23 14:36:34 +00:00
d39b5bd071 fix the name for the add window instance 2010-03-23 11:09:49 +00:00
52ea19249c Fix issue where plugins would try to be stopped after they have been
deregistered
2010-03-22 19:59:11 -07:00
a93bbc35a1 Merged test_versionsplit.py into test_common.py 2010-03-22 18:16:17 +11:00
79ab0f118f Add test case for deluge/common.py 2010-03-22 18:11:21 +11:00
9d13b17a3c Fix VersionSplit comparison to do a proper compare and not simply
against the version strings
2010-03-21 15:57:53 -07:00
6aacc6e75c add 2 extra debug logging statements to the Upload controller 2010-03-21 18:59:05 +00:00
c03f519f9a add some base parameter validation 2010-03-21 10:33:02 +00:00
c6caae848f Fix another problem with component change 2010-03-20 20:54:36 -07:00
5945b24476 Fix pluginmanagerbase using new component module 2010-03-20 19:29:36 -07:00
606b623d73 AlertManager will now cancel all pending delayedCalls prior to stopping. 2010-03-20 19:15:33 -07:00
16b832f7ab Fix importing libtorrent 2010-03-20 19:15:33 -07:00
b0714f625f Rewrite component module to handle deferreds properly
Add test_component
Fix test_core to work with new component module
2010-03-20 19:15:33 -07:00
670ad51de1 drop the Config resource and just include it in a script tag on the index page
this allows for dynamic base setting
add support for setting the base via a request header X-Deluge-Header
2010-03-20 14:14:46 +00:00
986e632475 add a missing Ext.namespace in order to create Deluge.preferences 2010-03-20 14:14:30 +00:00
f08c0e053c tidy up doc strings and change InstallPlugin to InstallPluginWindow 2010-03-20 13:35:21 +00:00
fd9dc2d892 add the new command line switches that deluge-web has 2010-03-20 12:41:51 +00:00
67bcaa267a allow the base path to be specified by a command line switch on deluge-web 2010-03-20 12:01:02 +00:00
5a9b671c85 add the jsdoc showing it extends from Ext.util.Observable 2010-03-20 11:26:54 +00:00
af9eeb02b0 rename Deluge.Events to Deluge.EventsManager 2010-03-20 11:02:13 +00:00
ff1ad9d764 fix logging out 2010-03-20 11:01:44 +00:00
7e5e28ea2b update to the new namespace format 2010-03-19 08:48:13 +00:00
51555cab83 fix the quick limits menus
fix displaying speeds with limits
2010-03-18 23:01:42 +00:00
dd866f07de big refactor to meet the new coding style to allow for tidier namespaces 2010-03-18 22:56:18 +00:00
26defff7fc fix building after the theme switch about 2010-03-18 12:41:07 +00:00
7947773a88 move the docs generating out of the js folder and include ext-js when generating the docs 2010-03-17 23:54:59 +00:00
ed03721789 upgrade to extjs 3.1.1 2010-03-17 23:17:13 +00:00
0f6cab42a8 reorganise the themes to make it easier to upgrade extjs 2010-03-17 23:13:32 +00:00
4031b9f94b ensure that we are definitely using the filename 2010-03-17 23:09:44 +00:00
a23648c657 fix the statusbar bandwidth limits (Closes: #1181) 2010-03-17 00:10:33 +00:00
9672480d39 add support for selecting multiple filters 2010-03-16 23:47:44 +00:00
7a115622df add "All" to the list of filters for tracker hosts 2010-03-16 23:44:38 +00:00
f7071b4428 fix the sidebar and torrent filtering (Closes: #1176) 2010-03-16 22:42:52 +00:00
296d790421 If the torrent has been added via a magnet link then try and extract the name from the dn key in the url. Fixes #1154. 2010-03-16 01:14:27 +00:00
228d623aef compress the response of Upload 2010-03-15 12:12:44 +00:00
e83737805d show the connection manager when the ui disconnects 2010-03-14 10:00:04 +00:00
2952a5a7a3 fix up the statusbar switching 2010-03-14 09:20:57 +00:00
21431f18e1 reset the torrents object upon a disconnect so there aren't any errors when reconnecting 2010-03-14 09:05:12 +00:00
4929ba3c44 pass in true to the formatter so fsize doesn't ignore zero values 2010-03-14 08:55:26 +00:00
81d28b686f add a failure callback when uploading a torrent file 2010-03-14 08:46:46 +00:00
e2840148af remove a torrent from the grid as well as displaying an error message 2010-03-14 08:46:46 +00:00
450d526eca Fix issue where the gtkui sometimes won't start if there is a stale lock file or socket in the ipc/
directory.
2010-03-13 12:17:34 -08:00
ae426eb0cd add support for asking the user to change their password if it is their first login 2010-03-13 18:42:46 +00:00
3e6c956ac6 change first_load to first_login in the ui config keys as well 2010-03-13 18:42:46 +00:00
3a54a9aebc change load to login as it seems more sensible 2010-03-13 18:42:46 +00:00
f6c058dd34 add a first_load config parameter 2010-03-13 18:42:46 +00:00
cd7681b909 Fix #1172 notify startup complete when adding torrents externally 2010-03-13 10:08:16 -08:00
d2dafe4180 update the libtorrent submodule to point to 0.15-stable 2010-03-12 10:04:47 +00:00
92837080cd add the libtorrent submodule pointing at RC_0_15 2010-03-11 23:06:47 +00:00
97c2d0346a remove libtorrent submodule that is tracking trunk 2010-03-11 22:59:34 +00:00
da9cb956a8 fix the submodule in master 2010-03-11 22:43:29 +00:00
0ed6eb8564 convert the port field from a "uxspinner" to a "spinnerfield", fixes #1170 2010-03-11 20:13:02 +00:00
f7f928f0b9 fix the entry point for web plugins 2010-03-10 10:39:20 +00:00
24ce77cdf0 add a home icon and corresponding icon class
adjust the file browser window title and add the remaining toolbar items
2010-03-09 23:48:56 +00:00
3a56af99c0 add the toolbar for the filebrowser in initComponent
add a browse button to MoveStorage
2010-03-09 23:40:29 +00:00
c1bf8c1da1 update the sort after an update 2010-03-09 23:32:12 +00:00
f825e8996a update the sort after an update 2010-03-09 23:26:54 +00:00
b919613a51 fix the spinner css classes to use relative paths 2010-03-09 23:06:24 +00:00
38802245b6 display the speed in the title bar 2010-03-09 22:48:33 +00:00
c6da126f55 fix the path to the spacer image when using a different base to / 2010-03-09 22:21:15 +00:00
84374fd83a use Deluge.config.base for the path to the status html page rather than just / 2010-03-09 22:19:01 +00:00
8de2d30de0 add forward and back icons for the filebrowser toolbar 2010-03-09 22:16:03 +00:00
a961947720 add a toolbar to the file browser 2010-03-09 22:16:03 +00:00
ae5071d6cb fix the button css adding !important to ensure that the background-image from them is used
use iconCls for the toolbar rather than fixed paths
2010-03-09 22:16:03 +00:00
00c896ff1d fix the paths of static content so a base config parameter can be used 2010-03-09 22:16:03 +00:00
0f126bcbd5 add the add and create icons to the css file 2010-03-09 22:16:03 +00:00
57fa3d8834 fix the tracker icons when used via a Proxy 2010-03-09 22:16:03 +00:00
e0a8fd70f5 use relative rather than absolute paths for icons 2010-03-09 22:16:03 +00:00
e2b78be264 improve support for a base config parameter 2010-03-09 22:16:03 +00:00
6fd3cd56ff fix the header year and file path 2010-03-09 22:16:03 +00:00
88004c0d54 build deluge-all to bring it up to date with the latest code 2010-03-09 22:16:03 +00:00
739636cc0b On queue_column_sort and seed_peer_column_sort, sorting is now made on a separate function, queue_peer_seed_sort_function so that code can be re-used and only the necessary treemodel lookups are made. 2010-03-08 03:08:13 +00:00
238e183851 Cleaned up the seed_peer_column_sort function. Code reuse is always better. 2010-03-08 02:52:09 +00:00
8a15a18361 PEP-8 and seed/peer sorting support. 2010-03-08 02:06:15 +00:00
2ed9f97bb0 add a stub file/class for a filebrowser 2010-03-07 19:16:20 +00:00
a1be15ffb2 update the libtorrent submodule to point to the public git repository 2010-03-07 19:16:20 +00:00
44d3e2fa2f Merge branch 'master' of deluge-torrent.org:deluge 2010-03-01 17:55:00 -08:00
2ce62bf19b Fix #1161 ask the user if they want to switch to Full allocation if
trying to change file priorities in the add torrent dialog while using
Compact.
2010-03-01 17:53:33 -08:00
3a86fd7068 give the fileuploadfield a width so the text field expands correctly 2010-03-01 22:45:35 +00:00
a69ed83e25 begin adding support for a base config parameter 2010-03-01 17:51:35 +00:00
e5c734fb05 Fix #1162 problem with the queued torrents dialog from not properly adding to the add torrent dialog if set to auto add 2010-02-28 16:58:19 -08:00
cfeae2baf4 Fix #1109 auto add halting when a torrent with invalid filename encoding is in the directory 2010-02-28 16:21:46 -08:00
0ffca9a1f6 Fix silly error from last commit 2010-02-26 14:49:19 +00:00
b8521e7e28 include the ability to profile the web server, code lifted straight from the daemon 2010-02-26 14:26:52 +00:00
50ae65b58a Use faster (non-regex) version of is_url. 2010-02-25 02:01:08 +11:00
4a7782af28 Fix #1143 deluge-console crashes when autocompleting non-existing
directory
2010-02-22 17:11:53 -08:00
5bbe8bec5c update the required libtorrent version to 0.14.9 to match 1.2-stable 2010-02-22 11:59:09 +00:00
a065f95075 Cross-platform fix for #1147. 2010-02-21 18:43:44 +11:00
8dd4d2f094 Fixed typo. 2010-02-21 02:32:24 +11:00
9ad59d5f48 fix #1148, saving execute commands, tuples can't be assigned to stupid me 2010-02-19 23:48:54 +00:00
7999bd1e8c now the size and speed formatters hide on 0 fix the status tab so it displays the same as the gtkui 2010-02-19 20:43:27 +00:00
c81b1620ca fix the doc for fspeed and hide if speed == 0 2010-02-19 20:22:37 +00:00
6d4cf138c8 fix #1147 in trunk as well 2010-02-19 19:50:24 +00:00
a011d6d659 Merge branch 'master' of deluge-torrent.org:deluge
Conflicts:
	libtorrent
2010-02-19 00:39:11 +00:00
1790a1cf2d add an additional check to ensure that the libtorrent folder has files in it 2010-02-18 18:23:36 +00:00
b5533a22bc need to not remove the libtorrent folder 2010-02-18 18:19:29 +00:00
6750e9f122 add libtorrent 0.15 branch as a submodule 2010-02-18 17:26:13 +00:00
04abf6d17b remove the libtorrent folder as we'll now be using git submodules 2010-02-18 17:22:49 +00:00
00734d14b6 update the ChangeLog 2010-02-18 02:32:27 +00:00
bb00387903 fix the peers progress renderer 2010-02-18 02:20:43 +00:00
ea365bf671 fix the cancel button in the edit trackers window 2010-02-18 02:02:32 +00:00
1d2a6f7f0e implement a better remote events system 2010-02-17 01:50:05 +00:00
7bd5ba3cdb use createDelegate and add the onHide method that stops updating the hosts grid 2010-02-17 01:34:42 +00:00
68b5f92ec0 build up the details tab html within the javascript as well as making it easy for plugins to add extra items 2010-02-10 23:16:17 +00:00
04242ba91c fix the broken torrent menu and use icon classes rather than straight icon urls 2010-02-10 22:35:47 +00:00
eef9d8ec13 update the copyright header year for all the js files
implement a new update method that will be compatible with the torrent status deltas
add a new script containing a record for a Torrent
2010-02-10 22:15:29 +00:00
0e9a691954 Fix weird gtk bug that breaks create dialog box's pieces size selection. 2010-02-04 11:17:26 +00:00
9b23ce9e06 Use the preferred locale encoding when renaming files on add 2010-02-03 02:41:24 +00:00
f9d2e96d39 fix the ip address sort function 2010-01-29 16:40:49 +00:00
caed5accea use get_host() in connect() 2010-01-29 15:35:51 +00:00
343521ca25 stop the torrent grid from resetting its position upon update 2010-01-29 11:04:26 +00:00
1d29f67a75 fix the progress bar in the grid 2010-01-28 22:49:56 +00:00
da8367de4d fix the row height 2010-01-28 18:43:30 +00:00
0647c4e3d7 use the BufferView to ease torrent loading in the interface 2010-01-28 18:39:16 +00:00
976824ad99 revert to the default theme if the selected themes stylesheet is missing 2010-01-27 20:23:15 +00:00
a4e12c1d94 change the favicon on the docs template 2010-01-27 11:14:05 +00:00
db4d0fabe7 remove the entry for jsdoc 2010-01-26 18:21:09 +00:00
25b282fdb8 add the full path to the info returned by the file tree 2010-01-26 18:20:43 +00:00
518a73079a fix some issues with the add window 2010-01-26 18:18:14 +00:00
0634592bd9 add a doc string 2010-01-26 18:17:24 +00:00
3e13fe1229 change the formatting 2010-01-26 17:42:17 +00:00
7125eab8b2 add a doc string 2010-01-26 17:42:02 +00:00
57a9e925a7 no need to have this wrapped in an inline function
add a solitary doc string
2010-01-26 17:35:18 +00:00
4afcae325a use createDelegate rather than bind, saving implementing our own method of setting a functions scope 2010-01-26 17:31:32 +00:00
dc764b2ad5 add some basic doc strings 2010-01-26 17:26:53 +00:00
454321614b update the doc strings 2010-01-26 17:07:23 +00:00
d39f6843c9 add the deluge docs template and a build_docs shell script 2010-01-26 17:05:48 +00:00
f63435db90 remove the old jsdoc-toolkit docs folder 2010-01-26 15:25:38 +00:00
8c3b6cb0db add a project file for ext-doc 2010-01-26 15:23:45 +00:00
a89d0d42aa rebuild the non-dev scripts 2010-01-26 14:03:14 +00:00
3368c4c67d re-enable a number of disabled scripts
use hbox for the buttonPanel and remove the pre ext3 hack
2010-01-26 13:59:25 +00:00
447cb52bf1 add .x-mixed-download to the priorities css
fix the way the directory stats are updated (parent directories weren't being updated)
2010-01-26 13:25:44 +00:00
2afd0a4e97 fix the progressbar renderer for the file tree
add a new file priority "Mixed"
add progress bars and priorities for directories using the new tree format
2010-01-26 13:18:16 +00:00
7727a98c45 add a second FileTree class that stores everything as a dict within the tree so information can be stored for directories 2010-01-26 13:12:32 +00:00
744f11e19b rename the TreeGridCustomColumn to TreeGridRenderColumn and add the column object to the template so its accessible from the renderer 2010-01-26 13:11:29 +00:00
0a86a30c2a Initialize session_id to -1 so that it will always return something even
if no connections to the daemon have been established
2010-01-26 02:42:30 +00:00
ec410fc1a9 Remove some debug code 2010-01-26 02:01:53 +00:00
7af689e57f change the priority renderer to return '' if there is no value 2010-01-25 15:10:14 +00:00
fa0d6b1aa0 Increased GTK UI limit for download / upload to 60000. 2010-01-25 09:46:08 +00:00
8fc4caa2f1 Wait on the session state before requesting torrent status updates 2010-01-25 04:58:01 +00:00
25afa04ba3 Use torrent status diffs in the TorrentView to reduce the amount of rpc
traffic from the core->gtkui
2010-01-25 00:15:12 +00:00
c202f7727f Add some rpc stats to the gtkui debug logging 2010-01-24 22:44:44 +00:00
d74050e7a6 partially working files tab added back in 2010-01-24 04:06:06 +00:00
c7635b0ff0 remove commented out line that scanned for the width which is redundant now width is a property of the renderer 2010-01-24 03:29:44 +00:00
0d069d0fe8 change the queue number server side 2010-01-24 03:27:43 +00:00
e441f96204 use Ext.ux.StatusBar 2010-01-24 03:01:12 +00:00
99197b2063 set the correct svn:ignore properties 2010-01-24 02:59:37 +00:00
92d19fd58d initial commit of the big js layout overhall (ui loads but there are parts missing) 2010-01-24 02:55:32 +00:00
b4b95c9423 Don't opitimise when doing a debug build. 2010-01-24 02:23:57 +00:00
e79f6ada2f Move the formatting of RPCRequests to a function so that it's not done every time a rpc request comes
in
2010-01-23 23:50:43 +00:00
0e0cc30128 Add ability to get the session id and validate it.
Fix up some docstrings
2010-01-23 23:41:06 +00:00
9b26f6ebee Fix up the build_debug so that it removes 'NDEBUG' from the CFLAGS 2010-01-23 22:33:24 +00:00
30280b0803 Remove debug print 2010-01-23 22:05:49 +00:00
fe6bcd62be remove all the torrents from the store upon logout 2010-01-23 20:34:32 +00:00
14cea4fbc7 change the data store to a json store to save translating the data into an array first 2010-01-23 15:50:32 +00:00
899ac7c86e remove starting the events manager upon client connect 2010-01-23 15:39:05 +00:00
39341f623f fix the formatting and change it so the events manager is started on the login event 2010-01-23 15:38:07 +00:00
42cbf4f5c6 change the default theme to gray 2010-01-23 15:37:04 +00:00
a3d98029f9 fix formatting and set Ext.USE_NATIVE_JSON to true 2010-01-23 15:35:44 +00:00
031f75a2bb disable the override to formlayout for the time being 2010-01-23 15:34:50 +00:00
a59332b4ef fix logging in 2010-01-23 15:34:32 +00:00
1b2d5bc6ad tweak the way the login is built up 2010-01-23 15:31:17 +00:00
f14b3a8459 fix typo 2010-01-23 14:38:28 +00:00
76fcfa498d add gzip encoding to responses that are just text 2010-01-22 12:39:33 +00:00
2073ae0221 change the default theme to blue for the time being 2010-01-21 21:17:18 +00:00
cd24acd74f upgrade to ext js 3.1 2010-01-21 21:01:02 +00:00
1ac0403f05 switch the css file in the server list 2010-01-21 20:28:10 +00:00
90e562ff98 update the rest of the css files 2010-01-21 19:53:02 +00:00
e010a789c4 remove the carriage returns 2010-01-21 19:50:55 +00:00
964d85d908 update the theme images 2010-01-21 19:34:05 +00:00
3068f006e2 remove the slate theme that is no longer supported 2010-01-21 19:28:40 +00:00
f4cf3d9893 convert spaces to tabs 2010-01-21 19:19:37 +00:00
708ad2e665 add a __contains__ method to the config class
fix upgrading old configs when the key doesn't exist in the old config
2010-01-20 21:04:40 +00:00
0819697c5b update the gettext.js generation script and gettext.js 2010-01-20 20:37:14 +00:00
0121d721cb Make sure all data is passed to pagePart. Accept x-gzip encodings. 2010-01-20 12:36:07 +00:00
a82b6e4fb5 add 2 new commands that allow for libtorrent to be built with debugging enabled 2010-01-20 12:08:29 +00:00
4420f2fae5 Fix hanging when using commands from the command-line
Fix displaying plugin command output on the command-line
2010-01-19 23:00:48 +00:00
f8f9438950 Fix #1128 Show an error dialog when unable to start a 'deluged' process 2010-01-18 02:36:03 +00:00
e211b6feca Update main window glade orientations 2010-01-17 22:18:45 +00:00
d9b9f22998 Completely disable gzip decoding when allow_compression=False. Add extra test. 2010-01-16 04:50:01 +00:00
aaa7dae18e Fix date in 1.2_RC changelog. Add release date to trunk changelog. 2010-01-16 04:21:25 +00:00
2de185adea bump version to 1.2.900 rather than 1.2.9.900 2010-01-14 14:17:05 +00:00
0e2dd9f389 Add gzip decoding support to httpdownloader (implements #1012). 2010-01-14 12:43:59 +00:00
cbac2fbd5a Fix typo. Remove obselete function. 2010-01-14 12:32:04 +00:00
be70305365 Make sure that the port test status image is always reset between tests. Added a "loading" image when the test is in course. 2010-01-12 03:15:50 +00:00
f586b91a59 Remove workaround for lt 0.15 when setting the trackers 2010-01-10 20:17:59 +00:00
623c5ab57b Fix displaying new release dialog in Windows 2010-01-10 19:47:31 +00:00
ed00536468 Add missing import(removed on a previous check-in???). 2010-01-10 16:26:41 +00:00
430b96f4f5 Do not save_state right away, but rather wait for the timer loop 2010-01-08 23:36:44 +00:00
ac66f305e7 Fix displaying root folder when using the 'path.utf-8' keys in torrents 2010-01-08 21:26:33 +00:00
8175b2af58 Use cStringIO to open zip files in python 2.5 2010-01-07 15:27:05 +00:00
4dbc93b1fa Rewrote call to use maybeDeferred (this handles methods that return deferreds).
Fixes #1114.
2010-01-07 00:45:47 +00:00
9b97c6a578 put the default password in the manpage for those too lazy to type "deluge default web password" in google 2010-01-05 14:07:16 +00:00
97375f1a7c Fix #1117 can't use the '3' key 2010-01-04 00:18:53 +00:00
6312ad4a7e Add rudimentary support for local files 2010-01-03 18:02:30 +00:00
b06f46ea7c Fix blocklist ignoring try_times.
Make blocklist print error messages on failures.
2010-01-03 16:27:05 +00:00
a570e67a4d Fix #1116 not being able to use command aliases when not connected to a daemon 2010-01-03 01:37:57 +00:00
221c9984d6 Fix #1115 not showing usage for the 'debug' command 2010-01-02 23:25:45 +00:00
ccc97f83a8 Yet, some more logging clean-ups.... 2010-01-01 22:49:02 +00:00
d557cda55c Clean-up logging. 2010-01-01 22:45:03 +00:00
eee6d4c030 The !FreeSpace plugin only calculates free-space on existing directories. Cleaned-up logging. 2010-01-01 21:44:55 +00:00
177ec7d5c2 Allow choosing which columns are seen on the torrent view by right-clicking it's headers. 2010-01-01 21:27:13 +00:00
f30a10f2b8 Add "Save Path" column to the torrent view. 2010-01-01 21:23:57 +00:00
1c665b7d2f Simplify logic flow a bit (should make local file support easier).
Improve docstrings.
2010-01-01 16:02:20 +00:00
717897b343 Don't apply 'stop/remove on completed' rules to torrents in a Queued or Paused state 2009-12-28 21:50:13 +00:00
7f33292aca Fix not being able to rename folder due to constant updating 2009-12-26 17:10:14 +00:00
3e67620e55 Fix torrent info name not being utf-8 decoded when root file/folder name is blank 2009-12-26 17:09:05 +00:00
bc8cacdbd1 Update svn:externals to point to libtorrent RC_0_15 branch 2009-12-25 21:33:01 +00:00
ec9564d0c1 #496: Remove deprecated functions in favour of get_session_status() 2009-12-25 21:29:47 +00:00
ffb241a4de Strip lines/spaces 2009-12-25 21:27:07 +00:00
d57b2b43ec Implement #457 progress bars for folders 2009-12-24 20:06:23 +00:00
19e2ab2187 Have the .desktop file run 'deluge-gtk' 2009-12-23 23:54:00 +00:00
8e7d4f2cd4 Change share ratio calculation to use the total done instead of the all time downloaded value. This change will make the share ratio calculation not use data downloaded in failed hash checks. 2009-12-23 18:44:00 +00:00
ef2ca43c3d Add in a '_' builtin method if unable to initialize gettext 2009-12-23 01:34:58 +00:00
8bedc613a0 Fix possible TorrentFinishedEvents being emitted on startup for already completed torrents 2009-12-23 01:28:33 +00:00
cd3221baf6 Fix exceptions when gettext/locale cannot be initialized properly 2009-12-21 19:41:31 +00:00
e0ebffb8fa More relaxed definition of what a commented line is in a blocklist.
Decorate readranges with raiseError rather than parse to increase performance.
2009-12-21 13:58:24 +00:00
5a8c443d50 Add another test to httpdownloader.
Make it compatible with python 2.5.
2009-12-21 13:48:00 +00:00
c7d52f3ce5 fix filtering on the tracker host, use == rather than in so tracker urls that contain another trackers url within them aren't picked up as well 2009-12-21 10:26:50 +00:00
fad6ba2193 Fix blocklist status icon not opening proper preferences page.
Show blocklist's file date using the locale's date / time representation.
2009-12-20 09:01:07 +00:00
22c9d7c0ee Fix some packing due to the last commit 2009-12-20 04:23:50 +00:00
3a864bcdad Plugin preference pages will now expand to fill 2009-12-20 04:18:21 +00:00
14f894959f Fix displaying folders in the add torrent dialog 2009-12-20 04:02:41 +00:00
6aebcef2b5 Fix file renaming 2009-12-20 03:45:14 +00:00
9e53e33c24 Fix #1104, #735 use path.utf-8 if available 2009-12-18 04:36:42 +00:00
62a336b7d8 Remove redundant variable. 2009-12-17 23:08:55 +00:00
0cc00ba5df Partial fix for #1103 if the per-torrent option for stopping at a ratio has been unchecked, then do
not stop it at the global setting.
2009-12-17 21:40:21 +00:00
a161bbfcb6 Fix #1095 incorrect piece size used when using some non-English languages 2009-12-17 21:27:04 +00:00
f03d1818fa Upgrade older confs instead of just dying.
Fix major logic error when checking if an update is needed.
2009-12-16 13:46:39 +00:00
13b2e7da26 Fix import on startup which got broken in previous commit. 2009-12-16 12:46:57 +00:00
377f8cf886 Fix blocklist not working for all locales (#1059). 2009-12-16 11:55:34 +00:00
72c9a46fa3 Apply #1100 sort plugins list by name 2009-12-15 17:37:05 +00:00
53b9cdebcd Fix #1099 use triple quotes on docstrings 2009-12-15 06:36:02 +00:00
dc9e2597da Fix showing the remove torrent dialog twice if using the delete key and pressing cancel in the dialog 2009-12-14 23:20:35 +00:00
bc27c2cdf7 Remove Notifications from list 2009-12-14 23:16:56 +00:00
a9631daf7f Fix #768 save tracker list for create torrent dialog 2009-12-14 18:46:08 +00:00
d1f6ca90fc Fix #1086 deprecated gtk.Tooltips usage 2009-12-14 18:20:51 +00:00
68749a7ad5 Fix #594 tray password dialog freeze in Windows
Made the password dialog prettier
2009-12-14 02:15:08 +00:00
5b94861fc9 Fix issue where stoping a daemon that you aren't connected to causes the gtkui to shutdown the
currently connected daemon.
2009-12-14 00:48:18 +00:00
a8697114c1 Fix #823 setting config values to -1.0 2009-12-13 22:47:15 +00:00
0042fb1767 Add #891 remove torrents by pressing the Delete key 2009-12-13 22:16:05 +00:00
b69e25e308 disconnect the client if getting information fails 2009-12-13 21:50:16 +00:00
3c24d72489 use metavar to change the output of --help by optparse 2009-12-13 21:49:10 +00:00
358b5f4b19 Fix issue where hosts will show up erroneously as Offline 2009-12-13 21:46:55 +00:00
43df21517e Disconnect from daemon if getting the info fails 2009-12-13 21:34:26 +00:00
43a5a9111b Fix autoconnecting to a host other than the first one in the list 2009-12-13 21:29:46 +00:00
773f65d708 Add an error dialog when trying to add a duplicate host
Center the add host dialog over the connection manager
2009-12-13 21:25:22 +00:00
cd7b5082a0 Fix #1036 autoconnecting to localhost daemon on start-up 2009-12-13 20:49:23 +00:00
f3f3b3669f Fix #782 do not ask for tray password when window is not minimized to tray 2009-12-12 22:38:26 +00:00
7e0d09a7bc Fix #692 no longer require tray password when quitting from the tray icon while the window is
visible.
2009-12-12 21:22:51 +00:00
42e904b63c reset the add torrent window on hide 2009-12-12 15:56:49 +00:00
35186faf78 Fix printing 'rm' command usage when called with no arguments 2009-12-11 21:19:48 +00:00
62dfd6a664 Implement #1063 option to delete torrent file copy on torrent removal - patch from Ghent 2009-12-11 21:00:12 +00:00
8212a66d5a fix #1075 (changing priority on a whole folder) 2009-12-11 20:45:59 +00:00
eac2a10a12 Fix possible exception when upgrading from a 0.5 state file 2009-12-10 21:28:51 +00:00
9f034657b0 Fix [6003] as it reverted a change 2009-12-10 21:15:56 +00:00
f7b3e11729 update some of the icons in the webui 2009-12-10 18:24:31 +00:00
b47f6badd7 disable the files and options tabs until a torrent has been selected 2009-12-10 17:45:40 +00:00
2ecb233b5b fix uploading plugins when the daemon is not localhost 2009-12-10 17:35:35 +00:00
040f1a5c6d fix the onResize method for the togglefield so it resizes the textfield to the correct size 2009-12-10 17:26:45 +00:00
a126081d2c implement installing plugins via the webui 2009-12-10 15:40:37 +00:00
104852d47e fix the upload_plugin method as it wasn't upgraded to deluge-rpc spec 2009-12-10 15:31:27 +00:00
a2cc2cdd8f remove the margin and padding from the bottom of the options fieldset 2009-12-10 14:35:10 +00:00
7650ebc373 fix enabling plugins on the fly 2009-12-10 14:32:55 +00:00
a4e8d1eb46 Fix using the console in Windows, but only in command-line mode 2009-12-10 01:26:26 +00:00
b9d2094a15 tweak the download prefs page so no scrollbars appear 2009-12-10 00:38:48 +00:00
3f383df479 improve the ToggleField widget, having the checkbox to the left of the
field rather than above it
2009-12-10 00:32:24 +00:00
1ba3955025 add tooltips to the statusbar items
add disk free space to the statusbar
2009-12-10 00:06:34 +00:00
0d3f364aac Apply cookie date fix from adios 2009-12-09 13:13:04 +00:00
d119fa3629 fix a bug in the execute plugin when move_completed is used the incorrect path was passed in 2009-12-08 11:24:56 +00:00
5129682727 tweak the sizes of some form elements to improve the layout 2009-12-08 02:09:03 +00:00
96becf60bd begin the makings of the togglefield widget that allows enabling of move completed/copy torrent files/auto add torrent files fields 2009-12-08 01:56:15 +00:00
9c3efd17cb Change the compressed js script to deluge-all.js to avoid naming conflicts on case sensitive filesystems 2009-12-01 17:11:07 +00:00
19455a7adf copy server.py across from the 1.2 branch 2009-12-01 13:02:46 +00:00
57c96477c1 Add button to Other preferences to associate magnet links with Deluge 2009-11-30 03:50:28 +00:00
f9c61bbc11 Fix #1085 only use ints for specific options to prevent unhandled exception 2009-11-29 21:32:56 +00:00
a80c4e18e7 Fix crash in Windows when creating a torrent 2009-11-29 07:38:29 +00:00
e73c65e602 Properly show 100.00% and reduce number of progress bar updates during a torrent creation 2009-11-29 07:37:29 +00:00
8c283875fb Register just 'deluge' not '/usr/bin/deluge' in the magnet uri handler 2009-11-29 01:45:46 +00:00
1353ce6903 Attempt to register as the default magnet uri handler in GNOME on startup 2009-11-29 01:40:30 +00:00
3136e5490f Add some checks for OSX since it doesn't support SVG icons 2009-11-29 00:52:00 +00:00
cffce4a706 swap the order of the buttons in the remove window 2009-11-26 14:59:04 +00:00
1c318504cf update the build script and rebuild deluge.js and ext-extensions.js 2009-11-25 18:52:00 +00:00
115a7c3795 rename deluge-yc.js to deluge.js in trunk 2009-11-25 18:51:19 +00:00
3fcb0e7ae5 exclude some more things from the sdist 2009-11-25 18:37:40 +00:00
a567b23262 prevent undefineds ending up as a key in the option manager 2009-11-25 18:37:06 +00:00
93468f342a Set batch_write to False in __init__ 2009-11-25 18:23:55 +00:00
635260e686 add the updated setup and new MANIFEST file from 1.2 2009-11-25 17:58:50 +00:00
94625c48b2 Fix loading the saved metadata when loading state with magnet uris 2009-11-25 01:55:51 +00:00
20dc0a5e8a Fix files list when using magnet uris 2009-11-25 01:41:50 +00:00
e6135aa2a9 Fix some accidental reverts 2009-11-25 01:00:25 +00:00
1cb42252b8 Don't throw errors when de-registering notifications.
If sound notifications is not possible or disabled, also disable the sound customization notebook page.
2009-11-22 08:14:09 +00:00
7812f7b4e4 Update the Notifications and FreeSpace plugins descriptions.
On the Notifications plugin, moved the Core and GtkUi notification implementations to `core.py` and `gtkui.py` respectively.
2009-11-22 06:56:50 +00:00
127b577440 If plugin is installed on an older client, known_events might not exist yet. 2009-11-22 06:13:11 +00:00
a5e8a9dc69 Only import gtk inside the GtkUi notifications implementation. Like this one won't need have gtk installed if only the daemon is running. 2009-11-22 05:58:32 +00:00
9bfa5f10b6 Since the WebUI does not yet do anything, remove it's entry point from the notifications plugin.
Cleanup debugging output.
2009-11-22 03:55:36 +00:00
67c0f8609b Merge Heads. 2009-11-22 03:08:28 +00:00
7061e09a8e Remove unused module. 2009-11-22 02:35:55 +00:00
e327d87ebc Moved all notifications into their own classes from which the Core, GtkUi, and possibly latter, Web, plugins inherit from.
The plugins now just handle configuration stuff.
2009-11-22 02:35:47 +00:00
c4f0920c18 Notifications are now working for the built-in TorrentFinishedEvent and the custom one for email, popup, blink and sound notifications. Sounds can even be tweaked for each of the events types.
Needs some code cleanup.
2009-11-22 02:35:37 +00:00
adb22bdfa5 Add the test module so that it can be version tracked. 2009-11-22 02:35:28 +00:00
01a43544d5 Remove un-used module. 2009-11-22 02:35:19 +00:00
8420d6105b Custom notifications now working for emails, popups, blinks and sound.
Blinks might need some changes because, there's no need to formar or gather extra info, so, it might not be needed to allow plugin developers to register custom handlers for it.
2009-11-22 02:35:12 +00:00
1b7a50f88b Checkpoint:
* Custom notification providers working for email.
  * Configuration through the GtkUI working.
2009-11-22 02:35:02 +00:00
8a6ec7232d Merge SVN and HG heads. 2009-11-22 02:34:51 +00:00
535940e2e6 Notifications(email, blink, popup, sound) are working both for classic mode and daemon mode.
Still need some further tests for using `component.get('Notifications').notify*()`.
2009-11-22 02:34:35 +00:00
0723a77214 First notifications plugin commit.
Working when not in classic mode. In classic mode, needs some more coding.
2009-11-22 02:34:23 +00:00
1f58910a38 Fix adding torrents with different metadata by storing the bencoded dict too. If we bencode the stored metadata dict, there is a chance the order of the dict will be different and change the info-hash. 2009-11-20 19:13:12 +00:00
634ecdeb1d Fix issues adding magnet uris 2009-11-19 04:51:19 +00:00
aa86aa6fe1 Fix issue where some torrents with special characters could not be added 2009-11-19 02:39:07 +00:00
789356d44d Fix exception on startup when the system tray icon is not enabled 2009-11-19 02:29:37 +00:00
2b3bd4f1f3 Change the event_list to be a dictionary of known_events and their docstrings 2009-11-16 00:39:15 +00:00
ad04b2a137 Add way to get a list of DelugeEvent classes 2009-11-14 23:42:04 +00:00
1a1ab4e780 Fix endless loop when trying to autoconnect to an offline daemon 2009-11-13 05:26:54 +00:00
330b8b3ced Fix autoconnecting to the next host in the list if the selected one isn't available 2009-11-13 05:22:38 +00:00
bdba9cd00a Fix #1071 issue where Deluge will fail to start if there is a stale ipc lockfile 2009-11-13 01:07:36 +00:00
f98c3adf2f Comment out a debug log 2009-11-10 18:28:27 +00:00
ec2c5ab937 Reduce height of Add Torrent Dialog by ~80 pixels 2009-11-10 02:45:36 +00:00
8dff2375d0 remove alpha from the title 2009-11-09 23:48:32 +00:00
4e2c0a70c4 Allow for colons in PeerGuardian/SafePeer lists' descriptions.
Check that the start & end range resembles an ip when checking a list's validity.
2009-11-09 08:54:13 +00:00
41353c9ae4 Force blocklist to re-detect the format when a download is forced.
Move remove_zeros to common.py and simplify / speed up.
Change debug logging lines to be more uniform.
2009-11-09 01:52:58 +00:00
e73052df1c Fix printing info, help, etc.. on the command line 2009-11-08 17:22:57 +00:00
9b8282010c Fix disabling/enabling plugins after switching daemons 2009-11-08 04:04:40 +00:00
dd67a935cb Fix #1067 import os 2009-11-06 19:22:13 +00:00
0a84bc73c5 Only try to stop LoopingCalls if they are running 2009-11-05 04:35:17 +00:00
baa177a1b1 Fix deleting old .fastresume files with fresh configs 2009-11-05 03:44:46 +00:00
fa5b7e7a66 allow commands that are .pyc files to be used 2009-11-04 23:49:07 +00:00
902ef3fa28 run the path from the add command through os.path.expanduser 2009-11-04 23:36:27 +00:00
8144d15689 add a basic move storage window that fixes #1057 2009-11-04 20:45:21 +00:00
dd860e67f7 remove the connected call upon an update to reduce the number of ajax calls 2009-11-04 19:54:59 +00:00
19d9c71b13 Allow the 'help' command to be called when not connected to a daemon 2009-11-03 22:08:18 +00:00
46906f5447 remove accidentally left in debug line 2009-11-03 14:48:24 +00:00
1893b92f37 make the delete key work in the console ui 2009-11-03 12:47:23 +00:00
fb1d7cfece Fix adding torrents from the Queued Torrents dialog 2009-11-03 03:25:57 +00:00
59b93f4d2e Fix showing the 'Other' speed dialogs in Windows 2009-11-03 03:19:30 +00:00
6880a142e3 Remove debian/ folder 2009-11-02 17:50:32 +00:00
3d76122666 escape the hyphens in the console and web manpages 2009-11-02 17:33:06 +00:00
0f81e2816f forward port the setup.py fix to trunk and update the 1.2 branch ChangeLog 2009-11-02 15:35:56 +00:00
59c7fcf854 Update translations 2009-11-02 01:35:13 +00:00
f6a4d19084 Add the clear() back 2009-11-01 17:49:32 +00:00
ec259d6aea Use batch writing mode in the help command 2009-10-31 22:05:35 +00:00
7983187818 Do not include an 'announce-list' key in torrents when there is only one tracker 2009-10-31 19:49:14 +00:00
2a4cf7cb56 Improve 'info' command draw speed 2009-10-31 18:52:52 +00:00
3b07cc40bd Don't bother clearing the screen during a refresh 2009-10-31 18:44:27 +00:00
fd24e1c17c Fix crash when string length makes line longer than terminal width 2009-10-31 18:43:48 +00:00
f876c17efd Fix crash when removing multiple torrents 2009-10-31 05:50:01 +00:00
ee7f4e452d Fix adding torrents when not showing the add torrent dialog in Windows 2009-10-31 00:08:53 +00:00
7c10dd4c0e Fix #1052 crash when issuing commands while not connected to a daemon 2009-10-30 20:06:07 +00:00
a110ad1d20 Fix improper dos line endings 2009-10-30 19:08:23 +00:00
7c2a2af1f0 Fix displaying non-ascii strings in the console ui -- patch from Ian Martin 2009-10-30 18:00:13 +00:00
6d2d3c0fd0 Fix torrent name being blank when root folder is renamed to /
Update changelog (for previous commit as well)
2009-10-30 00:15:22 +00:00
888997372c Make sure renamed files are utf-8 encoded. 2009-10-30 00:02:25 +00:00
5991abcec5 Use filename suggested by content-disposition header.
Closes #1040.
2009-10-29 06:02:20 +00:00
675d1219cd Consider 0 unlimited when displaying limits in the statusbar 2009-10-28 17:43:29 +00:00
a1e4c51c9c fix #990, showing 0 as a limit when it means unlimited in the statusbar 2009-10-28 17:38:35 +00:00
93e3d2acf6 need to actually continue from the loop otherwise another error still occurs 2009-10-28 13:33:27 +00:00
219f745e68 create a method to escape all possible forms of newlines in a translation as well as the quotes 2009-10-28 13:24:37 +00:00
d6e18f7729 fix displaying the protocol speed in the webui
also update the update_ui method in json_api so it gets the status more like how the gtkui does
2009-10-27 11:39:53 +00:00
d27d7c6733 fix the eta sort order in the webui 2009-10-27 11:16:55 +00:00
831b81529c update the ChangeLog so andar doesn't beat me up
fix displaying tracker urls with & in the url in the gtkui
2009-10-27 11:07:30 +00:00
826f1a2be9 add < and > escaping to the html escape method 2009-10-27 10:57:47 +00:00
e17bd472a8 fix actually escaping (foolish me had left it commented out) and also only update if there has been a change 2009-10-27 10:34:07 +00:00
de82302c67 create a simple html escape method and escape the fields in the details tab 2009-10-27 10:26:59 +00:00
81949449ae fix a couple of bugs in the M.O.M and fix the options tab and file priorities in the torrent add window (success!) 2009-10-27 10:25:16 +00:00
acc850dab9 fixes #1046, changing the option name in the ui rather than the core which would break the other uis 2009-10-27 09:12:22 +00:00
208eef713a Fix #1047 move completed does not work if saving to non default path 2009-10-27 03:08:47 +00:00
dbe90d2882 Use custom user-agent when downloading files with httpdownloader. 2009-10-26 13:58:42 +00:00
3153a545ca Update translations 2009-10-26 01:54:19 +00:00
65545df485 modify the M.O.M so the API is practically the same as the O.M, so the only method that accepts an id is changeId 2009-10-25 17:48:28 +00:00
29d01993c9 Fix typo, update plugin info. 2009-10-25 13:42:11 +00:00
9627b7cb92 Fix exception when using the 'halt' command 2009-10-24 19:49:20 +00:00
c068384845 Fix create_plugin.py script 2009-10-24 05:51:26 +00:00
92eb10be29 Fix #215 ETA sort order 2009-10-24 04:56:10 +00:00
c6d4208a29 Fix previous commit [5864] 2009-10-24 03:47:35 +00:00
c6eaec6998 Fix #799 translate connection status 2009-10-24 02:04:19 +00:00
b77e846744 Fix starting plugins when the pluginmanager is started 2009-10-23 23:23:38 +00:00
566d3c5ebf Fix possible exception when trying to load pre-1.2 plugins 2009-10-23 01:15:30 +00:00
6eee4fb31f Fix 'autostart localhost if needed' option 2009-10-23 01:07:46 +00:00
36e74e05ca fix removing torrents that fail to download when added via url 2009-10-21 20:30:07 +00:00
2289b5f173 fix switching the options when a different torrent is selected
fix showing the private flag
2009-10-21 20:15:16 +00:00
f6b5eb0a0c fixes to the M.O.M and the options details tab, still not 100% though 2009-10-21 19:48:44 +00:00
d70edb245b show the infinity symbol if ratio is less than 0 2009-10-20 22:45:32 +00:00
21701cb096 fix setting bandwidth limits via the statusbar 2009-10-20 22:33:18 +00:00
da2a7ef138 fix setting the add options in the mom 2009-10-20 21:53:54 +00:00
3f1d769ffc merge changes into trunk 2009-10-20 21:44:27 +00:00
9c491c13cc Add option to create torrent name sub-folders in extract folder
Fix issue where the plugin would not stop extracting files after being disabled
2009-10-19 02:10:43 +00:00
bdc173cf4b use os._exit() rather than exit() when forking 2009-10-14 15:53:31 +00:00
4ae439a99a Pause the TorrentDetails component when the window is minimized.
Clean up the pause/resume component code in mainwindow
2009-10-14 15:49:55 +00:00
04217e16d4 big bunch of fixes to the M.O.M along with a couple to the O.M 2009-10-13 16:21:28 +00:00
4a00edc066 move the parameter type converting into a seperate method 2009-10-13 15:22:24 +00:00
aa274eca74 improve the forking code 2009-10-13 15:20:45 +00:00
c0b5bcc7d3 add the option to fork the webui 2009-10-13 11:32:40 +00:00
551d38c7a0 fix a bug in the connection manager where the host list wasn't refreshed after a host was added 2009-10-13 09:56:49 +00:00
c3f433500b allow setting of the value without firing an event 2009-10-12 16:45:28 +00:00
23c949d4ec give names to both the radio buttons so they end up in a group (duh) 2009-10-12 16:44:30 +00:00
3d85791a03 fix a bug in converting non-boolean values back to boolean in the options manager 2009-10-12 09:53:13 +00:00
a3636ccdb7 Fix saving torrent state on fresh configs
Do not try to call doIteration() on the reactor if it has already stopped
2009-10-11 18:46:35 +00:00
e0111271a3 change the value of torrent.queue from -1 to 99999 so the grid sorting works the same as the gtk ui 2009-10-10 14:06:08 +00:00
44217fd977 add a man page for deluge-web 2009-10-10 13:45:31 +00:00
6274a32ca1 Add man pages for deluge-console and deluge-gtk
Update the other man pages
2009-10-09 16:26:10 +00:00
11c0e9a304 Likewise in trunk.. 2009-10-09 00:40:46 +00:00
844f98db04 Fix path errors when adding torrents externally in Windows 2009-10-09 00:19:07 +00:00
3c69822761 Modify setup.py to allow building without libtorrent/ 2009-10-08 02:51:49 +00:00
3a90109724 Likewise in trunk 2009-10-08 02:43:54 +00:00
ce0968e6dc Update gettextize.sh script to use proper encoding
Regenerate deluge.pot
2009-10-05 00:00:37 +00:00
2e6b21aa85 Add script to regenerate the POTFILES.in file
Update the POTFILES.in file
2009-10-04 23:48:18 +00:00
8a5ccbc2d4 Update setup.py 2009-10-04 23:19:34 +00:00
1553 changed files with 335268 additions and 212621 deletions

6
.gitattributes vendored
View File

@ -4,6 +4,12 @@ docs/build export-ignore
docs/source export-ignore
/tests export-ignore
deluge/scripts export-ignore
setup.cfg export-ignore
check_glade.sh export-ignore
createicons.sh export-ignore
create_potfiles_in.py export-ignore
gettextize.sh export-ignore
.gitattributes export-ignore
.gitmodules export-ignore
.gitignore export-ignore
*.py diff=python

3
.gitignore vendored
View File

@ -6,3 +6,6 @@ dist
*.log
*.pyc
*.tar.*
_trial_temp
deluge/i18n/*/
*.desktop

797
AUTHORS Normal file
View File

@ -0,0 +1,797 @@
Authors:
* Andrew Resch ('andar') <andrewresch@gmail.com>
* Damien Churchill ('damoxc') <damoxc@gmail.com>
Main Developers:
* Andrew Resch
* Damien Churchill
* John Garland ('johnnyg') <johnnybg+deluge@gmail.com>
* Calum Lind ('cas') <calumlind+deluge@gmail.com>
libtorrent (http://www.libtorrent.org):
* Arvid Norberg
Contributors (and Past Developers):
* Zach Tibbitts <zach@collegegeek.org>
* Alon Zakai ('Kripken') <kripkensteiner@gmail.com>
* Marcos Pinto ('markybob') <markybob@gmail.com>
* Alex Dedul
* Sadrul Habib Chowdhury
* Ido Abramovich <ido.deluge@gmail.com>
* Martijn Voncken <mvoncken@gmail.com>
* Mark Stahler ('kramed') <markstahler@gmail.com>
* Pedro Algarvio ('s0undt3ch') <ufs@ufsoft.org>
* Cristian Greco ('cgreco') <cristian@regolo.cc>
* Chase Sterling ('gazpachoKing') <chase.sterling@gmail.com>
Plugin Developers:
* Autoadd : Chase Sterling
* Blocklist : John Garland
* Execute : Damien Churchill
* Extractor : Andrew Resch
* Label : Martijn Voncken
* Notifications : Pedro Algarvio
* Scheduler : Andrew Resch
* Webui : Damien Churchill
Images Authors:
* files: deluge/data/pixmaps/*.svg, *.png
deluge/ui/web/icons/active.png, alert.png, all.png, checking.png, dht.png,
downloading.png, inactive.png, queued.png, seeding.png, traffic.png
exceptions: deluge/data/pixmaps/deluge.svg and derivatives
copyright: Andrew Resch
license: GPLv3
* files: deluge/data/pixmaps/deluge.svg and derivatives
deluge/ui/web/icons/apple-pre-*.png, deluge*.png
deluge/ui/web/images/deluge*.png
copyright: Andrew Wedderburn
license: GPLv3
* files: deluge/plugins/blocklist/blocklist/data/*.png
deluge/data/pixmaps/tracker_warning16.png, tracker_all16.png, lock48.png
copyright: Gnome Icon Theme
license: GPLv2
url: http://ftp.acc.umu.se/pub/GNOME/sources/gnome-icon-theme
* files: deluge/data/pixmaps/magnet.png
copyright: Woothemes
license: Freeware
icon pack: WP Woothemes Ultimate
url: http://www.woothemes.com/
* files: deluge/data/pixmaps/flags/*.png
copyright: Mark James <mjames@gmail.com>
license: Public Domain
url: http://famfamfam.com/lab/icons/flags/
* files: deluge/ui/web/icons/*.png
exceptions: apple-pre-*.png, active.png, alert.png, all.png, deluge.png, dht.png,
downloading.png, inactive.png, queued.png, seeding.png, traffic.png
copyright: Yusuke Kamiyamane <p@yusukekamiyamane.com>
license: Creative Commons Attribution 3.0 License
url: http://p.yusukekamiyamane.com/
* files: deluge/ui/web/images/spinner.gif, spinner-split.gif
copyright: Steven Chim
license: BSD license
url: http://members.upc.nl/j.chim/ext/spinner2/ext-spinner.html
Translation Contributors:
* files: deluge/i18n/*.po
Aaron Wang Shi
abbigss
ABCdatos
Abcx
Actam
Adam
adaminikisi
adi_oporanu
Adrian Goll
afby
Ahmades
Ahmad Farghal
Ahmad Gharbeia أحمد غربية
akira
Aki Sivula
Alan Pepelko
Alberto
Alberto Ferrer
alcatr4z
AlckO
Aleksej Korgenkov
Alessio Treglia
Alexander Ilyashov
Alexander Matveev
Alexander Saltykov
Alexander Taubenkorb
Alexander Telenga
Alexander Yurtsev
Alexandre Martani
Alexandre Rosenfeld
Alexandre Sapata Carbonell
Alexey Osipov
Alin Claudiu Radut
allah
AlSim
Alvaro Carrillanca P.
A.Matveev
Andras Hipsag
András Kárász
Andrea Ratto
Andreas Johansson
Andreas Str
André F. Oliveira
AndreiF
andrewh
Angel Guzman Maeso
Aníbal Deboni Neto
animarval
Antonio Cono
antoniojreyes
Anton Shestakov
Anton Yakutovich
antou
Arkadiusz Kalinowski
Artin
artir
Astur
Athanasios Lefteris
Athmane MOKRAOUI (ButterflyOfFire)
Augusta Carla Klug
Avoledo Marco
axaard
AxelRafn
Axezium
Ayont
b3rx
Bae Taegil
Bajusz Tamás
Balaam's Miracle
Ballestein
Bent Ole Fosse
berto89
bigx
Bjorn Inge Berg
blackbird
Blackeyed
blackmx
BlueSky
Blutheo
bmhm
bob00work
boenki
Bogdan Bădic-Spătariu
bonpu
Boone
boss01
Branislav Jovanović
bronze
brownie
Brus46
bumper
butely
BXCracer
c0nfidencal
Can Kaya
Carlos Alexandro Becker
cassianoleal
Cédric.h
César Rubén
chaoswizard
Chen Tao
chicha
Chien Cheng Wei
Christian Kopac
Christian Widell
Christoffer Brodd-Reijer
christooss
CityAceE
Clopy
Clusty
cnu
Commandant
Constantinos Koniaris
Coolmax
cosmix
Costin Chirvasuta
CoVaLiDiTy
cow_2001
Crispin Kirchner
crom
Cruster
Cybolic
Dan Bishop
Danek
Dani
Daniel Demarco
Daniel Ferreira
Daniel Frank
Daniel Holm
Daniel Høyer Iversen
Daniel Marynicz
Daniel Nylander
Daniel Patriche
Daniel Schildt
Daniil Sorokin
Dante Díaz
Daria Michalska
DarkenCZ
Darren
Daspah
David Eurenius
davidhjelm
David Machakhelidze
Dawid Dziurdzia
Daya Adianto
dcruz
Deady
Dereck Wonnacott
Devgru
Devid Antonio FiloniDevilDogTG
di0rz`
Dialecti Valsamou
Diego Medeiros
Dkzoffy
Dmitrij D. Czarkoff
Dmitriy Geels
Dmitry Olyenyov
Dominik Kozaczko
Dominik Lübben
doomster
Dorota Król
Doyen Philippe
Dread Knight
DreamSonic
duan
Duong Thanh An
DvoglavaZver
dwori
dylansmrjones
Ebuntor
Edgar Alejandro Jarquin Flores
Eetu
ekerazha
Elias Julkunen
elparia
Emberke
Emiliano Goday Caneda
EndelWar
eng.essam
enubuntu
ercangun
Erdal Ronahi
ergin üresin
Eric
Éric Lassauge
Erlend Finvåg
Errdil
ethan shalev
Evgeni Spasov
ezekielnin
Fabian Ordelmans
Fabio Mazanatti
Fábio Nogueira
FaCuZ
Felipe Lerena
Fernando Pereira
fjetland
Florian Schäfer
FoBoS
Folke
Force
fosk
fragarray
freddeg
Frédéric Perrin
Fredrik Kilegran
FreeAtMind
Fulvio Ciucci
Gabor Kelemen
Galatsanos Panagiotis
Gaussian
gdevitis
Georg Brzyk
George Dumitrescu
Georgi Arabadjiev
Georg Sieber
Gerd Radecke
Germán Heusdens
Gianni Vialetto
Gigih Aji Ibrahim
Giorgio Wicklein
Giovanni Rapagnani
Giuseppe
gl
glen
granjerox
Green Fish
greentea
Greyhound
G. U.
Guillaume BENOIT
Guillaume Pelletier
Gustavo Henrique Klug
gutocarvalho
Guybrush88
Hans Rødtang
HardDisk
Hargas Gábor
Heitor Thury Barreiros Barbosa
helios91940
helix84
Helton Rodrigues
Hendrik Luup
Henrique Ferreiro
Henry Goury-Laffont
Hezy Amiel
hidro
hoball
hokten
Holmsss
hristo.num
Hubert Życiński
Hyo
Iarwain
ibe
ibear
Id2ndR
Igor Zubarev
IKON (Ion)
imen
Ionuț Jula
Isabelle STEVANT
István Nyitrai
Ivan Petrovic
Ivan Prignano
IvaSerge
jackmc
Jacks0nxD
Jack Shen
Jacky Yeung
Jacques Stadler
Janek Thomaschewski
Jan Kaláb
Jan Niklas Hasse
Jasper Groenewegen
Javi Rodríguez
Jayasimha (ಜಯಸಿಂಹ)
jeannich
Jeff Bailes
Jesse Zilstorff
Joan Duran
João Santos
Joar Bagge
Joe Anderson
Joel Calado
Johan Linde
John Garland
Jojan
jollyr0ger
Jonas Bo Grimsgaard
Jonas Granqvist
Jonas Slivka
Jonathan Zeppettini
Jørgen
Jørgen Tellnes
josé
José Geraldo Gouvêa
José Iván León Islas
José Lou C.
Jose Sun
Jr.
Jukka Kauppinen
Julián Alarcón
julietgolf
Jusic
Justzupi
Kaarel
Kai Thomsen
Kalman Tarnay
Kamil Páral
Kane_F
kaotiks@gmail.com
Kateikyoushii
kaxhinaz
Kazuhiro NISHIYAMA
Kerberos
Keresztes Ákos
kevintyk
kiersie
Kimbo^
Kim Lübbe
kitzOgen
Kjetil Rydland
kluon
kmikz
Knedlyk
koleoptero
Kőrösi Krisztián
Kouta
Krakatos
Krešo Kunjas
kripken
Kristaps
Kristian Øllegaard
Kristoffer Egil Bonarjee
Krzysztof Janowski
Krzysztof Zawada
Larry Wei Liu
laughterwym
Laur Mõtus
lazka
leandrud
lê bình
Le Coz Florent
Leo
liorda
LKRaider
LoLo_SaG
Long Tran
Lorenz
Low Kian Seong
Luca Andrea Rossi
Luca Ferretti
Lucky LIX
Luis Gomes
Luis Reis
Łukasz Wyszyński
luojie-dune
maaark
Maciej Chojnacki
Maciej Meller
Mads Peter Rommedahl
Major Kong
Malaki
malde
Malte Lenz
Mantas Kriaučiūnas
Mara Sorella
Marcin
Marcin Falkiewicz
marcobra
Marco da Silva
Marco de Moulin
Marco Rodrigues
Marcos
Marcos Escalier
Marcos Pinto
Marcus Ekstrom
Marek Dębowski
Mário Buči
Mario Munda
Marius Andersen
Marius Hudea
Marius Mihai
Mariusz Cielecki
Mark Krapivner
marko-markovic
Markus Brummer
Markus Sutter
Martin
Martin Dybdal
Martin Iglesias
Martin Lettner
Martin Pihl
Masoud Kalali
mat02
Matej Urbančič
Mathias-K
Mathieu Arès
Mathieu D. (MatToufoutu)
Mathijs
Matrik
Matteo Renzulli
Matteo Settenvini
Matthew Gadd
Matthias Benkard
Matthias Mailänder
Mattias Ohlsson
Mauro de Carvalho
Max Molchanov
Me
MercuryCC
Mert Bozkurt
Mert Dirik
MFX
mhietar
mibtha
Michael Budde
Michael Kaliszka
Michalis Makaronides
Michał Tokarczyk
Miguel Pires da Rosa
Mihai Capotă
Miika Metsälä
Mikael Fernblad
Mike Sierra
mikhalek
Milan Prvulović
Milo Casagrande
Mindaugas
Miroslav Matejaš
misel
mithras
Mitja Pagon
M.Kitchen
Mohamed Magdy
moonkey
MrBlonde
muczy
Münir Ekinci
Mustafa Temizel
mvoncken
Mytonn
NagyMarton
neaion
Neil Lin
Nemo
Nerijus Arlauskas
Nicklas Larsson
Nicolaj Wyke
Nicola Piovesan
Nicolas Sabatier
Nicolas Velin
Nightfall
NiKoB
Nikolai M. Riabov
Niko_Thien
niska
Nithir
noisemonkey
nomemohes
nosense
null
Nuno Estêvão
Nuno Santos
nxxs
nyo
obo
Ojan
Olav Andreas Lindekleiv
oldbeggar
Olivier FAURAX
orphe
osantana
Osman Tosun
OssiR
otypoks
ounn
Oz123
Özgür BASKIN
Pablo Carmona A.
Pablo Ledesma
Pablo Navarro Castillo
Paco Molinero
Pål-Eivind Johnsen
pano
Paolo Naldini
Paracelsus
Patryk13_03
Patryk Skorupa
PattogoTehen
Paul Lange
Pavcio
Paweł Wysocki
Pedro Brites Moita
Pedro Clemente Pereira Neto
Pekka "PEXI" Niemistö
Penegal
Penzo
perdido
Peter Kotrcka
Peter Skov
Peter Van den Bosch
Petter Eklund
Petter Viklund
phatsphere
Phenomen
Philipi
Philippides Homer
phoenix
pidi
Pierre Quillery
Pierre Rudloff
Pierre Slamich
Pietrao
Piotr Strębski
Piotr Wicijowski
Pittmann Tamás
Playmolas
Prescott
Prescott_SK
pronull
Przemysław Kulczycki
Pumy
pushpika
PY
qubicllj
r21vo
Rafał Barański
rainofchaos
Rajbir
ras0ir
Rat
rd1381
Renato
Rene Hennig
Rene Pärts
Ricardo Duarte
Richard
Robert Hrovat
Roberth Sjonøy
Robert Lundmark
Robin Jakobsson
Robin Kåveland
Rodrigo Donado
Roel Groeneveld
rohmaru
Rolf Christensen
Rolf Leggewie
Roni Kantis
Ronmi
Rostislav Raykov
royto
RuiAmaro
Rui Araújo
Rui Moura
Rune Svendsen
Rusna
Rytis
Sabirov Mikhail
salseeg
Sami Koskinen
Samir van de Sand
Samuel Arroyo Acuña
Samuel R. C. Vale
Sanel
Santi
Santi Martínez Cantelli
Sardan
Sargate Kanogan
Sarmad Jari
Saša Bodiroža
sat0shi
Saulius Pranckevičius
Savvas Radevic
Sebastian Krauß
Sebastián Porta
Sedir
Sefa Denizoğlu
sekolands
Selim Suerkan
semsomi
Sergii Golovatiuk
setarcos
Sheki
Shironeko
Shlomil
silfiriel
Simone Tolotti
Simone Vendemia
sirkubador
Sławomir Więch
slip
slyon
smoke
Sonja
spectral
spin_555
spitf1r3
Spiziuz
Spyros Theodoritsis
SqUe
Squigly
srtck
Stefan Horning
Stefano Maggiolo
Stefano Roberto Soleti
steinberger
Stéphane Travostino
Stephan Klein
Steven De Winter
Stevie
Stian24
stylius
Sukarn Maini
Sunjae Park
Susana Pereira
szymon siglowy
takercena
TAS
Taygeto
temy4
texxxxxx
thamood
Thanos Chatziathanassiou
Tharawut Paripaiboon
Theodoor
Théophane Anestis
Thor Marius K. Høgås
Tiago Silva
Tiago Sousa
Tikkel
tim__b
Tim Bordemann
Tim Fuchs
Tim Kornhammar
Timo
Timo Jyrinki
Timothy Babych
TitkosRejtozo
Tom
Tomas Gustavsson
Tomas Valentukevičius
Tomasz Dominikowski
Tomislav Plavčić
Tom Mannerhagen
Tommy Mikkelsen
Tom Verdaat
Tony Manco
Tor Erling H. Opsahl
Toudi
tqm_z
Trapanator
Tribaal
Triton
TuniX12
Tuomo Sipola
turbojugend_gr
Turtle.net
twilight
tymmej
Ulrik
Umarzuki Mochlis
unikob
Vadim Gusev
Vagi
Valentin Bora
Valmantas Palikša
VASKITTU
Vassilis Skoullis
vetal17
vicedo
viki
villads hamann
Vincent Garibal
Vincent Ortalda
vinchi007
Vinícius de Figueiredo Silva
Vinzenz Vietzke
virtoo
virtual_spirit
Vitor Caike
Vitor Lamas Gatti
Vladimir Lazic
Vladimir Sharshov
Wanderlust
Wander Nauta
Ward De Ridder
WebCrusader
webdr
Wentao Tang
wilana
Wilfredo Ernesto Guerrero Campos
Wim Champagne
World Sucks
Xabi Ezpeleta
Xavi de Moner
XavierToo
XChesser
Xiaodong Xu
xyb
Yaron
Yasen Pramatarov
YesPoX
Yuren Ju
Yves MATHIEU
zekopeko
zhuqin
Zissan
Γιάννης Κατσαμπίρης
Артём Попов
Миша
Шаймарданов Максим
蔡查理

615
ChangeLog
View File

@ -1,229 +1,298 @@
=== Deluge 1.2.3 (27 March 2010) ===
=== Deluge 1.3.5 (09 April 2012) ===
==== Core ====
* Fix libtorrent version compare to use a proper numerical compare instead
of string. This fixes a problem where using lt 0.14.10 wouldn't allow
Deluge to start.
* Fix libtorrent 0.15 compatibility
* Fix hang on quit
=== Deluge 1.2.2 (19 March 2010) ===
==== Core ====
* Fix #1109 auto add halting when a torrent with invalid filename encoding
is in the directory
* Fix not properly detecting when torrent is at end of queue
* #2049: Preserve order when moving multiple torrents in the queue
==== GtkUI ====
* Fix #1162 problem with the queued torrents dialog from not properly adding
to the add torrent dialog if set to auto add
* Fix #1172 notify startup complete when adding torrents externally
* Fix issue where the gtkui sometimes won't start if there is a stale lock
file or socket in the ipc/ directory.
* Modified fix for #1957, keyerror with non-acsii columns
* Fix translation of items in Sidebar and Torrent Menu
* #2052: Fix translation of Progress bar text
* #2071: Fix KeyError in gtkui when file priority set to value '3'
* #2064: Fix files treeview height in Create Dialog
* Fix missing semi-colon in deluge.desktop
* Disable setting file priorities for seeding torrents
* Bring MainWindow to front when opening another instance
==== Console ====
* Fix #1143 deluge-console crashes when tab-completing not-existent directory
=== Deluge 1.2.1 (20 February 2010) ===
==== Core ====
* Make Deluge dependent upon libtorrent 0.14.9 or greater. This is due to
an over-downloading bug in previous versions of libtorrent.
==== GtkUI ====
* Fix #1128 Show an error dialog when unable to start a 'deluged' process
* Increased max enterable download / upload limit to 60000 KiB/s
==== Console ====
* Fix hanging when using commands from the command-line
==== Web ====
* Fix #1147: Cannot upload a torrent in a multi-user system via the web interface
* Fix #1148: Unable to save execute command in execute plugin
=== Deluge 1.2.0 - "Bursting like an infected kidney" (10 January 2010) ===
==== Core ====
* Fix file renaming
* Fix tracker host filtering (Closes #1106)
* Fix exceptions when gettext/locale cannot be initialized properly
* Change share ratio calculation to use the total done instead of the all time
downloaded value. This change will make the share ratio calculation not
use data downloaded in failed hash checks.
* Fix torrent info name not being utf-8 decoded when root file/folder name
is blank
==== GtkUI ====
* Fix #1104, #735 use path.utf-8 if available
* Fix #1114 test active port not working in classic mode
==== Console ====
* Fix #1115 not showing usage for the 'debug' command
* Fix #1116 not being able to use command aliases when not connected to a daemon
* Fix #1117 can't use the '3' key
==== Windows ====
* Fix displaying folders in the add torrent dialog
* Fix displaying the new release dialog
==== Blocklist ====
* Fix blocklist status icon not opening the blocklist preference
page in certain locales
* Fix blocklist not recognising comments that begin with whitespace
* Minor speedup in parsing blocklists
* Blocklist now attempts to download the URL multiple times before giving
up
* Fix blocklist not being able to open zipped blocklists with python 2.5
==== Web ====
* Put the default password in the manpage.
=== Deluge 1.2.0_rc5 (17 December 2009) ===
==== Web ====
* Swap order of buttons in Remove window (Closes #1083)
* Change the compressed js script to deluge-all.js to avoid naming
conflicts on case-sensitive filesystems.
* Apply patch from adios fixing the cookie date
* Add tooltips to the statusbar items
* Add disk usage to the statusbar
* Add a ToggleField widget and use this on the Downloads preferences
page allowing the movecom/copytorrent/autoadd boxes to be enabled.
* Fix enabling plugins.
* Implement installing plugins.
* Update some icons
* Fixed #1075 (changing priority on a whole folder doesn't work)
==== GtkUI ====
* Attempt to register as the default magnet uri handler in GNOME on startup
* Properly show 100.00% and reduce number of progress bar updates during a
torrent creation
* Fix crash in Windows when creating a torrent
* Add button to Other preferences to associate magnet links with Deluge
* Fix uploading plugins when the daemon is not localhost
* Fix #692 no longer require tray password when quitting from the tray icon
while the window is visible.
* Fix #782 do not ask for tray password when window is not minimized to tray
* Fix #1036 autoconnecting to localhost daemon on start-up
* Fix issue where hosts will show up erroneously as Offline
* Add #891 remove torrents by pressing the Delete key
* Fix issue where stoping a daemon that you aren't connected to causes the
gtkui to shutdown the currently connected daemon.
* Fix #594 tray password dialog freeze in Windows
* Made the password dialog prettier
* Fix #1086 deprecated gtk.Tooltips usage
* Fix #768 save tracker list for create torrent dialog
* Fix #1095 incorrect piece size used when using some non-English languages
==== Console ====
* Fix using the console in Windows, but only in command-line mode
* Fix #823 setting config values to -1.0
==== WebUI ====
* #2050: Fix 'Up Speed' column not sorting
* Hide unused Infohash button in WebUI
==== Label ====
* Fix #1085 only use ints for specific options to prevent unhandled exception
* Disable unusable items for 'All' in sidebar menu
* Fix items for translation
=== Console ====
* Fix prefixed space for tab completing commands
* Fix missing trailing space for command options with tab complete
=== Blocklist ====
* Use (documented) formatdate over format_date_time
=== Deluge 1.3.4 (03 March 2012) ===
==== Core ====
* #1921: Free disk space reporting incorrectly in FreeBSD
* #1964: Fix unhandled UnpicklingErrors
* #1967: Fix unhandled IndexError when trying to open a non-json conf file
* Fix setting daemon listen interface from command line
* #2021: Fix share ratio limit not obeyed for seeded torrents added to session
* Add optparse custom version to prevent unnecessary loading of libtorrent
* #1554: Fix seeding on share ratio failing for partially selected torrents
* Add proper process title naming in ps, top etc. (Depends: setproctitle)
==== GtkUI ====
* #1918: Fix Drag'n'Drop not working in Windows
* #1941: Increase maximum Cache Size to 999999 (15GiB)
* #1940: File & folder renaming issue when using Add Torrent dialog in Windows
* LP#821577: Fix UnpicklingError when external selection dragged onto Files Tab
* #1934: Fix Unicode error in AddTorrent Dialog
* #1957: Fix keyerror when adding columns for non-latin languages
* #1969: Fix menu item 'Quit & Shutdown' still available when not connected to daemon
* #1895: Fix Files Tab showing wrong files due to torrent_info race condition
* #2010: Move speed text in titlebar to the beginning
* #2032: Wait for client to shutdown/disconnect before stopping reactor
* Fix compatibility with Python 2.5
* Fix collapsed treeview in Create Torrent dialog
* Ignore unmaximise event when window isn't visible
* #1976: Fixed text entry with trailing newline characters causing issues for Move Storage
==== WebUI ====
* Fix Webui files-tab menu setting wrong priority
* Update to ExtJS 3.4.0
* #1960: Fix statustab showing total_payload_download for upload as well
* Remove uneeded Titlebar to save space
* Fix clipped Browse button in WebUI
* #1915: Fix being unable to stop the status bar from autohiding
* Fix password box focus issue in Firefox
* Fix plugin uploads from behind a reverse proxy
* #2010: Move speed text in titlebar to the beginning
* #1936: Fix Referenced before assignment error in json_api
* Changes are now applied when clicking OK in Preferences
* Added Download,Uploaded,Down Limit, Up Limit & Seeder/Peeds columns
* Add magnet uri support to Add Url
* Add keymaps for torrents - Ctrl-A (select all) and Delete
* #2037: Fix 'Add Torrents' torrents list not scrolling
* #2038: Fix Chrome 17 disconnecting from webui
==== Console ====
* #1953: Fix flickering on every update
* #1954: Fix 'invalid literal for float' when setting listen interface
* #1945: Fix UnicodeDecodeError when using non-ascii chars in info
==== Label ====
* #1961: Add missing 'All' filter option
* #2035: Fix label options dialog in webui
* #2036: Fix newly added labels not being sorted in torrent right click menu
==== Notification ====
* #1905: Fix no email sent to second email address
* #1898: Fix email notifications not including date/time they were sent
==== Scheduler ====
* Add plugin page for WebUi
==== Execute ====
* Use the move_completed path if it is different to the save path
in the completed event.
* Commands now run scripts asynchronous to prevent Deluge from hanging
==== AutoAdd ====
* Added watch folder support for '.magnet' text file containing single or multiple magnet uris
* Fix glade object issue when re-enabling plugin in same session
* Fix plugin not showing as enabled in webui
=== Deluge 1.3.3 (22 July 2011) ===
==== Core ====
* Fix the upload_plugin rpc method (was still using XML-RPC stuff)
* Fix possible exception when upgrading from a 0.5 state file
* Use metavar to modify the help output by optparse.
* Partial fix for #1103 if the per-torrent option for stopping at a ratio has
been unchecked, then do not stop it at the global setting.
* Properly show the 'Checking Resume Data' state instead of just 7
* #1788: Added ability to use XDG_DOWNLOAD_DIR as default download folder
* Fix path error with torrent files prefixed with 'file://' from Firefox
* #1869: Fix setting the disk io read/write to bypass OS cache in Windows
* #1504: Fix win32 running deluged as not logged in user via runas or service
* #890: If added torrent already exists, append extra trackers to it
* #1338: Fix Seeds and Peers totals not updating
* #1239: Fix translated Tracker Error text not counted in sidebar Error status
* Fix httpdownloader error with existing filename
* #1505: Add libtorrent info to version output
* #1637 Fix UnicodeDecodeError from 'deluge-* --help' with non-english languages
* #1714 Fix handling of backslashes when renaming files/folders
==== GtkUI ====
* Show the checking icon for torrents in the 'Checking Resume Data' state
* #1195: Fix right-click selecting issue when switching between folders and files
* Add F2 key shortcut for renaming filenames in the Files Tab
* Increase max piece size to 16 MiB in create torrent dialog
* #1475: Fix save and restore Preferences dialog size from config
* Add search as you type to the torrent view
* #1456: Fix no ETA showing with multiple files
* #1560: Fix FilesTab Progress value sorting by int instead of float
* #1263: Fix not remembering column widths
* #948: New Release Dialog now shows the server version
* Fix peers in PeersTab showing non-zero download rate when seeding
==== AutoAdd ====
* #1861: Fix AutoAdd Warning (column number is a boolean)
==== Label ====
* #1246: Fix losing Labels upon restart
==== Execute ====
* #1477: Fix ignore Added events from state file on startup
==== ConsoleUI ====
* #1258: Add support for urls and magnet uris in add command
* #1801: Fix unhandled defered error and missing error message upon failed connect
=== Deluge 1.3.2 (24 May 2011) ===
==== Core ====
* #1527: Fix Converting unicode to unicode error in move_storage
* #1373: Fix creating and moving non-ascii folder names in MS Windows
* #1507: Fix temporary file race condition in core/core.py:add_torrent_url
* Fix a bug that can occur when upgrading 1.1 config files
* #1517: Fix isohunt urls not loading
* Handle redirection when adding a torrent by url
* #1614: Fix autoadd matching a directory called "torrent"
* #1742: Fix failure in Event handler prevents further emissions
==== GtkUI ====
* #1514: Added Indicator Applet
* #1494: Add torrent columns Downloaded and Uploaded
* #1308: Add torrent column Seeds/Peers ratio
* #1646: Add torrent columns for per torrent upload and download speed limits
* Add missing icons for Trackers filter
* Fix inconsistancies in the text for translation
* #1510: Fix cannot create a torrent with only non-zero tier trackers
* #1513: Fix unhandled Twisted Error in test_listen_port
* #690: Fix renaming folders does not remove old empty folders
* #1336: Fix uneeded horizontal scrollbar showing in Files & Peers Tab
* #1508: Fix TypeError in cell_data_queue() could not convert argument to correct param type
* #1498: Fix double slashes appearing when renaming
* #1283: Fix consistent icons for Files tab
* #1282: Text for AutoManaged changed to 'On/Off' and localized
* Fix Up/Down buttons in Edit Trackers Dialog
* Add Key Shortcuts for main menu functions
==== WebUI ====
* #1194: Fix infinite login prompt in web ui through reverse proxy
* #1355: Fix slow changing states in webUI
* #1536: Fix Edit Trackers window not scrolling and not being resizable
* #1799: Fix Missing textbox for "Move completed" in torrent options
* #1562: Fix Javascript error in Web UI when re-opening preferences
* #1567: Fix js from plugins does not work with different 'base' setting
* #1268: Fix torrent errors not displayed in webui
* #1323: Fix filter panels not scrollable
* Fix file uploads from behind a reverse proxy.
* #1333: Fix peer list doesn't update automatically
* #1537: Fix editing trackers list, trackers have to be reselected
==== ConsoleUI ====
* #755: Fix can't set listen_ports through console UI
* #1500: Fix Console crashes on command longer than terminal width
* #1248: Fix deluge-console unicode support on redirected stdout
* Fix for deluge-console not adding torrent files on MS Windows
* #1450: Fix trailing white space in paths
* Misc: Updated help text for deluge-console on MS Windows
* #1484: Fix trying to access the screen object when not using interactive mode
* #1548: Fix cli argument processing
* #1856: Add --sort option to info command
* #1857: Add seeding_time, active_time and tracker_status to info command
==== Scheduler ====
* #1506: Fix max speed not restored on a yellow->green transition
=== Deluge 1.3.1 (31 October 2010) ===
==== Core ====
* #1369: Fix non-ascii config folders not working in windows
==== GtkUI ====
* #1365: Fix sidebar not updating show/hide trackers
* #1247: Fix hang on quit
==== WebUI ====
* #1364: Fix preferences not saving when the web ui plugin is enabled in classic mode
* #1377: Fix bug when enabling plugins
* #1370: Fix issues with preferences
* #1312: Fix deluge-web using 100% CPU
=== Deluge 1.3.0 (18 September 2010) ===
==== Core ====
* Fix issue where the save_timer is cancelled when it's not active
* Fix unhandled exception when adding a torrent to the session
* Moved xdg import so it is not called on Windows, where it is unused. fixes #1343
* Fix key error after enabling a plugin that introduces a new status key
* Ignore global stop ratio related settings in logic, so per torrent ones are used.
* Ensure preferencesmanager only changes intended libtorrent session settings.
* Fix issue when adding torrents without a 'session'. This can happen when a plugin adds a torrent, like how the AutoAdd plugin works. The user that adds this torrent will be an empty string.
* Add TorrentFileCompleted event
==== GtkUI ====
* Increase max piece size to 8 MiB in create torrent dialog (closes #1358)
==== Scheduler ====
* Add max active downloading and seeding options to scheduler.
* Fix scheduler so that it keeps current state, even after global settings change.
==== AutoAdd ====
* AutoAdd plugin can now recover when one of the watchfolders has an unhandled exception.
* Fix bug in AutoAdd plugin where watchdirs would not display in gtkui when first enabled.
* Fix bugs with unicode torrents in AutoAdd plugin.
=== Deluge 1.3.0-rc2 (20 August 2010) ===
==== Core ====
* Fix tracker_icons failing on windows
* Fix #1302 an uncaught exception in an state_changed event handler in SessionProxy was preventing the TorrentManager's stop method from properly saving all the resume data
* Fix issue with SessionProxy not updating the torrent status correctly when get_torrent_status calls take place within the cache_expiry time
==== ConsoleUI ====
* #1307: Fix not being able to add torrents
* #1293: Fix not being able to add paths that contain backslashes
==== GtkUI ====
* Fix uncaught exception when closing deluge in classic mode
==== Execute ====
* #1306: Fix always executing last event
==== Label ====
* Fix being able to remove labels in web ui
==== WebUI ====
* #1319: Fix shift selecting in file trees
=== Deluge 1.3.0-rc1 (08 May 2010) ===
==== Core ====
* Implement #1063 option to delete torrent file copy on torrent removal - patch from Ghent
* Implement #457 progress bars for folders
* Implement #1012 httpdownloader supports gzip decoding
* #496: Remove deprecated functions in favour of get_session_status()
* #1112: Fix renaming files in add torrent dialog
* #1247: Fix deluge-gtk from hanging on shutdown
* #995: Rewrote tracker_icons
* Add AutoAdd plugin
* Add Notifications plugin
==== GtkUI ====
* Use new SessionProxy class for caching torrent status client-side
* Use torrent status diffs to reduce RPC traffic
==== Blocklist ====
* Fix blocklist not working for all locales
* Fix blocklist checking for updates when it shouldn't
* Implement local blocklist support
* #861: Pause transfers until blocklist is imported
* Fix redirection not working with relative paths
=== Deluge 1.2.0_rc4 (24 November 2009) ===
==== Core ====
* Fix deleting old .fastresume files with fresh configs
* Fix files list when using magnet uris
* Fix loading the saved metadata when loading state with magnet uris
==== Execute ====
* Fix running commands with the TorrentAdded event
* Fix the web interface
==== GtkUI ====
* Fix showing the 'Other' speed dialogs in Windows
* Fix adding torrents from the Queued Torrents dialog
* Fix disabling/enabling plugins after switching daemons
* Reduce height of Add Torrent Dialog by ~80 pixels
* Fix #1071 issue where Deluge will fail to start if there is a stale ipc lockfile
* Fix autoconnecting to the next host in the list if the selected one isn't available
* Fix endless loop when trying to autoconnect to an offline daemon
* Fix exception on startup when the system tray icon is not enabled
* Fix issue where some torrents with special characters could not be added
* Fix issues adding magnet uris
==== Label ====
* Fix the web interface (#733)
==== Web ====
* Fix installing the deluge-web manpage
* Escape hyphens in the manpage
* Migrate to ExtJS 3.1
* Add gzip compression of HTTP data to the server
* Improve the efficiency of the TorrentGrid with lots of torrents (#1026)
* Add a base parameter to allow reverse proxying (#1076)
* Fix showing all the peers in the details tab (#1054)
* Fix uploading torrent files in Opera or IE (#1087)
* Complete IE support
==== Console ====
* Escape hyphens in the manpage
* Make the delete key work
* Allow ~ to be used in the path in the add command
* Allow commands that are .pyc files to be used
* Fix printing info, help, etc.. on the command line
==== Blocklist ====
* Force blocklist to auto-detect format when a download / import is forced
* Fix blocklist failing on certain PeerGuardian/SafePeer lists
=== Deluge 1.2.0_rc3 (01 November 2009) ===
==== Core ====
* Fix #1047 move completed does not work if saving to non default path
* Fix renamed files not being utf-8 encoded
* Fix torrent name being blank when renaming root folder to /
* Do not include an 'announce-list' key in torrents when there is only one tracker
==== GtkUI ====
* Replace & with &amp; in the details tab to ensure there are no markup errors
* Consider 0 unlimited when displaying limits in the statusbar
* Fix adding torrents when not showing the add torrent dialog in Windows
* Fix crash when removing multiple torrents
==== Web ====
* Fix #1046 changing auto managed via the details tab
* Fix setting torrent options when adding
* Fix setting file priorities when adding
* HTML escape the field values on the details tab
* Fix #215, make infinite eta values display in the correct order
* Fix displaying the protocol upload speed
* Fix #990, showing 0 as a limit when it means unlimited in the statusbar
==== Console ====
* Fix displaying non-ascii strings
* Fix #1052 crash when issuing commands while not connected to a daemon
* Fix crash when string length makes line longer than terminal width
* Improve 'info' command draw speed
=== Deluge 1.2.0_rc2 (25 October 2009) ===
==== GtkUI ====
* Fix path errors when adding torrents externally in Windows
* Fix localclient authentication by stripping the lines read from the auth file
* Do not try to call doIteration() on the reactor if it has already stopped
* Fix 'autostart localhost if needed' option
* Fix starting plugins when the pluginmanager is started
* Fix #799 translate connection status
* Fix #215 ETA sort order
==== Core ====
* Fix saving torrent state on fresh configs
==== Web ====
* Fix changing of the allocation in the preferences.
* Fix updating the Connection Manager when a host is added.
* Add a `--fork` option to allow forking the webui to the background
* Fix the statusbar menu limits
* Fix setting the torrent options via the options tab
* Fix the private flag in the options tab
==== Console ====
* Fix exception when using the 'halt' command
==== Misc ====
* Add man pages for deluge-console, deluge-gtk and deluge-web
==== Extractor ====
* Fix issue where the plugin would not stop extracting files after being disabled
* Add option to create torrent name sub-folders in extract folder
=== Deluge 1.2.0_rc1 (07 October 2009) ===
=== Deluge 1.2.0 - "Bursting like an infected kidney" (10 January 2010) ===
==== Core ====
* Implement new RPC protocol DelugeRPC replacing XMLRPC
* Move to a twisted framework
@ -261,134 +330,6 @@
* Add new scripts for invoking UIs: deluge-gtk, deluge-web, deluge-console
* Remove GeoIP database from the source tree
=== Deluge 1.1.9 - (15 June 2009) ===
==== Core ====
* Only move a torrent due to 'move on complete' when some data has been downloaded
* Update libtorrent for CVE-2009-1760
==== GtkUI ====
* Fix #950 renaming a parent folder into multiple folders
==== WebUI ====
* Fix remote torrent add
=== Deluge 1.1.8 - (21 May 2009) ===
==== Core ====
* Fix pause all/resume all
* Torrent name is now changed when the root folder or file is renamed
==== GtkUI ====
* Fix high cpu usage when displaying speeds in titlebar
* Fix showing non-utf8 encoded torrents in add torrent dialog -- this adds
an additional dependency on chardet.
* Fix exception when timing out trying to send notification email
* Set some sane defaults for peers/file tabs column widths
==== WebUI ====
* Fix starting when -l option is used
=== Deluge 1.1.7 - (25 April 2009) ===
==== Core ====
* Fix issue where cannot resume torrent after doing a 'Pause All'
* Add workaround for 'address_v4 from unsigned long' bug experienced by users
with 64-bit machines. This bug is fixed in libtorrent 0.14.3.
==== GtkUI ====
* Fix #883 segfault if locale is not using UTF-8 encoding
* Fix for adding torrents with invalid filename encodings
* Fix displaying IPv6 peers in the Peers tab
* Fix starting the daemon in OS X
* Fix loading improperly created torrents with mismatched encodings
* Fix displaying improper progress when creating torrent
==== Windows ====
* Fix freezing in create torrent dialog
* Fix creating torrents in Windows
* Fix free space check
=== Deluge 1.1.6 - (06 April 2009) ===
==== Core ====
* Fix udp trackers being classified as DHT source
* Fix #855 force a resume on a torrent if a 'Force Recheck' is initiated
* Fix #862 deluged crash when access http://localhost:58846
==== GtkUI ====
* Fix displaying torrents with non-utf8 encodings in add torrent dialog
==== WebUI ====
* Fix #870 use proper config location for loading ssl cert
==== Misc ====
* Add OpenSSL exception to license
=== Deluge 1.1.5 - (16 March 2009) ===
==== Core ====
* Fix config file saving when no current config file exists
==== GtkUI ====
* Add 'Comments' field to the Details tab
* Fix #841 maximum upload slots tooltip
=== Deluge 1.1.4 - (08 March 2009) ===
==== Core ====
* Fix displaying file errors when the torrent isn't paused
* Fix issue where torrents being check would get removed due to "stop at ratio" rules
* Fix #790 tracker hosts not correct for some .uk trackers
* Make sure config files, resume data and state are fsync'd when saved. This should help prevent data losses on crashes/improper shutdowns.
==== GtkUI ====
* Fix hiding bottom pane when no tabs are enabled upon restart
* Fix saving file priorities when switching torrents in the addtorrentdialog
* Fix the allocate mode not being preserved when selecting different torrents in addtorrentdialog
* Fix #655 issue where default torrent options wouldn't be set for new torrents added to the addtorrentdialog
* Fix #817 email notifications fail to substitute format strings
==== Plugins ====
* Label: Fix setting 'Move on completed' folder when connected to a remote daemon
=== Deluge 1.1.3 - (15 February 2009) ===
==== Core ====
* Fix issue where checking queue would stop
* Fix announcing to SSL trackers
==== Misc ====
* Fix issue when initializing gettext that would prevent deluge from starting
* Fix logging exceptions when starting the daemon
* Fix displaying errors when a torrent is Checking
* Fix #790 tracker hosts not correct for some 3rd-level domain names
=== Deluge 1.1.2 - (31 January 2009) ===
==== Core ====
* Fix issue where torrents get stuck Checking
==== GtkUI ====
* Fix #761 use proper theme colours in sidebar
* Fix saving files/peers tab state when no column is sorted
=== Deluge 1.1.1 - (24 January 2009) ===
==== Core ====
* Fix oldstateupgrader for those upgrading from 0.5.x
* Fix setting Peer TOS byte
* Fix setting outgoing ports
==== GtkUI ====
* Fix opening links from Help menu and others
* Fix remembering sorted column in the torrent list
* Fix saving Files tab and Peers tab state
* Disable popup notification in preferences on Windows
* Fix crashing in Add Torrent Dialog when removing torrents from the list
* Do not allow duplicate torrents in the Add Torrent Dialog
* Fix translating speed units in status tab when a per-torrent limit is set
* Fix torrents not displaying properly after disconnecting and reconnecting to the daemon
* Fix when sorting # column, downloads should be on top
==== Misc ====
* Fix bdecoding some torrent files
* Fix the -l, --logfile option
* Fix #729 tracker icons not being saved in the correct location
* Add support for more tracker icons
* Fix being able to connect to a local daemon from another user account
=== Deluge 1.1.0 - "Time gas!" (10 January 2009) ===
==== Core ====
* Implement #79 ability to change outgoing port range

14
DEPENDS
View File

@ -6,12 +6,18 @@
* simplejson (if python < 2.6)
* setuptools
* gettext
* intltool
* pyxdg
* geoip-database (optional)
* libtorrent >= 0.14.9
=== UIs ===
* chardet
* geoip-database (optional)
* setproctitle (optional)
* libtorrent >= 0.14, or build the included version
* If building included libtorrent::
* boost >= 1.34.1
* openssl
* zlib
=== Gtk ===
* python-notify (libnotify python wrapper)

12
MANIFEST.in Normal file
View File

@ -0,0 +1,12 @@
recursive-include docs/man *
recursive-include deluge *
recursive-include win32 *
recursive-exclude deluge *.egg-link
exclude deluge/ui/web/gen_gettext.py
exclude deluge/ui/web/css/*-debug.css
exclude deluge/ui/web/js/build.sh
exclude deluge/ui/web/js/Deluge*.js
exclude deluge/ui/web/js/*-debug.js
prune deluge/ui/web/docs
prune deluge/scripts

71
README
View File

@ -1,4 +1,3 @@
==========================
Deluge BitTorrent Client
==========================
@ -9,86 +8,50 @@ Authors:
Andrew Resch
Damien Churchill
For past developers and contributers see: http://dev.deluge-torrent.org/wiki/About
==========================
License
==========================
Deluge is under the GNU GPLv3 license.
Icon data/pixmaps/deluge.svg and derivatives in data/icons are copyright
Andrew Wedderburn and are under the GNU GPLv3.
All other icons in data/pixmaps are copyright Andrew Resch and are under
the GNU GPLv3.
==========================
Contact/Support:
==========================
We have two options available for support:
Our Forum, at: http://forum.deluge-torrent.org
or
Our IRC Channel, at #deluge on Freenode: http://freenode.net
For contributors and past developers see:
AUTHORS
==========================
Installation Instructions:
==========================
For more detailed instructions see: http://dev.deluge-torrent.org/wiki/Installing/Source
For detailed instructions see: http://dev.deluge-torrent.org/wiki/Installing/Source
See: DEPENDS for a full list of dependencies.
Ensure build dependencies are installed, see DEPENDS for a full listing.
First, make sure you have the proper build dependencies installed. On a normal
Debian or Ubuntu system:
Build and install by running:
sudo apt-get install g++ make python-all-dev python-all python-dbus \
python-gtk2 python-notify librsvg2-common python-xdg python-support \
subversion libboost-dev libboost-python-dev \
libboost-thread-dev libboost-date-time-dev libboost-filesystem-dev \
libssl-dev zlib1g-dev python-setuptools \
python-mako python-twisted-web python-chardet python-simplejson
$ python setup.py build
$ sudo python setup.py install
The names of the packages may vary depending on your OS / distro.
==========================
Contact/Support:
==========================
Once you have the needed libraries installed, build and install by running:
$ python setup.py build
$ sudo python setup.py install
Forum: http://forum.deluge-torrent.org
IRC Channel: #deluge on irc.freenode.net
==========================
FAQ
==========================
For the full FAQ see: http://dev.deluge-torrent.org/wiki/Faq
How to start the various user-interfaces
Gtk:
deluge-gtk
deluge or deluge-gtk
Console:
deluge-console
Web:
deluge-web
Go to http://localhost:8112/ default-password = "deluge"
Why is deluge still listed in my system tray even after I close it ?
You closed the gtk user-interface but you did not close the daemon. Choose "Quit & Shutdown Daemon" to close both Daemon and gtk-ui.
How do I start the daemon?
deluged
How do I start the daemon with logging to console?
deluged -d -L <log level>
I can't connect to the daemon from another machine
* Configure the daemon to allow remote connections
* Add a user to the auth file located in the config folder: ~/.config/deluge/auth
* Restart the daemon.
See: http://dev.deluge-torrent.org/wiki/UserGuide/ThinClient
I upgraded from 0.5 and plugin x is missing
1.0 is a rewrite, all old 0.5 plugins have to be rewritten.
For the full FAQ see: http://dev.deluge-torrent.org/wiki/Faq

21
check_glade.sh Executable file
View File

@ -0,0 +1,21 @@
#!/bin/sh
# Fixes glade files which may have set gtk stock labels set to translatable
for x in `find . -name '*.glade' |grep -v '.git\|build'` ; do \
for y in gtk-add gtk-apply gtk-bold gtk-cancel gtk-cdrom gtk-clear \
gtk-close gtk-color-picker gtk-connect gtk-convert gtk-copy gtk-cut \
gtk-delete gtk-dialog-error gtk-dialog-info gtk-dialog-question \
gtk-dialog-warning gtk-dnd gtk-dnd-multiple gtk-edit gtk-execute gtk-find \
gtk-find-and-replace gtk-floppy gtk-goto-bottom gtk-goto-first \
gtk-goto-last gtk-goto-top gtk-go-back gtk-go-down gtk-go-forward \
gtk-go-up gtk-help gtk-home gtk-index gtk-italic gtk-jump-to \
gtk-justify-center gtk-justify-fill gtk-justify-left gtk-missing-image \
gtk-new gtk-no gtk-ok gtk-open gtk-paste gtk-preferences gtk-print \
gtk-print-preview gtk-properties gtk-quit gtk-redo gtk-refresh \
gtk-remove gtk-revert-to-saved gtk-save gtk-save-as gtk-select-color \
gtk-select-font gtk-sort-descending gtk-spell-check gtk-stop \
gtk-strikethrough gtk-undelete gtk-underline gtk-undo gtk-yes \
gtk-zoom-100 gtk-zoom-fit gtk-zoom-in gtk-zoom-out; do \
sed -i "s/<property\ name\=\"label\"\ translatable\=\"yes\">$y<\/property>/<property\ name\=\"label\"\ translatable\=\"no\">$y<\/property>/g" $x; \
done;\
done

17
create_potfiles_in.py Normal file → Executable file
View File

@ -1,17 +1,26 @@
#!/usr/bin/env python
import os
import re
import sys
# Paths to exclude
EXCLUSIONS = [
"deluge/scripts"
"deluge/scripts",
"deluge/i18n",
]
POTFILE_IN = "deluge/i18n/POTFILES.in"
print "Creating " + POTFILE_IN + " .."
pattern = "deluge\/plugins\/.*\/build"
compiled = re.compile(pattern)
sys.stdout.write("Creating " + POTFILE_IN + " ... ")
sys.stdout.flush()
to_translate = []
for (dirpath, dirnames, filenames) in os.walk("deluge"):
for filename in filenames:
if os.path.splitext(filename)[1] in (".py", ".glade") and dirpath not in EXCLUSIONS:
if os.path.splitext(filename)[1] in (".py", ".glade", ".in") \
and dirpath not in EXCLUSIONS \
and not compiled.match(dirpath):
to_translate.append(os.path.join(dirpath, filename))
f = open(POTFILE_IN, "wb")

View File

@ -17,9 +17,9 @@
#
# You should have received a copy of the GNU General Public License
# along with deluge. If not, write to:
# The Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor
# Boston, MA 02110-1301, USA.
# The Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor
# Boston, MA 02110-1301, USA.
#
# In addition, as a special exception, the copyright holders give
# permission to link the code of portions of this program with the OpenSSL
@ -41,6 +41,7 @@ import time
import subprocess
import platform
import sys
import chardet
try:
import json
@ -63,7 +64,22 @@ if not hasattr(json, "dumps"):
json.load = load
import pkg_resources
import xdg, xdg.BaseDirectory
import gettext
import locale
# Initialize gettext
try:
if hasattr(locale, "bindtextdomain"):
locale.bindtextdomain("deluge", pkg_resources.resource_filename("deluge", "i18n"))
if hasattr(locale, "textdomain"):
locale.textdomain("deluge")
gettext.install("deluge", pkg_resources.resource_filename("deluge", "i18n"), unicode=True)
except Exception, e:
from deluge.log import LOG as log
log.error("Unable to initialize gettext/locale!")
log.exception(e)
import __builtin__
__builtin__.__dict__["_"] = lambda x: x
from deluge.error import *
@ -101,11 +117,15 @@ FILE_PRIORITY = {
0: "Do Not Download",
1: "Normal Priority",
2: "High Priority",
5: "Highest Priority",
3: "High Priority",
4: "High Priority",
5: "High Priority",
6: "High Priority",
7: "Highest Priority",
"Do Not Download": 0,
"Normal Priority": 1,
"High Priority": 2,
"Highest Priority": 5
"High Priority": 5,
"Highest Priority": 7
}
def get_version():
@ -127,11 +147,19 @@ def get_default_config_dir(filename=None):
"""
if windows_check():
appDataPath = os.environ.get("APPDATA")
if not appDataPath:
import _winreg
hkey = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders")
appDataReg = _winreg.QueryValueEx(hkey, "AppData")
appDataPath = appDataReg[0]
_winreg.CloseKey(hkey)
if filename:
return os.path.join(os.environ.get("APPDATA"), "deluge", filename)
return os.path.join(appDataPath, "deluge", filename)
else:
return os.path.join(os.environ.get("APPDATA"), "deluge")
return os.path.join(appDataPath, "deluge")
else:
import xdg.BaseDirectory
if filename:
return os.path.join(xdg.BaseDirectory.save_config_path("deluge"), filename)
else:
@ -144,8 +172,20 @@ def get_default_download_dir():
"""
if windows_check():
return os.path.expanduser("~")
return os.path.join(os.path.expanduser("~"), 'Downloads')
else:
from xdg.BaseDirectory import xdg_config_home
userdir_file = os.path.join(xdg_config_home, 'user-dirs.dirs')
try:
for line in open(userdir_file, 'r'):
if not line.startswith('#') and 'XDG_DOWNLOAD_DIR' in line:
download_dir = os.path.expandvars(\
line.partition("=")[2].rstrip().strip('"'))
if os.path.isdir(download_dir):
return download_dir
except IOError:
pass
return os.environ.get("HOME")
def windows_check():
@ -234,12 +274,36 @@ def fsize(fsize_b):
"""
fsize_kb = fsize_b / 1024.0
if fsize_kb < 1024:
return "%.1f KiB" % fsize_kb
return "%.1f %s" % (fsize_kb, _("KiB"))
fsize_mb = fsize_kb / 1024.0
if fsize_mb < 1024:
return "%.1f MiB" % fsize_mb
return "%.1f %s" % (fsize_mb, _("MiB"))
fsize_gb = fsize_mb / 1024.0
return "%.1f GiB" % fsize_gb
return "%.1f %s" % (fsize_gb, _("GiB"))
def fsize_short(fsize_b):
"""
Formats the bytes value into a string with K, M or G units
:param fsize_b: the filesize in bytes
:type fsize_b: int
:returns: formatted string in K, M or G units
:rtype: string
**Usage**
>>> fsize(112245)
'109.6 K'
"""
fsize_kb = fsize_b / 1024.0
if fsize_kb < 1024:
return "%.1f %s" % (fsize_kb, _("K"))
fsize_mb = fsize_kb / 1024.0
if fsize_mb < 1024:
return "%.1f %s" % (fsize_mb, _("M"))
fsize_gb = fsize_mb / 1024.0
return "%.1f %s" % (fsize_gb, _("G"))
def fpcnt(dec):
"""
@ -273,7 +337,14 @@ def fspeed(bps):
'42.1 KiB/s'
"""
return '%s/s' % (fsize(bps))
fspeed_kb = bps / 1024.0
if fspeed_kb < 1024:
return "%.1f %s" % (fspeed_kb, _("KiB/s"))
fspeed_mb = fspeed_kb / 1024.0
if fspeed_mb < 1024:
return "%.1f %s" % (fspeed_mb, _("MiB/s"))
fspeed_gb = fspeed_mb / 1024.0
return "%.1f %s" % (fspeed_gb, _("GiB/s"))
def fpeer(num_peers, total_peers):
"""
@ -340,21 +411,21 @@ def ftime(seconds):
def fdate(seconds):
"""
Formats a date string in the locale's date representation based on the systems timezone
Formats a date time string in the locale's date representation based on the systems timezone
:param seconds: time in seconds since the Epoch
:type seconds: float
:returns: a string in the locale's date representation or "" if seconds < 0
:returns: a string in the locale's datetime representation or "" if seconds < 0
:rtype: string
"""
if seconds < 0:
return ""
return time.strftime("%x", time.localtime(seconds))
return time.strftime("%x %X", time.localtime(seconds))
def is_url(url):
"""
A simple regex test to check if the URL is valid
A simple test to check if the URL is valid
:param url: the url to test
:type url: string
@ -367,8 +438,7 @@ def is_url(url):
True
"""
import re
return bool(re.search('^(https?|ftp|udp)://', url))
return url.partition('://')[0] in ("http", "https", "ftp", "udp")
def is_magnet(uri):
"""
@ -389,30 +459,6 @@ def is_magnet(uri):
return True
return False
def fetch_url(url):
"""
Downloads a torrent file from a given URL and checks the file's validity
:param url: the url of the .torrent file to fetch
:type url: string
:returns: the filepath to the downloaded file
:rtype: string
"""
import urllib
from deluge.log import LOG as log
try:
filename, headers = urllib.urlretrieve(url)
except IOError:
log.debug("Network error while trying to fetch torrent from %s", url)
else:
if filename.endswith(".torrent") or headers["content-type"] ==\
"application/x-bittorrent":
return filename
else:
log.debug("URL doesn't appear to be a valid torrent file: %s", url)
return None
def create_magnet_uri(infohash, name=None, trackers=[]):
"""
Creates a magnet uri
@ -481,8 +527,8 @@ def free_space(path):
sectors, bytes, free, total = map(long, win32file.GetDiskFreeSpace(path))
return (free * sectors * bytes)
else:
disk_data = os.statvfs(path)
block_size = disk_data.f_bsize
disk_data = os.statvfs(path.encode("utf8"))
block_size = disk_data.f_frsize
return disk_data.f_bavail * block_size
def is_ip(ip):
@ -515,6 +561,93 @@ def is_ip(ip):
except socket.error:
return False
def path_join(*parts):
"""
An implementation of os.path.join that always uses / for the separator
to ensure that the correct paths are produced when working with internal
paths on Windows.
"""
path = ''
for part in parts:
if not part:
continue
elif part[0] == '/':
path = part
elif not path:
path = part
else:
path += '/' + part
return path
XML_ESCAPES = (
('&', '&amp;'),
('<', '&lt;'),
('>', '&gt;'),
('"', '&quot;'),
("'", '&apos;')
)
def xml_decode(string):
"""
Unescape a string that was previously encoded for use within xml.
:param string: The string to escape
:type string: string
:returns: The unescaped version of the string.
:rtype: string
"""
for char, escape in XML_ESCAPES:
string = string.replace(escape, char)
return string
def xml_encode(string):
"""
Escape a string for use within an xml element or attribute.
:param string: The string to escape
:type string: string
:returns: An escaped version of the string.
:rtype: string
"""
for char, escape in XML_ESCAPES:
string = string.replace(char, escape)
return string
def decode_string(s, encoding="utf8"):
"""
Decodes a string and re-encodes it in utf8. If it cannot decode using
`:param:encoding` then it will try to detect the string encoding and
decode it.
:param s: string to decode
:type s: string
:keyword encoding: the encoding to use in the decoding
:type encoding: string
"""
try:
s = s.decode(encoding).encode("utf8", "ignore")
except UnicodeDecodeError:
s = s.decode(chardet.detect(s)["encoding"], "ignore").encode("utf8", "ignore")
return s
def utf8_encoded(s):
"""
Returns a utf8 encoded string of s
:param s: (unicode) string to (re-)encode
:type s: basestring
:returns: a utf8 encoded string of s
:rtype: str
"""
if isinstance(s, str):
s = decode_string(s)
elif isinstance(s, unicode):
s = s.encode("utf8", "ignore")
return s
class VersionSplit(object):
"""
Used for comparing version numbers.
@ -525,13 +658,15 @@ class VersionSplit(object):
"""
def __init__(self, ver):
ver = ver.lower()
vs = ver.split("_") if "_" in ver else ver.split("-")
vs = ver.replace("_", "-").split("-")
self.version = [int(x) for x in vs[0].split(".")]
self.suffix = None
self.dev = False
if len(vs) > 1:
for s in ("rc", "alpha", "beta", "dev"):
if s in vs[1][:len(s)]:
self.suffix = vs[1]
if vs[1].startswith(("rc", "alpha", "beta")):
self.suffix = vs[1]
if vs[-1] == 'dev':
self.dev = True
def __cmp__(self, ver):
"""
@ -542,19 +677,8 @@ class VersionSplit(object):
"""
if self.version > ver.version or (self.suffix and self.suffix[:3] == "dev"):
return 1
if self.version < ver.version:
return -1
if self.version == ver.version:
if self.suffix == ver.suffix:
return 0
if self.suffix is None:
return 1
if ver.suffix is None:
return -1
if self.suffix < ver.suffix:
return -1
if self.suffix > ver.suffix:
return 1
# If there is no suffix we use z because we want final
# to appear after alpha, beta, and rc alphabetically.
v1 = [self.version, self.suffix or 'z', self.dev]
v2 = [ver.version, ver.suffix or 'z', ver.dev]
return cmp(v1, v2)

View File

@ -1,7 +1,7 @@
#
# component.py
#
# Copyright (C) 2007, 2008 Andrew Resch <andrewresch@gmail.com>
# Copyright (C) 2007-2010 Andrew Resch <andrewresch@gmail.com>
#
# Deluge is free software.
#
@ -33,213 +33,395 @@
#
#
from twisted.internet.defer import maybeDeferred, succeed, DeferredList, fail
from twisted.internet.task import LoopingCall
from deluge.log import LOG as log
COMPONENT_STATE = [
"Stopped",
"Started",
"Paused"
]
class ComponentAlreadyRegistered(Exception):
pass
class Component(object):
"""
Component objects are singletons managed by the :class:`ComponentRegistry`.
When a new Component object is instantiated, it will be automatically
registered with the :class:`ComponentRegistry`.
The ComponentRegistry has the ability to start, stop, pause and shutdown the
components registered with it.
**Events:**
**start()** - This method is called when the client has connected to a
Deluge core.
**stop()** - This method is called when the client has disconnected from a
Deluge core.
**update()** - This method is called every 1 second by default while the
Componented is in a *Started* state. The interval can be
specified during instantiation. The update() timer can be
paused by instructing the :class:`ComponentRegistry` to pause
this Component.
**shutdown()** - This method is called when the client is exiting. If the
Component is in a "Started" state when this is called, a
call to stop() will be issued prior to shutdown().
**States:**
A Component can be in one of these 5 states.
**Started** - The Component has been started by the :class:`ComponentRegistry`
and will have it's update timer started.
**Starting** - The Component has had it's start method called, but it hasn't
fully started yet.
**Stopped** - The Component has either been stopped or has yet to be started.
**Stopping** - The Component has had it's stop method called, but it hasn't
fully stopped yet.
**Paused** - The Component has had it's update timer stopped, but will
still be considered in a Started state.
"""
def __init__(self, name, interval=1, depend=None):
# Register with the ComponentRegistry
register(name, self, depend)
self._interval = interval
self._timer = None
self._state = COMPONENT_STATE.index("Stopped")
self._name = name
self._component_name = name
self._component_interval = interval
self._component_depend = depend
self._component_state = "Stopped"
self._component_timer = None
self._component_starting_deferred = None
self._component_stopping_deferred = None
_ComponentRegistry.register(self)
def get_state(self):
return self._state
def __del__(self):
if _ComponentRegistry:
_ComponentRegistry.deregister(self._component_name)
def get_component_name(self):
return self._name
def start(self):
pass
def _start(self):
self._state = COMPONENT_STATE.index("Started")
def _component_start_timer(self):
if hasattr(self, "update"):
self._timer = LoopingCall(self.update)
self._timer.start(self._interval)
self._component_timer = LoopingCall(self.update)
self._component_timer.start(self._component_interval)
def stop(self):
pass
def _component_start(self):
def on_start(result):
self._component_state = "Started"
self._component_starting_deferred = None
self._component_start_timer()
return True
def _stop(self):
self._state = COMPONENT_STATE.index("Stopped")
try:
self._timer.stop()
except:
pass
def on_start_fail(result):
self._component_state = "Stopped"
self._component_starting_deferred = None
log.error(result)
return result
def _pause(self):
self._state = COMPONENT_STATE.index("Paused")
try:
self._timer.stop()
except:
pass
if self._component_state == "Stopped":
if hasattr(self, "start"):
self._component_state = "Starting"
d = maybeDeferred(self.start)
d.addCallback(on_start)
d.addErrback(on_start_fail)
self._component_starting_deferred = d
else:
d = maybeDeferred(on_start, None)
elif self._component_state == "Starting":
return self._component_starting_deferred
elif self._component_state == "Started":
d = succeed(True)
else:
d = fail("Cannot start a component not in a Stopped state!")
def _resume(self):
self._start()
return d
def shutdown(self):
pass
def _component_stop(self):
def on_stop(result):
self._component_state = "Stopped"
if self._component_timer and self._component_timer.running:
self._component_timer.stop()
return True
class ComponentRegistry:
def __init__(self):
self.components = {}
self.depend = {}
def on_stop_fail(result):
self._component_state = "Started"
self._component_stopping_deferred = None
log.error(result)
return result
def register(self, name, obj, depend):
"""Registers a component.. depend must be list or None"""
log.debug("Registered %s with ComponentRegistry..", name)
self.components[name] = obj
if depend != None:
self.depend[name] = depend
if self._component_state != "Stopped" and self._component_state != "Stopping":
if hasattr(self, "stop"):
self._component_state = "Stopping"
d = maybeDeferred(self.stop)
d.addCallback(on_stop)
d.addErrback(on_stop_fail)
self._component_stopping_deferred = d
else:
d = maybeDeferred(on_stop, None)
def deregister(self, name):
"""Deregisters a component"""
if name in self.components:
log.debug("Deregistering Component: %s", name)
self.stop_component(name)
del self.components[name]
if self._component_state == "Stopping":
return self._component_stopping_deferred
def get(self, name):
"""Returns a reference to the component 'name'"""
return self.components[name]
return succeed(None)
def _component_pause(self):
def on_pause(result):
self._component_state = "Paused"
if self._component_state == "Started":
if self._component_timer and self._component_timer.running:
d = maybeDeferred(self._component_timer.stop)
d.addCallback(on_pause)
else:
d = succeed(None)
elif self._component_state == "Paused":
d = succeed(None)
else:
d = fail("Cannot pause a component in a non-Started state!")
return d
def _component_resume(self):
def on_resume(result):
self._component_state = "Started"
if self._component_state == "Paused":
d = maybeDeferred(self._component_start_timer)
d.addCallback(on_resume)
else:
d = fail("Component cannot be resumed from a non-Paused state!")
return d
def _component_shutdown(self):
def on_stop(result):
if hasattr(self, "shutdown"):
return maybeDeferred(self.shutdown)
return succeed(None)
d = self._component_stop()
d.addCallback(on_stop)
return d
def start(self):
"""Starts all components"""
for component in self.components.keys():
self.start_component(component)
def start_component(self, name):
"""Starts a component"""
# Check to see if this component has any dependencies
if self.depend.has_key(name):
for depend in self.depend[name]:
self.start_component(depend)
# Only start if the component is stopped.
if self.components[name].get_state() == \
COMPONENT_STATE.index("Stopped"):
log.debug("Starting component %s..", name)
self.components[name].start()
self.components[name]._start()
pass
def stop(self):
"""Stops all components"""
# We create a separate list of the keys and do an additional check to
# make sure the key still exists in the components dict.
# This is because components could be deregistered during a stop and
# the dictionary would get modified while iterating through it.
components = self.components.keys()
for component in components:
if component in self.components:
self.stop_component(component)
def stop_component(self, component):
if self.components[component].get_state() != \
COMPONENT_STATE.index("Stopped"):
log.debug("Stopping component %s..", component)
self.components[component].stop()
self.components[component]._stop()
def pause(self):
"""Pauses all components. Stops calling update()"""
for component in self.components.keys():
self.pause_component(component)
def pause_component(self, component):
if self.components[component].get_state() not in \
[COMPONENT_STATE.index("Paused"), COMPONENT_STATE.index("Stopped")]:
log.debug("Pausing component %s..", component)
self.components[component]._pause()
def resume(self):
"""Resumes all components. Starts calling update()"""
for component in self.components.keys():
self.resume_component(component)
def resume_component(self, component):
if self.components[component].get_state() == COMPONENT_STATE.index("Paused"):
log.debug("Resuming component %s..", component)
self.components[component]._resume()
pass
def update(self):
"""Updates all components"""
for component in self.components.keys():
# Only update the component if it's started
if self.components[component].get_state() == \
COMPONENT_STATE.index("Started"):
self.components[component].update()
return True
pass
def shutdown(self):
"""Shuts down all components. This should be called when the program
exits so that components can do any necessary clean-up."""
# Stop all components first
self.stop()
for component in self.components.keys():
log.debug("Shutting down component %s..", component)
try:
self.components[component].shutdown()
except Exception, e:
log.debug("Unable to call shutdown()")
log.exception(e)
pass
class ComponentRegistry(object):
"""
The ComponentRegistry holds a list of currently registered
:class:`Component` objects. It is used to manage the Components by
starting, stopping, pausing and shutting them down.
"""
def __init__(self):
self.components = {}
def register(self, obj):
"""
Registers a component object with the registry. This is done
automatically when a Component object is instantiated.
:param obj: the Component object
:type obj: object
:raises ComponentAlreadyRegistered: if a component with the same name is already registered.
"""
name = obj._component_name
if name in self.components:
raise ComponentAlreadyRegistered(
"Component already registered with name %s" % name)
self.components[obj._component_name] = obj
def deregister(self, name):
"""
Deregisters a component from the registry. A stop will be
issued to the component prior to deregistering it.
:param name: the name of the component
:type name: string
"""
if name in self.components:
log.debug("Deregistering Component: %s", name)
d = self.stop([name])
def on_stop(result, name):
del self.components[name]
return d.addCallback(on_stop, name)
else:
return succeed(None)
def start(self, names=[]):
"""
Starts Components that are currently in a Stopped state and their
dependencies. If *names* is specified, will only start those
Components and their dependencies and if not it will start all
registered components.
:param names: a list of Components to start
:type names: list
:returns: a Deferred object that will fire once all Components have been sucessfully started
:rtype: twisted.internet.defer.Deferred
"""
# Start all the components if names is empty
if not names:
names = self.components.keys()
elif isinstance(names, str):
names = [names]
def on_depends_started(result, name):
return self.components[name]._component_start()
deferreds = []
for name in names:
if self.components[name]._component_depend:
# This component has depends, so we need to start them first.
d = self.start(self.components[name]._component_depend)
d.addCallback(on_depends_started, name)
deferreds.append(d)
else:
deferreds.append(self.components[name]._component_start())
return DeferredList(deferreds)
def stop(self, names=[]):
"""
Stops Components that are currently not in a Stopped state. If
*names* is specified, then it will only stop those Components,
and if not it will stop all the registered Components.
:param names: a list of Components to start
:type names: list
:returns: a Deferred object that will fire once all Components have been sucessfully stopped
:rtype: twisted.internet.defer.Deferred
"""
if not names:
names = self.components.keys()
elif isinstance(names, str):
names = [names]
deferreds = []
for name in names:
if name in self.components:
deferreds.append(self.components[name]._component_stop())
return DeferredList(deferreds)
def pause(self, names=[]):
"""
Pauses Components that are currently in a Started state. If
*names* is specified, then it will only pause those Components,
and if not it will pause all the registered Components.
:param names: a list of Components to pause
:type names: list
:returns: a Deferred object that will fire once all Components have been sucessfully paused
:rtype: twisted.internet.defer.Deferred
"""
if not names:
names = self.components.keys()
elif isinstance(names, str):
names = [names]
deferreds = []
for name in names:
if self.components[name]._component_state == "Started":
deferreds.append(self.components[name]._component_pause())
return DeferredList(deferreds)
def resume(self, names=[]):
"""
Resumes Components that are currently in a Paused state. If
*names* is specified, then it will only resume those Components,
and if not it will resume all the registered Components.
:param names: a list of Components to resume
:type names: list
:returns: a Deferred object that will fire once all Components have been sucessfully resumed
:rtype: twisted.internet.defer.Deferred
"""
if not names:
names = self.components.keys()
elif isinstance(names, str):
names = [names]
deferreds = []
for name in names:
if self.components[name]._component_state == "Paused":
deferreds.append(self.components[name]._component_resume())
return DeferredList(deferreds)
def shutdown(self):
"""
Shutdowns all Components regardless of state. This will call
:meth:`stop` on call the components prior to shutting down. This should
be called when the program is exiting to ensure all Components have a
chance to properly shutdown.
:returns: a Deferred object that will fire once all Components have been sucessfully resumed
:rtype: twisted.internet.defer.Deferred
"""
deferreds = []
for component in self.components.values():
deferreds.append(component._component_shutdown())
return DeferredList(deferreds)
def update(self):
"""
Updates all Components that are in a Started state.
"""
for component in self.components.items():
component.update()
_ComponentRegistry = ComponentRegistry()
def register(name, obj, depend=None):
"""Registers a component with the registry"""
_ComponentRegistry.register(name, obj, depend)
deregister = _ComponentRegistry.deregister
start = _ComponentRegistry.start
stop = _ComponentRegistry.stop
pause = _ComponentRegistry.pause
resume = _ComponentRegistry.resume
update = _ComponentRegistry.update
shutdown = _ComponentRegistry.shutdown
def deregister(name):
"""Deregisters a component"""
_ComponentRegistry.deregister(name)
def get(name):
"""
Return a reference to a component.
def start(component=None):
"""Starts all components"""
if component == None:
_ComponentRegistry.start()
else:
_ComponentRegistry.start_component(component)
:param name: the Component name to get
:type name: string
def stop(component=None):
"""Stops all or specified components"""
if component == None:
_ComponentRegistry.stop()
else:
_ComponentRegistry.stop_component(component)
:returns: the Component object
:rtype: object
def pause(component=None):
"""Pauses all or specificed components"""
if component == None:
_ComponentRegistry.pause()
else:
_ComponentRegistry.pause_component(component)
:raises KeyError: if the Component does not exist
def resume(component=None):
"""Resumes all or specificed components"""
if component == None:
_ComponentRegistry.resume()
else:
_ComponentRegistry.resume_component(component)
def update():
"""Updates all components"""
_ComponentRegistry.update()
def shutdown():
"""Shutdowns all components"""
_ComponentRegistry.shutdown()
def get(component):
"""Return a reference to the component"""
return _ComponentRegistry.get(component)
"""
return _ComponentRegistry.components[name]

View File

@ -45,9 +45,9 @@ The format of the config file is two json encoded dicts:
<version dict>
<content dict>
The version dict contains two keys: file and format. The format version is
controlled by the Config class. It should only be changed when anything below
it is changed directly by the Config class. An example of this would be if we
The version dict contains two keys: file and format. The format version is
controlled by the Config class. It should only be changed when anything below
it is changed directly by the Config class. An example of this would be if we
changed the serializer for the content to something different.
The config file version is changed by the 'owner' of the config file. This is
@ -93,13 +93,13 @@ def prop(func):
def find_json_objects(s):
"""
Find json objects in a string.
:param s: the string to find json objects in
:type s: string
:returns: a list of tuples containing start and end locations of json objects in the string `s`
:rtype: [(start, end), ...]
"""
objects = []
opens = 0
@ -119,8 +119,8 @@ def find_json_objects(s):
start = index + offset + 1
return objects
class Config(object):
"""
This class is used to access/create/modify config files
@ -146,7 +146,8 @@ class Config(object):
self._save_timer = None
if defaults:
self.__config = dict(defaults)
for key, value in defaults.iteritems():
self.set_item(key, value)
# Load the config from file in the config_dir
if config_dir:
@ -187,6 +188,10 @@ what is currently in the config and it could not convert the value
5
"""
if isinstance(value, basestring):
value = deluge.common.utf8_encoded(value)
if not self.__config.has_key(key):
self.__config[key] = value
log.debug("Setting '%s' to %s of %s", key, value, type(value))
@ -200,7 +205,10 @@ what is currently in the config and it could not convert the value
if value is not None and oldtype != type(None) and oldtype != newtype:
try:
value = oldtype(value)
if oldtype == unicode:
value = oldtype(value, "utf8")
else:
value = oldtype(value)
except ValueError:
log.warning("Type '%s' invalid for '%s'", newtype, key)
raise
@ -250,7 +258,13 @@ what is currently in the config and it could not convert the value
5
"""
return self.__config[key]
if isinstance(self.__config[key], str):
try:
return self.__config[key].decode("utf8")
except UnicodeDecodeError:
return self.__config[key]
else:
return self.__config[key]
def register_change_callback(self, callback):
"""
@ -348,21 +362,21 @@ what is currently in the config and it could not convert the value
return
objects = find_json_objects(data)
if not len(objects):
# No json objects found, try depickling it
try:
self.__config.update(pickle.loads(data))
except Exception, e:
log.exception(e)
log.warning("Unable to load config file: %s", filename)
log.warning("Unable to load config file: %s", filename)
elif len(objects) == 1:
start, end = objects[0]
try:
self.__config.update(json.loads(data[start:end]))
except Exception, e:
log.exception(e)
log.warning("Unable to load config file: %s", filename)
log.warning("Unable to load config file: %s", filename)
elif len(objects) == 2:
try:
start, end = objects[0]
@ -371,8 +385,8 @@ what is currently in the config and it could not convert the value
self.__config.update(json.loads(data[start:end]))
except Exception, e:
log.exception(e)
log.warning("Unable to load config file: %s", filename)
log.warning("Unable to load config file: %s", filename)
log.debug("Config %s version: %s.%s loaded: %s", filename,
self.__version["format"], self.__version["file"], self.__config)
@ -396,26 +410,24 @@ what is currently in the config and it could not convert the value
version = json.loads(data[start:end])
start, end = objects[1]
loaded_data = json.loads(data[start:end])
if self.__config == loaded_data and self.__version == version:
# The config has not changed so lets just return
self._save_timer.cancel()
return
except Exception, e:
log.warning("Unable to open config file: %s", filename)
if self._save_timer and self._save_timer.active():
self._save_timer.cancel()
return True
except (IOError, IndexError), e:
log.warning("Unable to open config file: %s because: %s", filename, e)
# Save the new config and make sure it's written to disk
try:
log.debug("Saving new config file %s", filename + ".new")
f = open(filename + ".new", "wb")
json.dump(self.__version, f, indent=2)
json.dump(self.__version, f, indent=2)
json.dump(self.__config, f, indent=2)
f.flush()
os.fsync(f.fileno())
f.close()
except Exception, e:
except IOError, e:
log.error("Error writing new config file: %s", e)
return False
@ -424,7 +436,7 @@ what is currently in the config and it could not convert the value
log.debug("Backing up old config file to %s~", filename)
shutil.move(filename, filename + "~")
except Exception, e:
log.error("Error backing up old config..")
log.warning("Unable to backup old config...")
# The new config file has been written successfully, so let's move it over
# the existing one.

View File

@ -66,9 +66,17 @@ class AlertManager(component.Component):
# handlers is a dictionary of lists {"alert_type": [handler1,h2,..]}
self.handlers = {}
self.delayed_calls = []
def update(self):
self.delayed_calls = [dc for dc in self.delayed_calls if dc.active()]
self.handle_alerts()
def stop(self):
for dc in self.delayed_calls:
dc.cancel()
self.delayed_calls = []
def register_handler(self, alert_type, handler):
"""
Registers a function that will be called when 'alert_type' is pop'd
@ -117,7 +125,7 @@ class AlertManager(component.Component):
if alert_type in self.handlers:
for handler in self.handlers[alert_type]:
if not wait:
reactor.callLater(0, handler, alert)
self.delayed_calls.append(reactor.callLater(0, handler, alert))
else:
handler(alert)

View File

@ -74,12 +74,12 @@ class AutoAdd(component.Component):
return
for filename in os.listdir(self.config["autoadd_location"]):
if filename.split(".")[-1] == "torrent":
try:
filepath = os.path.join(self.config["autoadd_location"], filename)
except UnicodeDecodeError, e:
log.error("Unable to auto add torrent due to inproper filename encoding: %s", e)
continue
try:
filepath = os.path.join(self.config["autoadd_location"], filename)
except UnicodeDecodeError, e:
log.error("Unable to auto add torrent due to improper filename encoding: %s", e)
continue
if os.path.isfile(filepath) and filename.endswith(".torrent"):
try:
filedump = self.load_torrent(filepath)
except (RuntimeError, Exception), e:

View File

@ -17,9 +17,9 @@
#
# You should have received a copy of the GNU General Public License
# along with deluge. If not, write to:
# The Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor
# Boston, MA 02110-1301, USA.
# The Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor
# Boston, MA 02110-1301, USA.
#
# In addition, as a special exception, the copyright holders give
# permission to link the code of portions of this program with the OpenSSL
@ -42,11 +42,14 @@ import shutil
import threading
import pkg_resources
import warnings
import tempfile
from urlparse import urljoin
from twisted.internet import reactor, defer
from twisted.internet.task import LoopingCall
import twisted.web.client
import twisted.web.error
from deluge.httpdownloader import download_file
from deluge.log import LOG as log
@ -92,6 +95,11 @@ class Core(component.Component):
# Set session settings
self.settings.send_redundant_have = True
if deluge.common.windows_check():
self.settings.disk_io_write_mode = \
lt.io_buffer_mode_t.disable_os_cache
self.settings.disk_io_read_mode = \
lt.io_buffer_mode_t.disable_os_cache
self.session.set_settings(self.settings)
# Load metadata extension
@ -128,9 +136,12 @@ class Core(component.Component):
self.__new_release = None
def stop(self):
log.debug("Core stopping...")
# Save the DHT state if necessary
if self.config["dht"]:
self.save_dht_state()
# Save the libtorrent session state
self.__save_session_state()
@ -147,8 +158,9 @@ class Core(component.Component):
def __save_session_state(self):
"""Saves the libtorrent session state"""
try:
open(deluge.configmanager.get_config_dir("session.state"), "wb").write(
lt.bencode(self.session.state()))
lt_data = open(deluge.configmanager.get_config_dir("session.state"), "wb")
lt_data.write(lt.bencode(self.session.save_state()))
lt_data.close()
except Exception, e:
log.warning("Failed to save lt state: %s", e)
@ -236,20 +248,35 @@ class Core(component.Component):
:returns: a Deferred which returns the torrent_id as a str or None
"""
log.info("Attempting to add url %s", url)
def on_get_file(filename):
def on_download_success(filename):
# We got the file, so add it to the session
data = open(filename, "rb").read()
f = open(filename, "rb")
data = f.read()
f.close()
try:
os.remove(filename)
except Exception, e:
log.warning("Couldn't remove temp file: %s", e)
return self.add_torrent_file(filename, base64.encodestring(data), options)
def on_get_file_error(failure):
# Log the error and pass the failure onto the client
log.error("Error occured downloading torrent from %s", url)
log.error("Reason: %s", failure.getErrorMessage())
return failure
def on_download_fail(failure):
if failure.check(twisted.web.error.PageRedirect):
new_url = urljoin(url, failure.getErrorMessage().split(" to ")[1])
result = download_file(new_url, tempfile.mkstemp()[1], headers=headers, force_filename=True)
result.addCallbacks(on_download_success, on_download_fail)
elif failure.check(twisted.web.client.PartialDownloadError):
result = download_file(url, tempfile.mkstemp()[1], headers=headers, force_filename=True,
allow_compression=False)
result.addCallbacks(on_download_success, on_download_fail)
else:
# Log the error and pass the failure onto the client
log.error("Error occured downloading torrent from %s", url)
log.error("Reason: %s", failure.getErrorMessage())
result = failure
return result
d = download_file(url, url.split("/")[-1], headers=headers)
d.addCallback(on_get_file)
d.addErrback(on_get_file_error)
d = download_file(url, tempfile.mkstemp()[1], headers=headers, force_filename=True)
d.addCallbacks(on_download_success, on_download_fail)
return d
@export
@ -288,28 +315,6 @@ class Core(component.Component):
log.debug("Removing torrent %s from the core.", torrent_id)
return self.torrentmanager.remove(torrent_id, remove_data)
@export
def get_stats(self):
"""
Deprecated: please use get_session_status()
"""
warnings.warn("Use get_session_status() instead of get_stats()", DeprecationWarning)
stats = self.get_session_status(["payload_download_rate", "payload_upload_rate",
"dht_nodes", "has_incoming_connections", "download_rate", "upload_rate"])
stats.update({
#dynamic stats:
"num_connections":self.session.num_connections(),
"free_space":deluge.common.free_space(self.config["download_location"]),
#max config values:
"max_download":self.config["max_download_speed"],
"max_upload":self.config["max_upload_speed"],
"max_num_connections":self.config["max_connections_global"],
})
return stats
@export
def get_session_status(self, keys):
"""
@ -407,9 +412,9 @@ class Core(component.Component):
self.torrentmanager[torrent_id].resume()
@export
def get_torrent_status(self, torrent_id, keys):
def get_torrent_status(self, torrent_id, keys, diff=False):
# Build the status dictionary
status = self.torrentmanager[torrent_id].get_status(keys)
status = self.torrentmanager[torrent_id].get_status(keys, diff)
# Get the leftover fields and ask the plugin manager to fill them
leftover_fields = list(set(keys) - set(status.keys()))
@ -418,7 +423,7 @@ class Core(component.Component):
return status
@export
def get_torrents_status(self, filter_dict, keys):
def get_torrents_status(self, filter_dict, keys, diff=False):
"""
returns all torrents , optionally filtered by filter_dict.
"""
@ -427,7 +432,7 @@ class Core(component.Component):
# Get the torrent status for each torrent_id
for torrent_id in torrent_ids:
status_dict[torrent_id] = self.get_torrent_status(torrent_id, keys)
status_dict[torrent_id] = self.get_torrent_status(torrent_id, keys, diff)
return status_dict
@ -490,24 +495,6 @@ class Core(component.Component):
"""Returns the current number of connections"""
return self.session.num_connections()
@export
def get_dht_nodes(self):
"""Returns the number of dht nodes"""
warnings.warn("Use get_session_status().", DeprecationWarning)
return self.session.status().dht_nodes
@export
def get_download_rate(self):
"""Returns the payload download rate"""
warnings.warn("Use get_session_status().", DeprecationWarning)
return self.session.status().payload_download_rate
@export
def get_upload_rate(self):
"""Returns the payload upload rate"""
warnings.warn("Use get_session_status().", DeprecationWarning)
return self.session.status().payload_upload_rate
@export
def get_available_plugins(self):
"""Returns a list of plugins available in the core"""
@ -605,12 +592,6 @@ class Core(component.Component):
"""Sets the path for the torrent to be moved when completed"""
return self.torrentmanager[torrent_id].set_move_completed_path(value)
@export
def get_health(self):
"""Returns True if we have established incoming connections"""
warnings.warn("Use get_session_status().", DeprecationWarning)
return self.session.status().has_incoming_connections
@export
def get_path_size(self, path):
"""Returns the size of the file or folder 'path' and -1 if the path is
@ -622,7 +603,7 @@ class Core(component.Component):
webseeds, private, created_by, trackers, add_to_session):
log.debug("creating torrent..")
threading.Thread(target=_create_torrent_thread,
threading.Thread(target=self._create_torrent_thread,
args=(
path,
tracker,
@ -725,7 +706,8 @@ class Core(component.Component):
@export
def queue_top(self, torrent_ids):
log.debug("Attempting to queue %s to top", torrent_ids)
for torrent_id in torrent_ids:
# torrent_ids must be sorted in reverse before moving to preserve order
for torrent_id in sorted(torrent_ids, key=self.torrentmanager.get_queue_position, reverse=True):
try:
# If the queue method returns True, then we should emit a signal
if self.torrentmanager.queue_top(torrent_id):
@ -736,35 +718,48 @@ class Core(component.Component):
@export
def queue_up(self, torrent_ids):
log.debug("Attempting to queue %s to up", torrent_ids)
torrents = ((self.torrentmanager.get_queue_position(torrent_id), torrent_id) for torrent_id in torrent_ids)
torrent_moved = True
prev_queue_position = None
#torrent_ids must be sorted before moving.
torrent_ids = list(torrent_ids)
torrent_ids.sort(key = lambda id: self.torrentmanager.torrents[id].get_queue_position())
for torrent_id in torrent_ids:
try:
# If the queue method returns True, then we should emit a signal
if self.torrentmanager.queue_up(torrent_id):
component.get("EventManager").emit(TorrentQueueChangedEvent())
except KeyError:
log.warning("torrent_id: %s does not exist in the queue", torrent_id)
for queue_position, torrent_id in sorted(torrents):
# Move the torrent if and only if there is space (by not moving it we preserve the order)
if torrent_moved or queue_position - prev_queue_position > 1:
try:
torrent_moved = self.torrentmanager.queue_up(torrent_id)
except KeyError:
log.warning("torrent_id: %s does not exist in the queue", torrent_id)
# If the torrent moved, then we should emit a signal
if torrent_moved:
component.get("EventManager").emit(TorrentQueueChangedEvent())
else:
prev_queue_position = queue_position
@export
def queue_down(self, torrent_ids):
log.debug("Attempting to queue %s to down", torrent_ids)
torrents = ((self.torrentmanager.get_queue_position(torrent_id), torrent_id) for torrent_id in torrent_ids)
torrent_moved = True
prev_queue_position = None
#torrent_ids must be sorted before moving.
torrent_ids = list(torrent_ids)
torrent_ids.sort(key = lambda id: -self.torrentmanager.torrents[id].get_queue_position())
for torrent_id in torrent_ids:
try:
# If the queue method returns True, then we should emit a signal
if self.torrentmanager.queue_down(torrent_id):
component.get("EventManager").emit(TorrentQueueChangedEvent())
except KeyError:
log.warning("torrent_id: %s does not exist in the queue", torrent_id)
for queue_position, torrent_id in sorted(torrents, reverse=True):
# Move the torrent if and only if there is space (by not moving it we preserve the order)
if torrent_moved or prev_queue_position - queue_position > 1:
try:
torrent_moved = self.torrentmanager.queue_down(torrent_id)
except KeyError:
log.warning("torrent_id: %s does not exist in the queue", torrent_id)
# If the torrent moved, then we should emit a signal
if torrent_moved:
component.get("EventManager").emit(TorrentQueueChangedEvent())
else:
prev_queue_position = queue_position
@export
def queue_bottom(self, torrent_ids):
log.debug("Attempting to queue %s to bottom", torrent_ids)
for torrent_id in torrent_ids:
# torrent_ids must be sorted before moving to preserve order
for torrent_id in sorted(torrent_ids, key=self.torrentmanager.get_queue_position):
try:
# If the queue method returns True, then we should emit a signal
if self.torrentmanager.queue_bottom(torrent_id):
@ -787,21 +782,27 @@ class Core(component.Component):
"""
from twisted.web.client import getPage
d = getPage("http://deluge-torrent.org/test_port.php?port=%s" % self.get_listen_port())
d = getPage("http://deluge-torrent.org/test_port.php?port=%s" %
self.get_listen_port(), timeout=30)
def on_get_page(result):
return bool(int(result))
def logError(failure):
log.warning("Error testing listen port: %s", failure)
d.addCallback(on_get_page)
d.addErrback(logError)
return d
@export
def get_free_space(self, path):
def get_free_space(self, path=None):
"""
Returns the number of free bytes at path
:param path: the path to check free space at
:param path: the path to check free space at, if None, use the default
download location
:type path: string
:returns: the number of free bytes at path
@ -810,7 +811,12 @@ class Core(component.Component):
:raises InvalidPathError: if the path is invalid
"""
return deluge.common.free_space(path)
if not path:
path = self.config["download_location"]
try:
return deluge.common.free_space(path)
except InvalidPathError:
return 0
@export
def get_libtorrent_version(self):

View File

@ -110,7 +110,7 @@ class Daemon(object):
# Twisted catches signals to terminate, so just have it call the shutdown
# method.
reactor.addSystemEventTrigger("after", "shutdown", self.shutdown)
reactor.addSystemEventTrigger("before", "shutdown", self._shutdown)
# Catch some Windows specific signals
if deluge.common.windows_check():
@ -120,7 +120,7 @@ class Daemon(object):
def win_handler(ctrl_type):
log.debug("ctrl_type: %s", ctrl_type)
if ctrl_type == CTRL_CLOSE_EVENT or ctrl_type == CTRL_SHUTDOWN_EVENT:
self.__shutdown()
self._shutdown()
return 1
SetConsoleCtrlHandler(win_handler)
@ -133,9 +133,14 @@ class Daemon(object):
if options and options.config:
deluge.configmanager.set_config_dir(options.config)
if options and options.listen_interface:
listen_interface = options.listen_interface
else:
listen_interface = ""
from deluge.core.core import Core
# Start the core as a thread and join it until it's done
self.core = Core()
self.core = Core(listen_interface=listen_interface)
port = self.core.config["daemon_port"]
if options and options.port:
@ -177,17 +182,16 @@ class Daemon(object):
reactor.callLater(0, reactor.stop)
def _shutdown(self, *args, **kwargs):
try:
os.remove(deluge.configmanager.get_config_dir("deluged.pid"))
except Exception, e:
log.exception(e)
log.error("Error removing deluged.pid!")
if os.path.exists(deluge.configmanager.get_config_dir("deluged.pid")):
try:
os.remove(deluge.configmanager.get_config_dir("deluged.pid"))
except Exception, e:
log.exception(e)
log.error("Error removing deluged.pid!")
component.shutdown()
try:
reactor.stop()
except twisted.internet.error.ReactorNotRunning:
log.debug("Tried to stop the reactor but it is not running..")
log.info("Waiting for components to shutdown..")
d = component.shutdown()
return d
@export()
def info(self):

View File

@ -53,7 +53,10 @@ class EventManager(component.Component):
if event.name in self.handlers:
for handler in self.handlers[event.name]:
#log.debug("Running handler %s for event %s with args: %s", event.name, handler, event.args)
handler(*event.args)
try:
handler(*event.args)
except:
log.error("Event handler %s failed in %s", event.name, handler)
def register_event_handler(self, event, handler):
"""

View File

@ -91,7 +91,7 @@ def tracker_error_filter(torrent_ids, values):
# Check all the torrent's tracker_status for 'Error:' and only return torrent_ids
# that have this substring in their tracker_status
for torrent_id in torrent_ids:
if "Error:" in tm[torrent_id].get_status(["tracker_status"])["tracker_status"]:
if _("Error") + ":" in tm[torrent_id].get_status(["tracker_status"])["tracker_status"]:
filtered_torrent_ids.append(torrent_id)
return filtered_torrent_ids
@ -197,6 +197,7 @@ class FilterManager(component.Component):
items[field][value] = items[field].get(value, 0) + 1
if "tracker_host" in items:
items["tracker_host"]["All"] = len(torrent_ids)
items["tracker_host"]["Error"] = len(tracker_error_filter(torrent_ids, ("Error",)))
if "state" in tree_keys and not show_zero_hits:

View File

@ -96,8 +96,7 @@ class PluginManager(deluge.pluginmanagerbase.PluginManagerBase,
try:
status[field] = self.status_fields[field](torrent_id)
except KeyError:
log.warning("Status field %s is not registered with the\
PluginManager.", field)
pass
return status
def register_status_field(self, field, function):

View File

@ -58,6 +58,7 @@ DEFAULT_PREFS = {
"listen_ports": [6881, 6891],
"listen_interface": "",
"copy_torrent_file": False,
"del_copy_torrent_file": False,
"torrentfiles_location": deluge.common.get_default_download_dir(),
"plugins_location": os.path.join(deluge.configmanager.get_config_dir(), "plugins"),
"prioritize_first_last_pieces": False,
@ -151,7 +152,6 @@ class PreferencesManager(component.Component):
def start(self):
self.core = component.get("Core")
self.session = component.get("Core").session
self.settings = component.get("Core").settings
# Register set functions in the Config
self.config.register_set_function("torrentfiles_location",
@ -228,10 +228,15 @@ class PreferencesManager(component.Component):
self.config.register_change_callback(self._on_config_value_change)
def stop(self):
if self.new_release_timer:
if self.new_release_timer and self.new_release_timer.running:
self.new_release_timer.stop()
# Config set functions
def session_set_setting(self, key, value):
settings = self.session.settings()
setattr(settings, key, value)
self.session.set_settings(settings)
def _on_config_value_change(self, key, value):
component.get("EventManager").emit(ConfigValueChangedEvent(key, value))
@ -273,8 +278,7 @@ class PreferencesManager(component.Component):
def _on_set_outgoing_ports(self, key, value):
if not self.config["random_outgoing_ports"]:
log.debug("outgoing port range set to %s-%s", value[0], value[1])
self.settings.outgoing_ports = value[0], value[1]
self.session.set_settings(self.settings)
self.session_set_setting("outgoing_ports", (value[0], value[1]))
def _on_set_random_outgoing_ports(self, key, value):
if value:
@ -283,13 +287,11 @@ class PreferencesManager(component.Component):
def _on_set_peer_tos(self, key, value):
log.debug("setting peer_tos to: %s", value)
try:
self.settings.peer_tos = chr(int(value, 16))
self.session_set_setting("peer_tos", chr(int(value, 16)))
except ValueError, e:
log.debug("Invalid tos byte: %s", e)
return
self.session.set_settings(self.settings)
def _on_set_dht(self, key, value):
log.debug("dht value set to %s", value)
state_file = deluge.configmanager.get_config_dir("dht.state")
@ -386,51 +388,39 @@ class PreferencesManager(component.Component):
self.session.set_max_half_open_connections(value)
def _on_set_max_connections_per_second(self, key, value):
self.settings.connection_speed = value
self.session.set_settings(self.settings)
self.session_set_setting("connection_speed", value)
def _on_ignore_limits_on_local_network(self, key, value):
self.settings.ignore_limits_on_local_network = value
self.session.set_settings(self.settings)
self.session_set_setting("ignore_limits_on_local_network", value)
def _on_set_share_ratio_limit(self, key, value):
log.debug("%s set to %s..", key, value)
self.settings.share_ratio_limit = value
self.session.set_settings(self.settings)
self.session_set_setting("share_ratio_limit", value)
def _on_set_seed_time_ratio_limit(self, key, value):
log.debug("%s set to %s..", key, value)
self.settings.seed_time_ratio_limit = value
self.session.set_settings(self.settings)
self.session_set_setting("seed_time_ratio_limit", value)
def _on_set_seed_time_limit(self, key, value):
log.debug("%s set to %s..", key, value)
# This value is stored in minutes in deluge, but libtorrent wants seconds
self.settings.seed_time_limit = int(value * 60)
self.session.set_settings(self.settings)
self.session_set_setting("seed_time_limit", int(value * 60))
def _on_set_max_active_downloading(self, key, value):
log.debug("%s set to %s..", key, value)
log.debug("active_downloads: %s", self.settings.active_downloads)
self.settings.active_downloads = value
self.session.set_settings(self.settings)
self.session_set_setting("active_downloads", value)
def _on_set_max_active_seeding(self, key, value):
log.debug("%s set to %s..", key, value)
log.debug("active_seeds: %s", self.settings.active_seeds)
self.settings.active_seeds = value
self.session.set_settings(self.settings)
self.session_set_setting("active_seeds", value)
def _on_set_max_active_limit(self, key, value):
log.debug("%s set to %s..", key, value)
log.debug("active_limit: %s", self.settings.active_limit)
self.settings.active_limit = value
self.session.set_settings(self.settings)
self.session_set_setting("active_limit", value)
def _on_set_dont_count_slow_torrents(self, key, value):
log.debug("%s set to %s..", key, value)
self.settings.dont_count_slow_torrents = value
self.session.set_settings(self.settings)
self.session_set_setting("dont_count_slow_torrents", value)
def _on_send_info(self, key, value):
log.debug("Sending anonymous stats..")
@ -466,14 +456,14 @@ class PreferencesManager(component.Component):
if value:
log.debug("Checking for new release..")
threading.Thread(target=self.core.get_new_release).start()
if self.new_release_timer:
if self.new_release_timer and self.new_release_timer.running:
self.new_release_timer.stop()
# Set a timer to check for a new release every 3 days
self.new_release_timer = LoopingCall(
self._on_new_release_check, "new_release_check", True)
self.new_release_timer.start(72 * 60 * 60, False)
else:
if self.new_release_timer:
if self.new_release_timer and self.new_release_timer.running:
self.new_release_timer.stop()
def _on_set_proxies(self, key, value):
@ -490,8 +480,7 @@ class PreferencesManager(component.Component):
def _on_rate_limit_ip_overhead(self, key, value):
log.debug("%s: %s", key, value)
self.settings.rate_limit_ip_overhead = value
self.session.set_settings(self.settings)
self.session_set_setting("rate_limit_ip_overhead", value)
def _on_geoip_db_location(self, key, value):
log.debug("%s: %s", key, value)
@ -513,10 +502,8 @@ class PreferencesManager(component.Component):
def _on_cache_size(self, key, value):
log.debug("%s: %s", key, value)
self.settings.cache_size = value
self.session.set_settings(self.settings)
self.session_set_setting("cache_size", value)
def _on_cache_expiry(self, key, value):
log.debug("%s: %s", key, value)
self.settings.cache_expiry = value
self.session.set_settings(self.settings)
self.session_set_setting("cache_expiry", value)

View File

@ -47,7 +47,11 @@ from twisted.internet import ssl, reactor, defer
from OpenSSL import crypto, SSL
from types import FunctionType
import deluge.rencode as rencode
try:
import rencode
except ImportError:
import deluge.rencode as rencode
from deluge.log import LOG as log
import deluge.component as component
@ -86,6 +90,32 @@ def export(auth_level=AUTH_LEVEL_DEFAULT):
else:
return wrap
def format_request(call):
"""
Format the RPCRequest message for debug printing
:param call: the request
:type call: a RPCRequest
:returns: a formatted string for printing
:rtype: str
"""
try:
s = call[1] + "("
if call[2]:
s += ", ".join([str(x) for x in call[2]])
if call[3]:
if call[2]:
s += ", "
s += ", ".join([key + "=" + str(value) for key, value in call[3].items()])
s += ")"
except UnicodeEncodeError:
return "UnicodeEncodeError, call: %s" % call
else:
return s
class DelugeError(Exception):
pass
@ -113,8 +143,8 @@ class DelugeRPCProtocol(Protocol):
"""
This method is called whenever data is received from a client. The
only message that a client sends to the server is a RPC Request message.
If the RPC Request message is valid, then the method is called in a thread
with :meth:`dispatch`.
If the RPC Request message is valid, then the method is called in
:meth:`dispatch`.
:param data: the data from the client. It should be a zlib compressed
rencoded string.
@ -151,24 +181,7 @@ class DelugeRPCProtocol(Protocol):
if len(call) != 4:
log.debug("Received invalid rpc request: number of items in request is %s", len(call))
continue
# Format the RPCRequest message for debug printing
try:
s = call[1] + "("
if call[2]:
s += ", ".join([str(x) for x in call[2]])
if call[3]:
if call[2]:
s += ", "
s += ", ".join([key + "=" + str(value) for key, value in call[3].items()])
s += ")"
except UnicodeEncodeError:
pass
#log.debug("RPCRequest had some non-ascii text..")
else:
pass
#log.debug("RPCRequest: %s", s)
#log.debug("RPCRequest: %s", format_request(call))
reactor.callLater(0, self.dispatch, *call)
def sendData(self, data):
@ -177,6 +190,7 @@ class DelugeRPCProtocol(Protocol):
:param data: the object that is to be sent to the client. This should
be one of the RPC message types.
:type data: object
"""
self.transport.write(zlib.compress(rencode.dumps(data)))
@ -244,7 +258,7 @@ class DelugeRPCProtocol(Protocol):
try:
ret = component.get("AuthManager").authorize(*args, **kwargs)
if ret:
self.factory.authorized_sessions[self.transport.sessionno] = ret
self.factory.authorized_sessions[self.transport.sessionno] = (ret, args[0])
self.factory.session_protocols[self.transport.sessionno] = self
except Exception, e:
sendError()
@ -273,11 +287,14 @@ class DelugeRPCProtocol(Protocol):
if method in self.factory.methods and self.transport.sessionno in self.factory.authorized_sessions:
try:
method_auth_requirement = self.factory.methods[method]._rpcserver_auth_level
auth_level = self.factory.authorized_sessions[self.transport.sessionno]
auth_level = self.factory.authorized_sessions[self.transport.sessionno][0]
if auth_level < method_auth_requirement:
# This session is not allowed to call this method
log.debug("Session %s is trying to call a method it is not authorized to call!", self.transport.sessionno)
raise NotAuthorizedError("Auth level too low: %s < %s" % (auth_level, method_auth_requirement))
# Set the session_id in the factory so that methods can know
# which session is calling it.
self.factory.session_id = self.transport.sessionno
ret = self.factory.methods[method](*args, **kwargs)
except Exception, e:
sendError()
@ -324,6 +341,8 @@ class RPCServer(component.Component):
self.factory = Factory()
self.factory.protocol = DelugeRPCProtocol
self.factory.session_id = -1
# Holds the registered methods
self.factory.methods = {}
# Holds the session_ids and auth levels
@ -399,6 +418,44 @@ class RPCServer(component.Component):
"""
return self.factory.methods.keys()
def get_session_id(self):
"""
Returns the session id of the current RPC.
:returns: the session id, this will be -1 if no connections have been made
:rtype: int
"""
return self.factory.session_id
def get_session_user(self):
"""
Returns the username calling the current RPC.
:returns: the username of the user calling the current RPC
:rtype: string
"""
session_id = self.get_session_id()
if session_id > -1 and session_id in self.factory.authorized_sessions:
return self.factory.authorized_sessions[session_id][1]
else:
# No connections made yet
return ""
def is_session_valid(self, session_id):
"""
Checks if the session is still valid, eg, if the client is still connected.
:param session_id: the session id
:type session_id: int
:returns: True if the session is valid
:rtype: bool
"""
return session_id in self.factory.authorized_sessions
def emit_event(self, event):
"""
Emits the event to interested clients.

View File

@ -36,6 +36,7 @@
import os
import time
from urllib import unquote
from urlparse import urlparse
from deluge._libtorrent import lt
@ -48,6 +49,31 @@ from deluge.event import *
TORRENT_STATE = deluge.common.TORRENT_STATE
def sanitize_filepath(filepath, folder=False):
"""
Returns a sanitized filepath to pass to libotorrent rename_file().
The filepath will have backslashes substituted along with whitespace
padding and duplicate slashes stripped. If `folder` is True a trailing
slash is appended to the returned filepath.
"""
def clean_filename(filename):
filename = filename.strip()
if filename.replace('.', '') == '':
return ''
return filename
if '\\' in filepath or '/' in filepath:
folderpath = filepath.replace('\\', '/').split('/')
folderpath = [clean_filename(x) for x in folderpath]
newfilepath = '/'.join(filter(None, folderpath))
else:
newfilepath = clean_filename(filepath)
if folder is True:
return newfilepath + '/'
else:
return newfilepath
class TorrentOptions(dict):
def __init__(self):
config = ConfigManager("core.conf").config
@ -72,7 +98,7 @@ class TorrentOptions(dict):
self["file_priorities"] = []
self["mapped_files"] = {}
class Torrent:
class Torrent(object):
"""Torrent holds information about torrents added to the libtorrent session.
"""
def __init__(self, handle, options, state=None, filename=None, magnet=None):
@ -80,6 +106,16 @@ class Torrent:
# Get the core config
self.config = ConfigManager("core.conf")
self.rpcserver = component.get("RPCServer")
# This dict holds previous status dicts returned for this torrent
# We use this to return dicts that only contain changes from the previous
# {session_id: status_dict, ...}
self.prev_status = {}
from twisted.internet.task import LoopingCall
self.prev_status_cleanup_loop = LoopingCall(self.cleanup_prev_status)
self.prev_status_cleanup_loop.start(10)
# Set the libtorrent handle
self.handle = handle
# Set the torrent_id for this torrent
@ -168,6 +204,11 @@ class Torrent:
else:
self.time_added = time.time()
# Keep track if we're forcing a recheck of the torrent so that we can
# repause it after its done if necessary
self.forcing_recheck = False
self.forcing_recheck_paused = False
log.debug("Torrent object created.")
## Options methods ##
@ -219,11 +260,11 @@ class Torrent:
self.handle.set_download_limit(v)
def set_prioritize_first_last(self, prioritize):
self.options["prioritize_first_last_pieces"] = prioritize
if prioritize:
if self.handle.has_metadata():
if self.handle.get_torrent_info().num_files() == 1:
# We only do this if one file is in the torrent
self.options["prioritize_first_last_pieces"] = prioritize
priorities = [1] * self.handle.get_torrent_info().num_pieces()
priorities[0] = 7
priorities[-1] = 7
@ -275,7 +316,9 @@ class Torrent:
self.update_state()
break
self.options["file_priorities"] = file_priorities
self.options["file_priorities"] = self.handle.file_priorities()
if self.options["file_priorities"] != list(file_priorities):
log.warning("File priorities were not set for this torrent")
# Set the first/last priorities if needed
self.set_prioritize_first_last(self.options["prioritize_first_last_pieces"])
@ -285,12 +328,9 @@ class Torrent:
if trackers == None:
trackers = []
for value in self.handle.trackers():
if lt.version_minor < 15:
tracker = {}
tracker["url"] = value.url
tracker["tier"] = value.tier
else:
tracker = value
tracker = {}
tracker["url"] = value.url
tracker["tier"] = value.tier
trackers.append(tracker)
self.trackers = trackers
self.tracker_host = None
@ -333,7 +373,10 @@ class Torrent:
# Set self.state to the ltstate right away just incase we don't hit some
# of the logic below
self.state = str(ltstate)
if ltstate in LTSTATE:
self.state = LTSTATE[ltstate]
else:
self.state = str(ltstate)
log.debug("set_state_based_on_ltstate: %s", deluge.common.LT_TORRENT_STATE[ltstate])
log.debug("session.is_paused: %s", component.get("Core").session.is_paused())
@ -385,15 +428,14 @@ class Torrent:
else:
status = self.status
if self.is_finished and (self.options["stop_at_ratio"] or self.config["stop_seed_at_ratio"]):
if self.is_finished and self.options["stop_at_ratio"]:
# We're a seed, so calculate the time to the 'stop_share_ratio'
if not status.upload_payload_rate:
return 0
stop_ratio = self.config["stop_seed_ratio"] if self.config["stop_seed_at_ratio"] else self.options["stop_ratio"]
stop_ratio = self.options["stop_ratio"]
return ((status.all_time_download * stop_ratio) - status.all_time_upload) / status.upload_payload_rate
left = status.total_wanted - status.total_done
left = status.total_wanted - status.total_wanted_done
if left <= 0 or status.download_payload_rate == 0:
return 0
@ -467,11 +509,11 @@ class Torrent:
ret.append({
"client": client,
"country": country,
"down_speed": peer.down_speed,
"down_speed": peer.payload_down_speed,
"ip": "%s:%s" % (peer.ip[0], peer.ip[1]),
"progress": peer.progress,
"seed": peer.flags & peer.seed,
"up_speed": peer.up_speed,
"up_speed": peer.payload_up_speed,
})
return ret
@ -532,8 +574,21 @@ class Torrent:
return host
return ""
def get_status(self, keys):
"""Returns the status of the torrent based on the keys provided"""
def get_status(self, keys, diff=False):
"""
Returns the status of the torrent based on the keys provided
:param keys: the keys to get the status on
:type keys: list of str
:param diff: if True, will return a diff of the changes since the last
call to get_status based on the session_id
:type diff: bool
:returns: a dictionary of the status keys and their values
:rtype: dict
"""
# Create the full dictionary
self.status = self.handle.status()
if self.handle.has_metadata():
@ -547,6 +602,13 @@ class Torrent:
if distributed_copies < 0:
distributed_copies = 0.0
# Calculate the seeds:peers ratio
if self.status.num_incomplete == 0:
# Use -1.0 to signify infinity
seeds_peers_ratio = -1.0
else:
seeds_peers_ratio = self.status.num_complete / float(self.status.num_incomplete)
#if you add a key here->add it to core.py STATUS_KEYS too.
full_status = {
"active_time": self.status.active_time,
@ -565,6 +627,8 @@ class Torrent:
"message": self.statusmsg,
"move_on_completed_path": self.options["move_completed_path"],
"move_on_completed": self.options["move_completed"],
"move_completed_path": self.options["move_completed_path"],
"move_completed": self.options["move_completed"],
"next_announce": self.status.next_announce.seconds,
"num_peers": self.status.num_peers - self.status.num_seeds,
"num_seeds": self.status.num_seeds,
@ -574,6 +638,7 @@ class Torrent:
"remove_at_ratio": self.options["remove_at_ratio"],
"save_path": self.options["download_location"],
"seeding_time": self.status.seeding_time,
"seeds_peers_ratio": seeds_peers_ratio,
"seed_rank": self.status.seed_rank,
"state": self.state,
"stop_at_ratio": self.options["stop_at_ratio"],
@ -610,7 +675,22 @@ class Torrent:
except UnicodeDecodeError:
return name
elif self.magnet:
try:
keys = dict([k.split('=') for k in self.magnet.split('?')[-1].split('&')])
name = keys.get('dn')
if not name:
return self.torrent_id
name = unquote(name).replace('+', ' ')
try:
return name.decode("utf8", "ignore")
except UnicodeDecodeError:
return name
except:
pass
return self.torrent_id
def ti_priv():
if self.handle.has_metadata():
return self.torrent_info.priv()
@ -664,6 +744,24 @@ class Torrent:
elif key in fns:
status_dict[key] = fns[key]()
session_id = self.rpcserver.get_session_id()
if diff:
if session_id in self.prev_status:
# We have a previous status dict, so lets make a diff
status_diff = {}
for key, value in status_dict.items():
if key in self.prev_status[session_id]:
if value != self.prev_status[session_id][key]:
status_diff[key] = value
else:
status_diff[key] = value
self.prev_status[session_id] = status_dict
return status_diff
self.prev_status[session_id] = status_dict
return status_dict
return status_dict
def apply_options(self):
@ -707,13 +805,8 @@ class Torrent:
if self.handle.is_finished():
# If the torrent has already reached it's 'stop_seed_ratio' then do not do anything
if self.config["stop_seed_at_ratio"] or self.options["stop_at_ratio"]:
if self.options["stop_at_ratio"]:
ratio = self.options["stop_ratio"]
else:
ratio = self.config["stop_seed_ratio"]
if self.get_ratio() >= ratio:
if self.options["stop_at_ratio"]:
if self.get_ratio() >= self.options["stop_ratio"]:
#XXX: This should just be returned in the RPC Response, no event
#self.signals.emit_event("torrent_resume_at_stop_ratio")
return
@ -740,11 +833,25 @@ class Torrent:
def move_storage(self, dest):
"""Move a torrent's storage location"""
if not os.path.exists(dest):
log.error("Could not move storage for torrent %s since %s does not exist!", self.torrent_id, dest)
return False
# Attempt to convert utf8 path to unicode
# Note: Inconsistent encoding for 'dest', needs future investigation
try:
self.handle.move_storage(dest.encode("utf8"))
dest_u = unicode(dest, "utf-8")
except TypeError:
# String is already unicode
dest_u = dest
if not os.path.exists(dest_u):
try:
# Try to make the destination path if it doesn't exist
os.makedirs(dest_u)
except IOError, e:
log.exception(e)
log.error("Could not move storage for torrent %s since %s does not exist and could not create the directory.", self.torrent_id, dest_u)
return False
try:
self.handle.move_storage(dest_u)
except:
return False
@ -806,18 +913,22 @@ class Torrent:
def force_recheck(self):
"""Forces a recheck of the torrents pieces"""
paused = self.handle.is_paused()
try:
self.handle.force_recheck()
self.handle.resume()
except Exception, e:
log.debug("Unable to force recheck: %s", e)
return False
self.forcing_recheck = True
self.forcing_recheck_paused = paused
return True
def rename_files(self, filenames):
"""Renames files in the torrent. 'filenames' should be a list of
(index, filename) pairs."""
for index, filename in filenames:
filename = sanitize_filepath(filename)
self.handle.rename_file(index, filename.encode("utf-8"))
def rename_folder(self, folder, new_folder):
@ -828,8 +939,7 @@ class Torrent:
log.error("Attempting to rename a folder with an invalid folder name: %s", new_folder)
return
if new_folder[-1:] != "/":
new_folder += "/"
new_folder = sanitize_filepath(new_folder, folder=True)
wait_on_folder = (folder, new_folder, [])
for f in self.get_files():
@ -838,3 +948,14 @@ class Torrent:
wait_on_folder[2].append(f["index"])
self.handle.rename_file(f["index"], f["path"].replace(folder, new_folder, 1).encode("utf-8"))
self.waiting_on_folder_rename.append(wait_on_folder)
def cleanup_prev_status(self):
"""
This method gets called to check the validity of the keys in the prev_status
dict. If the key is no longer valid, the dict will be deleted.
"""
for key in self.prev_status.keys():
if not self.rpcserver.is_session_valid(key):
del self.prev_status[key]

View File

@ -17,9 +17,9 @@
#
# You should have received a copy of the GNU General Public License
# along with deluge. If not, write to:
# The Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor
# Boston, MA 02110-1301, USA.
# The Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor
# Boston, MA 02110-1301, USA.
#
# In addition, as a special exception, the copyright holders give
# permission to link the code of portions of this program with the OpenSSL
@ -41,21 +41,21 @@ import os
import time
import shutil
import operator
import re
from twisted.internet import reactor
from twisted.internet.task import LoopingCall
from deluge._libtorrent import lt
from deluge.event import *
from deluge.error import *
import deluge.common
import deluge.component as component
from deluge.configmanager import ConfigManager, get_config_dir
from deluge.core.torrent import Torrent
from deluge.core.torrent import TorrentOptions
import deluge.core.oldstateupgrader
from deluge.common import utf8_encoded
from deluge.log import LOG as log
@ -138,6 +138,7 @@ class TorrentManager(component.Component):
# Create the torrents dict { torrent_id: Torrent }
self.torrents = {}
self.queued_torrents = set()
# This is a list of torrent_id when we shutdown the torrentmanager.
# We use this list to determine if all active torrents have been paused
@ -150,6 +151,9 @@ class TorrentManager(component.Component):
# Keeps track of resume data that needs to be saved to disk
self.resume_data = {}
# Workaround to determine if TorrentAddedEvent is from state file
self.session_started = False
# Register set functions
self.config.register_set_function("max_connections_per_torrent",
self.on_set_max_connections_per_torrent)
@ -191,6 +195,8 @@ class TorrentManager(component.Component):
self.on_alert_metadata_received)
self.alerts.register_handler("file_error_alert",
self.on_alert_file_error)
self.alerts.register_handler("file_completed_alert",
self.on_alert_file_completed)
def start(self):
# Get the pluginmanager reference
@ -225,7 +231,9 @@ class TorrentManager(component.Component):
# torrent_id is removed from it in self.on_alert_torrent_paused()
# before we call self.save_resume_data() here.
save_resume_data_list = []
for key in self.torrents.keys():
for key in self.torrents:
# Stop the status cleanup LoopingCall here
self.torrents[key].prev_status_cleanup_loop.stop()
if not self.torrents[key].handle.is_paused():
# We set auto_managed false to prevent lt from resuming the torrent
self.torrents[key].handle.auto_managed(False)
@ -253,16 +261,13 @@ class TorrentManager(component.Component):
def update(self):
for torrent_id, torrent in self.torrents.items():
if self.config["stop_seed_at_ratio"] or torrent.options["stop_at_ratio"] and torrent.state not in ("Checking", "Allocating", "Paused", "Queued"):
if torrent.options["stop_at_ratio"] and torrent.state not in ("Checking", "Allocating", "Paused", "Queued"):
# If the global setting is set, but the per-torrent isn't.. Just skip to the next torrent
# This is so that a user can turn-off the stop at ratio option on a per-torrent basis
if self.config["stop_seed_at_ratio"] and not torrent.options["stop_at_ratio"]:
if not torrent.options["stop_at_ratio"]:
continue
stop_ratio = self.config["stop_seed_ratio"]
if torrent.options["stop_at_ratio"]:
stop_ratio = torrent.options["stop_ratio"]
if torrent.get_ratio() >= stop_ratio and torrent.is_finished:
if self.config["remove_seed_at_ratio"] or torrent.options["remove_at_ratio"]:
if torrent.get_ratio() >= torrent.options["stop_ratio"] and torrent.is_finished:
if torrent.options["remove_at_ratio"]:
self.remove(torrent_id)
break
if not torrent.handle.is_paused():
@ -373,7 +378,35 @@ class TorrentManager(component.Component):
add_torrent_params["resume_data"] = resume_data
else:
# We have a torrent_info object so we're not loading from state.
# We have a torrent_info object or magnet uri so we're not loading from state.
if torrent_info:
add_torrent_id = str(torrent_info.info_hash())
if add_torrent_id in self.get_torrent_list():
# Torrent already exists just append any extra trackers.
log.debug("Torrent (%s) exists, checking for trackers to add...", add_torrent_id)
add_torrent_trackers = []
for value in torrent_info.trackers():
tracker = {}
tracker["url"] = value.url
tracker["tier"] = value.tier
add_torrent_trackers.append(tracker)
torrent_trackers = {}
tracker_list = []
for tracker in self[add_torrent_id].get_status(["trackers"])["trackers"]:
torrent_trackers[(tracker["url"])] = tracker
tracker_list.append(tracker)
added_tracker = False
for tracker in add_torrent_trackers:
if tracker['url'] not in torrent_trackers:
tracker_list.append(tracker)
added_tracker = True
if added_tracker:
self[add_torrent_id].set_trackers(tracker_list)
return
# Check if options is None and load defaults
if options == None:
options = TorrentOptions()
@ -385,9 +418,10 @@ class TorrentManager(component.Component):
# Check for renamed files and if so, rename them in the torrent_info
# before adding to the session.
if options["mapped_files"]:
for index, name in options["mapped_files"].items():
log.debug("renaming file index %s to %s", index, name)
torrent_info.rename_file(index, name.encode("utf-8"))
for index, filename in options["mapped_files"].items():
filename = deluge.core.torrent.sanitize_filepath(filename)
log.debug("renaming file index %s to %s", index, filename)
torrent_info.rename_file(index, utf8_encoded(filename))
add_torrent_params["ti"] = torrent_info
add_torrent_params["resume_data"] = ""
@ -401,14 +435,8 @@ class TorrentManager(component.Component):
else:
storage_mode = lt.storage_mode_t(1)
try:
# Try to encode this as utf8 if needed
options["download_location"] = options["download_location"].encode("utf8")
except UnicodeDecodeError:
pass
# Fill in the rest of the add_torrent_params dictionary
add_torrent_params["save_path"] = options["download_location"]
add_torrent_params["save_path"] = utf8_encoded(options["download_location"])
add_torrent_params["storage_mode"] = storage_mode
add_torrent_params["paused"] = True
add_torrent_params["auto_managed"] = False
@ -421,7 +449,7 @@ class TorrentManager(component.Component):
handle = None
try:
if magnet:
handle = lt.add_magnet_uri(self.session, magnet, add_torrent_params)
handle = lt.add_magnet_uri(self.session, utf8_encoded(magnet), add_torrent_params)
else:
handle = self.session.add_torrent(add_torrent_params)
except RuntimeError, e:
@ -449,6 +477,9 @@ class TorrentManager(component.Component):
if not options["add_paused"]:
torrent.resume()
# Add to queued torrents set
self.queued_torrents.add(torrent.torrent_id)
# Write the .torrent file to the state directory
if filedump:
try:
@ -479,6 +510,7 @@ class TorrentManager(component.Component):
# Emit the torrent_added signal
component.get("EventManager").emit(TorrentAddedEvent(torrent.torrent_id))
log.info("Torrent %s added by user: %s", torrent.get_status(["name"])["name"], component.get("RPCServer").get_session_user())
return torrent.torrent_id
def load_torrent(self, torrent_id):
@ -518,6 +550,8 @@ class TorrentManager(component.Component):
if torrent_id not in self.torrents:
raise InvalidTorrentError("torrent_id not in session")
torrent_name = self.torrents[torrent_id].get_status(["name"])["name"]
# Emit the signal to the clients
component.get("EventManager").emit(PreTorrentRemovedEvent(torrent_id))
@ -536,6 +570,28 @@ class TorrentManager(component.Component):
# Remove the .torrent file in the state
self.torrents[torrent_id].delete_torrentfile()
# Remove the torrent file from the user specified directory
filename = self.torrents[torrent_id].filename
if self.config["copy_torrent_file"] \
and self.config["del_copy_torrent_file"] \
and filename:
try:
users_torrent_file = os.path.join(
self.config["torrentfiles_location"],
filename)
log.info("Delete user's torrent file: %s",
users_torrent_file)
os.remove(users_torrent_file)
except Exception, e:
log.warning("Unable to remove copy torrent file: %s", e)
# Stop the looping call
self.torrents[torrent_id].prev_status_cleanup_loop.stop()
# Remove from set if it wasn't finished
if not self.torrents[torrent_id].is_finished:
self.queued_torrents.remove(torrent_id)
# Remove the torrent from deluge's session
try:
del self.torrents[torrent_id]
@ -547,7 +603,7 @@ class TorrentManager(component.Component):
# Emit the signal to the clients
component.get("EventManager").emit(TorrentRemovedEvent(torrent_id))
log.info("Torrent %s removed by user: %s", torrent_name, component.get("RPCServer").get_session_user())
return True
def load_state(self):
@ -560,7 +616,7 @@ class TorrentManager(component.Component):
os.path.join(get_config_dir(), "state", "torrents.state"), "rb")
state = cPickle.load(state_file)
state_file.close()
except (EOFError, IOError, Exception), e:
except (EOFError, IOError, Exception, cPickle.UnpicklingError), e:
log.warning("Unable to load state file: %s", e)
# Try to use an old state
@ -587,6 +643,7 @@ class TorrentManager(component.Component):
log.error("Torrent state file is either corrupt or incompatible! %s", e)
break
self.session_started = True
component.get("EventManager").emit(SessionStartedEvent())
def save_state(self):
@ -634,8 +691,8 @@ class TorrentManager(component.Component):
state_file.flush()
os.fsync(state_file.fileno())
state_file.close()
except IOError:
log.warning("Unable to save state file.")
except IOError, e:
log.warning("Unable to save state file: %s", e)
return True
# We have to move the 'torrents.state.new' file to 'torrents.state'
@ -716,6 +773,43 @@ class TorrentManager(component.Component):
except IOError:
log.warning("Error trying to save fastresume file")
def remove_empty_folders(self, torrent_id, folder):
"""
Recursively removes folders but only if they are empty.
Cleans up after libtorrent folder renames.
"""
if torrent_id not in self.torrents:
raise InvalidTorrentError("torrent_id is not in session")
info = self.torrents[torrent_id].get_status(['save_path'])
# Regex removes leading slashes that causes join function to ignore save_path
folder_full_path = os.path.join(info['save_path'], re.sub("^/*", "", folder))
folder_full_path = os.path.normpath(folder_full_path)
try:
if not os.listdir(folder_full_path):
os.removedirs(folder_full_path)
log.debug("Removed Empty Folder %s", folder_full_path)
else:
for root, dirs, files in os.walk(folder_full_path, topdown=False):
for name in dirs:
try:
os.removedirs(os.path.join(root, name))
log.debug("Removed Empty Folder %s", os.path.join(root, name))
except OSError, (errno, strerror):
from errno import ENOTEMPTY
if errno == ENOTEMPTY:
# Error raised if folder is not empty
log.debug("%s", strerror)
except OSError, (errno, strerror):
log.debug("Cannot Remove Folder: %s (ErrNo %s)", strerror, errno)
def get_queue_position(self, torrent_id):
"""Get queue position of torrent"""
return self.torrents[torrent_id].get_queue_position()
def queue_top(self, torrent_id):
"""Queue torrent to top"""
if self.torrents[torrent_id].get_queue_position() == 0:
@ -734,7 +828,7 @@ class TorrentManager(component.Component):
def queue_down(self, torrent_id):
"""Queue torrent down one position"""
if self.torrents[torrent_id].get_queue_position() == (len(self.torrents) - 1):
if self.torrents[torrent_id].get_queue_position() == (len(self.queued_torrents) - 1):
return False
self.torrents[torrent_id].handle.queue_position_down()
@ -742,7 +836,7 @@ class TorrentManager(component.Component):
def queue_bottom(self, torrent_id):
"""Queue torrent to bottom"""
if self.torrents[torrent_id].get_queue_position() == (len(self.torrents) - 1):
if self.torrents[torrent_id].get_queue_position() == (len(self.queued_torrents) - 1):
return False
self.torrents[torrent_id].handle.queue_position_bottom()
@ -775,9 +869,9 @@ class TorrentManager(component.Component):
log.debug("on_alert_torrent_finished")
try:
torrent = self.torrents[str(alert.handle.info_hash())]
torrent_id = str(alert.handle.info_hash())
except:
return
torrent_id = str(alert.handle.info_hash())
log.debug("%s is finished..", torrent_id)
# Get the total_download and if it's 0, do not move.. It's likely
@ -793,11 +887,14 @@ class TorrentManager(component.Component):
if torrent.options["download_location"] != move_path:
torrent.move_storage(move_path)
torrent.is_finished = True
component.get("EventManager").emit(TorrentFinishedEvent(torrent_id))
torrent.is_finished = True
torrent.update_state()
# Torrent is no longer part of the queue
self.queued_torrents.remove(torrent_id)
# Only save resume data if it was actually downloaded something. Helps
# on startup with big queues with lots of seeding torrents. Libtorrent
# emits alert_torrent_finished for them, but there seems like nothing
@ -810,9 +907,9 @@ class TorrentManager(component.Component):
log.debug("on_alert_torrent_paused")
try:
torrent = self.torrents[str(alert.handle.info_hash())]
torrent_id = str(alert.handle.info_hash())
except:
return
torrent_id = str(alert.handle.info_hash())
# Set the torrent state
old_state = torrent.state
torrent.update_state()
@ -835,6 +932,13 @@ class TorrentManager(component.Component):
except:
return
# Check to see if we're forcing a recheck and set it back to paused
# if necessary
if torrent.forcing_recheck:
torrent.forcing_recheck = False
if torrent.forcing_recheck_paused:
torrent.handle.pause()
# Set the torrent state
torrent.update_state()
@ -890,16 +994,16 @@ class TorrentManager(component.Component):
torrent = self.torrents[str(alert.handle.info_hash())]
except:
return
torrent.set_save_path(alert.handle.save_path())
torrent.set_save_path(os.path.normpath(alert.handle.save_path()))
torrent.set_move_completed(False)
def on_alert_torrent_resumed(self, alert):
log.debug("on_alert_torrent_resumed")
try:
torrent = self.torrents[str(alert.handle.info_hash())]
torrent_id = str(alert.handle.info_hash())
except:
return
torrent_id = str(alert.handle.info_hash())
torrent.is_finished = torrent.handle.is_seed()
old_state = torrent.state
torrent.update_state()
if torrent.state != old_state:
@ -917,16 +1021,20 @@ class TorrentManager(component.Component):
old_state = torrent.state
torrent.update_state()
# Torrent may need to download data after checking.
if torrent.state in ('Checking', 'Checking Resume Data', 'Downloading'):
torrent.is_finished = False
self.queued_torrents.add(torrent_id)
# Only emit a state changed event if the state has actually changed
if torrent.state != old_state:
component.get("EventManager").emit(TorrentStateChangedEvent(torrent_id, torrent.state))
def on_alert_save_resume_data(self, alert):
log.debug("on_alert_save_resume_data")
torrent_id = str(alert.handle.info_hash())
try:
torrent_id = str(alert.handle.info_hash())
torrent = self.torrents[torrent_id]
except:
return
@ -957,9 +1065,9 @@ class TorrentManager(component.Component):
log.debug("index: %s name: %s", alert.index, alert.name.decode("utf8"))
try:
torrent = self.torrents[str(alert.handle.info_hash())]
torrent_id = str(alert.handle.info_hash())
except:
return
torrent_id = str(alert.handle.info_hash())
# We need to see if this file index is in a waiting_on_folder list
folder_rename = False
@ -969,6 +1077,8 @@ class TorrentManager(component.Component):
if len(wait_on_folder[2]) == 1:
# This is the last alert we were waiting for, time to send signal
component.get("EventManager").emit(TorrentFolderRenamedEvent(torrent_id, wait_on_folder[0], wait_on_folder[1]))
# Empty folders are removed after libtorrent folder renames
self.remove_empty_folders(torrent_id, wait_on_folder[0])
del torrent.waiting_on_folder_rename[i]
self.save_resume_data((torrent_id,))
break
@ -996,3 +1106,12 @@ class TorrentManager(component.Component):
except:
return
torrent.update_state()
def on_alert_file_completed(self, alert):
log.debug("file_completed_alert: %s", alert.message())
try:
torrent_id = str(alert.handle.info_hash())
except:
return
component.get("EventManager").emit(
TorrentFileCompletedEvent(torrent_id, alert.index))

View File

@ -1,2 +0,0 @@
From: http://famfamfam.com/lab/icons/flags/
"These flag icons are available for free use for any purpose with no requirement for attribution."

Binary file not shown.

After

Width:  |  Height:  |  Size: 723 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 683 B

View File

@ -1,12 +0,0 @@
[Desktop Entry]
Version=1.0
Name=Deluge BitTorrent Client
GenericName=Bittorrent Client
Comment=Transfer files using the Bittorrent protocol
Exec=deluge-gtk
Icon=deluge
Terminal=false
Type=Application
Categories=Network;
StartupNotify=true
MimeType=application/x-bittorrent;

View File

@ -0,0 +1,14 @@
[Desktop Entry]
Version=1.0
_Name=Deluge
_GenericName=BitTorrent Client
_X-GNOME-FullName=Deluge BitTorrent Client
_Comment=Download and share files over BitTorrent
TryExec=deluge-gtk
Exec=deluge-gtk %U
Icon=deluge
Terminal=false
Type=Application
Categories=Network;FileTransfer;P2P;GTK;
StartupNotify=true
MimeType=application/x-bittorrent;x-scheme-handler/magnet;

51
deluge/decorators.py Normal file
View File

@ -0,0 +1,51 @@
#
# decorators.py
#
# Copyright (C) 2010 John Garland <johnnybg+deluge@gmail.com>
#
# Deluge is free software.
#
# You may redistribute it and/or modify it under the terms of the
# GNU General Public License, as published by the Free Software
# Foundation; either version 3 of the License, or (at your option)
# any later version.
#
# deluge is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with deluge. If not, write to:
# The Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor
# Boston, MA 02110-1301, USA.
#
# In addition, as a special exception, the copyright holders give
# permission to link the code of portions of this program with the OpenSSL
# library.
# You must obey the GNU General Public License in all respects for all of
# the code used other than OpenSSL. If you modify file(s) with this
# exception, you may extend this exception to your version of the file(s),
# but you are not obligated to do so. If you do not wish to do so, delete
# this exception statement from your version. If you delete this exception
# statement from all source files in the program, then also delete it here.
#
#
from functools import wraps
def proxy(proxy_func):
"""
Factory class which returns a decorator that passes
the decorated function to a proxy function
:param proxy_func: the proxy function
:type proxy_func: function
"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
return proxy_func(func, *args, **kwargs)
return wrapper
return decorator

View File

@ -164,6 +164,22 @@ class TorrentResumedEvent(DelugeEvent):
"""
self._args = [torrent_id]
class TorrentFileCompletedEvent(DelugeEvent):
"""
Emitted when a file completes.
This will only work with libtorrent 0.15 or greater.
"""
def __init__(self, torrent_id, index):
"""
:param torrent_id: the torrent_id
:type torrent_id: string
:param index: the file index
:type index: int
"""
self._args = [torrent_id, index]
class NewVersionAvailableEvent(DelugeEvent):
"""
Emitted when a more recent version of Deluge is available.

View File

@ -36,27 +36,37 @@ from twisted.web import client, http
from twisted.web.error import PageRedirect
from twisted.python.failure import Failure
from twisted.internet import reactor
from deluge.log import setupLogger, LOG as log
from common import get_version
import os.path
import zlib
class HTTPDownloader(client.HTTPDownloader):
"""
Factory class for downloading files and keeping track of progress.
"""
def __init__(self, url, filename, part_callback=None, headers=None):
def __init__(self, url, filename, part_callback=None, headers=None, force_filename=False, allow_compression=True):
"""
:param url: the url to download from
:type url: string
:param filename: the filename to save the file as
:type filename: string
:param force_filename: forces use of the supplied filename, regardless of header content
:type force_filename: bool
:param part_callback: a function to be called when a part of data
is received, it's signature should be: func(data, current_length, total_length)
:type part_callback: function
:param headers: any optional headers to send
:type headers: dictionary
"""
self.__part_callback = part_callback
self.part_callback = part_callback
self.current_length = 0
self.decoder = None
self.value = filename
client.HTTPDownloader.__init__(self, url, filename, headers=headers)
self.force_filename = force_filename
self.allow_compression = allow_compression
agent = "Deluge/%s (http://deluge-torrent.org)" % get_version()
client.HTTPDownloader.__init__(self, url, filename, headers=headers, agent=agent)
def gotStatus(self, version, status, message):
self.code = int(status)
@ -68,7 +78,30 @@ class HTTPDownloader(client.HTTPDownloader):
self.total_length = int(headers["content-length"][0])
else:
self.total_length = 0
elif self.code in (http.TEMPORARY_REDIRECT, http.MOVED_PERMANENTLY):
if self.allow_compression and "content-encoding" in headers and \
headers["content-encoding"][0] in ("gzip", "x-gzip", "deflate"):
# Adding 32 to the wbits enables gzip & zlib decoding (with automatic header detection)
# Adding 16 just enables gzip decoding (no zlib)
self.decoder = zlib.decompressobj(zlib.MAX_WBITS + 32)
if "content-disposition" in headers and not self.force_filename:
new_file_name = str(headers["content-disposition"][0]).split(";")[1].split("=")[1]
new_file_name = sanitise_filename(new_file_name)
new_file_name = os.path.join(os.path.split(self.fileName)[0], new_file_name)
count = 1
fileroot = os.path.splitext(new_file_name)[0]
fileext = os.path.splitext(new_file_name)[1]
while os.path.isfile(new_file_name):
# Increment filename if already exists
new_file_name = "%s-%s%s" % (fileroot, count, fileext)
count += 1
self.fileName = new_file_name
self.value = new_file_name
elif self.code in (http.MOVED_PERMANENTLY, http.FOUND, http.SEE_OTHER, http.TEMPORARY_REDIRECT):
location = headers["location"][0]
error = PageRedirect(self.code, location=location)
self.noPage(Failure(error))
@ -78,12 +111,50 @@ class HTTPDownloader(client.HTTPDownloader):
def pagePart(self, data):
if self.code == http.OK:
self.current_length += len(data)
if self.__part_callback:
self.__part_callback(data, self.current_length, self.total_length)
if self.decoder:
data = self.decoder.decompress(data)
if self.part_callback:
self.part_callback(data, self.current_length, self.total_length)
return client.HTTPDownloader.pagePart(self, data)
def download_file(url, filename, callback=None, headers=None):
def pageEnd(self):
if self.decoder:
data = self.decoder.flush()
self.current_length -= len(data)
self.decoder = None
self.pagePart(data)
return client.HTTPDownloader.pageEnd(self)
def sanitise_filename(filename):
"""
Sanitises a filename to use as a download destination file.
Logs any filenames that could be considered malicious.
:param filename: the filename to sanitise
:type filename: string
:returns: the sanitised filename
:rtype: string
"""
# Remove any quotes
filename = filename.strip("'\"")
if os.path.basename(filename) != filename:
# Dodgy server, log it
log.warning("Potentially malicious server: trying to write to file '%s'" % filename)
# Only use the basename
filename = os.path.basename(filename)
filename = filename.strip()
if filename.startswith(".") or ";" in filename or "|" in filename:
# Dodgy server, log it
log.warning("Potentially malicious server: trying to write to file '%s'" % filename)
return filename
def download_file(url, filename, callback=None, headers=None, force_filename=False, allow_compression=True):
"""
Downloads a file from a specific URL and returns a Deferred. You can also
specify a callback function to be called as parts are received.
@ -97,6 +168,11 @@ def download_file(url, filename, callback=None, headers=None):
:type callback: function
:param headers: any optional headers to send
:type headers: dictionary
:param force_filename: force us to use the filename specified rather than
one the server may suggest
:type force_filename: boolean
:param allow_compression: allows gzip & deflate decoding
:type allow_compression: boolean
:returns: the filename of the downloaded file
:rtype: Deferred
@ -111,8 +187,13 @@ def download_file(url, filename, callback=None, headers=None):
for key, value in headers.items():
headers[str(key)] = str(value)
if allow_compression:
if not headers:
headers = {}
headers["accept-encoding"] = "deflate, gzip, x-gzip"
scheme, host, port, path = client._parse(url)
factory = HTTPDownloader(url, filename, callback, headers)
factory = HTTPDownloader(url, filename, callback, headers, force_filename, allow_compression)
if scheme == "https":
from twisted.internet import ssl
reactor.connectSSL(host, port, factory, ssl.ClientContextFactory())

View File

@ -1,161 +0,0 @@
deluge/error.py
deluge/common.py
deluge/rencode.py
deluge/httpdownloader.py
deluge/main.py
deluge/configmanager.py
deluge/bencode.py
deluge/__rpcapi.py
deluge/pluginmanagerbase.py
deluge/metafile.py
deluge/event.py
deluge/__init__.py
deluge/_libtorrent.py
deluge/log.py
deluge/component.py
deluge/config.py
deluge/plugins/pluginbase.py
deluge/plugins/init.py
deluge/plugins/__init__.py
deluge/plugins/execute/setup.py
deluge/plugins/execute/execute/common.py
deluge/plugins/execute/execute/core.py
deluge/plugins/execute/execute/gtkui.py
deluge/plugins/execute/execute/__init__.py
deluge/plugins/execute/execute/webui.py
deluge/plugins/execute/execute/data/execute_prefs.glade
deluge/plugins/extractor/setup.py
deluge/plugins/extractor/extractor/common.py
deluge/plugins/extractor/extractor/core.py
deluge/plugins/extractor/extractor/gtkui.py
deluge/plugins/extractor/extractor/__init__.py
deluge/plugins/extractor/extractor/webui.py
deluge/plugins/extractor/extractor/data/extractor_prefs.glade
deluge/plugins/webui/setup.py
deluge/plugins/webui/webui/common.py
deluge/plugins/webui/webui/core.py
deluge/plugins/webui/webui/gtkui.py
deluge/plugins/webui/webui/__init__.py
deluge/plugins/webui/webui/data/config.glade
deluge/plugins/scheduler/setup.py
deluge/plugins/scheduler/scheduler/common.py
deluge/plugins/scheduler/scheduler/core.py
deluge/plugins/scheduler/scheduler/gtkui.py
deluge/plugins/scheduler/scheduler/__init__.py
deluge/plugins/scheduler/scheduler/webui.py
deluge/plugins/label/setup.py
deluge/plugins/label/label/core.py
deluge/plugins/label/label/test.py
deluge/plugins/label/label/__init__.py
deluge/plugins/label/label/webui.py
deluge/plugins/label/label/data/label_pref.glade
deluge/plugins/label/label/data/label_options.glade
deluge/plugins/label/label/gtkui/submenu.py
deluge/plugins/label/label/gtkui/sidebar_menu.py
deluge/plugins/label/label/gtkui/__init__.py
deluge/plugins/label/label/gtkui/label_config.py
deluge/plugins/blocklist/setup.py
deluge/plugins/blocklist/blocklist/readers.py
deluge/plugins/blocklist/blocklist/peerguardian.py
deluge/plugins/blocklist/blocklist/common.py
deluge/plugins/blocklist/blocklist/detect.py
deluge/plugins/blocklist/blocklist/core.py
deluge/plugins/blocklist/blocklist/decompressers.py
deluge/plugins/blocklist/blocklist/gtkui.py
deluge/plugins/blocklist/blocklist/__init__.py
deluge/plugins/blocklist/blocklist/webui.py
deluge/plugins/blocklist/blocklist/data/blocklist_pref.glade
deluge/ui/ui.py
deluge/ui/common.py
deluge/ui/coreconfig.py
deluge/ui/countries.py
deluge/ui/tracker_icons.py
deluge/ui/client.py
deluge/ui/__init__.py
deluge/ui/gtkui/toolbar.py
deluge/ui/gtkui/addtorrentdialog.py
deluge/ui/gtkui/removetorrentdialog.py
deluge/ui/gtkui/status_tab.py
deluge/ui/gtkui/common.py
deluge/ui/gtkui/peers_tab.py
deluge/ui/gtkui/connectionmanager.py
deluge/ui/gtkui/systemtray.py
deluge/ui/gtkui/notification.py
deluge/ui/gtkui/new_release_dialog.py
deluge/ui/gtkui/details_tab.py
deluge/ui/gtkui/options_tab.py
deluge/ui/gtkui/torrentdetails.py
deluge/ui/gtkui/sidebar.py
deluge/ui/gtkui/edittrackersdialog.py
deluge/ui/gtkui/mainwindow.py
deluge/ui/gtkui/dialogs.py
deluge/ui/gtkui/aboutdialog.py
deluge/ui/gtkui/listview.py
deluge/ui/gtkui/createtorrentdialog.py
deluge/ui/gtkui/statusbar.py
deluge/ui/gtkui/ipcinterface.py
deluge/ui/gtkui/gtkui.py
deluge/ui/gtkui/torrentview.py
deluge/ui/gtkui/queuedtorrents.py
deluge/ui/gtkui/filtertreeview.py
deluge/ui/gtkui/__init__.py
deluge/ui/gtkui/menubar.py
deluge/ui/gtkui/files_tab.py
deluge/ui/gtkui/preferences.py
deluge/ui/gtkui/pluginmanager.py
deluge/ui/gtkui/glade/main_window.glade
deluge/ui/gtkui/glade/remove_torrent_dialog.glade
deluge/ui/gtkui/glade/create_torrent_dialog.glade
deluge/ui/gtkui/glade/torrent_menu.glade
deluge/ui/gtkui/glade/edit_trackers.glade
deluge/ui/gtkui/glade/filtertree_menu.glade
deluge/ui/gtkui/glade/tray_menu.glade
deluge/ui/gtkui/glade/dgtkpopups.glade
deluge/ui/gtkui/glade/move_storage_dialog.glade
deluge/ui/gtkui/glade/connection_manager.glade
deluge/ui/gtkui/glade/queuedtorrents.glade
deluge/ui/gtkui/glade/add_torrent_dialog.glade
deluge/ui/gtkui/glade/preferences_dialog.glade
deluge/ui/web/gen_gettext.py
deluge/ui/web/web.py
deluge/ui/web/common.py
deluge/ui/web/auth.py
deluge/ui/web/server.py
deluge/ui/web/__init__.py
deluge/ui/web/json_api.py
deluge/ui/web/pluginmanager.py
deluge/ui/console/eventlog.py
deluge/ui/console/main.py
deluge/ui/console/statusbars.py
deluge/ui/console/colors.py
deluge/ui/console/__init__.py
deluge/ui/console/screen.py
deluge/ui/console/commands/quit.py
deluge/ui/console/commands/help.py
deluge/ui/console/commands/add.py
deluge/ui/console/commands/pause.py
deluge/ui/console/commands/resume.py
deluge/ui/console/commands/halt.py
deluge/ui/console/commands/recheck.py
deluge/ui/console/commands/cache.py
deluge/ui/console/commands/connect.py
deluge/ui/console/commands/plugin.py
deluge/ui/console/commands/info.py
deluge/ui/console/commands/__init__.py
deluge/ui/console/commands/rm.py
deluge/ui/console/commands/config.py
deluge/ui/console/commands/debug.py
deluge/core/torrent.py
deluge/core/alertmanager.py
deluge/core/filtermanager.py
deluge/core/authmanager.py
deluge/core/core.py
deluge/core/preferencesmanager.py
deluge/core/torrentmanager.py
deluge/core/oldstateupgrader.py
deluge/core/__init__.py
deluge/core/rpcserver.py
deluge/core/daemon.py
deluge/core/eventmanager.py
deluge/core/pluginmanager.py
deluge/core/autoadd.py

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

3761
deluge/i18n/fo.po Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

3761
deluge/i18n/lb.po Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

3743
deluge/i18n/ml.po Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

3743
deluge/i18n/te.po Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More