Compare commits

...

1987 Commits

Author SHA1 Message Date
43f5581cf1 Fix installing with --root 2008-12-12 04:23:47 +00:00
c773b97334 debian packaging fix 2008-12-11 17:34:29 +00:00
bd3cba4cce Add do_egg_install() 2008-12-11 08:22:17 +00:00
e58006b5d4 Fix installing scripts 2008-12-11 05:40:06 +00:00
3f2ef1b457 Fix setup.py in 1.0.7 2008-12-11 03:55:30 +00:00
e4d40a3bb3 Tag 1.0.7 release 2008-12-10 23:42:55 +00:00
2bde2c823b Prep for release 2008-12-10 23:34:36 +00:00
84499c1cc1 lt sync 4382 2008-12-10 23:30:59 +00:00
e7914ed520 Change libtorrent import behaviour to first try importing deluge.libtorrent and then libtorrent. It will now also raise an ImportError if libtorrent version is not 0.14. 2008-12-10 23:30:09 +00:00
cbb7c6119d Fix some minor bugs in ConnectionManager 2008-12-10 10:24:15 +00:00
808758cd16 Fix file removal 2008-12-10 10:00:21 +00:00
983440ab20 lang sync 2008-12-10 03:16:52 +00:00
dab76ff653 point default blocklist to our server and up interval to 4 days 2008-12-10 02:34:32 +00:00
27917fa769 fix #547 add description to name field per HIG entry 2.1.1.1 2008-12-09 04:10:46 +00:00
53db6a2e01 fix #571 notification-daemon-xfce dependency circle 2008-12-09 03:57:36 +00:00
a3186c642c pots updates 2008-12-09 03:42:18 +00:00
9c2db32532 partial fix to #640. more work needed 2008-12-09 03:28:30 +00:00
4b58aa10ea clean up/finish oxygen 2008-12-06 20:42:43 +00:00
107c2aca80 switch to oxygen icon set 2008-12-06 20:03:12 +00:00
9117823cbd lang sync 2008-12-06 04:56:35 +00:00
52e1c0d8cd Fix #636 not setting the daemon's config directory when using --config=
with the UI in classic mode.
2008-12-05 21:59:40 +00:00
8fac7ed86e Remove unnecessary libtorrent files 2008-12-02 20:39:18 +00:00
fad83d56e8 Fix shutting deluged down when using Python 2.6 2008-12-02 04:48:57 +00:00
42c6af12e0 Fix issue in setup.py where it would try to compile mapped_storage.cpp
or memdebug.cpp
2008-12-01 16:28:12 +00:00
4427e612af update changelog 2008-12-01 06:24:24 +00:00
2dcc3368b0 Do not build memdebug.cpp 2008-12-01 01:43:19 +00:00
ad252697bc lt sync 3006 2008-12-01 01:13:28 +00:00
e38ce4fb20 Prep for release 2008-12-01 01:11:28 +00:00
f7d6dcb425 Log socket or xmlrpc errors that cause the ui to disconnect from the
core
2008-11-30 21:18:11 +00:00
d35de1986b lang sync 2008-11-30 20:26:39 +00:00
b18f1cddbc Add license info for blocklist icons
Fix up copyright notice in debugerror.py
2008-11-30 20:02:11 +00:00
00cf7a8f34 Fix typo 2008-11-30 19:27:51 +00:00
1afef3425f Fix up some licence stuff 2008-11-30 19:25:45 +00:00
18cc95933a Better libtorrent check in setup 2008-11-30 01:11:26 +00:00
aeb6b96987 lt sync 2996 2008-11-30 00:24:13 +00:00
318b81f62b fix icon in new release dialog for windows 2008-11-29 23:28:11 +00:00
14e34c8f03 lt sync 2995 - add port number of host field in http requests 2008-11-29 23:05:03 +00:00
cfec86be75 lt sync 2994 2008-11-29 21:53:57 +00:00
0fe3d4d1af Clean-up gettext code and make it more portable 2008-11-29 21:21:05 +00:00
f42564b1aa Fix building on FreeBSD
Add some more metadata
2008-11-29 20:48:37 +00:00
ae1ac12ff8 Change xpm icon size to 32x32 2008-11-29 18:11:21 +00:00
b96833d92c Add blurb about icon copyright 2008-11-29 17:53:04 +00:00
49ea917368 Fix man page 2008-11-29 17:25:00 +00:00
0aacfca848 Add 'deluge.xpm' 2008-11-29 17:24:02 +00:00
ebd6229c77 Have setup.py obey prefix when installing data files.
Add manpages to data files.
2008-11-29 02:12:09 +00:00
fb0d46fefe Build translations in the build folder 2008-11-29 01:22:29 +00:00
964c5fbc4f Remove OpenSSL exception from headers 2008-11-28 17:54:17 +00:00
b70aabd129 lang sync 2008-11-28 06:10:20 +00:00
0f73da5a6a licensing 2008-11-26 19:41:56 +00:00
8a2d110ef6 lt sync 2987 2008-11-26 09:14:19 +00:00
eefa2f49a0 Remove install class 2008-11-26 06:50:39 +00:00
1f94e7db20 use new manpages in debian packaging 2008-11-25 23:45:14 +00:00
ce54df008a Add manpages 2008-11-25 23:21:22 +00:00
88346a5722 Fallback to using DNS for geoip lookups if the database file is not
available
2008-11-25 22:43:31 +00:00
98f65f13cf Include a 'clean_plugins' command and make sure it's run with 'clean' 2008-11-25 22:21:14 +00:00
d880cfa8d2 licensing 2008-11-25 17:42:38 +00:00
f9d30b7071 Create a 'build_plugins' command and clean-up setup.py 2008-11-23 05:57:35 +00:00
80ab83b363 Remove OpenSSL exception from license headers 2008-11-23 04:58:01 +00:00
bb4927d513 rate_limit_ip_overhead:fix 2008-11-22 13:58:45 +00:00
2f64f74325 rate_limit_ip_overhead 2008-11-22 13:57:13 +00:00
442a42a1e2 remove webui LICENSE 2008-11-22 11:05:48 +00:00
342ddbe4ad Add an option to not include IP overhead in rate limiting (setting False
is equivalent to how 0.5.x behaves)
2008-11-22 09:00:01 +00:00
9601ca2f86 Fix displaying the total downloaded field 2008-11-22 08:47:40 +00:00
e0356b7f10 Fix invalidating the torrent status and torrent_info prior to building
the status dict
2008-11-22 08:47:16 +00:00
9698b36523 lt sync 2969 2008-11-22 01:00:58 +00:00
840eff412e licensing 2008-11-21 22:56:25 +00:00
37471572da Update flag icon license 2008-11-21 12:00:53 +00:00
f046f0e1cf Include GeoIP license 2008-11-21 11:46:05 +00:00
ab76923de3 moe tango license 2008-11-20 19:49:25 +00:00
b20c95bb6a fix license, again 2008-11-20 19:45:15 +00:00
045533bcb8 fix license 2008-11-20 19:15:19 +00:00
3106f54c35 fix executable flag 2008-11-20 18:01:00 +00:00
ba6b6cfd77 lt sync 2946 2008-11-17 09:04:33 +00:00
4e4fbbc87c Prevent wrongly encoded torrents from causing an xmlrpc exception thus causing
a blank torrent list
2008-11-17 08:28:32 +00:00
dac3c5d3e9 Remove trailing whitspace from *.py 2008-11-17 00:57:32 +00:00
1ca215d8f5 Update Changelog 2008-11-17 00:52:13 +00:00
7dff5178e6 Fix #475 catch unicode decoding errors 2008-11-16 08:29:31 +00:00
87a8085ef7 Show all_time_download instead of total_done in the stats tab 2008-11-16 08:28:44 +00:00
4f59847ef7 remove broken choose files 2008-11-15 10:20:40 +00:00
257f3274d0 2931 assert fix 2008-11-13 01:46:29 +00:00
810f332ae8 Fix building when system libtorrent is present 2008-11-12 12:05:52 +00:00
1d49ec4bfb lt sync 2926 2008-11-12 03:58:03 +00:00
49d2a544a8 two new languages 2008-11-12 03:56:36 +00:00
5e13fae1ee changelog update 2008-11-09 22:02:58 +00:00
613ca12bc2 prep for release 2008-11-09 19:30:55 +00:00
1e38e4865d lang sync 2008-11-08 22:56:11 +00:00
3ae023774f update pots 2008-11-08 20:34:21 +00:00
790dcc49ca Fix #528 make sure gtkui config file is written before exiting 2008-11-08 08:04:46 +00:00
43c8d0ead2 Increase the per-torrent stop share ratio max to 99999.0 and make the
spinner and remove at ratio checkbox insensitive if stop at ratio not 
checked
2008-11-08 06:17:42 +00:00
87cc010d5b forgot js file for refresh 2008-11-06 16:32:03 +00:00
65c8b04723 auto refresh details2 2008-11-05 22:10:33 +00:00
c5ffbd04e8 auto refresh details 2008-11-05 22:05:49 +00:00
80318855f9 javascript auto-refresh 2008-11-05 21:53:11 +00:00
040337982f Fix #577 adding torrents by drag n' drop in windows 2008-11-02 23:22:55 +00:00
e89251b545 lt sync 2896 2008-11-02 21:49:06 +00:00
0661c70594 add udp to is_url to allow udp trackers 2008-11-01 03:30:20 +00:00
3b1e93bf88 utf8 fixes 2008-10-30 23:59:15 +00:00
43d5df5a0a use 1.36 on windows 2008-10-30 22:53:26 +00:00
3ef8ddac10 Fix building in windows 2008-10-30 20:56:10 +00:00
b72ae5d5cc lt sync 2881 2008-10-30 17:23:36 +00:00
bacb57a795 Prep for release 2008-10-30 16:57:19 +00:00
45eecc5c25 lt 2879-storage cleanup and truncating files that are larger than they should be 2008-10-30 06:38:25 +00:00
8a092a2f79 lt 2876 - support for UPnP routers that don't provide a urlbase 2008-10-29 02:42:45 +00:00
12a6be4e20 Update bindings 2008-10-28 22:20:46 +00:00
bf7b9ec09f 2873 upnp fix 2008-10-28 21:37:33 +00:00
10181dc7ee update translator credits 2008-10-28 03:18:57 +00:00
30cb3673f1 update list of files for pot 2008-10-27 23:19:42 +00:00
5ce2bbcbcc lt sync 2868 2008-10-27 06:06:51 +00:00
feaee5f344 Have torrent.get_ratio return -1 when downloaded bytes is 0.
Have torrentview and statistics_tab display an infinity character when 
ratio is -1
2008-10-26 21:10:03 +00:00
97fb9f8aee Better fix for #565 2008-10-24 07:43:34 +00:00
dd86ac9bcc Fix #565 wait for the deluged process to start to prevent defunct
processes
2008-10-24 07:39:14 +00:00
1fbf983ff6 Fix #545 use proper values in ratio calculation 2008-10-23 16:52:09 +00:00
e4c72c7dce Fix #560 force an int value for global max connections 2008-10-23 16:19:28 +00:00
0c9a3751e4 Fix and clean-up os checking functions 2008-10-23 11:27:37 +00:00
0e9c61d4be Fix locale stuff on OS X 2008-10-23 08:21:25 +00:00
b5fdadc2aa Windows build system fixes 2008-10-23 08:13:08 +00:00
7d10b60811 Handle OS X better in the build system - patch from hydri 2008-10-23 08:05:02 +00:00
87e77565fc add darwin check to common 2008-10-23 07:22:08 +00:00
ce191efc54 fix problem that sometimes occured when switching back and forth between daemons without disconnecting first 2008-10-22 08:54:26 +00:00
3360c9c754 Fix the alert_type magic to work when libtorrent is not in the deluge
module
2008-10-19 05:43:58 +00:00
63c314843e lang sync 2008-10-19 00:09:47 +00:00
be2b266ba8 lt sync 2836 2008-10-18 23:57:39 +00:00
1458db6b03 Re-add "Max Connections per Second" setting 2008-10-18 23:55:27 +00:00
16ba61dbf5 Prep for release 2008-10-18 21:38:54 +00:00
46352b6f13 ly sync 2832 2008-10-18 21:22:44 +00:00
82d15c856a maid service 2008-10-17 21:42:09 +00:00
5315620ca2 lt sync 2824 - fix segfault when passing None to torrent_info() 2008-10-17 19:38:33 +00:00
40d6716e74 Remove max connections per second from config dialog. 2008-10-17 18:38:19 +00:00
efec531c75 lt sync 2823 2008-10-17 17:54:07 +00:00
cc7e6d1ff2 Deluge will now use a system libtorrent library if available. 2008-10-17 17:52:12 +00:00
e2b9d5d936 fix bad opera fix 2008-10-16 17:19:58 +00:00
5f8fef7996 changelog 2008-10-16 17:17:27 +00:00
03a37062d4 fix opera tested on 2008-10-16 17:12:22 +00:00
0534b24609 Fix IP filter 2008-10-15 23:57:03 +00:00
130d7c08a0 lt sync 2803 2008-10-15 20:55:20 +00:00
ea6a6ec9bc Use "127.0.0.1" instead of "localhost" when starting the SignalReceiver 2008-10-15 19:19:12 +00:00
d0da82de21 Change to use 'all_time_upload' and 'all_time_download' due to change
in recent libtorrent revision
2008-10-15 18:49:51 +00:00
8cc74af9c3 lt sync 2802 2008-10-15 18:45:35 +00:00
f75c0cf096 lt sync 2796 2008-10-14 16:13:23 +00:00
244ba86b8a use multithreaded ssl on windows 2008-10-11 07:30:18 +00:00
054cc120de lang sync 2008-10-11 04:45:42 +00:00
fbdb1479ad Update for release 2008-10-10 22:45:41 +00:00
ec8c45e940 Fix issue where torrents will not be properly added to the session 2008-10-10 22:01:10 +00:00
1b29b6bfc9 Updates for release 2008-10-10 05:11:46 +00:00
158bfbcb6e lt sync 2781 2008-10-10 05:00:40 +00:00
a37d739b0b Properly line wrap tracker messages 2008-10-09 07:26:48 +00:00
353795f02a Change max connections default setting to 200 2008-10-09 03:41:06 +00:00
798b27cf34 Fix freezing on start-up issues on systems that do not have a properly
configured localhost entry.
2008-10-08 13:32:02 +00:00
acd64e6381 Prevent being able to set file priorities for compactly allocated
torrents as it is not intended to work.
2008-10-08 12:42:59 +00:00
70c588dba6 lt sync 2776 2008-10-08 12:40:46 +00:00
8d10642ec7 Changed max half-open connections default limit to 8 on XP/2000 and 4 on
Vista
2008-10-07 08:54:19 +00:00
76eac8b51c Removed the 'Maximum Connections Per Second' setting and replaced it
with a default setting of 20.  This should alleviate speed issues some are 
experiencing.
2008-10-07 08:44:06 +00:00
a168265753 Update python bindings in RC branch 2008-10-07 08:42:51 +00:00
eafb404b7b Set max connections per second default to 20 since this seems to fix
the slow speed issue that some people experience.
2008-10-06 10:58:28 +00:00
fa42b06e34 lt sync 2749 2008-10-01 19:11:13 +00:00
56b806ce78 Fix add_torrent_url() to download the torrent file in a thread to
prevent the main thread from blocking and causing the daemon to freeze.
2008-10-01 18:31:55 +00:00
c2427ccb7d Prevent libtorrent from starting the default plugins and features. 2008-10-01 02:19:44 +00:00
090de9bfa8 lt sync 2744 2008-09-30 22:37:50 +00:00
cd2084b421 Improve performance of files tab by only updating when values change 2008-09-29 23:52:53 +00:00
4b5dc6bc28 Fix display of tracker error messages 2008-09-29 23:11:17 +00:00
9486b24907 Change the default max global upload slots to 4 instead of -1 since
libtorrent will automatically open more slots to meet the upload speed 
limit.
2008-09-29 19:12:27 +00:00
7ee5547066 add enable auto add checkbox 2008-09-28 00:16:01 +00:00
c432b82e69 lt sync 2726 2008-09-25 20:45:31 +00:00
26d58d4057 Fix #503 change the boost lib detection logic to first look for -mt
and if not available, fall back to regular boost lib (non-multithreaded)
2008-09-25 03:30:08 +00:00
1cf863a022 Fix #187 set a 5 second timer to save the config file after a config
value has been changed.
2008-09-25 02:11:02 +00:00
8660209d28 fix missing gtk-add 2008-09-22 21:46:11 +00:00
bbd862e086 lang updates 2008-09-21 03:06:21 +00:00
f7f00de52c lt sync 2696 2008-09-21 01:44:11 +00:00
baaafefb89 Prepping for release 2008-09-21 01:40:29 +00:00
262279b27f Fix upgrading from 0.5.x state where torrents would have no trackers 2008-09-21 01:38:43 +00:00
3c33018079 add classic tooltip 2008-09-20 21:28:55 +00:00
fb23f229fb Remove more un-used files 2008-09-20 02:25:55 +00:00
2e3a9ce28c lt sync 2690 2008-09-19 22:57:05 +00:00
a0f90acfc8 Include GeoIP database for country look-ups 2008-09-19 20:11:50 +00:00
34d34b785c lt sync 2676 2008-09-16 02:39:03 +00:00
90053270d5 Convert unicode to str before saving to config. This should fix unicode
path issues.
2008-09-15 19:50:49 +00:00
a1df9626e5 Update dates 2008-09-14 21:41:53 +00:00
84e58626a9 Workaround bad cast in listen_failed alert 2008-09-14 21:33:03 +00:00
761586b2a8 Fix setting file priorities on folders 2008-09-14 20:49:45 +00:00
57f1409a55 Only show the error when displaying the tracker_error 2008-09-14 20:31:21 +00:00
14bfebdb98 Fix move_storage when using unicode path 2008-09-14 20:16:35 +00:00
95e40aa64b Fix #475 the use of unicode paths when adding torrents 2008-09-14 20:08:19 +00:00
b246457b91 include faq 2008-09-14 19:02:06 +00:00
0c39331295 force local only 2008-09-13 23:01:53 +00:00
66c986c305 fix status bar wtf 2008-09-13 02:31:45 +00:00
ccfead4e6c fix invariant 2008-09-13 02:24:10 +00:00
88e5c07564 allow network mounts 2008-09-13 00:31:59 +00:00
40633277d8 Update changelog 2008-09-12 21:52:59 +00:00
d60c595599 up date 2008-09-10 03:59:11 +00:00
fc6edca315 Updates for RC9 2008-09-10 03:20:52 +00:00
bd8dcbce91 lt sync 2667 2008-09-07 10:44:46 +00:00
7adf503bb6 Prevent libtorrent from crashing when 'announce' is not in the tracker
url.
2008-09-07 08:46:41 +00:00
67c0069c7a Fix last by just always deleting the fastresume file before writing a
new one
2008-09-06 22:24:35 +00:00
4094601f6e fix problem with old fastresume files not being replaced causing loss of data and dont resave fastresume for seed files 2008-09-06 20:11:12 +00:00
3178582312 lt sync 2650 2008-09-01 02:02:04 +00:00
2f6d98693d add missing of last 2008-08-31 23:37:49 +00:00
1e4f53b716 add gtk stock clearing script and update glade files 2008-08-31 23:37:02 +00:00
4731d4814f Fix various issues when not using English 2008-08-31 20:20:16 +00:00
584226db96 Fix add torrent dialog closing preventing another dialog from being
shown
2008-08-28 20:42:19 +00:00
135a0ca7e9 Fix typo in [3766] 2008-08-28 04:03:39 +00:00
892e642502 lt sync 2642 2008-08-28 03:56:28 +00:00
6f7e814e76 Remove test plugin 2008-08-28 01:56:00 +00:00
39e8fd772b Have setup use boost-mt libraries if boost libs are not found 2008-08-28 01:53:17 +00:00
2a5e346313 lang sync 2008-08-27 01:17:39 +00:00
4fb8fe54c9 up version in debs 2008-08-27 01:04:41 +00:00
acf59dd287 Prep for RC8 2008-08-27 01:03:50 +00:00
f2d80343c7 Fix #453 allow showing of text in the toolbar buttons 2008-08-26 23:11:47 +00:00
f15971bdeb Fix setting file priorities on folders 2008-08-26 23:00:12 +00:00
6afe33d584 Tracker errors now change the tracker status 2008-08-26 22:38:22 +00:00
53853f043e Fix #455 force recheck on completed torrents causing crash 2008-08-26 21:34:51 +00:00
bc0612d951 lt sync 2637 2008-08-26 01:03:39 +00:00
edb60072f5 lt sync 2630 2008-08-25 16:42:22 +00:00
b1dbca37c3 Change default 'torrentfiles_location' to just the default download
directory
2008-08-25 03:26:38 +00:00
7bde1e549a translator updates 2008-08-24 10:37:15 +00:00
9e04988422 lang sync 2008-08-24 10:04:28 +00:00
cccd1b8436 Fix bug in Blocklist that prevented downloading of new file every X days 2008-08-23 13:00:35 +00:00
5f20e2139d lt sync 2626 2008-08-23 08:09:52 +00:00
ab9842e4c1 Sort filenames alphabetically in add torrent dialog 2008-08-23 03:57:37 +00:00
240c60aa74 lang updates 2008-08-22 07:57:20 +00:00
d8bdaff0cc lang updates 2008-08-22 07:56:33 +00:00
4a4ffdab63 Attempt to upgrade a 0.5.x state file to new format. 2008-08-21 20:43:01 +00:00
d83a748401 lt sync 2613 2008-08-19 07:45:23 +00:00
dac94c5038 Fix #407 possible negative ETA 2008-08-18 00:36:19 +00:00
ed5e080b6d Expand root folder in files tab by default 2008-08-17 23:31:54 +00:00
cbab9cd823 Fix not displaying file list when state changes 2008-08-17 23:24:16 +00:00
971308416b Update ChangeLog 2008-08-17 22:44:23 +00:00
8564f45e59 fix open folder/file in windows 2008-08-17 22:40:59 +00:00
6948c81d01 Fix torrentview sorting to be persistent 2008-08-17 22:26:48 +00:00
7665f5394a rc prep 2008-08-17 21:55:32 +00:00
7b31434287 Fix #415 crash when using 'config-set' with no parameters 2008-08-17 18:06:08 +00:00
bba9c1a54f Fix size units to be more accurate 2008-08-17 17:51:31 +00:00
73b3ff8a0f Fix to prevent Deluge from segfaulting when trying to autoadd an
incomplete torrent file
2008-08-17 17:27:56 +00:00
67b85a9f89 Fix properly shutting Deluge down when system shuts down 2008-08-17 04:51:28 +00:00
165b97751d Fix not showing new torrents if you don't use the All label first 2008-08-17 04:18:59 +00:00
26fc7cf13f lang updates 2008-08-17 02:58:45 +00:00
c0cced9747 Fix-up the main startup code a bit so that Windows is always logging to
a file and config folders are properly created for the daemon
2008-08-17 00:56:29 +00:00
cd391ca749 lt sync 2607 - fixes upnp 2008-08-17 00:10:56 +00:00
8ecc336152 Fix loading torrents from state when fastresume file is missing 2008-08-16 23:55:45 +00:00
9280a9609e Fix hiding the bottom pane when disabling all the tabs 2008-08-16 05:28:12 +00:00
a118d3e7d5 Improve performance of initial torrent list load 2008-08-15 03:50:25 +00:00
61b9e4ae0e Fix Vista slowness fix, by not actually changing the 'uri', but simply
replacing 'localhost' with '127.0.0.1' when creating the xmlrpc object.
2008-08-14 07:03:04 +00:00
1a9376b7ea add 'edit' tracker to edit trackers dialog 2008-08-14 01:27:23 +00:00
2edaeae60e Fix Vista slowness issue 2008-08-13 19:40:41 +00:00
01ed7d6012 Add missing file 2008-08-13 19:14:30 +00:00
3152dd1a9a cpu fix to changelog 2008-08-13 03:24:36 +00:00
560604ade9 up for release 2008-08-13 03:21:30 +00:00
766a055d65 asio changeset 48031 - cpu spike fix (hopefully) 2008-08-13 02:37:14 +00:00
073f8ff544 lt sync 2599 2008-08-12 10:16:00 +00:00
43982adc3a Fix building python bindings 2008-08-12 08:46:28 +00:00
922e34f025 lt sync 2598 2008-08-12 08:45:25 +00:00
bf69584b99 lang sync 2008-08-12 08:26:24 +00:00
470deeb8ed lang updates 2008-08-12 08:17:35 +00:00
d880015eae more gpl3 switches 2008-08-09 00:04:27 +00:00
f6b6a44d4c change copyright notices to gpl3 2008-08-08 05:59:07 +00:00
4332627a33 lang sync 2008-08-08 05:19:55 +00:00
6182d5f14b Fix homepage link in about dialog 2008-08-07 00:37:48 +00:00
40ab319f64 Fix move storage dialog when connected to a remote daemon 2008-08-05 01:17:56 +00:00
a2e0eae18a Prep for next release 2008-08-04 09:22:25 +00:00
f5b398aaea Fix changelog overwrite 2008-08-03 20:25:45 +00:00
9402ab1781 Fix drag n' drop in windows 2008-08-03 20:12:35 +00:00
e10a02b4e2 tweak alphabetical order 2008-08-03 07:17:28 +00:00
26eb9e9658 up version for rc5 2008-08-02 23:31:07 +00:00
4d1ff54c03 remove ajax_demo template 2008-08-02 10:20:32 +00:00
c861110047 add translators to credits 2008-08-02 07:19:25 +00:00
1170675310 fix libtorrent portion of license 2008-08-02 06:18:10 +00:00
7e56c5568c fix typo 2008-08-02 06:07:43 +00:00
8eb7eb7dae update control to gpl3 and copyright info 2008-08-02 06:04:53 +00:00
f23520664a revert last 2008-08-02 05:55:09 +00:00
ce638455fd add json to dependency list 2008-08-02 05:51:26 +00:00
21050caaa6 lang sync 2008-08-02 05:44:28 +00:00
325746bfa0 Fix queue order shuffling on restart 2008-08-02 04:31:30 +00:00
f853ac209b Handle shutting down more cleanly in the gtkui 2008-08-02 03:25:34 +00:00
da309c66c3 Save resume data periodically 2008-08-02 03:12:15 +00:00
897ef1135d Fix blocklist file info when no file is downloaded 2008-08-02 02:32:16 +00:00
ab89338dac Improve Blocklist preferences page 2008-07-29 08:00:50 +00:00
537c596e21 Fix deluged running with ssh X forwarding by removing the Gnome lib
import
2008-07-29 04:22:03 +00:00
d03d1f1483 Prep for RC5 2008-07-28 23:58:27 +00:00
af25aee9e2 fix process_args 2008-07-28 23:51:48 +00:00
ad6f16f69d Double-clicking on host in ConnectionManager now will connect to that
host
2008-07-28 23:38:24 +00:00
78eabc66a8 Fix signalreceiver when switching between daemons 2008-07-28 12:02:01 +00:00
feb54cd785 Fix view options to be persistent between sessions 2008-07-26 08:12:34 +00:00
c873360ca6 Fix last again 2008-07-26 04:17:43 +00:00
10ad76b2f4 Fix last 2008-07-26 04:16:56 +00:00
63ede39505 Add drag n' drop support for torrent file adding 2008-07-26 04:06:35 +00:00
f26f9c6331 Fix do not create torrentfiles folder unless 'copy_torrent_file' is True 2008-07-26 03:51:53 +00:00
2102c0b910 lang sync 2008-07-25 22:05:14 +00:00
d71b4a132e Fix displaying of torrents when language is not English 2008-07-24 05:57:00 +00:00
e3a55b8923 revert tab i18n 2008-07-23 22:27:50 +00:00
a5178a875c make tab names i18n 2008-07-23 22:07:24 +00:00
9d416efbd2 add translations to rc 2008-07-23 21:54:58 +00:00
e481be0ccd Modify files tab right-click menu behaviour to that of torrentviews 2008-07-23 02:57:16 +00:00
4abb436e34 Fix last 2008-07-22 07:27:21 +00:00
753f624805 Display 'total_wanted' instead of 'total_size' in Size column 2008-07-22 06:44:28 +00:00
063564655e Update version for next RC 2008-07-22 06:26:49 +00:00
54a3e04e26 Fix building with gcc 4.3 2008-07-22 06:26:31 +00:00
bbee37f54f Fix right-click selecting torrents. Behaviour is now similar to Nautilus. 2008-07-22 04:01:37 +00:00
ca7ad6daf3 Update 2008-07-21 09:16:49 +00:00
f4ccc4bd79 Set 'send_redundant_have' to True 2008-07-21 06:36:34 +00:00
fc717fbc0e Include LICENSE file
Change license type in setup.py to GPLv3
2008-07-21 00:58:10 +00:00
0e6f48d1de Branch off 1.0.0_RC. Trunk will now become 1.1.0. 2008-07-20 20:38:05 +00:00
8f8b87987b Update changelog 2008-07-20 20:34:18 +00:00
fefc78f468 Fix #358 properly emit torrent_removed signal to clients when torrent is
removed by queue system
2008-07-20 20:32:54 +00:00
692ff7a979 Add session::settings() to bindings 2008-07-20 20:18:27 +00:00
2789fe95be update lang files for rc3 2008-07-20 20:11:37 +00:00
8d5aa9c6e0 remove url validation 2008-07-20 19:11:02 +00:00
13f67b609b finally finish lt sync 2008-07-20 18:46:41 +00:00
4990d273a4 combine download/import 2008-07-20 07:29:55 +00:00
4368554937 less verbose label text 2008-07-20 07:11:31 +00:00
bef1a94b2b new and improved blocklist cfg 2008-07-20 07:06:31 +00:00
bdfdf0bf21 fix config template 2008-07-20 07:02:38 +00:00
ddf79fb062 add more global-bandwith settings 2008-07-20 05:51:36 +00:00
4ebba67fa4 fix logfile for deluge 2008-07-20 04:40:22 +00:00
f52ebbe541 fix alignment of description 2008-07-20 03:55:01 +00:00
f222b2737e Add some extra bandwidth settings 2008-07-20 00:44:02 +00:00
f61a8bb023 Show preferences page when clicking on blocklist statusbar item 2008-07-19 23:00:28 +00:00
5ed244cad6 Reset IP Filter when disabling blocklist plugin 2008-07-19 22:48:34 +00:00
64e8a34940 Blocklist updates 2008-07-19 22:37:40 +00:00
31a4c4159f Update changelog 2008-07-19 02:35:16 +00:00
29a8631b6f Do not try to pause a torrent that is already paused in the stop_ratio code 2008-07-19 02:11:28 +00:00
237c0978f4 Add new blocklist plugin 2008-07-19 02:09:53 +00:00
8d27c4e349 Remove broken blocklist plugin 2008-07-19 02:08:55 +00:00
f68d4a7896 Fix signalreceiver when connecting to remote daemons 2008-07-19 00:22:50 +00:00
0ccfb483ba Plugin system updates 2008-07-18 23:46:57 +00:00
dde58e80d7 Fix starting if tabs.state does not exist 2008-07-18 23:06:04 +00:00
9f1c536eb1 Remove 'mapped_storage.cpp' from the sources list 2008-07-18 22:50:30 +00:00
1fb61c426f fix spawn of deluged 2008-07-18 22:11:42 +00:00
c4b62fc1fc Preferences plugin fixes 2008-07-18 20:53:16 +00:00
461432bb70 fix previous commit 2008-07-18 19:40:50 +00:00
9d24f551fc sidebar 2008-07-18 19:34:11 +00:00
7eedaeedf3 Fix 'on_apply_prefs' plugin hook 2008-07-18 18:57:14 +00:00
864f69ef5d ajax-demo:file-upload auto-close 2008-07-18 17:44:56 +00:00
7faed7ec1c ajax-demo:file-upload auto-close 2008-07-18 17:44:26 +00:00
a218f0e6a2 begin transition to print being a function 2008-07-18 06:14:15 +00:00
4ac5d43d58 replace urllib.urlopen (which was marked as deprecated) with urllib2.urlopen 2008-07-18 04:10:01 +00:00
dac01416f0 replace tabs with spaces 2008-07-18 03:04:02 +00:00
0add52506b Fix #355 add python 2.4 support in systemtray too 2008-07-18 02:15:01 +00:00
65ccd2d7c1 Fix #355 support python 2.4 sha hashing 2008-07-18 02:09:54 +00:00
b62dfde447 Windows ipc fixes 2008-07-17 23:55:53 +00:00
ed9b472615 Another windows ipc fix 2008-07-17 23:40:51 +00:00
40ca2d7229 Another windows ipc fix 2008-07-17 23:36:49 +00:00
61358e7e31 Windows ipc fix 2008-07-17 23:30:03 +00:00
2021a0c048 Attempt fixing windows build 2008-07-17 22:55:19 +00:00
065e27b5f5 Fix windows ipc adding torrent to existing session 2008-07-17 22:32:39 +00:00
daecb4b984 Update changelog 2008-07-17 22:10:05 +00:00
553ccd0a38 Fix #350 stop seeds when stop ratio is reached 2008-07-17 22:09:30 +00:00
9b60cdd241 Handle an old 'tabs.state' gracefully by just using the defaults. 2008-07-17 20:39:07 +00:00
cfadbec2cf Fix #349 tab ordering when hiding/showing 2008-07-17 20:20:34 +00:00
88ca3bacd1 json:fix label filters 2008-07-17 18:42:13 +00:00
c2b1b59de3 damoxc patch:set_torrents_options 2008-07-17 18:41:03 +00:00
952b8dcea3 refix permissions that last rev reverted 2008-07-17 00:54:06 +00:00
85939e93ba lt sync 2543 2008-07-17 00:15:35 +00:00
310b428b78 Fix open folder 2008-07-16 20:03:23 +00:00
fe66f0f890 Update ChangeLog 2008-07-16 19:57:12 +00:00
9e59948c91 Fix building on FreeBSD 2008-07-16 19:56:59 +00:00
a100b84ebd lt sync torrent.cpp r2541 - file_progress fixes 2008-07-16 19:56:44 +00:00
32e3481ef1 fix logging typo 2008-07-16 17:08:49 +00:00
aaad0651e2 move from os.popen and os.popen2 to subproces.Popen for 2.6 compatibility as they've been deprecated 2008-07-15 22:29:35 +00:00
67ee5000ad move from sha module to hashlib module for 2.6 support 2008-07-15 22:18:37 +00:00
bbddd29d4b Deluge will now default to 'gtk' instead of defaulting to last used UI. 2008-07-15 19:59:09 +00:00
c266bd489f update json docs 2008-07-15 19:06:21 +00:00
f7066242da json,update_ui fix if label plugin not enabled 2008-07-15 17:50:12 +00:00
6a216c0122 refactor+enhance json api 2008-07-15 17:36:18 +00:00
9b12c231da Fix system tray locking 2008-07-15 07:06:41 +00:00
1209663595 Fix possible division by zero crash 2008-07-15 06:54:44 +00:00
c1622b23aa version up 2008-07-15 05:24:03 +00:00
2291db5be4 Update changelog 2008-07-15 03:16:42 +00:00
70c384191a Fix tray icon tooltip to use less characters for windows 2008-07-15 03:16:06 +00:00
eb9ba43984 Add 'ChangeLog' 2008-07-15 02:35:29 +00:00
2745bf8536 Fix libtorrent creating files with no read/write permissions 2008-07-15 02:30:23 +00:00
02ce32d5e2 Fix file progress percentages again 2008-07-15 02:17:39 +00:00
516945277e Fix status icon tray menu scrolling on windows 2008-07-15 01:55:12 +00:00
38fc6ba9e3 Fix showing system tray icon in windows 2008-07-15 00:50:50 +00:00
2030ba5e84 Fix removing tray on windows after shutdown 2008-07-15 00:39:20 +00:00
31bb4eface Fix displaying file percentages properly. 2008-07-14 23:17:20 +00:00
a2b2b4c3f4 webui:fix setup.py 2008-07-14 20:42:11 +00:00
7c2ca86968 options-tab:queue;prio first/last 2008-07-14 19:44:01 +00:00
8668e2eb8e update details+stats tab 2008-07-14 18:26:00 +00:00
ceaa06d1ad only create dirs if they dont exist - fixes crash 2008-07-13 20:16:50 +00:00
4f50438b61 lt sync 2537 2008-07-13 03:53:39 +00:00
bfe4cb0f71 Fix last 2008-07-13 03:40:22 +00:00
e600eae544 Update package description and authors 2008-07-13 03:33:56 +00:00
e1fb908f6e Update version to 0.9.01 for RC 2008-07-13 03:24:49 +00:00
93357de3c5 Move branches/deluge-0.6 to trunk 2008-07-13 03:23:06 +00:00
b57157a16d Create config folders if they do not exist 2008-07-13 02:58:02 +00:00
152c45b6ef Fix #338 do not continue in classic mode if 'deluged' is not available 2008-07-12 22:59:43 +00:00
e27d8bacd4 js:select first 2008-07-12 13:30:12 +00:00
f247884e66 fix label:set_global_options 2008-07-12 13:20:49 +00:00
cce3783c3f cosmetics: tweak icon+hr 2008-07-12 13:04:22 +00:00
63cb8189c4 cosmetics: tweak icon+hr 2008-07-12 12:59:23 +00:00
24c7504159 fix ie-javascript 2008-07-12 12:43:29 +00:00
ceafbfd990 label.core: assert->checkinput , regexp for label_id 2008-07-12 12:25:42 +00:00
421c439c21 fix pause/resume for queued torrents 2008-07-12 11:51:18 +00:00
82e6ab32bb label:gtkui,columns+delete label 2008-07-12 11:37:04 +00:00
7517bf89b7 label: remember filters 2008-07-12 11:26:47 +00:00
32e2e37277 label: remember filters 2008-07-12 11:18:27 +00:00
c1c2ce4244 white-templ: add deluge icon 2008-07-12 11:04:55 +00:00
dd54a6e592 disable daemon start/stop until it is fixed 2008-07-12 10:39:11 +00:00
563a8fa03d align login button 2008-07-12 10:32:02 +00:00
40126166ea fix queue config 2008-07-12 10:29:43 +00:00
b652934969 fix queue config 2008-07-12 10:27:29 +00:00
a8f89a90ca fix download config 2008-07-12 10:20:50 +00:00
c5aa8dd97b finish enable/disable plugin 2008-07-12 10:09:25 +00:00
255920fad9 json, add header 2008-07-12 06:54:36 +00:00
e6a8123939 check session in json api 2008-07-12 06:49:13 +00:00
f2120b1131 allow recreating filter-model after adding columns 2008-07-12 05:46:21 +00:00
69f8bd7f89 utf8 fixes in eventlogging plugin 2008-07-11 23:59:02 +00:00
a462abb5f3 fallback to CONFIG_DEFAULTS on unknown temnplate 2008-07-11 19:41:19 +00:00
03be7a6d8f remove advanced template, rename deluge to classic 2008-07-11 19:22:52 +00:00
0624b686fa torrent_files 2008-07-11 18:48:02 +00:00
de49037412 use deluge.common version in webui 2008-07-11 18:41:28 +00:00
9307778bea link to 0.6 faq 2008-07-11 18:22:31 +00:00
5b60bc2604 label plugin;gtk-disabled 2008-07-11 18:12:51 +00:00
cdf55da8d6 label templates/info pane position 2008-07-11 16:32:50 +00:00
cf71429e8e use rc version file 2008-07-11 10:09:13 +00:00
8003f246b7 Add 'Checking' state icon.
Add 'Checking' filter to sidebar.
2008-07-11 07:31:25 +00:00
1f97344b2f Fix showing 'Checking' state when doing a forced recheck 2008-07-11 07:30:33 +00:00
2b9663edce lt sync 2518 - mostly timeout fixes 2008-07-11 07:10:21 +00:00
c0bc622fca switch to 1.34.1 from 1.33 2008-07-11 06:58:20 +00:00
fe6a2c16f3 tweak deps and conflict/replaces 2008-07-11 06:54:33 +00:00
ecad391157 trick to have the tray icon go away on windows 2008-07-10 22:03:36 +00:00
7415061fde Fix 'always show add torrent dialog' when using classic mode 2008-07-10 08:33:19 +00:00
5d53128d92 Add '-D_UNICODE' to windows compile args. On windows, this will cause the file IO use wide character API, to properly support non-ansi characters. 2008-07-10 05:15:36 +00:00
053cba31cb Allow for shorter versions 2008-07-10 05:05:52 +00:00
f13ea7375e Allow versions with '-RC' tags 2008-07-10 05:02:40 +00:00
b3cc15c4a1 Update default prefs 2008-07-10 04:56:59 +00:00
2dc13bd68e Update some default prefs 2008-07-10 04:55:25 +00:00
f872263a45 Fix #317, commit patch from Sadrul to properly hide torrents when their
status changes from the selected filter in the sidebar.
2008-07-10 04:47:30 +00:00
ce66e22099 Add a hook 'on_show_prefs' for plugins to setup their pref options prior
to the preferences dialog showing
2008-07-10 04:46:48 +00:00
cc9acf19aa classic mode default on all 2008-07-10 04:42:49 +00:00
1c576164e8 cleanup/reorder a bit 2008-07-10 04:40:13 +00:00
382f9cf614 classic mode default on win 2008-07-10 04:39:07 +00:00
5a8662ae03 fix windows launching of daemon 2008-07-10 04:19:22 +00:00
19a2ae45e9 Try to fix daemon starting in windows 2008-07-10 03:42:43 +00:00
4d46faf014 asio 1.1.1 sync 2008-07-10 02:25:28 +00:00
63d36a4b70 lt sync 2515 2008-07-10 02:24:51 +00:00
ac9659469a cosmetics 2008-07-09 18:24:01 +00:00
979d540a63 Have the client disconnect from the daemon if a socket error or
xmlrpclib protocol error is encountered.
2008-07-09 12:49:11 +00:00
2423af8660 Set auto_managed to False when pausing and saving resume data on
shutdown.
2008-07-09 12:42:57 +00:00
1b811e1ecb lt sync 2510 2008-07-09 12:35:08 +00:00
a51638ed62 Fix alert handling to use message instead of msg 2008-07-09 09:59:33 +00:00
8f55b4f5ae Fix starting daemon from deluge in windows 2008-07-09 09:55:57 +00:00
e0ce28cb8f aclient: log exceptions; don't reset core-uri 2008-07-08 18:00:05 +00:00
50c8741a41 clamav plugin idea in todo 2008-07-08 08:36:28 +00:00
3cb046755e webui stuff in gtkui 2008-07-08 08:34:36 +00:00
34b530cb4c add adv bar to todo 2008-07-08 08:31:09 +00:00
a9f53c770b Use flag icons from www.famfamfam.com 2008-07-08 03:05:01 +00:00
b9c1f574c9 lt sync 2500 2008-07-07 22:31:37 +00:00
390d85b008 allow for udp trackers 2008-07-06 20:25:04 +00:00
c4dedadafe Fix typo 2008-07-06 07:36:56 +00:00
f1141b3f07 Actually fix typo 2008-07-06 07:34:49 +00:00
f45f0a081b Fix typo 2008-07-06 07:32:05 +00:00
ad45c6b658 Windows fixes 2008-07-06 00:47:08 +00:00
ec50c9cb41 windows fix 2008-07-05 23:43:38 +00:00
0ebcaa4d9b white-templ:green-iframe-->blue 2008-07-05 17:08:20 +00:00
3e3c0f718a filter_cat: doing it wrong, but it works.. 2008-07-05 17:00:31 +00:00
204b6a005a update TODO/add crappy label image/minor-code-fix 2008-07-05 16:40:51 +00:00
c5ad6d7e5a remove organize plugin 2008-07-05 16:34:46 +00:00
88d12ef63b persist filter_[cat/value] in redirects 2008-07-05 16:04:56 +00:00
14b5aabfa6 purging organize pt1 2008-07-05 15:38:07 +00:00
14d6dd55bc fix plugin-templating 2008-07-05 11:22:16 +00:00
0acd13aaca re-enable webui plugins 2008-07-05 07:49:26 +00:00
0e25062af7 use set_wrap_license and generalize license to make translation easier 2008-07-05 01:40:30 +00:00
622ab78b94 fix copyright symbol for some people 2008-07-05 00:57:04 +00:00
e91943d72b win updates for setup 2008-07-05 00:25:04 +00:00
cf54a107a4 fix typo in last 2008-07-04 23:57:15 +00:00
18d7026db7 fix path of config in windows 2008-07-04 23:14:05 +00:00
1f3e930df3 Some windows fixes 2008-07-04 22:36:46 +00:00
fa77fad0ff Fix typo for windows 2008-07-04 21:39:16 +00:00
4be277e353 Fix another typo 2008-07-04 21:21:57 +00:00
63bbe00eae Fix typo 2008-07-04 21:17:40 +00:00
400e47aa80 Fix #319 do not crash when changing file priorities 2008-07-04 19:37:21 +00:00
135a3d75f1 Emit 'torrent_status_changed' signal to the clients 2008-07-03 23:52:27 +00:00
bf70ff03a3 lt sync 2495 2008-07-03 23:48:15 +00:00
5d9d8a6741 Some minor code cleanups. Closes #318. 2008-07-03 22:16:15 +00:00
7427389739 move json.py to /lib 2008-07-03 19:32:52 +00:00
fd449c4b0c add json.py , easyer to distribute this way 2008-07-03 19:25:41 +00:00
e8a9d39e86 Rename _update to _update_list to prevent the component from calling
_update on start.
2008-07-03 04:06:25 +00:00
72add9da10 fix do_update for classic mode 2008-07-03 03:21:34 +00:00
4366233fc8 Fix issue where connectionmanager continues to poll servers even when
closed.  This also fixes the issue where tooltips would disappear after 
a second or so.
2008-07-02 23:39:28 +00:00
d6400431b8 Add missing file 2008-07-02 22:20:14 +00:00
0779618917 Remove DBUS dependency for Windows port 2008-07-02 20:04:57 +00:00
1f80de044b fix add 2008-07-02 18:40:35 +00:00
65e22936da add accelerator keys to add torrent dialog 2008-07-02 04:28:24 +00:00
9ceac125c8 i8n for statusbar tooltips 2008-07-02 04:01:32 +00:00
f9c2fc0720 fix shit :P 2008-07-02 03:50:47 +00:00
b5e986c3b4 Update asio 2008-07-02 02:02:28 +00:00
c4a4121060 Remove asio, updating next revision 2008-07-02 02:00:44 +00:00
71555ebd0a Update about dialog 2008-07-02 01:42:43 +00:00
3a40d81a38 Fix new release check 2008-07-02 01:31:20 +00:00
34354a25d5 Fix #311 add tooltips to statusbar items 2008-07-02 01:29:04 +00:00
5f1de26f58 Implement update checking 2008-07-02 01:19:43 +00:00
4026ac0bf2 Add 'torrent_finished' signal 2008-07-01 22:03:18 +00:00
69e24fe673 lt sync 2486 2008-07-01 21:51:16 +00:00
7dde05d5a3 Update .desktop file 2008-07-01 21:14:49 +00:00
0469f4b2d2 dont fork on win 2008-07-01 02:07:57 +00:00
59a7d8b947 json:add get_stats method 2008-06-30 17:48:40 +00:00
e2bc3dbd48 json:add get_stats method 2008-06-30 17:40:28 +00:00
6f87ba0646 json:add get_stats method 2008-06-30 17:33:01 +00:00
7e076a82a0 simplify do_redirect 2008-06-30 16:29:19 +00:00
649fd2495d Update .desktop file 2008-06-30 09:25:12 +00:00
4b68fa7d76 fix other speed dialog from tray 2008-06-29 05:18:10 +00:00
71bd04351e fix add from tray 2008-06-29 05:00:58 +00:00
43214712ef New command 'config-set' to change configuration values. This doesn't
work for list values yet.
2008-06-28 06:06:39 +00:00
be0b24369f Show colors, using ansi color codes. I have selected colors mostly
randomly. If someone wants to change the colors, feel free!
2008-06-28 04:30:37 +00:00
f24c8504e2 * Show peer information for the 'info' command.
* The first few characters from a torrent id can be used to identify a
  torrent for all the commands.
2008-06-28 03:24:14 +00:00
3201b59c4a Update glade file from #307 2008-06-27 23:54:21 +00:00
ce6c5142ce template layout fixes 2008-06-27 23:13:42 +00:00
fbbe7a9914 template layout fixes 2008-06-27 23:09:20 +00:00
e215493ee8 Fix #307 gui updates from Sadrul. 2008-06-27 23:05:49 +00:00
2c195e286c sync lang with launchpad 2008-06-27 23:04:58 +00:00
130831e63b lt sync 2454 2008-06-27 22:41:27 +00:00
01ae1cc06a fix gtk-cancel/gtk-ok translation in movetorrent and webseed plugins 2008-06-27 21:58:38 +00:00
632ce0c6fc Add 'Expand All' menu item to the files tab. 2008-06-27 08:31:11 +00:00
e1ceb07567 Try to fix issue where adding a lot of torrents at once crashes the
daemon.
2008-06-27 05:49:27 +00:00
0b590bfcda Fix #303 make port spinners insensitive if random ports is enabled 2008-06-27 05:37:38 +00:00
f45badc34d break webui if python-json is not installed 2008-06-26 21:59:34 +00:00
056dc50400 use header template in white index.html 2008-06-26 21:40:46 +00:00
22d75a7f43 cleanup 2008-06-26 21:12:17 +00:00
2641868cff remove incorrect comment 2008-06-26 20:36:12 +00:00
1aa4611e30 json-api+ajax demo 2008-06-26 20:31:50 +00:00
6a734dab69 Prevent setting file priorities if file priority list length does not
equal the number of files.
2008-06-26 15:28:09 +00:00
67d156973c Fix issue where fastresume is not being saved properly on shutdown when
using compact allocation
2008-06-26 09:36:48 +00:00
5cbf606503 fix faq/torrent_add 2008-06-25 17:29:55 +00:00
12f18ac3a4 use correct unit for total-size 2008-06-25 16:54:03 +00:00
a7b232845a disable https if pyopenssl is not installed 2008-06-25 16:21:23 +00:00
9fc8f431a5 2008-06-25 15:43:10 +00:00
c88fd0ab27 Fix #300 do not crash when 0-byte .torrent file is added 2008-06-25 14:21:36 +00:00
409a824d7d Fix #299 preserve filename in gtkui when using 'add by url' 2008-06-25 07:49:58 +00:00
0d273690d5 renaming config-file again 2008-06-25 05:18:25 +00:00
660ee3eeff finish renaming config-file 2008-06-25 05:15:10 +00:00
28aaa5fe3b lt sync 2458 2008-06-25 04:39:45 +00:00
7280465cd5 Some windows stuff 2008-06-25 04:37:43 +00:00
9648d2c6b0 Fix #298 resume torrentview and statusbar after presenting the window 2008-06-25 03:26:26 +00:00
a58b26c550 basic arrow up/down 2008-06-24 19:36:30 +00:00
76a19a7d5a change name of config-file; choose-files on add 2008-06-24 18:20:14 +00:00
5270d1fe4f Fix #294 prevent deluge from crashing when autoload folder does not
exist
2008-06-24 09:10:25 +00:00
60b2fa8893 Remove debug print 2008-06-24 07:46:00 +00:00
6cb4d27b7e lt sync 2453 2008-06-23 22:58:46 +00:00
eeedd79f45 Fix #292 clicking on the tray icon while using 'start in tray' 2008-06-23 22:10:49 +00:00
9d3d22e7f8 Fix possible crash on exit in clasic mode 2008-06-23 22:10:08 +00:00
2be6c2a5ed up version to 0.5.9.3 and fix plugin reporting 2008-06-23 19:37:15 +00:00
e905044445 Properly shutdown the daemon if changing from classic to regular 2008-06-23 06:47:06 +00:00
982fd4f292 Fix showing of Queued Torrents dialog when in classic mode 2008-06-23 06:35:23 +00:00
d9676aabca file_priorities 2008-06-23 04:18:06 +00:00
e43f2370e1 Add queueing options to the Options tab
Add setting auto managed from the torrent menu
2008-06-23 03:12:28 +00:00
f200cae0f0 Rename 'Move Torrent' to 'Move Storage' 2008-06-23 00:22:51 +00:00
48d18e3c52 Implement 'Classic Mode' 2008-06-23 00:12:30 +00:00
3ed6e59cae Process all alerts before shutting down torrentmanager 2008-06-23 00:11:57 +00:00
c5a7abe5d2 Fix _on_send_info 2008-06-22 23:25:15 +00:00
da1b4c68df lt sync 2440 2008-06-22 23:23:35 +00:00
888b57cd6f lt sync 2438 2008-06-22 23:07:51 +00:00
5bc3906863 Fix send_info and move_completed preferences when not connected to a
daemon.
2008-06-22 22:57:43 +00:00
c22cf5cf69 clear-button->clear image /me rants about default-buttons 2008-06-22 22:16:40 +00:00
b0cc183c0c Fix-up send info stuff 2008-06-22 22:14:59 +00:00
b9cde0e267 clear button for keyword 2008-06-22 21:59:58 +00:00
d6f783abf1 add forgotten pygtk version 2008-06-22 21:42:15 +00:00
38f10f2e1f add force-recheck image 2008-06-22 21:21:22 +00:00
617196f51c check-off stats 2008-06-22 21:19:24 +00:00
dd18152266 add send stats info 2008-06-22 21:15:05 +00:00
fe9664bce3 queue bottom/top 2008-06-22 21:03:51 +00:00
c7be9e3bfd q&d script to generate deuge.ui.client docs in wiki 2008-06-22 20:28:02 +00:00
13479f3985 rename 2008-06-22 19:52:33 +00:00
263c014715 connect page,better support for remote daemons 2008-06-22 19:50:00 +00:00
b6a300f687 no crash on invalid daemon+cosmetics 2008-06-22 19:25:23 +00:00
aad8a926d6 lt sync 2432
Add new queueing options
2008-06-21 19:02:15 +00:00
f921834d4f state_upgrade script 2008-06-21 10:36:12 +00:00
408abb5abe webui:more cosmetics:details+status 2008-06-21 09:24:36 +00:00
bc41329f2a cosmectics:queue 2008-06-21 08:56:32 +00:00
0a37faadc7 lenny/sid now use 2.5 and sid is called unstable in changelog 2008-06-21 06:16:49 +00:00
a7caeed0cb Add debian/ folder for packagers 2008-06-21 06:05:29 +00:00
0da3fed18d Change files tab to a tree view 2008-06-20 23:04:33 +00:00
5b4bb37e7d Hide the 'From Hash' button from the add torrent dialog, since it is not
operational yet.
2008-06-19 21:56:27 +00:00
8ca5682449 Update toolbar buttons on torrentview update 2008-06-19 21:55:00 +00:00
8f4a96c8e7 lt sync 2426 2008-06-19 21:51:59 +00:00
a206c6b3c4 fix typo 2008-06-19 01:36:22 +00:00
062e4d2a8a wpath fix 2008-06-19 01:24:19 +00:00
1454a4d4c0 lang sync 2008-06-18 22:14:32 +00:00
0f63847c34 update changelog 2008-06-18 22:11:34 +00:00
282f842663 Modify startup script to make a true unix daemon by using two fork()s
Work will need to be done to make deluged a windows service
2008-06-17 22:46:55 +00:00
f548dbce7c Include timestamps in log messages 2008-06-17 22:46:05 +00:00
3d5a1d3540 Join listening thread in signalreceiver on shutdown 2008-06-17 19:49:43 +00:00
2578ca3e21 Join listening thread on shutdown to make sure it exits properly before
terminating the interpreter
2008-06-17 19:46:15 +00:00
cb9db1658b Change 'active seeds' preference to 'total active' to avoid confusion. 2008-06-17 16:01:32 +00:00
cfa18bc729 Fix #283 resuming torrents when stop_seed_at_ratio is set 2008-06-17 02:00:53 +00:00
2e09e6b9ba min reconnect time fix 2008-06-17 01:48:20 +00:00
5934918363 Another attempt to fix #283 .. revamped how resuming/pausing is done 2008-06-17 00:56:10 +00:00
7e7feeb2d8 Update the state of a torrent before attempting to resume. This is an
attempt to fix #283
2008-06-16 23:14:21 +00:00
651523e7d0 lt sync 2413 2008-06-16 23:08:06 +00:00
89cad666d5 Rework the signalreceiver a bit to help address errors on exit.
A few UI tweaks.
2008-06-15 11:02:09 +00:00
efd1f18082 Fix stop seed ratio to only stop seeders, not downloaders 2008-06-15 04:16:31 +00:00
8588a6e83c Fix prioritize_first_last 2008-06-15 03:31:33 +00:00
f769429e1d Add move storage on completed download option 2008-06-15 02:43:06 +00:00
7322a08323 Catch all exceptions in do_multicall() 2008-06-15 02:41:25 +00:00
cfc742501d Implement prioritize first/last pieces 2008-06-15 00:53:56 +00:00
517ba20ae7 Update connection manager host list ner. 2008-06-14 07:55:13 +00:00
8c49dd6e90 Fix move storage for remote hosts by adding a dialog for path entry. 2008-06-14 07:48:14 +00:00
2a510c8310 Fix peers tab state loading 2008-06-14 07:44:24 +00:00
fdfe2ac1ff Revert last. It's not needed. 2008-06-14 07:33:54 +00:00
ab4dbff3e7 Fix possible race condition when using force_call() 2008-06-14 06:39:57 +00:00
6b008d6c4d Fix #231 clear torrent info if no torrent selected. 2008-06-14 05:31:16 +00:00
9d40380f71 New option to make a copy of torrent file added to session.
Have torrentmanager handle old state files better by filling in the 
missing fields with defaults.
2008-06-14 02:10:23 +00:00
dfc14ff785 Fix #207 do not exit if dbus is unavailable, just give warning. 2008-06-14 00:49:34 +00:00
5936aeebb6 Fix #270 autoadd folder 2008-06-14 00:32:52 +00:00
d7957f82e7 lt sync 2405 2008-06-12 21:47:56 +00:00
f7010b18f3 Switch to libtorrent queueing
This breaks state.
2008-06-12 09:21:13 +00:00
37df050e3b Fixes for set_queue_position() 2008-06-11 12:13:26 +00:00
fe7dead2df lt sync 2397 2008-06-10 08:02:15 +00:00
45dd1e37c3 Fix #263 2008-06-08 23:34:18 +00:00
d8b7393c94 Use libtorrents force_recheck() 2008-06-07 21:01:43 +00:00
7107413d0e lt sync 2388 2008-06-07 18:58:33 +00:00
bf00795050 Big code clean-up in torrentmanager and torrent. This breaks
torrent.state.  Sorry.
2008-06-07 00:20:36 +00:00
a8b1d98c3d fix move plugin oops 2008-06-06 19:48:13 +00:00
bc8e6b441f add move to different partition 2008-06-06 07:27:35 +00:00
228597abdc add send redundant haves iow show peers our progress 2008-06-05 02:12:57 +00:00
49338fc5d7 lt unicode fix in storage 2008-06-04 19:51:30 +00:00
e78aa7dcc3 lt sync 2374 2008-06-03 20:24:42 +00:00
abbba8bf3b Remove ability to modify private flag. 2008-06-03 01:39:03 +00:00
6b6a2646b9 add url from tra 2008-06-02 23:49:56 +00:00
8359ade3f2 Update bindings to include queueing and file_renamed_alert 2008-06-02 21:18:27 +00:00
772f80e622 lt sync 2370 2008-06-02 17:40:37 +00:00
78cde674f0 revert unintentional wizard commit 2008-06-02 10:16:14 +00:00
aaf6d8128d up version number 2008-06-02 10:15:10 +00:00
53a5999462 update changelog 2008-06-02 10:14:14 +00:00
44293bf6bd lt R_0_13 2366 sync 2008-06-01 23:37:15 +00:00
4f0e77c68e launchpad lang sync 2008-06-01 23:35:52 +00:00
8e11197ac9 Add missing files. 2008-05-20 06:28:42 +00:00
b15608252c libtorrent sync 2347 2008-05-20 06:23:48 +00:00
817076ff65 Fix uploaded_memory from reverting to state value when doing a forced
recheck.
2008-05-20 02:03:11 +00:00
576cae3b26 Add an 'All' option to the Tabs menu.
Fix error on clear() when no tabs visible.
2008-05-19 20:23:48 +00:00
66212563e7 indent fix 2008-05-19 16:05:10 +00:00
c7310de524 lang sync 2008-05-19 16:04:54 +00:00
afa3c03691 Add the tabs to the View menu and allow them to be shown/hidden.
Some minor UI tweaks.
2008-05-19 02:28:47 +00:00
95d0b65785 Remove unnecessary calls to update_buttons() 2008-05-19 02:26:10 +00:00
16477181d0 Prep 0.5.9.1 release. 2008-05-18 22:03:25 +00:00
6dca7958a2 Fix forced recheck 2008-05-17 19:06:35 +00:00
da3cb085af Fix addtorrentdialog from not showing updated options on show. 2008-05-17 18:56:19 +00:00
eeb695464a Update ChangeLog 2008-05-17 18:12:04 +00:00
0d8b619200 Fix catching of invalid torrent file 2008-05-14 20:11:08 +00:00
069bd5da88 Fix advanced progressbar to display properly when torrent only has 1
wanted piece that is smaller than the piece size
2008-05-12 13:19:41 +00:00
4ae8faa3ef Fix open folder 2008-05-12 13:05:01 +00:00
e70a09b6e4 Fix queue order on restart. 2008-05-12 12:41:45 +00:00
3a482b2f19 Implement 'Always show add torrent dialog' and 'Bring to focus' when
adding a torrent from an external source.
2008-05-12 06:31:52 +00:00
ebebdb7132 Fix 'No incoming connections' label not removing properly. 2008-05-09 10:01:07 +00:00
e7e4651482 fix torrentfiles 2008-05-02 23:18:14 +00:00
f46ce64914 fix torrentfiles with --config 2008-05-02 21:04:55 +00:00
0d7c25879e remove old plugin and tweak torrentfiles default path 2008-05-02 20:43:48 +00:00
a06b241056 Fix rechecking torrents 2008-05-01 05:40:25 +00:00
9313975ba5 Update the use of add_torrent() 2008-05-01 05:38:25 +00:00
df459e7eaa Update python bindings to use new add_torrent() method 2008-05-01 05:37:22 +00:00
e513c4a46d update version and changelog 2008-05-01 02:30:32 +00:00
3ba8ba710d fix opening folder/files in windows 2008-04-30 23:33:38 +00:00
85f557e6c1 lt sync 2240 2008-04-29 21:49:24 +00:00
88c20df380 Sync up alerts in the python bindings 2008-04-29 21:43:25 +00:00
c1d7f68c12 lang sync 2008-04-28 23:30:55 +00:00
2a00af8781 Fix typo 2008-04-28 20:14:45 +00:00
ef9541366f Fix #188 libtorrent build with gcc 4.3 2008-04-28 08:12:30 +00:00
140326443c Set auto_managed to false for now. 2008-04-27 03:53:19 +00:00
a745178244 peers_tab:display ?% instead of KeyError on progress 2008-04-25 16:37:25 +00:00
62b713041a Add torrent_error_alert to python bindings 2008-04-24 09:46:15 +00:00
846d575a52 Fix typo in policy.cpp 2008-04-24 09:36:37 +00:00
1a8c3d21be Fix issue where trying to handle an announce alert after the torrent has
been removed from session.
2008-04-24 07:58:52 +00:00
c5eba92174 lt sync 2224 2008-04-24 07:54:44 +00:00
ff837215e3 Fix compiling of 'GeoIP.c' on some systems. 2008-04-23 21:13:53 +00:00
9f05f6fc64 lt sync 2219 2008-04-23 01:14:11 +00:00
e477b5e037 lt sync 2207 2008-04-20 04:18:40 +00:00
354b31dbbe lt sync 2205 2008-04-20 00:39:26 +00:00
e366b75714 Fix peers tab sorting by down/up speed. 2008-04-19 20:44:30 +00:00
5717fa0d8a Fix ratio bug.. yet again
Some possible fastresume fixes too
2008-04-19 18:09:48 +00:00
6a693d10ab dht array index out of bound fix 2008-04-19 17:08:28 +00:00
1b5bfaaad1 Fix possible incorrect display of uploaded total in details tab. 2008-04-19 16:07:02 +00:00
8de21c82ae blocklist, fix #171 by covracer 2008-04-19 15:30:40 +00:00
6d9cfbabd9 lt sync 2203 2008-04-16 07:52:09 +00:00
19dcc3e09b lt sync 2202 2008-04-16 07:07:58 +00:00
809007d77c Define '_FILE_OFFSET_BITS=64' 2008-04-16 03:52:08 +00:00
770e0a0db6 Update the country flag properly. 2008-04-16 02:55:45 +00:00
1557679259 Forgot some headers in last commit. 2008-04-16 01:20:57 +00:00
70bb78b833 Update libtorrent to 0.14 trunk.
A few minor touch ups regarding torrent state and queue.
2008-04-16 01:15:06 +00:00
1861ef439f Attempt fixing #146. 2008-04-15 02:46:29 +00:00
ff2d7ba7f8 add deluge.js to setup 2008-04-14 00:49:31 +00:00
67f0b6a2c9 lt sync 2193 2008-04-13 23:00:51 +00:00
479db99d9f oops, missed changelog in last 2008-04-13 22:59:07 +00:00
d6168ca79a update version numbers and changelog 2008-04-13 22:58:50 +00:00
7aa72e3b17 lang sync 2008-04-13 22:57:14 +00:00
116aa12da7 Fix segfault in torrent_get_torrent_state() 2008-04-13 10:17:37 +00:00
1e2326cb6a deluge duplicant language files 2008-04-13 08:15:53 +00:00
3ac9af0486 State fixes. 2008-04-13 06:07:19 +00:00
0b63f0b3b4 Add more webui files 2008-04-13 04:45:05 +00:00
1558ab8607 Fix #85 change torrent state to downloading if changing priority of files in torrent to something other than
'Do Not Download'.
2008-04-13 04:16:33 +00:00
0f4895ee6a Update webui paths 2008-04-13 03:42:05 +00:00
3f9f4bb662 add and use is_finished 2008-04-13 03:25:22 +00:00
d231aafa9a lt sync 2185 2008-04-13 03:24:27 +00:00
2cc8b72e96 lt sync 2185 2008-04-13 03:24:27 +00:00
4ffe14573f Expose torrent_handle::is_finished() 2008-04-13 03:15:46 +00:00
49af682226 Re-apply per-torrent settings after forced recheck. 2008-04-13 01:25:33 +00:00
4b620896a5 fix set_current_folder when None 2008-04-12 05:08:33 +00:00
c012427edc Fix #146 2008-04-10 05:52:38 +00:00
ef4ea151f4 Remove cruft for ubuntu check 2008-04-10 02:01:46 +00:00
622a0053d8 css 2008-04-08 20:16:50 +00:00
7a879b33c8 details tabs:add css 2008-04-08 19:39:09 +00:00
85d17af933 split details/statistics tabs 2008-04-08 18:34:37 +00:00
39cad76dd2 rm gtk webserver 2008-04-08 17:46:53 +00:00
7023ad0974 progresss bars : fix layout 2008-04-08 17:32:49 +00:00
3e6d43b8a5 update todo 2008-04-08 17:21:35 +00:00
d93df183bb webui:add TODO 2008-04-08 17:00:33 +00:00
c282132574 template_static:fix config bug 2008-04-08 16:54:20 +00:00
46a1eb26cf Fix peers list updating. 2008-04-08 12:02:08 +00:00
7cb6876bae Fix peers tab updating to include country codes. 2008-04-08 09:55:31 +00:00
cb75bda84e tweak last 2008-04-08 08:12:34 +00:00
7fe0a713b2 blocklist flix to todo 2008-04-08 08:07:37 +00:00
d009516272 update TOTO 2008-04-08 08:01:28 +00:00
3bc4f167f2 censor myself on changelog 2008-04-08 07:43:22 +00:00
ca66946169 only show torrent menu if a torrent is selected 2008-04-08 06:40:29 +00:00
d17092b20d fix return of None in 2.4 2008-04-08 06:39:57 +00:00
346a25564a dont show file menu if no files are selected 2008-04-08 06:19:48 +00:00
3ca459df87 Only update the peers list as necessary. 2008-04-08 05:55:20 +00:00
ec326c2c6d Show a peer/seed icon for peers. 2008-04-08 05:26:10 +00:00
c884142691 Only show peers that we've exchanged a handshake with. 2008-04-08 05:15:52 +00:00
1bf2339b0f Proper sorting of ip addresses in peers tab.
Try to show a proper string for clients that don't send utf-8
2008-04-08 05:11:36 +00:00
ed4389fe65 Show country flags in peers tab. 2008-04-08 04:46:01 +00:00
4ead675fad Fix pluginmanagerbase to use configmanagers config directory instead of trying to get it from the config
file.
2008-04-08 03:56:27 +00:00
7f89a8aff3 Fix issue where folder chooser buttons show the path's parent and not the actual selected path.
Remove file browser options from preferences dialog.
2008-04-08 03:51:29 +00:00
126208b416 Fix issue where folder chooser buttons show the path's parent and not the actual selected path. 2008-04-08 03:48:45 +00:00
b376786782 update changelog 2008-04-08 03:20:29 +00:00
36e21935f4 Show proper file priorities now.
Added file tab context menu and can now set priorities for individual files.
2008-04-08 03:05:34 +00:00
7e5179d0de remove file manager setting and use xdg-open, use os.startfile in windows, remove initial_upload, fix ratio 2008-04-08 01:53:56 +00:00
2b007ff878 Fix when selecting multiple torrents and right-clicking only selecting the one. 2008-04-08 01:02:44 +00:00
051e2ae9e7 Add 'set_torrent_prioritize_first_last' method. 2008-04-08 00:41:23 +00:00
4423ce667f Make buttons on the options tab actually work. 2008-04-08 00:40:29 +00:00
37fcf4ec4d Catch a couple more exceptions. 2008-04-07 21:10:44 +00:00
3befc2e084 sync language files for release 2008-04-07 12:27:15 +00:00
aef9690dee update changelog 2008-04-07 12:13:32 +00:00
9bfd6471f3 up version number 2008-04-07 12:10:31 +00:00
f39e3c69a3 0.13 final sync 2008-04-07 05:13:36 +00:00
c3f15b8b1e 0.13 final sync 2008-04-07 05:13:36 +00:00
c464d64d46 fix vista check 2008-04-07 01:31:53 +00:00
97e8cdaac8 Change the listview to a treeview -- patch from Andrew Eikum 2008-04-07 01:02:33 +00:00
35e6059b10 vista python 2.5.2 fix 2008-04-07 00:18:56 +00:00
fecd9132ce sync with asio 1.0 release and update lt 2147 2008-04-06 21:12:32 +00:00
a530367fd7 sync with asio 1.0 release and update lt 2147 2008-04-06 21:12:32 +00:00
642569f4bc Fix remove torrent command in null client. 2008-04-06 03:14:29 +00:00
c226014439 Remove the progress column from the peers tab.
Only show connected peers.
2008-04-06 00:09:30 +00:00
4c867264f9 Add '-c, --config' options to set config directory. 2008-04-05 22:40:35 +00:00
72e0df3e5f Fix details tab. 2008-04-05 22:04:17 +00:00
8eca7bfdeb Add Options tab. 2008-04-05 21:43:04 +00:00
6858e875a1 webui:mv tab_meta->tab_statistics 2008-04-04 19:33:33 +00:00
6bd677bedc fix oops,tracker_name 2008-04-04 19:22:01 +00:00
ec1db13c32 webui:layout torrent_meta+add hash 2008-04-04 18:38:44 +00:00
5f4d5efa17 fix #134, pretty eta 2008-04-04 17:56:40 +00:00
7f8fca451d webui : fix add url 2008-04-04 17:02:09 +00:00
c9bc6a9526 webui:fix oops in torrent_files 2008-04-03 19:56:24 +00:00
2ccf6786c6 webui:add queue config 2008-04-03 19:49:23 +00:00
380966f3f1 webui:add some values to config pages 2008-04-03 19:06:17 +00:00
c585e75b36 edit trackers 2008-04-03 18:32:58 +00:00
3185665941 fix indent 2008-04-02 15:01:46 +00:00
7990de2a31 windows support in open_file 2008-04-01 22:23:41 +00:00
c906af496f add apache.py 2008-04-01 17:44:30 +00:00
d9ec10dd28 remove https+ add apache 2008-04-01 17:40:50 +00:00
0f32cde503 Fix possible issue where the health icon will not disappear. 2008-04-01 08:38:10 +00:00
39e8866b97 Fix #131 2008-04-01 07:46:41 +00:00
875af674a1 Fix #130 2008-04-01 07:43:51 +00:00
4d81005d5b add open file to files tab 2008-04-01 07:40:27 +00:00
157bcca244 remove debug print 2008-04-01 05:02:02 +00:00
dc2ea3a220 fix for paths with spaces 2008-04-01 05:00:01 +00:00
4cd7ade277 Some tweaks to the add url dialog. 2008-04-01 00:59:36 +00:00
aa5da70030 Implement Add by Url in the addtorrentdialog. 2008-04-01 00:47:52 +00:00
187fedbb8a Fix AutoAdd preference.
Tweak stats panel.
2008-03-31 12:36:47 +00:00
441021b0cb Remove some debug prints. 2008-03-31 12:26:49 +00:00
2a9993cfe8 Move AutoAdd to core. 2008-03-31 12:18:19 +00:00
34ca508410 AutoAdd fix. 2008-03-31 12:04:14 +00:00
787de2cfe0 Add 'hash' to torrent details. 2008-03-31 09:06:16 +00:00
22aafb532e Fix edit trackers dialog. 2008-03-31 08:35:54 +00:00
db13c2e3f3 Implement Error status. 2008-03-31 06:17:55 +00:00
4ff17ee367 Implement AutoAdd folder. 2008-03-31 01:37:59 +00:00
488bbb0a53 Attempt to fix improper ratio. 2008-03-31 00:15:36 +00:00
9a586fb343 Update TODO. 2008-03-30 23:17:58 +00:00
5b5ba1c4ee Fix last. 2008-03-30 22:08:48 +00:00
7d9fee4946 on shutdown, dont create fast resumes for seeds or paused torrents and only pause if compact, since that's only when it's needed 2008-03-30 17:24:21 +00:00
cf8f7f0376 webui:apache,allow relative urls 2008-03-30 14:48:59 +00:00
0ee52a17fe Fix peer info. 2008-03-30 08:40:53 +00:00
f5a9c5a11f Change default 'load_on_start' to False for blocklist. 2008-03-30 00:48:34 +00:00
d22fa1299a Fix forced recheck. 2008-03-30 00:18:11 +00:00
4e5a20ba38 Remove some debug prints. 2008-03-29 04:39:34 +00:00
5f2be57ba8 Fix stuff for updated bindings. 2008-03-29 04:36:50 +00:00
c35553d4a8 Update libtorrent python bindings to lt rev 2120. 2008-03-29 04:36:30 +00:00
81d07734e5 Remove viewport from files and peers tab. 2008-03-29 04:11:44 +00:00
dff2a69169 add private status to details tab 2008-03-28 01:44:47 +00:00
1a85622137 use threading again for launching browser so it doesnt lock up in python2.4 2008-03-28 00:22:22 +00:00
86856b44de lt sync 2116 2008-03-27 22:42:39 +00:00
6b0952764d webui:torrent_options:update ticket #123 2008-03-27 19:22:21 +00:00
80db26e0e7 webui:css table padding 2008-03-26 22:39:04 +00:00
a1a8534972 webui:fix :state-filter,peers-order/width 2008-03-26 21:46:40 +00:00
21efd6709d webui:basic peers tab 2008-03-26 21:27:33 +00:00
b446bc0c15 fix reg_torrents_POST 2008-03-26 20:47:56 +00:00
8fb22554f2 webui:minor config fixes 2008-03-26 20:24:30 +00:00
24b7cff766 webui:fix pwd update(+better css) 2008-03-26 19:37:14 +00:00
1f3932e13f url-routing using PageManager 2008-03-26 19:02:54 +00:00
ace62ef0b7 Updated libtorrent bindings to support peer_info. 2008-03-25 08:29:40 +00:00
cceb2ef5a0 Start of peers tab implementation. 2008-03-25 08:28:50 +00:00
bd57df9915 clear finished changes to changelog 2008-03-25 02:03:29 +00:00
5bbb7a526d up version numbers and update changelog 2008-03-25 02:01:30 +00:00
cfbb5692cf revert accidental commit 2008-03-25 01:59:02 +00:00
7986b7a042 lt sync 2105 2008-03-25 01:56:53 +00:00
c4ee6c090e Add state saving to the the files tab so that column size, sort order
and positions are persistent.
2008-03-25 01:53:00 +00:00
8d56d12178 lang sync 2008-03-25 01:49:30 +00:00
efead335a9 Fix saving ratios on quit. 2008-03-25 00:09:05 +00:00
13b507a925 torrent-add,move,options->use component-api 2008-03-24 22:54:00 +00:00
f1d13d0bca torrents_command 2008-03-24 22:17:46 +00:00
a9238995ce reduce code in /index 2008-03-24 22:02:27 +00:00
f8cbcd9184 wsgiapp+reduce code in /index 2008-03-24 21:56:10 +00:00
7121abc572 #113 add cache-control+content-length for /pixamps 2008-03-24 08:59:46 +00:00
3857a564a1 try to fix #89, by assuming name,tracker,tracker_status could be non-unicode 2008-03-24 08:22:26 +00:00
8eda411a86 fix lt dht announce bug 2008-03-23 07:42:54 +00:00
adf36fac1d fix lt dht announce bug 2008-03-23 07:42:54 +00:00
16b19fc423 fixed incorrect forwarding in torrent_handle 2008-03-22 16:56:41 +00:00
7412a0052b fixed incorrect forwarding in torrent_handle 2008-03-22 16:56:41 +00:00
b87089c7d2 newforms->newforms_portable 2008-03-22 12:55:49 +00:00
0eaa0aca27 consolidate manager-componets 2008-03-21 18:31:27 +00:00
dcc10b7819 remove broken ssl 2008-03-21 17:29:37 +00:00
2852820a50 fix non-connected daemon 2008-03-21 17:25:30 +00:00
36fa568d16 oops 2008-03-21 17:11:29 +00:00
b4e1051fe0 remove all logic from webserver_common 2008-03-21 17:11:00 +00:00
55274532be fix last oops 2008-03-21 05:45:19 +00:00
0753f800e2 remove torrent file on clear seeding 2008-03-21 05:35:44 +00:00
d2d0e26f4c fix multiple router_node support lt rev 2089 2008-03-21 02:00:26 +00:00
06a1591b44 fix multiple router_node support lt rev 2089 2008-03-21 02:00:26 +00:00
69d5aa6e2e plugin updates by ben 2008-03-18 20:55:05 +00:00
f55fdcf118 blocklist-plugin config pt1 2008-03-18 20:33:04 +00:00
85d9e6ceb8 webui: minor css 2008-03-18 20:32:01 +00:00
f78d794079 fix webpy022 import for /lib/ 2008-03-18 17:08:30 +00:00
fc9bb503df Attempt to fix issue where core will no longer pause/resume torrents. 2008-03-18 01:41:09 +00:00
d34356a800 Modify how we iterate through the liststore. 2008-03-18 00:21:23 +00:00
4882f5cb88 refactor:webpy022->web.py 2008-03-17 20:47:27 +00:00
f1cd5071da webui-refactor:use deluge.component for components/prepare for plugins 2008-03-17 19:42:44 +00:00
1a5ebf73ee Start work of new torrent info tabs. 2008-03-17 09:36:43 +00:00
86d8ea3f5b Fix add torrent dialog displaying the wrong download path when connected
to a remote daemon.
2008-03-17 08:11:21 +00:00
5b6a197a50 Clicking on the 'Not Connected' status bar item will now show the
ConnectionManager.
2008-03-17 08:01:27 +00:00
b18ffb3397 update changelog 2008-03-16 22:46:09 +00:00
096ea631a9 lt sync 2080 2008-03-16 22:43:27 +00:00
53c5ad79c6 lt sync 2080 2008-03-16 22:43:27 +00:00
2ffa5737bd lt sync 2071 2008-03-16 05:48:37 +00:00
e033024fbd lt sync 2071 2008-03-16 05:48:37 +00:00
92dea4475c fix plugin list scrolling with keyboard (ticket #84) 2008-03-16 02:34:11 +00:00
ca85860b90 update our enourmous list of translators 2008-03-16 02:25:01 +00:00
13b3716d60 remove debug print 2008-03-16 01:08:02 +00:00
b2b148994f fix stats url 2008-03-16 01:06:28 +00:00
a65cda0094 webui white template=default 2008-03-15 12:10:44 +00:00
b713ae5fb2 white template:config+panel style 2008-03-15 11:10:47 +00:00
2af622b850 remove 0.5 torrent_info hacks 2008-03-15 10:02:38 +00:00
b3f9785b20 Fix adding torrents and setting proper state on load. 2008-03-15 06:16:06 +00:00
723fd76d84 white template 2008-03-14 08:30:38 +00:00
4c987aed06 Fix showing the other speed dialog in the StatusBar pop-up menus. 2008-03-12 07:56:59 +00:00
b87f68fcb6 Fix issue where we try to handle lt alerts for torrents that have not
had a Torrent object created for them yet.
2008-03-12 06:30:49 +00:00
f18b42b64d Include all .svg files in data/pixmaps. 2008-03-12 06:27:10 +00:00
4dba4d730a sync lang files with launchpad 2008-03-11 19:11:53 +00:00
6153ca1140 up version for release 2008-03-11 19:09:52 +00:00
55aae06130 update changelog and ly sync 2055 2008-03-11 19:08:42 +00:00
1872a2634a use data/pixmaps instead of copied images 2008-03-11 18:40:04 +00:00
87e7fd5869 remove plugin preference page properly, handle downloads/timeouts better, fixed inf download loop 2008-03-10 22:12:31 +00:00
174ea3c35e Fix stop seed ratio to only stop Seeding torrents. 2008-03-10 10:33:29 +00:00
b5078571a2 Fix inserting into queue. 2008-03-10 09:19:49 +00:00
616fa74051 Add timeout items to the StatusBar. These items will disappear after N
seconds.
Add warning items to the StatusBar.
Show warning when trying to resume a torrent past the stop share ratio.
2008-03-10 08:18:39 +00:00
4f0882ebbe Add Network Health icon to StatusBar.
Fix issue of adding a torrent to the top of the queue if no torrents in 
the session.
2008-03-10 07:32:25 +00:00
58e4e1b2f4 Update some copyright years. 2008-03-10 06:12:51 +00:00
07dd3506e1 Implement 'stop seed at desired ratio'. 2008-03-10 04:32:13 +00:00
e305e04e31 Only update the queue when necessary, not every second. This should
improve performance a bit.
2008-03-10 02:54:20 +00:00
bcd5b2c458 When loading state, add torrents with .fastresume files first to avoid
waiting for torrents to be checked.
2008-03-10 01:46:23 +00:00
7fbfbbc49c lt sync 2047 2008-03-10 01:24:05 +00:00
7d5bd22855 white template:add wip message 2008-03-09 20:32:11 +00:00
5c02a9cb82 template-inheritance&white-template(wip) 2008-03-09 19:13:09 +00:00
b5e4fdaa04 remove plugin icons from general path 2008-03-09 16:18:15 +00:00
62c52e8740 fixed icon path, added gtk download list button 2008-03-09 16:16:16 +00:00
e0c5820bf0 Initial version of blocklist for 0.6 2008-03-09 06:05:00 +00:00
74cd111513 Add pop-up menus to the statusbar items. 2008-03-09 05:38:07 +00:00
bed05c7a05 Updates to test plugin. 2008-03-09 05:05:56 +00:00
c679d6b2cf Register 'Core' with deluge.component. 2008-03-09 03:39:26 +00:00
75a797cabe Add entry widgets for setting remote daemon paths. 2008-03-09 03:32:35 +00:00
7a0365fd4a Fix showing remote download/torrent files path in Preferences. 2008-03-09 03:31:30 +00:00
5d91c170e4 Fix signalreceiver crashing on daemon switch.
Fix exception on shutdown in signalreceiver.
2008-03-09 03:27:25 +00:00
969b43d069 Set # column as default sort. 2008-03-09 03:07:50 +00:00
8562cad4f5 Implement 'Queue finished to bottom'. 2008-03-09 02:41:02 +00:00
def92cb735 Fix showing proper upload/download speed values in SystemTray. 2008-03-09 01:07:54 +00:00
d0b3418ccc Fix preferences dialog to show when not connected to a daemon. 2008-03-09 01:00:26 +00:00
37f1560024 Move toolbar separator over one position. 2008-03-09 00:43:07 +00:00
c1787e2520 Fix setting max active torrents to unlimited to actually work. 2008-03-09 00:27:32 +00:00
ccfa7c16e0 Asio update. 2008-03-08 23:47:38 +00:00
4087576905 lt sync 2049 2008-03-08 23:38:26 +00:00
569fba5b5f Fix remove torrent toolbutton. 2008-03-08 23:13:30 +00:00
7303e52ae6 Fix torrents not showing up in list until changing filters. 2008-03-08 23:03:01 +00:00
b32c7de968 Enable 'Queue new torrents to top' 2008-03-08 22:58:11 +00:00
dda5be096a Touch-up Queue preferences. 2008-03-08 22:57:44 +00:00
2dc6df31da Queueing updates. This breaks torrents.state. 2008-03-08 08:19:43 +00:00
54b512a7e0 Delete .fastresume on resume of a non-seeding torrent. 2008-03-08 04:47:43 +00:00
f2065ae344 Queue updates. 2008-03-08 04:15:35 +00:00
b5ff8eb29f Testing. 2008-03-07 04:16:48 +00:00
81606e3e67 More queue updates. 2008-03-07 02:27:34 +00:00
cd2bfe8a62 Fix showing of page without updating selection in list. 2008-03-07 01:45:47 +00:00
d7dd5180cf Add 'page' argument to show() to allow opening the Preferences dialog to
a specific page.
2008-03-07 01:13:45 +00:00
ff4009cb6e Fix add_toolbutton() to work with non-stock images. 2008-03-07 00:55:46 +00:00
4fe2187653 marry uploaded mem saving with pickle state 2008-03-06 22:55:28 +00:00
6fcc56c79a revert last 2008-03-06 13:05:49 +00:00
e61169c7b9 remove timer for fastresume now that normal saving should be fixed and it's unnecessary and hogs cpu with large/serveral torrents 2008-03-06 12:57:38 +00:00
61f49a2cda fix andar's 2916 :P 2008-03-06 12:54:16 +00:00
1132292e9e fix damn stupid fast resume for real 2008-03-06 12:22:48 +00:00
98b026f155 Add torrents with .fastresume files before torrents that don't during
state load.
2008-03-06 08:09:47 +00:00
3ff2af0f2a clarify printouts with fast resume 2008-03-06 01:02:28 +00:00
5577667631 move state check for fastresume to be within a try statement to try to catch race condition that happens if a torrent is finished and immediately removed by ratio limit 2008-03-05 23:33:18 +00:00
882a7e8033 core:fix multiple queue_up/down 2008-03-05 19:10:21 +00:00
fa0847a45b webui:error handling of no-daemon 2008-03-05 18:58:44 +00:00
0c58504f42 fix #72 ui hang 2008-03-05 06:57:12 +00:00
6e5da1cae3 Update the null-client to work with the changed 'state' key. 2008-03-05 06:22:28 +00:00
0b4b52d586 Attempt to fix fastresume saving by not using a cached torrent state. 2008-03-05 04:33:02 +00:00
f0d52b4fda enable queue 2008-03-04 21:42:46 +00:00
d2bd2fabcf webui:remove cat, use organize plugin 2008-03-04 21:27:51 +00:00
faa5b69db4 webui:cosmetic+crop_middle 2008-03-04 21:02:37 +00:00
49ec8766ca webui:keyword filter 2008-03-04 20:11:19 +00:00
db24c543fe webui:move filter-logic to organize-plugin 2008-03-04 19:52:06 +00:00
8cf72ca2dc organize core-plugin 2008-03-04 19:51:31 +00:00
985ccb3187 webui:fix TORRENT_STATE 2008-03-04 12:04:08 +00:00
0e31d4243c Add 'Queued' label to SideBar.
Fix the labels filter from not displaying properly.
2008-03-03 09:05:02 +00:00
8de2946da2 Queueing updates. 2008-03-03 04:54:52 +00:00
87a59662e4 Modify common.TORRENT_STATE to be a list instead of a dictionary. The
state is now sent as a string instead of an int.  This will break UIs.
2008-03-03 02:41:44 +00:00
eb15b5da37 Setting options for the Queueing stuff now works in preferences. 2008-03-03 02:40:43 +00:00
e031c4b3ee Add new Queued state icon. 2008-03-03 02:14:51 +00:00
25d2f99ece Update the host list on initialization. 2008-03-02 06:50:34 +00:00
ea3d25e8e1 Add Queue functionality from the plugin to the core. This breaks
torrents.state.
2008-03-02 04:47:35 +00:00
2113cbc3c3 Remove Queue plugin as it's functionality has been moved to the core. 2008-03-02 04:40:40 +00:00
d4a8f29957 clean up status_fields 2008-03-01 14:20:04 +00:00
b10cdb22d1 fix reversed sorting 2008-03-01 11:10:45 +00:00
c04e9701ae move webui(done) 2008-03-01 10:42:06 +00:00
b47551d009 move webui(3) 2008-03-01 10:41:08 +00:00
7377f1416c move webui(2) 2008-03-01 10:40:46 +00:00
5dc12d1774 move webui(1) 2008-03-01 10:39:53 +00:00
62c23829be plugin_api 2008-03-01 10:16:33 +00:00
ba6018f3f3 Fix torrents being added in wrong paused/active state on state load.
This should fix #27.
2008-02-28 20:55:06 +00:00
a65251807b prepare for plugins2 2008-02-28 19:36:28 +00:00
d844337cbb prepare for plugins 2008-02-28 19:35:45 +00:00
8a4bf3ab15 improved connect-page+web.reloader 2008-02-28 16:55:23 +00:00
6914216234 fix damn web proxy pref 2008-02-28 08:40:17 +00:00
b7571ecddd launchpad lang sync 2008-02-28 07:00:41 +00:00
049f99ffae update changelog 2008-02-28 06:56:24 +00:00
a697c721bb up version # for fix release 2008-02-28 06:54:24 +00:00
e595a7d1fd fix force recheck 2008-02-28 06:53:47 +00:00
51dccc21ae lt sync 2039 2008-02-28 06:45:21 +00:00
ae18fc8b5a lt sync 2039 2008-02-28 06:45:21 +00:00
b72098e561 Start of work migrating the Queue plugin into core. 2008-02-27 08:10:14 +00:00
53ebbe011c Updates to the test plugin. 2008-02-27 08:09:47 +00:00
f1808a0cc3 Add pausing and resuming of components. This stops the update() timer
for the component and restarts it upon resume.
2008-02-27 07:43:47 +00:00
26b8fcf086 minimal admin toolbar2 2008-02-26 17:59:46 +00:00
c5cb204344 minimal admin toolbar 2008-02-26 17:59:24 +00:00
8ee529d229 Add 'on_apply_prefs' plugin hook. 2008-02-26 17:10:44 +00:00
b94fcc1da0 Fix #39 .. this is a regression from [2793] 2008-02-26 15:21:30 +00:00
06ffa8c628 Fix commit 2866 2008-02-26 05:31:05 +00:00
8c44dd40fa Make PluginManager start before TorrentManager. 2008-02-26 05:28:29 +00:00
28f0a0b9f8 Catch possible exception on shutdown. 2008-02-26 05:27:32 +00:00
3103a69754 Update Test plugin to work properly. 2008-02-26 05:27:12 +00:00
a7b12cc159 no exception on invalid sort 2008-02-26 00:33:27 +00:00
79b9eda351 fix config template 2008-02-26 00:22:54 +00:00
d1b8075fe6 webui:torrent_list:use sclient.get_torrents_status instead of async 2008-02-25 17:44:32 +00:00
9c0dc5f9e3 lt sync 2828 2008-02-25 08:52:57 +00:00
17dd85b60b lt sync 2828 2008-02-25 08:51:48 +00:00
a352202247 Account for large files in the files list. 2008-02-25 06:52:56 +00:00
367e3f1df8 Do not bother removing fastresume files on resume. 2008-02-25 04:29:18 +00:00
4513531ef4 Attempt to call 'apply_prefs()' in enabled plugins when the user clicks
OK or Apply in preferences.  This is designed to allow plugins to save 
their preferences.
2008-02-25 02:49:30 +00:00
a39b8baa72 Ensure int-ness for max-connections and upload-slots of torrents. 2008-02-25 01:22:46 +00:00
ae0652227b Add post_session_load() plugin hook. This change does break
persistent.state.
Add some queue exports and stuff to the core.
2008-02-25 00:05:09 +00:00
d9868b0ce2 disable queue 2008-02-24 13:24:29 +00:00
fb85b87580 basic reconnect 2008-02-24 12:59:36 +00:00
8f039eb0fa Fix shutdown(). 2008-02-24 05:36:36 +00:00
ada8d5641f add_torrent_file_binary 2008-02-23 15:19:47 +00:00
2c12368fad webui:add_torrent_file_binary 2008-02-23 15:18:18 +00:00
83f8481797 fix ui hang on keyerror with seed time 2008-02-23 13:09:26 +00:00
616dd6288a Minor cosmetic touch-ups.
Removed some imports that are no longer needed.
2008-02-22 22:36:31 +00:00
80f11bff0f client.has_callback->fix api/readability 2008-02-22 22:27:21 +00:00
e192b38ab6 webui:client.py refactor 2008-02-22 22:16:43 +00:00
d53a606b0e big client.py refactor 2008-02-22 22:16:13 +00:00
21c4025a7b Show max_speeds in torrent details. 2008-02-22 09:12:16 +00:00
5cb5ce15d6 Fix formatting 2008-02-22 09:11:40 +00:00
5aa3bfd16d Fix stopping signalreceiver 2008-02-22 09:10:59 +00:00
694bf6d778 update changelog with #51 fix 2008-02-22 08:36:35 +00:00
e4ee196129 fix fastresume/up mem timers - fixes ticket #51 2008-02-22 08:31:15 +00:00
5b516040f3 update changelog 2008-02-22 06:30:27 +00:00
1e02029fe1 lt sync 2020 2008-02-22 06:26:08 +00:00
63d9165dc9 lt sync 2020 2008-02-22 06:24:58 +00:00
300b4a7905 Scrape tracker if tracker doesn't report number of peers on reply. 2008-02-21 22:20:28 +00:00
27ffaab15b Change core methods to use a list of torrent_ids. 2008-02-21 20:23:02 +00:00
6d63307623 webui:fix torrent_add 2008-02-21 18:37:58 +00:00
1f5d9a10c1 Expose reset_ip_filter() to plugins. 2008-02-21 04:20:30 +00:00
361a276da4 Add reset_ip_filter() to core. 2008-02-21 04:19:13 +00:00
88f2638764 fix CoreMethod 2008-02-20 20:24:08 +00:00
4fa375bd6c proxy for plugin methods 2008-02-20 19:36:24 +00:00
86eeef4b92 refactor:remove ws.(part1) 2008-02-19 20:50:29 +00:00
35446801c6 queue+add logging 2008-02-19 18:27:28 +00:00
3d76649b78 Add missing file. Fixes #43. 2008-02-19 01:44:12 +00:00
c2a7c9fe92 queue 2008-02-18 16:51:49 +00:00
bff0e3f8d5 Attempt fix fastresume saving issue. 2008-02-18 00:50:12 +00:00
b59d148a21 Additional exposure for constants. 2008-02-17 23:54:52 +00:00
b3950faf9b Expose torrent_paused and torrent_checked alerts. 2008-02-17 23:46:44 +00:00
335c037add Modify the remove torrent behaviour to be more HIG compliant.
Add the ability to set per-torrent options from the Torrent menu.
Add new CoreConfig component for keeping a local mirror of the core 
config.
2008-02-17 22:39:50 +00:00
89bea0a40f Modify SignalReceiver to only start the XMLRPC server once the thread is
started.
Allow components to directly connect to signals in Signals.
2008-02-17 18:56:39 +00:00
2eec78f9fb Expose block_ip_range() to plugins. 2008-02-17 05:51:07 +00:00
c9caab1b4d Add block_ip_range() in core and expose it in client. 2008-02-17 05:46:51 +00:00
0940f9072e Add ip_filter.cpp 2008-02-17 05:33:59 +00:00
72e0a35986 Add ip_filter to libtorrent bindings. 2008-02-17 05:33:41 +00:00
bd99ebf190 webui:recheck 2008-02-16 15:13:26 +00:00
de77db0eae webui : robots.txt fix 2008-02-16 14:31:36 +00:00
596e8bbf21 webui : robots.txt, prevent search-engine indexing 2008-02-16 14:29:35 +00:00
07939d46b2 fix advanced webui statusbar for shwouchk 2008-02-16 14:20:00 +00:00
89e2e3ae5c update file_prio+bugfixes 2008-02-16 13:56:04 +00:00
ed7b75b956 fix move,fix add using url 2008-02-16 10:33:40 +00:00
5ca14dbfba Fix duplicate torrents on restart. 2008-02-16 10:09:17 +00:00
6b49e4e623 extra status fields for torrent options 2008-02-16 08:25:24 +00:00
68e5745e02 Fix duplicate torrent loading again.. 2008-02-16 06:09:04 +00:00
967f0a6a78 Fix duplicate torrent handling. 2008-02-16 05:07:07 +00:00
dc2f8d6c9c Only show limits when set.
Increase spacing of StatusBarItems from 5 to 10.
2008-02-16 01:44:23 +00:00
ce1398f342 fix web proxy checkbutton 2008-02-15 23:17:37 +00:00
9db2824bfe Expose set_torrent_max_connections(), set_torrent_max_upload_slots(),
set_torrent_max_upload_speed(), set_torrent_max_download_speed(), 
set_torrent_private_flag(), set_torrent_file_priorities().
2008-02-15 23:14:15 +00:00
89278153bf part_button 2008-02-15 18:13:06 +00:00
c1b8d6e880 start of torrent-move,-options,-files 2008-02-15 18:11:34 +00:00
02d66701c4 fix ppc detection 2008-02-15 17:07:56 +00:00
5fc175092b only add rt on linux 2008-02-15 17:04:31 +00:00
e03a516cb5 Fix #34 2008-02-14 08:01:18 +00:00
02cfb48eea version bump 2008-02-14 06:28:41 +00:00
c013c520df add webui to POTFILES 2008-02-13 19:46:30 +00:00
3e2f8020bb add enabled plugins to send info 2008-02-13 09:47:34 +00:00
bab5b518ab add seed time to changelog 2008-02-13 07:29:34 +00:00
1c08462dd3 add time limits for seeding torrents 2008-02-13 04:45:31 +00:00
9bb58d498c Remove some cruft. 2008-02-12 21:48:58 +00:00
4c2ec1b8fb Change torrent saving/loading to use torrent options and update the
state format to support new options.
Some minor modifications to CoreProxy in client -- only run the 
do_multicall timer when 'connected' to a core.
2008-02-12 21:29:39 +00:00
31ae3488ba Tweak 'quit and shutdown daemon'. 2008-02-12 21:26:01 +00:00
85e6c4c76d update template translation strings 2008-02-12 21:17:47 +00:00
949ee6160d add tab_files 2008-02-12 21:04:12 +00:00
991a413327 torrent_info:display torrent files 2008-02-12 21:03:33 +00:00
6b716c782d update changelog 2008-02-12 20:59:23 +00:00
05240945a7 add 'switch torrent source' to movetorrent plugin 2008-02-12 20:57:46 +00:00
cb493591f1 fix deprecation warning with float 2008-02-12 20:27:58 +00:00
75663de03c polish 2008-02-12 19:56:11 +00:00
dfaf263d66 Fix preferences to actually set global per torrent download/upload
speeds.
Apply global per torrent download/upload speeds to all torrents on 
change.
2008-02-12 19:51:45 +00:00
345f61b740 torrent_add options bugfix 2008-02-12 18:39:07 +00:00
0b306717b6 torrent_add:options 2008-02-12 18:14:18 +00:00
b0a9bf49fe fix broken svn state on torrent_add 2008-02-12 16:53:48 +00:00
9beda7c96e Return a full status, including functions, when len(keys) is 0. 2008-02-12 02:42:09 +00:00
22352888f6 add form again 2008-02-11 20:42:48 +00:00
9be62d2056 add form again 2008-02-11 20:30:44 +00:00
8719ad3c50 torrent_add : start of options ui 2008-02-11 19:13:54 +00:00
8f8a6e41aa torrent_add:options ui 2008-02-11 19:09:23 +00:00
f4a5b750d8 use gobject timer for saving mem and fastresume 2008-02-11 17:43:15 +00:00
9df4492083 refactor forms 2008-02-11 16:59:29 +00:00
ee0851b39e add support for debian kfreebsd 2008-02-11 14:26:29 +00:00
0f5d041c83 update changelog 2008-02-11 13:32:59 +00:00
1d7306910f lt sync - fixes lockup 2008-02-11 13:31:44 +00:00
d32ffa7ace Remove shutdown() from TorrentManager because stop() is already called
during a component shutdown.
2008-02-11 03:13:07 +00:00
c13fb94bcc fix keyboard interrupt 2008-02-11 00:15:31 +00:00
494c0cc558 sync asio 2008-02-10 22:07:23 +00:00
cc5ebf59d8 resync asio 2008-02-10 22:05:58 +00:00
8c5f699015 launchpad lang fix 2008-02-10 21:58:00 +00:00
0848e0faac update changelog 2008-02-10 21:51:06 +00:00
f20e1af0f0 fix alignment of torrent info 2008-02-10 21:49:23 +00:00
42e75fbcdd Fix test port button. 2008-02-10 15:29:15 +00:00
76da1ac525 Show an error message when trying to do an operation while disconnected from a deluge daemon. 2008-02-10 14:12:14 +00:00
25295ee094 Do not save fastresume files if torrent is being checked or is queued
for being checked.
2008-02-10 14:03:22 +00:00
72cb14f1d7 Remove the decorator class and just raise the NoCoreError in
CoreProxy.call().
2008-02-10 13:42:14 +00:00
e95be5d131 Prevent an exception when multiple signals are tried to send to an unreachable client. 2008-02-10 13:39:47 +00:00
3ad87b0e91 Add error.py.
Remove old cache decorator classes from client.py.
Raise deluge.error.NoCoreError when attempting to use a client function 
when not connected to a daemon.
2008-02-10 13:36:58 +00:00
e554140276 Do not try to send signals to a client after 30 consecutive failures. 2008-02-10 13:29:01 +00:00
885ca2c899 Two new commands 'halt' and 'connect'. 2008-02-10 12:02:57 +00:00
ca3f08690e Gracefully handle ctrl-d, and don't exit on blank command. 2008-02-10 11:39:29 +00:00
47406335ac Debug/Info level log messages are noisy for the null-client. 2008-02-10 11:29:36 +00:00
3d26049aeb Rearrange almost all of the code. 2008-02-10 11:11:04 +00:00
5f40e030b1 Make 'deluge -u null' launch the null client. 2008-02-10 09:40:14 +00:00
4eabde05ff Introduce the null client. 2008-02-10 08:22:56 +00:00
27feb11ae8 fix save fast resume 2008-02-10 07:46:44 +00:00
d4d1ccac33 dont resave fastresume for seeds 2008-02-10 07:42:01 +00:00
1f881a3d9c Add debug prints for every function call. Define DELUGE_CORE_DEBUG to
see prints.
2008-02-10 06:41:05 +00:00
587d5afda0 Update upload_memory prior to saving state on shutdown. 2008-02-10 05:57:54 +00:00
40ac3d1ad1 sync libtorrent 1991 2008-02-10 04:36:19 +00:00
883ce6da4a fix dht asserts 2008-02-10 02:31:49 +00:00
994fbd571d keyboard interrupt call shutdown, not core.quit 2008-02-10 00:33:54 +00:00
6322115fef improved support for out-of-memory conditions, fix pe-crypto error handling and add some dht asserts 2008-02-09 22:02:14 +00:00
cb59fd31aa More resume/pause all fixes. 2008-02-09 03:37:42 +00:00
c7c1ea26f9 Fix resuming all torrents. 2008-02-08 22:51:41 +00:00
eee68666ef torrent-index no - , mimic gtk ui and use 0 or '' 2008-02-08 18:56:35 +00:00
1c33177a63 torrent-index use '-' for unknown/empty values 2008-02-08 18:47:21 +00:00
eeac163a9d use utf-8 infinity symbol instead of Unlimited/Infinity string 2008-02-08 18:33:35 +00:00
ae792ccb21 Split up function calls in get_torrent_status() and add 'file_progress'
key.  Patch from Sadrul.
2008-02-08 05:43:14 +00:00
f1d488a09c Fix pause/resume all torrents in the SystemTray. 2008-02-08 00:46:10 +00:00
6342fe2e08 Set file_priorities default value to [] if not priorities have been set. 2008-02-07 23:19:17 +00:00
055e42776a Fix last. 2008-02-07 22:55:04 +00:00
1f3452277a Add 'file_priorities' status key to torrent. 2008-02-07 22:53:51 +00:00
f940a4c4db http_tracker connection fix and proxy support for udp-trackers 2008-02-07 07:23:43 +00:00
9a1d5e9bfa Allow incomplete options dictionaries when adding a torrent. The
missing keys will be replaced by defaults.
2008-02-07 07:20:17 +00:00
187b4c423d update stats file due to our new ftp osuosl server 2008-02-07 06:46:21 +00:00
737b95250d fix static-fileserver license 2008-02-04 21:21:02 +00:00
75a626b28d more minor stuff on status bar 2008-02-04 21:06:02 +00:00
7c0a997bbf move settings-link 2008-02-04 20:36:35 +00:00
6402b95099 dht image 2008-02-04 20:32:26 +00:00
6dbadf877d mimic gtk status-bar->images 2008-02-04 20:26:11 +00:00
ab37facd54 max 2 digits after . for %-completed 2008-02-04 18:57:36 +00:00
f7c7644362 fix error in lib/readme.txt 2008-02-04 18:17:14 +00:00
3af0ea2e9f Fix exception in get_selected_torrents(). 2008-02-04 07:28:17 +00:00
2accb9902e add ssl to changelog 2008-02-04 04:16:40 +00:00
22f6477d69 Fix another typo. 2008-02-03 22:50:06 +00:00
cc38bbdfbf Fix typo. 2008-02-03 22:45:23 +00:00
ea49afb9c3 Fix tracker scraping in tracker_reply_alert. 2008-02-03 16:28:06 +00:00
5e46ac1b42 fix library names for vc71 2008-02-03 09:05:55 +00:00
6602721526 update changelog 2008-02-03 07:29:15 +00:00
784a25aec1 Fix desired ratio to default value when adding torrents. 2008-02-03 06:37:14 +00:00
f005a5d869 remove file.cpp in win 2008-02-03 05:37:10 +00:00
d40387ada9 forgot z has to be zlib in windows 2008-02-03 05:12:47 +00:00
586543917a add proper boost path for windows 2008-02-03 03:24:36 +00:00
684c3098d9 Touch-up setup.py. 2008-02-03 01:12:46 +00:00
34fd115051 add windows support to setup.py 2008-02-03 01:04:26 +00:00
8ab923fb94 Update TODO 2008-02-02 01:31:08 +00:00
9469610aca Use new torrent states instead of using libtorrent's. 2008-02-02 01:30:18 +00:00
4b18f49ec1 Only draw the advanced progress bar if 'num_pieces' is greater than 0. 2008-02-01 21:18:58 +00:00
e2eaa9abb4 logout;more robust async 2008-01-31 19:11:39 +00:00
7a973947a7 add logout;remove json 2008-01-31 17:52:48 +00:00
9541f02fb4 Remove some Anonymous browser cruft in open_url_in_browser(). 2008-01-31 07:25:13 +00:00
a23ff6cbca randomize encryption pad size 2008-01-31 06:51:35 +00:00
aed8b1a722 randomize encryption pad size 2008-01-31 06:51:14 +00:00
1653a72c7a Do not update UI when minimized or hidden. 2008-01-30 12:56:50 +00:00
2fba592e6c Move update label calls to where they should be. 2008-01-29 09:08:27 +00:00
f8adeb9c69 Statusbar DHT touch-up 2008-01-29 09:01:02 +00:00
5e66a28e88 check dht status in start() and dont get dht nodes when dht is off 2008-01-29 08:51:46 +00:00
c3061576f3 check dht value on start() and dont get_dht_nodes() when dht is off 2008-01-29 08:12:44 +00:00
8806704043 fix dht value change 2008-01-29 07:29:14 +00:00
50fa1ff1a9 add dht to config_value_changed 2008-01-29 07:17:19 +00:00
c97175a51e add add_dht_router to libtorrent bindings 2008-01-29 07:16:20 +00:00
f757593146 add dht nodes to status bar 2008-01-29 06:58:23 +00:00
b29583024d Set the multicall to None if disconnected from the daemon. 2008-01-29 02:44:25 +00:00
70f82f947f Fix the new release check from informing user of an update when they are
unable to download the version file.
2008-01-28 08:26:31 +00:00
f4e97eae22 Fix various spelling mistakes in ChangeLog. 2008-01-28 08:13:16 +00:00
0f8a55c66c Update ChangeLog 2008-01-28 08:07:35 +00:00
2a72d56055 Fix loading of BlocklistImport if the config key 'load_after_days' is
not found.
2008-01-28 07:09:33 +00:00
a7eb6ae0f7 update version numbers for release 2008-01-28 07:04:37 +00:00
8e58ead77c update changelog 2008-01-28 07:02:45 +00:00
8604de25d8 Fix queue order on state load. 2008-01-28 06:41:13 +00:00
94f36c72a1 lt sync - cpu spike fix 2008-01-28 03:19:21 +00:00
67dfd74bdc lt update which fixes cpu spikes in 0.5.8.2 2008-01-28 03:17:29 +00:00
6dd304ee63 another unicode tracker fix 2008-01-28 02:51:38 +00:00
cd49b329f6 works yay 2008-01-27 09:58:10 +00:00
66458da847 test 2008-01-27 09:57:53 +00:00
d1677a855f Fix debug message. 2008-01-26 13:24:42 +00:00
a55dcc8099 Catch RuntimeErrors in load_torrent(). These are likely due to bad
torrent files.
2008-01-26 07:10:39 +00:00
38f0d9f71c Fix exception due to common not importing log. 2008-01-26 06:45:23 +00:00
a242566099 Update TODO. 2008-01-25 03:11:05 +00:00
c1710ca0f4 Add the ability to set file priorities for torrents in the core.
The Add Torrent dialog now sets proper file priorities based on user 
input.
2008-01-25 02:55:48 +00:00
073b62408f Show revision number in version if available. 2008-01-25 02:28:34 +00:00
4e42c2744d Remove another window.update(). 2008-01-25 00:31:19 +00:00
d5ab09e11f Remove main window update() attempts in SystemTray.
Force the add_torrent call to happen right away.
2008-01-25 00:28:07 +00:00
7406b1cd7d up version for fix release and update chnagelog 2008-01-24 23:19:28 +00:00
34b1726178 lt sync 1959 2008-01-24 23:17:49 +00:00
ec21e02cb2 launchpad lang sync 2008-01-24 23:16:50 +00:00
b22a40de9b BlocklistImport: Option to download new blocklist after certain numbers
of days has past.  Patch from Mark Stahler.
2008-01-24 08:46:17 +00:00
3ccfb4e03e Fix get_selected_torrents() when removing multiple torrents. 2008-01-24 03:51:15 +00:00
5ab95814e7 Adjust Preferences dialog height a bit. 2008-01-24 01:59:36 +00:00
10cced15a3 Fix GtkWarning in StatusBar when disconnecting from daemon. 2008-01-24 01:56:25 +00:00
9d5e60c42f Modify the Downloads tab of Preferences to include changes associated
with the new Add Torrent dialog.
2008-01-24 01:33:37 +00:00
468e51c72b Fix deregistering signal receivers in the core. 2008-01-24 01:31:48 +00:00
50e6b343c3 Fix removing torrents options in WebUI. They were reversed. 2008-01-23 01:53:20 +00:00
e231621e12 oops 2008-01-22 21:01:35 +00:00
e439b69252 tweak last 2008-01-22 21:01:10 +00:00
a1ead133df fix searching for bad url in edit trackers 2008-01-22 20:59:30 +00:00
22c07f8e10 use async api for torrent_list(index-page) 2008-01-22 18:19:30 +00:00
9236e9bff2 fix eta 2008-01-22 18:03:48 +00:00
bbe31367d4 Use os.popen2() instead of os.fork() to daemonize. 2008-01-22 11:45:56 +00:00
4ba32dc4bf Select a torrent in the list if none are selected on torrent add. 2008-01-22 11:43:58 +00:00
4036ff4310 remove torrent file by default 2008-01-22 07:30:35 +00:00
a4e7e9c41a fix webui fuck up 2008-01-22 06:42:50 +00:00
93e631d893 Add hack to determine svn revision on Gentoo with svn ebuild. 2008-01-22 05:20:20 +00:00
b64393d096 Get some error output when trying to get svn revision. 2008-01-22 04:27:33 +00:00
e092619d64 Remove hack to set revision to "". 2008-01-22 04:11:29 +00:00
3a47731483 Default to Random Ports. 2008-01-22 03:57:46 +00:00
a3fc292dd6 Tweak Network tab. 2008-01-22 03:54:29 +00:00
e7ecead473 Tweak Downloads tab. 2008-01-22 03:40:44 +00:00
c747e4e125 Revert last. 2008-01-22 03:31:50 +00:00
9a36ef3c26 fix alignment ugliness in preferences 2008-01-22 03:20:08 +00:00
20d13f8ddc tweak unicode from tracker 2008-01-22 02:09:27 +00:00
7ed0821143 Tweak EditTrackersDialog async call. 2008-01-22 01:26:31 +00:00
3946b03b83 remove extra stats as its causing too many errors 2008-01-22 00:53:20 +00:00
6438cb0121 fix edit trackers to be async 2008-01-22 00:41:05 +00:00
74a1f60e42 try to catch unicode error 2008-01-21 23:51:41 +00:00
3aca2fa33c use get_default_download_dir() for move torrent pref 2008-01-21 22:53:24 +00:00
10d7f86f6f Reset revision file to "" after build and install. 2008-01-21 22:39:10 +00:00
6cb3b2b9e0 add move torrent 2008-01-21 22:38:58 +00:00
1a0718b4ac Update 'save_path' on storage_moved_alert. 2008-01-21 22:24:31 +00:00
db97daeeeb Remove update() call as it is no longer necessary. 2008-01-21 22:13:39 +00:00
83cc479898 split torrent_status for future async 2008-01-21 19:51:55 +00:00
3807b372ff async status-bar + pause/resume 2008-01-21 19:31:36 +00:00
c9a5caa3ec test perf improvement of multicall 2008-01-21 18:28:09 +00:00
217d7eaa90 sync-wrapper for new async client 2008-01-21 17:57:38 +00:00
762f8a52af Fix preferences when not connected to daemon. 2008-01-21 10:02:30 +00:00
a461074da2 Catch signals and KeyboardInterrupt and shutdown properly in GtkUI. 2008-01-21 09:54:03 +00:00
b950d28781 Handle setting the revision in a different way. 2008-01-21 09:25:21 +00:00
0b807e8945 Fix errors on quit. 2008-01-21 09:13:36 +00:00
72ea2d0632 catch index error 2008-01-21 07:58:16 +00:00
f08fcc68d3 Only call a callback once for a specific method. 2008-01-21 06:37:30 +00:00
2a637c0b12 Fix preferences when clicking Apply or Ok.
Add revision number to about dialog.
2008-01-21 06:03:38 +00:00
f16092400d Change get_version() to only return version number, not revision.
Added get_revision() to get svn revision number of build.
2008-01-21 05:56:45 +00:00
fdb07b4929 Try to include svn revision number in version if available. 2008-01-21 03:14:24 +00:00
1c9c765cb1 Change update intervals of several components.
Have StatusBar update the respected label when it receives a 
'config_value_changed' signal.
2008-01-21 01:58:19 +00:00
f9d25287ea Change Component to use individual timers for the components. This
allows for different update intervals for the components.
2008-01-21 01:57:25 +00:00
799037a46b Improve performance by only updating labels that have changed. 2008-01-21 01:13:56 +00:00
bcd2bcd2d4 SignalReceiver now chooses a random port to listen on. 2008-01-20 23:47:57 +00:00
2ce5d5e35e Prevent Scheduler plugin from setting an invalid 'max_active_torrents'
value.
2008-01-20 23:16:38 +00:00
80514ad829 Fix last commit.
Use 'config_value_changed' signal from core to get config value updates 
instead of polling every update for StatusBar and SystemTray.
2008-01-20 21:37:11 +00:00
f0b6833d17 Reduce the amount of calls in the MultiCall batch by removing
duplicates.  Increase the MultiCall timer to 200ms.
2008-01-20 19:11:36 +00:00
452781a78c fix column width saving 2008-01-20 03:59:48 +00:00
3e2631213c log pygtk.require warning 2008-01-20 03:13:09 +00:00
0b2dcd5dc2 i need to stop smoking weed 2008-01-20 03:00:11 +00:00
bb86fefe66 try/else pass for pygtk.require 2008-01-20 02:58:41 +00:00
d965adff82 Disconnect from Gnome session during shutdown. 2008-01-20 02:49:25 +00:00
5d1dbc98e5 Give the Queue plugin some love. 2008-01-20 02:37:26 +00:00
6485986294 Silence xmlrpclib about int exceeding XML-RPC limits. 2008-01-20 02:00:42 +00:00
23840ce390 Destroy AddTorrentDialog window after clicking 'Add'. 2008-01-20 01:55:17 +00:00
f327290e33 Fix preferences for removed preference. 2008-01-20 01:52:27 +00:00
28a4883a72 Fix signals. 2008-01-20 01:00:39 +00:00
df29d7d69a lt sync 1958 2008-01-20 00:59:49 +00:00
76a0eb12e8 Do not make Core a thread anymore as it is not needed. 2008-01-20 00:56:42 +00:00
f042bf0dda use die in signal 2008-01-20 00:46:52 +00:00
77a63c791c fix finally call for 2.4 compatibility 2008-01-20 00:40:12 +00:00
bf26a9ef50 import signal and fix shutdown call 2008-01-20 00:38:36 +00:00
e5f9a313c2 fix missing icon 2008-01-20 00:30:43 +00:00
071a0cdbaa fix path oops in last 2008-01-20 00:11:50 +00:00
3a102189cf add missing pixmap 2008-01-19 23:58:03 +00:00
0e5c81c2e0 Handle losing contact with the daemon gracefully. 2008-01-19 23:33:09 +00:00
42b5f6872c Fix labels. 2008-01-19 23:11:12 +00:00
0f7a91797f Remove 'Clear Seeders' tool button. Remove 'Add URL' menu item. Modify
the Preferences dialog a bit.
2008-01-19 23:05:55 +00:00
1fa301cb69 Change client.py to use multicalls. This forces all client methods to
be async.
2008-01-19 22:33:30 +00:00
29c77e1a04 Hack xmlrpclib to stop from dieing with long numbers. 2008-01-19 16:48:45 +00:00
7e03f82d73 Import proper xmlrpclib. 2008-01-19 16:47:46 +00:00
3618b4bfe8 sync lang files 2008-01-19 04:56:48 +00:00
fe01d8c55f version updates and todo/changelog update 2008-01-19 04:54:09 +00:00
263387c6c9 fix saving fast resume on checking torrents 2008-01-19 04:53:36 +00:00
379eac85c4 lt sync 1955 2008-01-19 04:52:22 +00:00
d2f6a99778 Catch all exceptions during interactive_add_torrent. 2008-01-18 04:46:39 +00:00
4a7e0a578b Try catching more exceptions in the core. 2008-01-18 04:37:33 +00:00
8fadfb8254 Prevent the use of an invalid unique_id from throwing an exception
during get_torrent_state().
2008-01-18 03:40:38 +00:00
b73dd60e6b minor css fix+pwd-cfg 2008-01-17 20:09:05 +00:00
1c3c5b76b0 fast resume oops2 2008-01-17 12:22:27 +00:00
ac80dd4d59 fast resume oops 2008-01-17 12:18:11 +00:00
89af88e370 Refactor TorrentView to have async returns populate a local status
dictionary.  We now update every second against the local status 
dictionary instead of updating on every async return.
2008-01-16 06:42:43 +00:00
1e5af9bd87 Use threading in ConnectionManager to test online status of hosts. 2008-01-16 06:40:58 +00:00
d1eb4bc8d6 use pieces wanted instead of total pieces to draw adv progress bar 2008-01-16 02:19:15 +00:00
966b2fa459 config plugins:raise todo 2008-01-16 00:00:21 +00:00
350cad9f3f config plugins 2008-01-15 23:44:30 +00:00
03c9806b40 config pages 2008-01-15 21:04:49 +00:00
790eda0f2c lt sync 1947 2008-01-15 08:46:24 +00:00
20cce5aa68 don't commit *.pyc files 2008-01-14 22:14:14 +00:00
c71d4f3258 config within webui, see /config/ for a preview 2008-01-14 22:13:32 +00:00
8ae26b049c Fix SystemTray on systems with old PyGTK. 2008-01-14 12:02:53 +00:00
73c14b8c47 Prevent a stall in torrentview updates if a signal isn't received
properly.
2008-01-14 11:48:51 +00:00
f5cc3db2d5 Make port spinbuttons editable. 2008-01-14 11:21:35 +00:00
f9a664b9c7 Attempt to fix issues where torrents would not update correctly in the
torrent view.  Also an attempt at improving performance.
2008-01-14 09:00:13 +00:00
eaddaaa844 Fix adding torrents by URL. 2008-01-14 08:46:44 +00:00
cc81e1073d Catch 'address already in use' error when trying to use a port that is
in use by another program.  We now try to use a range of 40000-60000 
when this error occurs.
2008-01-14 08:04:28 +00:00
5a90f48ccb Include deluge_icon.gif for WebUI. 2008-01-14 05:40:40 +00:00
642663604f Fix possible issue if pref 'choose_directory_dialog_path' is None. 2008-01-14 05:13:21 +00:00
57870b8094 don't import forms 2008-01-13 11:22:51 +00:00
806e3885b4 test-commit/sync to 189 2008-01-13 11:16:56 +00:00
6b68ac9ad7 Attempt to fix issue where all the columns start very small. 2008-01-13 10:58:52 +00:00
1de14a1ce0 Fix issue with removing items while iterating through the self.state
dictionary.
2008-01-13 08:32:46 +00:00
0d793e7f89 Attempt to load the state in a safe manner. 2008-01-13 08:10:35 +00:00
2e0be83732 lt sync 1938 2008-01-13 06:24:52 +00:00
dc60e26c59 use die instead of save_yourself and add arg to shutdown func 2008-01-13 05:00:04 +00:00
dbe41a3cd5 lt sync 1929 2008-01-11 20:25:08 +00:00
a5d3444fd8 Initial commit of WebUI support for 0.6. The WebUI revision is 187.
You can start the webui by doing: $ deluge --ui web
2008-01-11 01:42:47 +00:00
49c09bf297 Catch exception in calc_free_space(). 2008-01-10 12:12:30 +00:00
8f675ebacf lt bandwidth limiter mutex fix 2008-01-10 06:23:53 +00:00
c7f3323d3e remove browser 2008-01-10 02:16:34 +00:00
e65d720890 Fix autostarting daemon. 2008-01-09 23:43:00 +00:00
c763d82306 2008-01-09 21:41:07 +00:00
ee4d054582 fix pausing of checking torrents 2008-01-09 21:16:13 +00:00
cb64ecb282 update, then present, not the other way around 2008-01-09 18:05:24 +00:00
fcfdcd6b06 tweak new release pref 2008-01-09 08:18:35 +00:00
2e895795b6 Force '-DNDEBUG'. 2008-01-09 07:12:04 +00:00
e491ecf0df lt sync 1912 2008-01-09 06:35:48 +00:00
77f542b925 more tab work 2008-01-09 04:02:13 +00:00
068e4008c6 update todo and initial stages of browser tab support 2008-01-08 06:01:34 +00:00
70497c074e fix win32 problems with rt 2008-01-08 06:00:37 +00:00
7b39f7adf5 lt sync 1912 2008-01-08 05:59:58 +00:00
e0fc7f3d2e fix #647 2008-01-07 23:25:10 +00:00
7d781568ea remove rt from win32 2008-01-07 21:43:44 +00:00
5c485afe5e Make new add torrent dialog actually work, but still needs work. 2008-01-07 02:18:40 +00:00
dcefa152c0 sync rest 2008-01-07 01:36:35 +00:00
294e1f6b76 lt sync 2008-01-07 01:36:09 +00:00
d76ed8cfba remove old files 2008-01-06 20:08:36 +00:00
62b9a9170a 2008-01-06 20:02:44 +00:00
8c67f97631 2008-01-06 20:02:16 +00:00
3997c235be 2008-01-06 20:00:13 +00:00
c6eb180e66 2008-01-06 19:58:20 +00:00
b31fa3a6df 2008-01-06 19:57:16 +00:00
22225963d5 2008-01-06 19:56:11 +00:00
9741cbbda0 2008-01-06 19:54:53 +00:00
65d007c681 browser and search are now plugins 2008-01-06 19:53:47 +00:00
d15a03bce1 test 2008-01-06 19:52:56 +00:00
0e82847ae0 fix cast oops, add youtorrent to search, catch fastresume error 2008-01-05 00:13:50 +00:00
d497a971db fix cast oops 2008-01-04 23:59:54 +00:00
3baecc13d3 save fastresume every minute 2008-01-04 23:30:25 +00:00
0ca8b5887b lt sync 2008-01-03 19:08:52 +00:00
34eec4ab93 Improve performance of the statusicon and progress cell functions. 2008-01-03 03:22:08 +00:00
76e9cb3e76 remove needless casts for performance 2008-01-03 02:43:54 +00:00
7477a0f159 Improve performance of some common functions. 2008-01-03 02:35:37 +00:00
1efe0f7778 Improve performance of the cell data functions. 2008-01-03 02:33:38 +00:00
c7fcbd40e3 Remove some needless 'casts' in common.py to slightly improve
performance.
2008-01-03 02:30:40 +00:00
9a3a96a31f py2.4 fix - thresh 2008-01-03 00:57:36 +00:00
72f49e3557 add rt/crypto to libraries - thresh 2008-01-03 00:52:08 +00:00
39e987d5da Improve get_torrent_status() speed by only building the files dictionary
when the Torrent object is created.
2008-01-02 11:54:42 +00:00
a3658e352b Fix undefined sleep. 2008-01-02 11:46:08 +00:00
df9fd2af09 Fix sorting of name column. 2008-01-02 11:45:36 +00:00
7e49e9acc4 tweak windows build preprocessors 2008-01-01 03:56:50 +00:00
ff0ade61b0 tweak vista shutdown 2008-01-01 02:36:06 +00:00
24fc4f0a49 Start of work integrating new Add Torrent dialog. 2008-01-01 01:03:15 +00:00
9972471231 lt sync 2007-12-31 10:44:40 +00:00
42f4d55db2 tweak version 2007-12-31 10:43:37 +00:00
2d27cede5f asio sync 2007-12-31 07:11:07 +00:00
4d4b30700a sort by seeds in piratebay search 2007-12-30 22:02:05 +00:00
736afd6a19 add /seeds to mininova search 2007-12-30 22:00:08 +00:00
74d382dc86 Tweak the add torrent glade file. 2007-12-30 04:01:33 +00:00
aa932b56a7 Fix crash when trying to add a bad .torrent. 2007-12-30 04:00:53 +00:00
91fa4df798 fix new release 2007-12-30 02:58:47 +00:00
150609e8c8 lang sync 2007-12-29 22:01:26 +00:00
aeb1b9bac2 allow higher ports in proxies 2007-12-29 21:27:52 +00:00
d1a5490e6b handle events before apply_queue 2007-12-29 18:40:01 +00:00
5a175587f4 Initial commit of the new Add Torrent dialog. 2007-12-29 13:18:31 +00:00
7ac3421e31 Remove pointless '+0.5' from update timer. 2007-12-29 05:37:21 +00:00
3b2d205866 alter signal handling shutdown 2007-12-29 05:04:35 +00:00
c067cbe4bd tweak import of gnome.ui 2007-12-29 04:52:14 +00:00
fb222ce57f remove no-longer needed freebsd fix 2007-12-29 04:04:08 +00:00
c21f650c45 fix handling of invalid torrents 2007-12-29 03:16:30 +00:00
ea7fdc3bc1 tweak pause/resume 2007-12-29 01:39:58 +00:00
eeb2c26002 tweaks and lt sync 2007-12-28 23:35:11 +00:00
24471624c2 Fix previous fix for non-present key in cache. 2007-12-28 13:39:47 +00:00
e069542e3a Fix allocation modes. They were reversed. 2007-12-28 13:20:34 +00:00
5c38bfdbe7 Fix batch status caching for when a key doesn't exist in the cache. 2007-12-28 13:19:50 +00:00
dd395b8c9c Attempt to reduce the number of updates to the TorrentView by caching
the previous status batch dictionary and only updating the difference.
2007-12-28 08:48:33 +00:00
44c82db9a8 Fix display of speeds in the systemtray tooltip. 2007-12-28 08:22:59 +00:00
c8508c8d15 Use an asynchronous batch torrent status method for updating the
torrentview list.
Other various minor stuff.
2007-12-28 05:29:54 +00:00
4156788296 2007-12-27 17:41:01 +00:00
2dec88e5c2 makefile fix 2007-12-27 17:40:35 +00:00
e2e3073f23 Fix last. 2007-12-27 10:56:18 +00:00
91c55522b8 Optimize torrent.get_status() a bit.
Emit signals with gobject.idle_add().
2007-12-27 10:54:05 +00:00
5eeabadc88 lt fixes 2007-12-27 06:19:51 +00:00
85fb85cf13 fix association with svn builds 2007-12-27 05:52:38 +00:00
d3492be2c2 fix having two instances of deluge running when fixing environment variables 2007-12-27 01:50:56 +00:00
c6f69d47e2 fix ubuntu and separate config dir issues 2007-12-27 00:45:11 +00:00
ea953f54b1 fix debug 2007-12-26 22:17:43 +00:00
eea8ff8e98 try to fix ubuntu again 2007-12-26 22:17:23 +00:00
cd74538adf check for bookmark first 2007-12-26 21:09:04 +00:00
7e748a1306 fix config error 2007-12-26 20:10:15 +00:00
ab8e6e6bde fix freebsd oops 2007-12-26 20:07:44 +00:00
2465c5d214 try to fix adding torrents when overwriting env variables 2007-12-26 20:06:38 +00:00
5828ee03e9 account for freebsd path for gtkmozembed 2007-12-26 19:48:48 +00:00
a29c735acd tweak last 2007-12-26 19:28:43 +00:00
dacebd2eec use external browser always for active port test 2007-12-26 19:27:52 +00:00
659c1c5f34 warning popup instead of crash if importing browser fails 2007-12-26 18:53:58 +00:00
d647031bee tweak new version 2007-12-25 23:45:55 +00:00
02ad4098bc fix update alert 2007-12-25 17:39:58 +00:00
f7952eaa7f remove restart notice in prefs for browser 2007-12-25 07:50:14 +00:00
5a3527611d fix browser icon without restart 2007-12-25 07:48:31 +00:00
3c0d9279eb add missing lt changes to changelog 2007-12-25 07:32:33 +00:00
3d794b6983 update changelog and version numbers for rc2 release 2007-12-25 07:27:23 +00:00
9b52e63f5b fix icon size in search 2007-12-25 03:34:57 +00:00
214042af9a tweak launching of frames externally 2007-12-25 03:31:34 +00:00
3fb919b99d fix oops in notification 2007-12-25 03:02:07 +00:00
653dcb046e minor glade tweak 2007-12-25 02:25:50 +00:00
445f3840b2 add buttons to launch main/footer frames into an external browser 2007-12-25 02:24:06 +00:00
c748419fa9 webui sync 2007-12-24 22:52:04 +00:00
431664fec4 lt sync 2007-12-24 22:27:26 +00:00
77d4fefba9 remove filelist from notification list 2007-12-24 09:12:23 +00:00
3ba156632f fix flexrss before blocklist 2007-12-24 04:47:34 +00:00
4ee8fd8394 tweak message 2007-12-24 04:44:08 +00:00
5b1a381389 change add torrent to ctrl+n and remove browser icon when not selected in preferences 2007-12-23 23:52:15 +00:00
b59de9aa8b fix shrinking of main window 2007-12-23 06:48:14 +00:00
4149e1d285 sync trunk 2007-12-23 02:42:22 +00:00
8d12fe6312 testing 2007-12-22 22:50:28 +00:00
58a240a998 Added tray tooltip.
Increased client cache time to 1.5 seconds.
2007-12-22 20:35:43 +00:00
75684cde8d fix up webui 2007-12-22 19:58:46 +00:00
5ccca41ea6 2007-12-22 08:36:15 +00:00
23d13a2cfd revert last 2007-12-22 08:20:17 +00:00
b803d39d63 webui sync r168 2007-12-22 08:15:51 +00:00
93d0ab797b lt fix - fix to bound check piece index before use in incoming_allowed_fast 2007-12-19 07:06:10 +00:00
473110b7fe Fix up calls to open_url_in_browser() because it's been moved to
deluge.common.
2007-12-18 00:03:34 +00:00
4d6e4b1a06 Create a specialized decorator for caching get_torrent_status(). 2007-12-17 23:55:42 +00:00
9251a82259 lt fix - added missing include guard to disk_io_thread.hpp 2007-12-17 23:55:31 +00:00
68642443a5 Make CoreProxy a GObject. 2007-12-17 11:14:22 +00:00
60fc0d24fe Start of caching for client.py. 2007-12-17 04:00:39 +00:00
53702b378e lt fix - fixed typo in plugin 2007-12-16 22:54:18 +00:00
419333b9cb Only enable plugins that are enabled in the core. 2007-12-16 11:10:12 +00:00
02fe961a8a Fix deluge.common. 2007-12-16 10:40:25 +00:00
58a0506b98 Sync lt 1825 2007-12-16 10:15:32 +00:00
3e9eff9b16 lt piece picker fix 2007-12-16 06:35:45 +00:00
6dff50c3f5 Import gobject now. Oops. 2007-12-16 05:36:51 +00:00
3dd3d22fd0 catch (more) delete 2007-12-15 18:40:03 +00:00
c6ff9e43b7 catch delete 2007-12-15 18:14:20 +00:00
c8507b4c28 fix lt assert 2007-12-14 08:44:31 +00:00
6733ce38d2 Add removals to the setup script.
Do not display the Open Folder menu item if not connected to a 
localhost.
2007-12-14 07:44:53 +00:00
62bd4a86f8 Fix EditTrackersDialog to import deluge.component correctly. 2007-12-14 06:38:11 +00:00
f133704905 home env doesnt exist in windows, so work around that 2007-12-14 03:48:16 +00:00
8821113742 fix column saving 2007-12-14 02:21:02 +00:00
2317bb4d52 change tabs to spaces 2007-12-14 01:23:09 +00:00
0ed3bda526 proper paths for cross platfrom 2007-12-14 01:19:39 +00:00
3fd1434b04 tweak path to icon 2007-12-14 01:02:42 +00:00
71cf5198d4 launchpad lang sync 2007-12-13 06:36:16 +00:00
83be470f1e Libtorrent sync 1814 2007-12-13 06:30:39 +00:00
22ddf86a4d add web seed to torrent creator in changelog 2007-12-13 06:25:51 +00:00
fa7a785aab update changelog 2007-12-13 05:08:56 +00:00
202b3019a3 fix total uploaded 2007-12-13 04:50:27 +00:00
5eb2e95dd4 change trunk version # 2007-12-13 04:44:40 +00:00
b800545ca1 lt - attempt to fix potential deadlock in disk_io_thread 2007-12-13 04:13:29 +00:00
bf037ab3d6 tweak init script 2007-12-12 23:20:30 +00:00
79b0f67760 lt bug fixes 2007-12-12 20:23:31 +00:00
657055cab1 change shutdown from using abort 2007-12-12 20:22:15 +00:00
8271d70ec7 Plugin system changes in regards to enabling/disabling plugins. 2007-12-11 04:45:47 +00:00
f3cdfa8351 Fix Queue plugin loading when state file is wrong. 2007-12-11 01:35:36 +00:00
9eaf2e602a fix seeding ratio stop on finished torrents 2007-12-11 01:08:49 +00:00
c35a13b227 set half-open connection lower on ms' retarded windows 2007-12-10 22:24:45 +00:00
54155670b5 dht fix 2007-12-10 20:57:25 +00:00
78b78ce8b3 Use deluge.component for core components. 2007-12-10 10:49:42 +00:00
559fcdf51c Move component.py up one level. 2007-12-10 10:26:44 +00:00
43c09af8b1 fix zombie fix oops 2007-12-09 19:05:17 +00:00
d355a42af8 bandwidth manager fix 2007-12-09 18:50:22 +00:00
91531deb6d no more zombie processes when launching external apps 2007-12-09 04:31:39 +00:00
f73e9be9c9 increase tracker stop timeout 2007-12-09 04:31:18 +00:00
9e9eee5d2c Fix loading when no .state file exists. 2007-12-08 21:39:19 +00:00
26350c5099 Fix listview. 2007-12-08 21:23:08 +00:00
589df97add Add ListView state saving.
Have TorrentView save and load state on startup/shutdown.
Add new method to components shutdown() which is called when the UI is 
exiting to allow components to clean-up.
Clean up some debug output.
2007-12-08 05:02:29 +00:00
7522ecf719 Fix sorting in TorrentView. 2007-12-08 03:48:52 +00:00
4a8f2c46f2 Add Classic mode to the preferences dialog. 2007-12-08 02:15:17 +00:00
0f8199dbab close upnp on close 2007-12-07 22:02:34 +00:00
04ad4ae7be launchpad language sync 2007-12-06 02:53:18 +00:00
68f9a3f265 webui sync r165 2007-12-05 22:06:31 +00:00
2324fdca83 dht abuse prevention in lt 2007-12-05 19:04:27 +00:00
3b9983f110 Add filtering to torrentview for use with sidebar labels.
Implement sidebar filtering.
2007-12-05 05:21:34 +00:00
db80d433b6 revert svg for windows 2007-12-03 18:10:15 +00:00
b4795cc362 windows now supports svg icons 2007-12-03 16:45:11 +00:00
d849684e8b fix about dialog focus in windows 2007-12-03 15:58:05 +00:00
b079f1b755 fix alignment 2007-12-03 14:43:10 +00:00
c7067c93d2 close daemon in vista, too 2007-12-03 13:14:27 +00:00
d45b859705 tweak height 2007-12-02 22:55:55 +00:00
856420c640 add web seeds to torrent creator 2007-12-02 22:36:02 +00:00
4f55d7dfc6 fix date in changelog 2007-12-01 18:31:05 +00:00
27bc2a72b0 tweak full hd warning - disable it in libtorrent 2007-12-01 06:45:43 +00:00
4037479119 update changelogs and up trunk version 2007-12-01 04:20:47 +00:00
a0af136b81 remove unneeded makefiles 2007-12-01 04:14:24 +00:00
f757efde4d sync lt to rc_0_13 branch 2007-12-01 04:07:11 +00:00
cfe1bd241d fix duplicant_torrent and libtorrent bugfixes 2007-12-01 03:54:42 +00:00
2eb3868115 increase tracker timeout 2007-12-01 03:24:36 +00:00
622080de50 Fix signalreceiver to work when connected to a remote daemon. 2007-11-30 06:50:48 +00:00
6953e280ad total_done overflow fix in libtorrent 2007-11-30 06:39:12 +00:00
e32f603103 UI tweaks. 2007-11-30 06:20:47 +00:00
f817de3575 fix faq url 2007-11-30 04:48:00 +00:00
aa019231ba Scrape tracker if we do not receive any peer information on announce.
Minor UI tweaks.
2007-11-29 07:09:18 +00:00
a7e6ec4b06 Sync libtorrent to 0.13RC
Update python bindings to support wait_for_alert() and scrape_tracker()
plus associated alerts.  This modifies lt's wait_for_alert() to return a
std::auto_ptr.
2007-11-29 06:02:33 +00:00
dae1472f61 lt sync 1787 2007-11-28 03:29:53 +00:00
5b71f1f6d9 up trunk version number post release 2007-11-27 23:16:11 +00:00
7d5e079336 remove webui example template 2007-11-27 21:35:16 +00:00
039c5591ed sync languages for release 2007-11-27 19:18:55 +00:00
e00fece477 fix portuguese encryption translation 2007-11-27 18:56:31 +00:00
fb5d4c8e55 gtk stock non translatable again 2007-11-27 18:10:36 +00:00
d3890efaf9 Add removetorrentdialog.py 2007-11-27 05:07:01 +00:00
36a5440858 webui button fix from vonck 2007-11-26 23:21:34 +00:00
b3ab64182e webui rev161 2007-11-26 19:43:51 +00:00
47acfd93ea try to catch invalid_handle in add_torrent 2007-11-26 18:56:17 +00:00
9ec83822a0 tweak replace_tracker in core.py 2007-11-26 17:31:22 +00:00
d288e39a54 tweak try/catch again 2007-11-26 17:03:04 +00:00
8c5355498c tweak boost library variables 2007-11-26 16:42:07 +00:00
4dad638a41 webui tweaks rev 160 2007-11-26 16:06:55 +00:00
1698c57f58 tweak get_index_from_unique_id 2007-11-26 06:07:47 +00:00
f96cc8e56a fix typo 2007-11-26 05:57:31 +00:00
675a286f8a make sure simplerss does not load 2007-11-26 05:40:24 +00:00
0d51bb250e fix indent 2007-11-26 04:57:28 +00:00
8f6bb96df0 add catch to get_index_from_unique_id 2007-11-26 04:48:11 +00:00
32fc9bbf07 tweak last 2007-11-26 02:20:40 +00:00
b7983a5ab4 catch invalid_handle on add_torrent 2007-11-26 02:04:55 +00:00
776ed5a9d8 another attempt for invalid handle 2007-11-26 00:59:28 +00:00
6595fe0621 fix webseed 2007-11-26 00:17:48 +00:00
fd7d1ce675 try to catch invalid handle in deluge_core 2007-11-25 23:59:19 +00:00
e0367895b7 torrent info labels selectable 2007-11-25 22:02:44 +00:00
1e65e4e396 Apply logfile patch for Windows build from Slurdge. 2007-11-25 12:16:29 +00:00
fcd70cbb44 Registering a signal receiver with the core is done with the clients ip
address.
Minor UI fix-ups.
Hook up autoadd folder options in Preferences.
2007-11-25 09:58:12 +00:00
fe33a72022 Various interface improvements.
Initial import of SideBar.
2007-11-25 02:16:54 +00:00
51bc2329c2 use system setting for toolbar text/icon style 2007-11-25 01:51:00 +00:00
5c7031ab80 cleanup trackers replace 2007-11-25 01:11:19 +00:00
9c3929f15e dont die if plugin in prefs.state is not found on the filesystem 2007-11-24 22:46:43 +00:00
ee409d71c5 fix add torrent in webui 2007-11-24 20:39:55 +00:00
9777d4e00c skip taskbar fix for win 2007-11-24 19:54:00 +00:00
7e9576a947 language files sync 2007-11-24 19:30:42 +00:00
1b0f7e89c1 asio fix for win32 2007-11-24 18:39:00 +00:00
fbf7564d42 up version number for rc release 2007-11-24 16:55:33 +00:00
0b2faf6ee1 add python-pyopenssl to README depend list 2007-11-24 16:31:02 +00:00
cda1b3aa98 update webui, show error on permission failure, differentiate queued vs paused 2007-11-24 16:22:49 +00:00
ced47db339 tweak full hd dialog when adding a new torrent 2007-11-24 05:00:08 +00:00
b221e7ac82 tweak full hd dialog 2007-11-24 04:58:57 +00:00
19f38da504 tweak tooltip 2007-11-24 03:56:11 +00:00
54aca23618 update changelog 2007-11-24 03:52:59 +00:00
dde291d6dd add connection_speed setting 2007-11-24 03:51:11 +00:00
2815d8f19f Add option to allow remote connections to daemon.
Add option to change daemon port.
Added 'Daemon' tab to Preferences dialog.
2007-11-24 03:21:37 +00:00
adb7bcdf38 set max_half_open default to 20 if not on a windows system 2007-11-24 03:12:18 +00:00
ceaec1897d update changelog 2007-11-24 03:02:07 +00:00
e701fa28ba fix merge trackers 2007-11-24 02:58:23 +00:00
4ca1206b2c Add 'torrentfiles_location' configuration option. 2007-11-24 02:34:21 +00:00
5701324e00 dont pause prior to move_storage 2007-11-24 01:58:54 +00:00
ac08425ee3 Add remove torrent dialog. 2007-11-24 01:38:17 +00:00
ffa2066046 asio sync 2007-11-23 23:36:34 +00:00
8a833af738 lt sync 1757 2007-11-23 23:32:47 +00:00
71bee41ff0 ipv6 listen fix 2007-11-23 23:23:41 +00:00
54bba4d74c fix for when lsd/natpmp/upnp are started twice 2007-11-23 21:18:26 +00:00
ae4d85d5d8 Add LSD support.
Initial import of remove torrent dialog.
2007-11-23 08:52:00 +00:00
1aec790ad6 Update Preferences dialog glade file to support new options. 2007-11-23 06:39:11 +00:00
063fe8fe2d default not to use upnp 2007-11-22 23:19:14 +00:00
2cb306ca86 new languages - bs, nds and hi 2007-11-22 23:18:14 +00:00
e617c1d3b7 remove dumb tb_middle and tb_right 2007-11-22 23:17:45 +00:00
bb03e2ff6a deal with stupid gutsy sometimes not being able to connect to dbus 2007-11-22 22:26:06 +00:00
4b7d40ed49 lang sync 2007-11-22 17:29:21 +00:00
cc0d1502cc revert webui 2007-11-22 04:20:42 +00:00
74f739a693 identify miro client 2007-11-22 02:42:07 +00:00
22317356c5 plugin name translations 2007-11-22 00:02:06 +00:00
037be4d170 tweak local setting 2007-11-21 23:42:35 +00:00
d918302e3e sync webui rev 143 2007-11-21 22:32:18 +00:00
fde0c836aa re-add features that our isp lost in the backup 2007-11-21 22:18:11 +00:00
d9a783118a fast resume fix 2007-11-20 03:37:15 +00:00
3e6b577b1b fix blocklist load on start 2007-11-20 01:59:51 +00:00
19ee80cfab pause torrent before fastresume save if in compact mode 2007-11-20 01:21:22 +00:00
7b6ece4a2c lt update 2007-11-19 18:21:36 +00:00
a0b2638ffb fix category 2007-11-19 16:24:42 +00:00
8b4053dd2e fix wizard apply_prefs mess 2007-11-19 15:17:24 +00:00
9afc4ce936 lt sync 1746 2007-11-19 14:14:22 +00:00
1ae6dbf871 allow creation of torrents without trackers 2007-11-19 12:51:46 +00:00
d8680af277 Clean up StatusBar and use new StatusBarItems. 2007-11-19 07:33:43 +00:00
de2e230e4f Enable auto add queued torrents. 2007-11-19 03:51:33 +00:00
3d1cd9bf00 update lang template 2007-11-19 02:29:22 +00:00
15983c8901 fix typo 2007-11-19 02:10:57 +00:00
7bdf7e9d1e fix eta 2007-11-19 00:43:33 +00:00
34e0a0e839 tweak pause/resume all 2007-11-19 00:27:56 +00:00
1c369bce31 same 2007-11-18 23:46:33 +00:00
9b88b8d61f tweak set_user_pause 2007-11-18 23:45:16 +00:00
423cce7c56 fix oops in last 2007-11-18 23:29:47 +00:00
43ad15b3b2 fix pause all / resume all problems 2007-11-18 23:22:36 +00:00
5a01eec297 add proper preferences for selection popup 2007-11-18 22:57:10 +00:00
06e8a0c6b9 update changelog 2007-11-18 22:27:40 +00:00
b0f991b43c only popup file selection if torrent has more than 1 file 2007-11-18 22:20:22 +00:00
61a4842bed remove remap 2007-11-18 22:09:21 +00:00
06eaabc45f update desktop file 2007-11-18 19:42:46 +00:00
553bdcc3a6 remove lsd...damnit 2007-11-18 09:17:55 +00:00
3eab9473bf lt fix 1737 2007-11-18 09:10:23 +00:00
b4b7b154ae paused/active state on add to todo 2007-11-18 08:32:15 +00:00
3a77185e1e reanable lsd with custom fix to lt 2007-11-18 05:18:12 +00:00
63fa4601fb force recheck fix 2007-11-18 04:49:25 +00:00
77f6be5aac disable lsd 2007-11-18 04:30:18 +00:00
f5f7f04e1e fix lsd 2007-11-18 04:13:41 +00:00
8e22078402 fixes for gcc-4.3 2007-11-18 02:16:31 +00:00
d0d2e59192 fix last oops 2007-11-18 00:37:30 +00:00
b793646437 use sysconfig for libdir 2007-11-18 00:35:52 +00:00
51eceeae3a redo -mt detection 2007-11-18 00:09:48 +00:00
dba9a65749 remove separate libtorrent comment 2007-11-17 20:47:46 +00:00
bbbc8024e5 fix for opensuse 10.3 being retarded 2007-11-17 20:13:00 +00:00
989abbc531 multiple torrents update tracker 2007-11-17 19:53:56 +00:00
dc2f24344c asio sync 2007-11-17 12:22:22 +00:00
732c3d8674 lt sync 1732 2007-11-17 11:45:19 +00:00
4ff0a04608 disable lsd for now 2007-11-17 11:39:05 +00:00
35fe99eee3 Updates to the QueuedTorrents dialog stuff.
Updates to StatusBar.
2007-11-17 11:36:29 +00:00
1163096a70 remove abort 2007-11-17 11:21:09 +00:00
e47f0a756e remove locations plugin 2007-11-17 10:46:59 +00:00
709b2a04a3 tweaks to shutdown 2007-11-17 10:29:31 +00:00
3c78e41fc2 Add missing file. 2007-11-17 10:17:51 +00:00
94a159a66f remove uneffective hide 2007-11-17 09:58:52 +00:00
de8b55c9ed fix plugins on restart 2007-11-17 09:15:08 +00:00
85f9b8bf41 more scheduler fixes/tweaks from ben 2007-11-17 09:12:12 +00:00
0c83ffc391 code cleanup on advanced progress bar and clear adv bar on torrent removal 2007-11-17 09:10:24 +00:00
0c5c099097 save plugin state on plugin enable/disable, instead of on shutdown. remembers active plugins in case of a crash 2007-11-17 08:14:27 +00:00
e4ab021d20 set proper transient for other speed dialog 2007-11-17 07:55:44 +00:00
e21da8636e tweak remap dialog size 2007-11-17 05:57:51 +00:00
f40e5522bd cleanup 2007-11-17 04:12:41 +00:00
7e175dd4c0 remap files update 2007-11-17 03:21:34 +00:00
b871ae8152 Do not force_reannounce if 0 trackers. 2007-11-17 02:13:43 +00:00
b764486bff deal with blank trackers in force recheck and between sessions 2007-11-16 20:56:50 +00:00
5a90e14794 edit empty trackers fix 2007-11-16 20:11:58 +00:00
2a8d36029e Fix memory leak. 2007-11-16 08:27:34 +00:00
052894e805 readd advanced progress bar and beginnings of remap_files 2007-11-16 08:08:33 +00:00
0b582261ec lt sync 1727 2007-11-16 00:52:10 +00:00
b95e3c4988 hopefully fix shutdown hang and tweak win compile 2007-11-15 04:38:35 +00:00
abc9534f7f Add --config switch to specify the config directory on startup. Patch
from slurdge.
2007-11-14 23:40:05 +00:00
eac95882d4 Queued torrents update. 2007-11-14 15:51:22 +00:00
80ef895a51 Add dependency support to the components. 2007-11-14 11:29:06 +00:00
2b519730bc remove remnant of adv progress bar 2007-11-14 02:07:20 +00:00
edfd988cf9 add torrent in paused state option 2007-11-13 23:15:17 +00:00
f7a1db3be7 remove advanced progress bar 2007-11-13 20:30:55 +00:00
10456b3f99 Add support for Dbus and adding torrents to an already running client.
Minor UI tweaks.
Additional error checking in update functions.
2007-11-13 08:47:26 +00:00
de2f265c2a update todo 2007-11-13 04:33:57 +00:00
97f2f244ae fixes to scheduler from ben 2007-11-13 03:18:44 +00:00
c4c8539401 small ui tweaks 2007-11-12 22:43:45 +00:00
fced9a2c71 dont crash on empty tracker list 2007-11-12 22:39:59 +00:00
ebe0ac39d9 update todo 2007-11-12 22:23:26 +00:00
2e86ebc6ee copy translator credits from launchpad to our about->credits 2007-11-12 21:59:54 +00:00
fd817f5e76 only show queue arrows if there are two or more torrents loaded 2007-11-12 19:59:46 +00:00
6bced0fb8c EditTrackerDialog now works.
Save trackers in torrent state.
Load trackers on torrent add from state.
2007-11-12 13:28:56 +00:00
70b7c120bc scheduler revamp by ben klein 2007-11-12 08:37:20 +00:00
091b57d65f tweak webseed glade file 2007-11-12 07:36:00 +00:00
31b05cfaa9 tweak last 2007-11-12 06:25:19 +00:00
d7c7222d4f fix wizard not working if firstrun file is already created 2007-11-12 05:49:26 +00:00
190d6d94ea Extra debug info. 2007-11-12 04:51:23 +00:00
a8c796ba59 Inital import of EditTrackersDialog. 2007-11-12 02:27:03 +00:00
efc8179261 cancels more async operations on shutdown 2007-11-11 20:55:48 +00:00
3400c444a8 adding add torrent in pause state to TODO 2007-11-11 03:37:14 +00:00
b6ff01e7c7 update pot file 2007-11-11 01:37:41 +00:00
be8a004324 add lsd to bindings 2007-11-11 00:30:29 +00:00
4e92f3f699 lt sync 1723 2007-11-11 00:22:53 +00:00
89533158e6 revert back to delete m_ses and no abort 2007-11-11 00:20:06 +00:00
3eb3ab5b6b dont delete m_ses 2007-11-11 00:04:46 +00:00
cd0465a3a1 use lazy bitfield in 0.6 2007-11-10 22:18:02 +00:00
812eeb024e revert queue 2007-11-10 19:57:51 +00:00
56e8db547c cleaning up tabs/spaces 2007-11-10 18:56:18 +00:00
6da931e815 Do not show Torrent menu when not connected.
Fix force recheck.
2007-11-10 10:04:07 +00:00
5c154c3231 Fix removing columns from ListView. 2007-11-10 09:54:09 +00:00
c42b146528 System tray fixes. 2007-11-10 09:44:51 +00:00
6a51a4b9ed tweak last 2007-11-10 08:16:43 +00:00
d3fe619f11 fix queue oops 2007-11-10 08:12:23 +00:00
8886ee9a59 tweak adv progress bar border 2007-11-10 07:50:16 +00:00
5c75c5192f fix oops 2007-11-10 07:29:10 +00:00
e7a789e453 fix ident/tabs 2007-11-10 07:28:36 +00:00
6e58e5113f fix toolbar 2007-11-10 07:13:34 +00:00
5b5232eddf Fix adding torrents. 2007-11-10 06:28:09 +00:00
4dc601c845 System tray updates. 2007-11-10 06:00:23 +00:00
2c48226cdc fix oops 2007-11-10 05:11:25 +00:00
d1f2aed58b add advanced progress bar option - modified extensively from patch by arnab 2007-11-10 05:10:28 +00:00
6da46bc546 Add separate preference for max downloading torrents and max seeding torrents 2007-11-10 02:46:27 +00:00
3c9209dce4 Display Queue preferences tab when enabled. 2007-11-10 00:22:11 +00:00
b645417689 tweak save_upmem 2007-11-09 22:32:18 +00:00
da9bf950a7 remember file priorities in force recheck 2007-11-09 21:54:10 +00:00
4e8d9b6e6d tweak shutdown 2007-11-09 21:07:14 +00:00
576b81e910 clean force recheck 2007-11-09 20:36:02 +00:00
7d9a30a545 Updates to the Connection Manager.
Updates to TorrentManager.
2007-11-09 12:08:15 +00:00
24b6def6bd little code cleanup 2007-11-09 01:12:42 +00:00
1f24972c9d use lazy_bitfield 2007-11-08 22:13:47 +00:00
a043858f2e Update TODO 2007-11-08 08:04:43 +00:00
094e132ace Add Force-recheck. 2007-11-08 07:54:56 +00:00
14c34684dc change force recheck to redo 2007-11-08 07:41:11 +00:00
1bc07d2d8e add total seeding torrents to todo 2007-11-08 07:28:29 +00:00
8bf1c1e60a fix recheck oops 2007-11-08 04:22:39 +00:00
8b13d85bdc fix queue 2007-11-08 04:21:34 +00:00
4eb0e558a8 update changelog 2007-11-08 03:18:43 +00:00
2dfb02e062 fix eta from going backwards 2007-11-08 03:17:26 +00:00
92c9d28d0c call it peer exchange, not utorrent peer exchange 2007-11-08 03:07:27 +00:00
554ad73aa1 tweak glade file 2007-11-08 03:05:03 +00:00
d94694fc73 add local discovery of peers 2007-11-08 02:44:22 +00:00
e2e507b94b warning fix 2007-11-07 03:09:42 +00:00
8d6b749a5d add flex to changelog 2007-11-07 02:00:04 +00:00
23c83e6bb1 again 2007-11-07 01:06:36 +00:00
6d70add980 tweak shutdown 2007-11-07 00:24:23 +00:00
6b3065d2cf sync webui 127 2007-11-06 23:34:23 +00:00
047a32ef9f testing some shutdown tweaks 2007-11-06 22:27:07 +00:00
ab9a3f778f cia test 2007-11-06 22:05:34 +00:00
179b5f8c55 add hd warning to changelog 2007-11-06 21:32:15 +00:00
f9e5157d6e ui warning of out of hd space 2007-11-06 21:30:12 +00:00
86732c72d0 get duplicate error again 2007-11-06 21:04:34 +00:00
09798cd394 raise error 2007-11-06 20:46:11 +00:00
0998506f9f make gtk-stock strings not translatable 2007-11-06 20:19:37 +00:00
5f21c9d276 try to solve unicode problem 2007-11-06 19:24:26 +00:00
8050c3f8a6 add torrent notification plugin as default 2007-11-06 08:20:40 +00:00
4b21cc6bf1 add ratio fix to changelog 2007-11-06 04:20:42 +00:00
c244b29a03 tweak changelog 2007-11-06 04:16:37 +00:00
9ac2b85068 fix queue in force recheck 2007-11-06 04:09:40 +00:00
5383d6d197 remove debug print 2007-11-06 03:45:19 +00:00
9b170fe759 remove stupid raise 2007-11-06 03:38:44 +00:00
a624ff5557 tweak uploaded memory in force-recheck 2007-11-06 02:51:23 +00:00
1d36020f9d make force-recheck remember trackers and upload memory 2007-11-06 02:25:21 +00:00
cdb6450d48 remove unneeded code 2007-11-05 23:42:00 +00:00
ca51b3eeff tweak to get uid after force recheck 2007-11-05 23:33:47 +00:00
b48956397f update todo 2007-11-05 23:30:34 +00:00
319bc25cd5 manual force-recheck 2007-11-05 22:34:05 +00:00
e202a79dc3 update lang for last 2007-11-05 17:19:01 +00:00
63ac691e64 remove simplerss and add flexrss 2007-11-05 17:17:30 +00:00
a4b46d0607 Queue preferences glade file. 2007-11-05 03:05:45 +00:00
a769af2262 add progress bar to todo 2007-11-05 01:32:49 +00:00
0dcc01c942 implement autoload directory preference 2007-11-05 01:05:34 +00:00
580d2a2e84 add preference for torrent files location 2007-11-04 23:55:37 +00:00
cfc05729ee Queue plugin updates. 2007-11-04 23:54:38 +00:00
91d8ad33ae add error management to blocklist plugin 2007-11-04 22:33:55 +00:00
67e79250d2 piece picker assert fix 2007-11-04 21:32:07 +00:00
eacc6dd08f Queue plugin update.
Plugin system updates.
2007-11-03 07:24:45 +00:00
0898680adc lt update 1719 2007-11-02 23:43:09 +00:00
b64bbf1e76 tweak bindings 2007-11-02 22:24:52 +00:00
330b4c2115 no need to save config here since interface does it before passing it over 2007-11-02 21:25:14 +00:00
8adff80407 fix plugin oops 2007-11-02 20:40:26 +00:00
a09c03dafd quicker window shutdown 2007-11-02 20:00:58 +00:00
3610c30a25 minor tweak 2007-11-02 19:53:18 +00:00
9ecb8a388d revert libtorrent updates 2007-11-02 19:08:15 +00:00
3733b91d32 fix ratio and remember trackers 2007-11-02 18:33:37 +00:00
c11e61355b Add testing plugin.
Plugins should now enable/disable properly and save enabled/disabled 
state.
2007-11-02 02:40:44 +00:00
b144525cab lt exception tweaks 1719 2007-11-02 02:29:33 +00:00
2eec0a766d lt sync 1717 2007-11-02 00:49:26 +00:00
b3cdf1371c use full alloc 2007-11-01 22:40:04 +00:00
bd8329e971 only set_icon when not in windows 2007-11-01 22:32:46 +00:00
3c94a2039d fix dos format 2007-11-01 05:49:06 +00:00
c446d60ecd fix minor oops 2007-10-31 11:40:56 +00:00
5d3275de01 Some plugin updates. 2007-10-31 08:16:35 +00:00
3ab044409f fixing up libtorrent and tagging 0.5.6.2 2007-10-31 07:49:48 +00:00
5ad442341f use try in case pygame isnt installed 2007-10-31 05:46:49 +00:00
a4373ef156 use try in case pynotify isnt installed 2007-10-31 05:45:07 +00:00
9604c3ff09 update changelog 2007-10-31 04:23:37 +00:00
64aeb867a4 make sound not sensitive on windows 2007-10-31 03:52:55 +00:00
99065bf452 webui sync 117 2007-10-31 03:46:36 +00:00
2a9455e50a lt sync 1710 2007-10-31 02:00:53 +00:00
15d39eeb54 fix total_size 2007-10-29 23:41:44 +00:00
cf2c4a50f4 webui sync 115 2007-10-29 20:01:37 +00:00
054f7e5721 fix max upload for 256k 2007-10-29 05:46:49 +00:00
6520e618c2 forget reloading saved trackers 2007-10-29 03:54:09 +00:00
c059d5162b sync asio 2007-10-29 03:10:12 +00:00
9b59c0507e fix hang on shutdown 2007-10-29 01:01:48 +00:00
4cca79c764 2007-10-29 00:16:42 +00:00
2bac676de7 update todo 2007-10-28 23:20:44 +00:00
f21eb1c3f4 Fix plugin sub-dir code to work in Windows. 2007-10-28 10:34:40 +00:00
ff1391b8bf Send all torrent status keys if keys is []. 2007-10-28 06:36:25 +00:00
ae81a28e6b Add 'files' key to torrent status. 2007-10-28 06:30:02 +00:00
925416dded try to fix persistent.state pooping 2007-10-28 02:00:47 +00:00
cd2f45da92 sync webui 112 and translate 2007-10-28 01:35:27 +00:00
019ea1f601 make webui name/description translatable 2007-10-28 00:55:43 +00:00
2949ab545d fix crash on exit 2007-10-27 22:07:57 +00:00
3ed1de43c2 fix bug which made set_max_connections not work 2007-10-27 21:22:54 +00:00
8f592b6330 Fix some exceptions. 2007-10-27 04:35:09 +00:00
902e8a2526 lt sync 1900 2007-10-26 20:28:03 +00:00
dead0864ad better way to show number of connections 2007-10-26 20:10:29 +00:00
9bd76e077a update changelog 2007-10-26 03:20:43 +00:00
eec0be17f9 add piece size 2048 and make default piece size 256kb 2007-10-26 03:19:30 +00:00
0a0183b0b9 add description to about dialog 2007-10-26 02:56:52 +00:00
c030789e09 Updates to ConnectionManager. Can now autostart localhost, autoconnect
and not show dialog if desired.
2007-10-26 02:32:40 +00:00
d320f2aebe update todo for 0.5.7 2007-10-26 01:48:00 +00:00
38471aa832 upnp/lsd/natpmp fixes 1699 2007-10-26 01:38:04 +00:00
4bb1f06fd3 lt sync 1694 2007-10-25 22:20:56 +00:00
cbeb2c6e6c add new languages 2007-10-25 22:20:38 +00:00
2a315def04 Change toolbar button sensitivity based on selected torrent state.
Patch from sadrul.
2007-10-25 08:47:44 +00:00
1f8884f903 Enabled 'start local daemon' in ConnectionManager.
Change startup scripts: deluged runs daemon and deluge runs ui.
Minor fix-ups.
2007-10-25 07:42:14 +00:00
2b12b10f8c update version numbers in trunk 2007-10-25 01:15:46 +00:00
557d90987c dont show 0.0kbps by Arnab 2007-10-25 01:10:20 +00:00
60eeb8deed Minor touch-ups. 2007-10-24 21:11:33 +00:00
294945dca2 Fix icon on ConnectionManager. 2007-10-24 10:11:27 +00:00
1144ee802f SignalReceiver now initializes gobject threading. 2007-10-24 09:52:20 +00:00
0d3e319bea Change sensitivity of many UI elements based on state of connection to a
daemon.
2007-10-24 08:16:09 +00:00
57ff5be823 Able to change the visibility of the toolbar and infopane. 2007-10-24 07:40:59 +00:00
40e1376bc4 Hook up ConnectionManager tool button.
Fix preferences when applying config with no daemon.
2007-10-24 07:22:11 +00:00
e03401e3aa Fix Preferences dialog so that it can load while not be connected to a
daemon.
Change ConnectionManager icon and add toolbar button.
2007-10-24 05:45:32 +00:00
dbbace5f23 piece picker priority fix 2007-10-24 00:30:21 +00:00
a534f23661 update webui version num and add missed file 2007-10-23 22:30:37 +00:00
a28e33b809 sync with webui rev87 2007-10-23 22:16:37 +00:00
ac00fef1d4 only replace tracker if handle is valid 2007-10-23 22:14:22 +00:00
f436cbff64 hopefully fix segfault 2007-10-23 22:02:15 +00:00
74e5e49ee1 try to catch replace trackers error 2007-10-23 20:51:15 +00:00
1bf007907c tweak last attribute except 2007-10-23 07:35:23 +00:00
0bec032638 fix last 2007-10-23 06:49:27 +00:00
d17f6ee274 fix attribute error 2007-10-23 06:45:21 +00:00
571ecbdfac have name column expand 2007-10-23 06:35:46 +00:00
92c4adc4c1 sync language files with launchpad for release 2007-10-23 03:36:01 +00:00
80f941a249 tweak ratio fix 2007-10-23 03:32:58 +00:00
c04ae40cf1 catch attributeerror to fix upgrade issue 2007-10-23 03:26:28 +00:00
3eacd3e2d6 remove unnecessary eval 2007-10-23 03:10:04 +00:00
7d680bdd3a ratio fix 2007-10-23 02:43:21 +00:00
79e9e1de53 fixed issue when calling close on an uninstantiated variant_stream + variant_stream cleanup (removed unncessesary templates) 2007-10-22 23:56:03 +00:00
5d4a69d852 lt sync 1688 2007-10-22 22:33:08 +00:00
2e5eb2b885 try to fix a race condition 2007-10-22 20:35:32 +00:00
88a49d17c7 Stop local daemon now works in ConnectionManager.
Some minor tweaks.
2007-10-21 16:21:00 +00:00
298fd1bc7f Fixed and enabled the SignalReceiver. 2007-10-21 01:53:40 +00:00
f2c036650c fix deleting of subfolders 2007-10-21 00:51:13 +00:00
0b4b409a53 fix edited tracker list not being persistent 2007-10-20 23:37:36 +00:00
c4d4e75667 Change the gtkui to a new component based system.
Properly handle daemon quitting unexpectedly.
Many updates to the ConnectionManager.
2007-10-20 22:26:43 +00:00
d5888131a0 Move the old dbus branch to deluge-0.6-dbus and move the xmlrpc branch
to deluge-0.6.
2007-10-20 16:58:35 +00:00
c852cfd7c1 Updates to the ConnectionManager stuff. This is a work in progress.
Renamed functions.py to client.py.
2007-10-20 16:55:38 +00:00
58be40da1e set some fields as insensitive which arent valid on win32 2007-10-18 23:25:26 +00:00
589c007386 windows tweaks to prevent error on win32 2007-10-18 23:15:52 +00:00
c70721aeac fix for some invariant checks 2007-10-18 06:19:20 +00:00
1ddbf05b92 set file browser fields in deluge's preferences insensitive when in win32 2007-10-17 03:17:59 +00:00
cc77df8216 make torrentfile pref field insensitive when on win32 to avoid confusing windows users 2007-10-17 03:12:26 +00:00
5fb1987b1b collect network information when not in the networkgraph plugin tab 2007-10-17 02:54:05 +00:00
bf6a709340 Start of ConnectionManager. 2007-10-15 15:12:35 +00:00
c259aea06a Fix adding/removing torrents with current libtorrent. 2007-10-15 09:01:59 +00:00
b02b71e978 lt sync 1677 2007-10-15 06:11:37 +00:00
a16eb7625c lt updates 2007-10-15 04:50:17 +00:00
b3d15c7117 Daemonize receiver thread. 2007-10-15 04:35:37 +00:00
d690e44194 Fix adding torrents by URL. 2007-10-15 04:25:05 +00:00
67c7f9a80e Fix preferences' function calls. 2007-10-15 04:06:56 +00:00
1440e78cae Add xmlrpclib from Python 2.5.1 2007-10-15 04:01:46 +00:00
287d96d1e7 Include SimpleXMLRPCServer from Python 2.5.1 2007-10-15 03:49:45 +00:00
5b7b027f48 Save the uploaded_total in torrent state. 2007-10-15 01:56:47 +00:00
64a94ec197 Add SignalReceiver and use it in the client.
Add SignalManager in the core for emitting signals to clients.
2007-10-14 07:06:19 +00:00
b4cb4e7bcc Import the 0.6 xmlrpc branch.. Work in progess. 2007-10-12 23:37:42 +00:00
2b9d8cc670 fixed dead lock and fixed a problem in recent shutdown cleanup 2007-10-07 23:54:04 +00:00
8f974b8067 better shutdown sequence in lt 2007-10-07 21:03:25 +00:00
50877923ea pickle->cPickle 2007-10-07 20:29:43 +00:00
515305e950 fixes files that were left open in write mode by mistake, policy invariant check fix, fixed static assert being hit 2007-10-07 03:41:56 +00:00
85767b148a fix tray locking pop-up on quit while disabled 2007-10-07 03:33:36 +00:00
ae30cdb677 Fix an issue with large torrent sizes. 2007-10-07 01:53:58 +00:00
33fd818933 Save and load total_uploaded from torrent state. 2007-10-07 01:53:03 +00:00
54b1665c50 libtorrent build fix 2007-10-06 17:32:41 +00:00
7fe0392c90 Fix config debug output. 2007-10-06 17:31:48 +00:00
8f6029219d Fix adding torrents with a unicode save_path. 2007-10-06 04:35:15 +00:00
94fd3c0f37 lt sync 1649 2007-10-06 04:22:06 +00:00
d240ba3c01 Preferences plugin tab stuff. 2007-10-05 05:05:07 +00:00
84cd2da8dd Implement plugin management api in the core. 2007-10-05 00:58:26 +00:00
cc7d7e8c62 Show save_path in TorrentDetails. 2007-10-05 00:30:19 +00:00
c2f7c362b3 Use dbus variants instead of pickling objects. 2007-10-04 23:54:58 +00:00
17f62130fe Add 'save_path' to add_torrent().
Save the 'save_path' in the torrent state.
2007-10-04 22:21:47 +00:00
8a0692fa4f fix storage of banned peers lt 1645 2007-10-04 21:14:32 +00:00
7f88289f1f lt 1643 2007-10-04 15:31:23 +00:00
8e96afe626 Fix display of availability. 2007-10-04 01:21:39 +00:00
2707afc9c8 Show Queue menu and toolbuttons properly. 2007-10-04 00:53:39 +00:00
06e148c2ed Add PluginManagerBase class.
Only load plugins that are in the 'enabled_plugins' key in the config 
files.
2007-10-04 00:43:41 +00:00
838ef287da accidentaly reverted disk io priority fix, so here it is again 2007-10-04 00:09:45 +00:00
3841ddd3dc moved block_downloading_alert, block_finished_alert and piece_finished_alert to debug level...yay performance 2007-10-04 00:07:26 +00:00
5db5f423ce disk io priority fix 2007-10-03 22:46:30 +00:00
1a6afef6b8 lt sync 1638 2007-10-03 22:29:42 +00:00
27360c6cf8 show 8 '*' for password 2007-10-03 05:51:41 +00:00
2eafe71a2c Implement close to tray. 2007-10-03 03:04:22 +00:00
170c3810b3 Save torrent state every 5 minutes. 2007-10-03 02:57:05 +00:00
a17328fff7 Fix exception when removing torrents. 2007-10-02 03:06:40 +00:00
cc4fc60db0 redo translation for tracker status 2007-10-02 03:02:06 +00:00
78e797796a translation for tracker alerts 2007-10-02 02:29:12 +00:00
935aa72584 Add tracker responses to TorrentDetails. 2007-10-02 01:22:30 +00:00
4ad4ac058c remove lt example files 2007-10-01 22:32:33 +00:00
9a66035f0d Add 'paused' to TorrentState.
Move some alert handlers around.
2007-10-01 22:29:05 +00:00
4d4b2de7c3 remove misplaced and unnecessary code 2007-10-01 01:52:25 +00:00
c6c649485e enable start in tray 2007-09-30 09:26:05 +00:00
4a858a70bc fix tray password resetting itself sometimes 2007-09-30 09:12:38 +00:00
ca43940c1f sha1 hash password for tray lock 2007-09-30 07:52:48 +00:00
fd03c62ccb add tray locking 2007-09-30 07:28:06 +00:00
78f01e1397 set icon size and fix typo 2007-09-30 06:14:03 +00:00
fa73b6d125 add icon to quit daemon 2007-09-30 06:10:28 +00:00
1ce3eb7099 add quit & shutdown daemon to tray 2007-09-30 06:07:55 +00:00
f2f73b8539 Fix exception when removing multiple torrents at once.
Updated TODO.
2007-09-30 05:33:53 +00:00
466292d38e clean up adding via url and make enter submit it instead of having to click ok 2007-09-30 03:49:30 +00:00
234e6827e8 Load .fastresume files on add.
Fix opening browser function.
2007-09-29 10:37:46 +00:00
b645630773 Only enable the system tray once. 2007-09-29 05:32:42 +00:00
e0d82901e3 Remove silly line causing exception in get_torrent_status() 2007-09-28 06:29:04 +00:00
9551aab1c1 Properly show the Columns menu. 2007-09-27 13:41:19 +00:00
936df09c60 Fix issue where port was not opened before attempting to add torrents.
All config 'set functions' will apply automatically when they are 
registered unless otherwise specified.
2007-09-27 13:29:20 +00:00
4401c8f238 Save .fastresume files on shutdown. 2007-09-26 01:27:38 +00:00
78244649b8 Add support for saving .fastresume files. They are not loaded on add
yet.
2007-09-26 01:16:14 +00:00
0e73700f15 Fix add_torrent() deprecation and fix tracker_reply_alert to have the
number of peers.
2007-09-26 01:14:55 +00:00
20f76b4eaa Update the alerts bindings. 2007-09-25 07:15:35 +00:00
b72a79332d Update mainwindow glade 2007-09-24 23:14:25 +00:00
d64ed7e2e4 Make sure the queue state is saved whenever there is a change. 2007-09-24 23:13:18 +00:00
280eed95b6 libtorrent sync 1605 2007-09-24 23:07:45 +00:00
cf116cf3a1 Make shutdown() an async method. 2007-09-24 08:22:02 +00:00
67347e67b6 Stop update timer before shutting down. 2007-09-24 06:44:20 +00:00
8b6a14403f fix icon path 2007-09-24 06:41:38 +00:00
dd3ec750aa Prevent update() thread to start until all plugins are loaded and we are
ready to show the main window.
2007-09-24 06:22:31 +00:00
5043c8bf29 activate test active port button 2007-09-24 03:54:35 +00:00
1f0579d590 Update TODO. 2007-09-23 23:51:29 +00:00
c86a17b42b Some interactivty tweaks. 2007-09-23 23:38:54 +00:00
10632476ce Have core save the config file on shutdown. 2007-09-23 23:30:46 +00:00
e47e7920cc change where clearing of torrentdetails is done 2007-09-23 09:41:53 +00:00
f6640db58e clear torrentdetails when a torrent is removed 2007-09-23 08:53:42 +00:00
9cb26544e1 fix icons to use theme properly 2007-09-23 08:06:44 +00:00
3270f23747 Initial import of StatusBar 2007-09-23 02:24:18 +00:00
d80debfbea Save and restore the main window's vpane position. 2007-09-23 00:50:42 +00:00
56e78f0cc6 Add file. 2007-09-22 23:04:05 +00:00
8f62df0732 Inital import of SystemTray 2007-09-22 23:02:58 +00:00
28447f7564 oops, fix docstring 2007-09-22 19:52:22 +00:00
731c51815e update tracker aka force reannounce 2007-09-22 19:44:11 +00:00
d91bcbe55c Update TorrentDetails when a different torrent is selected. 2007-09-22 19:27:29 +00:00
82873f8129 translate torrentview 2007-09-22 14:31:48 +00:00
30ed1f2d86 Fix saving config on exit of UI. 2007-09-22 03:30:42 +00:00
cc155d9473 ConfigManager now tries to save configs every 5 minutes.
Added close() to ConfigManager to explicitly close and save a config.
2007-09-22 03:14:23 +00:00
1f6798c98a Make sure gtkui.conf is written on quit. 2007-09-22 03:13:32 +00:00
0ed8ac1cdc MainWindow state saving. 2007-09-22 02:53:06 +00:00
61216e06b0 have either, not full, set as default 2007-09-22 00:21:24 +00:00
e2422ab64e Add translated torrent state list. 2007-09-21 23:56:59 +00:00
007f8c8dc3 Show paused state correctly in TorrentView. 2007-09-21 23:30:03 +00:00
f7b537ad81 Display progress bar in torrentview properly. 2007-09-21 22:54:46 +00:00
0c012133cd fix icon size 2007-09-21 22:37:17 +00:00
fb20bcd1a2 add avail column 2007-09-21 22:25:54 +00:00
c454ea05fe fix resizing 2007-09-21 21:20:19 +00:00
7b91bf83cc Fix get_pe_settings() in bindings.
More debug output for encryption settings.
Fix preferences glade file so that encryption settings are in correct 
order.
2007-09-21 04:24:26 +00:00
c69a5661df i18n fixes 2007-09-21 04:08:55 +00:00
537bc72190 peer num reminder 2007-09-21 04:02:07 +00:00
b9de236a00 Update TODO. 2007-09-21 03:09:17 +00:00
bf0c8ba820 Fix extensions. 2007-09-21 02:52:52 +00:00
7224fa7196 Fix extensions. 2007-09-21 01:18:32 +00:00
8cea7e34ed Fix python bindings. 2007-09-21 00:58:28 +00:00
adf5487962 libtorrent sync 1592 2007-09-21 00:55:58 +00:00
0b746d2ab1 revert lt sync for later testing 2007-09-21 00:22:38 +00:00
4dd7e38358 Remove Makefile.am as we do not use it. 2007-09-21 00:09:25 +00:00
4ca7ced757 Add status icons to torrentview. 2007-09-21 00:08:12 +00:00
a9961adda7 finish sync 2007-09-21 00:05:59 +00:00
b2fe562dd4 libtorrent sync 1592 2007-09-20 23:43:07 +00:00
d44632f0a9 Add 'default_load_path' to default prefs. 2007-09-20 22:57:16 +00:00
ff13e8c2f7 Update TODO. 2007-09-20 22:21:43 +00:00
943a62f62c Have all core config use set functions to apply the configuration to the
session.
2007-09-20 22:10:03 +00:00
d3c5064353 Add upnp, natpmp and pe_settings support to libtorrent bindings. 2007-09-20 22:09:23 +00:00
ec5c970499 Add 'deluged' script to start the deluge daemon. 2007-09-20 19:56:05 +00:00
66192d0f8d Add 'set functions' to Config.. These functions get called when the
specified key's value changes.
2007-09-18 14:40:19 +00:00
685e20fbf1 Only write a config file to disk if there is a change in the
configuration.
2007-09-18 06:26:22 +00:00
e4ebef6ae3 Properly shutdown ConfigManager. 2007-09-18 04:47:28 +00:00
9370d81444 Add extra output in add_torrent_url() and update TODO list. 2007-09-18 03:18:43 +00:00
e3188695c6 check url in functions instead 2007-09-18 02:25:32 +00:00
7338806613 fix header 2007-09-18 02:12:30 +00:00
0a7789f649 add about dialog and open_url_in_browser 2007-09-18 01:52:32 +00:00
25271af9f3 remove unused import 2007-09-17 20:42:37 +00:00
d953c8d8b4 url checks for add torrent 2007-09-17 20:38:32 +00:00
b6faa81c26 Upload actual status icon source svgs and update the alert status icon
to be consistent with the rest.
2007-09-17 13:55:47 +00:00
8f796738d5 Initial import of ConfigManager. 2007-09-17 12:44:31 +00:00
c5156df280 Add torrent from URL implemented. This is Marcos patch plus some more
error checking and some modifications to make it work properly with 
TorrentManager.
2007-09-17 11:07:58 +00:00
6898d8dd17 Add alert status icon and the source svgs of the other status icons. 2007-09-17 06:10:39 +00:00
7f8743df17 Update TODO list. 2007-09-17 05:23:59 +00:00
c072e4d605 Preferences dialog now saves and displays gtkui specific config options. 2007-09-17 05:15:31 +00:00
cc8466988c Add DEFAULT_PREFS. 2007-09-17 04:36:45 +00:00
978a2ae80b Remove debug print from that last commit and re-add libtorrent metadata
plugin.
2007-09-17 04:20:40 +00:00
f764448cad Store allocation type in the torrent state file and add the ability to
add a torrent with a different allocation type then what is set in the 
config.
2007-09-17 04:19:59 +00:00
4a2bb465f0 Fix libtorrent extensions from crashing on add_torrent. 2007-09-17 04:08:47 +00:00
70b71ad6ce Added user-agent.
Now start the metadata and utpex extensions on start-up.
2007-09-17 01:05:27 +00:00
e6341e35d9 finish off window icons for now 2007-09-16 07:40:44 +00:00
379eff9767 Updates to last patch and updates to the preferences dialog. 2007-09-16 04:26:32 +00:00
b9ffab2499 touchup last and remove old files 2007-09-16 03:55:32 +00:00
bc88fb3d11 icons and internal pixmap 2007-09-16 03:46:50 +00:00
9d2f6ad3a0 Adding TODO file. 2007-09-16 02:02:27 +00:00
70dde55ecf Tweaked random port selection. 2007-09-16 01:41:18 +00:00
ef5c499f17 Remove 'po' directory in gtkui due to new i18n patch. 2007-09-16 01:25:26 +00:00
7f5a0d8ab7 Applied i18n patch from Marcos. 2007-09-16 01:24:08 +00:00
9bb65d1ab4 Add random port support patch from Marcos. 2007-09-15 22:22:06 +00:00
4691dcbaa2 Preferences dialog now sets core configuration options. 2007-09-14 11:45:42 +00:00
a46610a04a Fix widget naming. 2007-09-12 12:11:10 +00:00
1be0705aab Add activate signal to Preferences menuitem. 2007-09-12 03:09:36 +00:00
2b120cdbe4 Inital import of Preferences dialog. 2007-09-10 13:21:33 +00:00
e737e3ef12 Can now register handlers with the AlertManager to handle libtorrent
alerts.
2007-09-08 14:01:52 +00:00
f5a00e8d58 Add some more error checking. 2007-09-08 08:30:15 +00:00
38312177ef Inital import of the AlertManager. 2007-09-07 08:21:19 +00:00
05a0a8a6a4 Make myself the only author of this branch. 2007-09-07 08:20:20 +00:00
02874799f2 Update the columns menu when new columns are added. 2007-09-05 17:26:52 +00:00
b4ad65ab9b Add Deluge fingerprint. 2007-09-04 15:35:07 +00:00
b187d02c94 Change torrent_add_file() method in core to return a boolean value based
on the success of the torrent add.
Removed the torrent_add_failed() signal from core.
2007-09-03 06:35:31 +00:00
be5855dcd6 Added TorrentDetails component to GtkUI, but it is currently not
optimized.
Added more status fields to Torrent.
2007-09-02 14:15:41 +00:00
0d12b1e0cf Fix names of widgets. 2007-09-02 11:55:41 +00:00
e9917bfbb2 Code clean-up. 2007-09-01 11:52:01 +00:00
55fc7f4725 Fix issue where core could not save .torrent files if the
torrentfiles_location did not exist.  Core will not create this 
directory before attempting to write the file.
2007-09-01 09:57:02 +00:00
cb0505405d Clean-up. 2007-08-29 08:02:06 +00:00
c5d76cf8ee State saving and loading in core and TorrentQueue.
GtkUI now requests a 'session_state' on start-up to populate it's 
listview.
GtkUI can now shutdown core.
2007-08-29 08:00:19 +00:00
ca5306bd2d Code refactoring.
Sync preferences_dialog.glade from trunk.
2007-08-28 09:50:25 +00:00
53934ec8d8 Add file. 2007-08-28 07:33:07 +00:00
c85fda3188 Code refactoring and added docstrings. 2007-08-27 14:34:44 +00:00
1bd62ba584 Add TorrentQueue's menu glade file. 2007-08-27 05:52:32 +00:00
623c34b349 TorrentQueue plugin now diplays menu in TorrentMenu. 2007-08-27 05:18:32 +00:00
7296920731 Updates to the MainWindow glade file. 2007-08-27 04:55:12 +00:00
6a525530ee Big code clean-up and some refactoring. Added docstrings but more are
needed.
2007-08-26 14:34:50 +00:00
f3c80eb816 Remove idea of a 'get_function'. Updated add_row() to use new
status_fields.
2007-08-22 08:53:12 +00:00
f185f19cfb Plugins can now register 'status_fields' with core for use with
get_status().
Updates to TorrentQueue plugin.
2007-08-22 08:24:40 +00:00
5611037db2 Modified update() in TorrentView. It is now able to update only the
requested columns and only columns which are visible.
2007-08-22 06:23:16 +00:00
810c0813ce Start work on the addition of 'status_field' to ListViewColumn. 2007-08-21 14:43:15 +00:00
d12e333e3a Updates to the TorrentQueue plugin.
Added 'add_toolbutton()' and 'add_separator()' to ToolBar.
Added 'get_toolbar()' and 'get_selected_torrents()' to PluginManager.
2007-08-20 12:47:54 +00:00
38dd216e16 Updates to ListView and the TorrentQueue plugin. 2007-08-18 11:16:31 +00:00
98ecdd12a9 Added remove_column() to ListView. 2007-08-17 09:55:33 +00:00
8d23e8ee80 The column menu list now toggles visibility of the columns. 2007-08-17 03:16:56 +00:00
e208724bc3 Updated listview menu creation.
Added 'hidden' columns.
2007-08-15 14:30:47 +00:00
b7e3c6b3df Sync libtorrent to trunk.
Start of columns menu.
2007-08-13 09:28:29 +00:00
ac29983651 ListView still needs some improvements, but it is working now.
Removed columns.py as this has been merged with listview.py.
2007-08-12 09:48:34 +00:00
e13b42203b Start of move to generic ListView. Not really functional yet. 2007-08-12 07:01:27 +00:00
873b5397eb Add missing file. 2007-08-11 06:49:18 +00:00
895f7e2761 Add missing files.
Start of plugin support in gtkui.
2007-08-11 06:46:41 +00:00
13fc181fa2 More work on the queue torrent plugin and plugins in general. 2007-08-10 08:15:02 +00:00
78e225526c 'Hack' in plugin support. This is totally wrong, but it sort of works. 2007-08-05 20:03:00 +00:00
7cd0ba0a6c Updates and revert mainwindow.py from last change 2007-08-02 18:52:33 +00:00
bcf70c3e0f get_torrent_status() now takes a list of keys and only returns the
values for those keys.
2007-07-28 18:48:32 +00:00
bb299f4e97 Add Resume button/menuitem to the toolbar and torrent menu. 2007-07-27 22:16:57 +00:00
8c67927974 Fix up the importing of functions 2007-07-27 20:20:38 +00:00
510bc30971 Moving functions.py to UI (actual file move) 2007-07-27 20:17:57 +00:00
6f3a57f827 Moving functions.py to UI 2007-07-27 20:17:13 +00:00
139b5d82c7 updating mainwindow to current trunk 2007-07-27 06:35:45 +00:00
ac1bffb65f get_torrent_status() and get_torrent_info() now use pickled
dictionaries thus removing the need for the templates.
2007-07-25 05:07:43 +00:00
2eb455179b Updates 2007-07-25 00:43:37 +00:00
7c36587f23 Can now change queue order in the UI. 2007-07-24 07:19:38 +00:00
ca5297e20d Can now remove torrents.
Torrent view is now updating in timer.
2007-07-24 01:53:35 +00:00
c4e688b450 Added TorrentManager class for handling torrents.
Added get_torrent_state() in the core, but this will be changed.
2007-07-23 20:43:42 +00:00
626e7657d0 Sync to libtorrent revision 1415 2007-07-23 05:36:20 +00:00
5145dafeae Added torrent queueing in the core. 2007-07-23 04:42:26 +00:00
7ca17a3922 Changed the way adding torrents is done.
The core is now sent the torrent file data and saves it's own copy of 
the torrent file.
Start of receiving signals in the UI.
2007-07-22 03:01:38 +00:00
be081ae103 Can now add torrents from the UI.
Various other updates.
2007-07-21 00:50:13 +00:00
9280781dd3 Updates 2007-07-14 01:33:16 +00:00
02b189f5a5 rename branch to deluge-0.6 2007-07-13 16:47:22 +00:00
702967a2c6 Changed from 2 spaces ident to 4 2007-07-13 01:34:18 +00:00
a7c93458c8 Updates! 2007-07-13 00:48:21 +00:00
61ca73dde1 Updates 2007-07-12 23:16:39 +00:00
0b621fd581 Updates 2007-07-12 23:15:38 +00:00
e08ad9ddaf Updates 2007-07-12 22:43:23 +00:00
49e5e9b093 Updates 2007-07-12 22:34:33 +00:00
bc39371af6 New directory structure 2007-07-12 20:02:34 +00:00
65c4d72fd0 More updates 2007-07-09 02:51:40 +00:00
770cfa0a07 Update to my branch.. 2007-07-09 02:50:20 +00:00
59656397d0 Changed from Pyro to DBUS.. Still doesn't do anything. 2007-07-08 00:28:17 +00:00
29c4b6aee1 Just some updates.. Probably going to change to DBUS instead of Pyro in
next revision.
2007-07-05 19:35:59 +00:00
cb4630ded9 Initial import. 2007-07-04 08:24:30 +00:00
1671 changed files with 248245 additions and 155110 deletions

354
ChangeLog
View File

@ -1,120 +1,248 @@
Deluge 0.5.6 (xx October 2007)
* Web Interface Plugin
* Hopefully fix "losing data" and having to re-download parts (for real this time :p)
* Use new full allocation method which does not create files until one of its
pieces is downloaded
* Tray lock password is no longer stored in plain text
* Update the Scheduler plugin and fix a bunch of bugs on it
* Double-clicking on a torrent opens up its containing folder
* Fix SpeedLimiter plugin when setting upload limits
* Fix MoveTorrent plugin when moving actively downloading torrents
* Pause torrents while importing blocklist and resume them when finished
* Remove TorrentPieces and disable its use
* A whole bunch of stuff for Win32
* Add private flag to TorrentCreator plugin
* Use SVG for internal logo usage (except on Win32)
* Use theme for tray icon instead of hard-coded
* Properly release port on shutdown
* TorrentFiles plugin now has progress bars
* Removing torrent files no longer deletes files that werent part of the torrent
* New max half-open connections setting to deal with cheap/broken routers
* Inherit UPnP fixes from libtorrent
* Use threading for everything, instead of spawnning
Deluge 1.0.7 (10 December 2008)
GtkUI:
* Fix #636 not setting the daemon's config directory when using --config= with the UI in classic mode.
* Fix some minor bugs in ConnectionManager
Deluge 0.5.5 (09 September 2007)
* Editing a torrent's tracker list is now persistent between sessions
* Persistence between sessions for Speed Limiter, Web Seed and Desired Ratio
plugins
* New wizard to aid first-time users with configuration
* Reorderable tabs and remember order (with exception of details tab)
* Fix losing data and having to re-download parts
* Fix password lock showing when main window is not hidden
* Get rid of the plugin manager and integrate it into preferences
* New Move torrent plugin - takes over for "move completed downloads" feature
and provides a "Move Torrent" option when right-clicking on a torrent
* Save column widths
* Queue order after restart fixes.
* Use payload instead of including protocol overhead to ease user confusion
of seeding torrents "downloading"
* New Web Seed plugin for adding URLs to torrents for http seeding
* Add FAST-extension (http://www.bittorrent.org/fast_extensions.html)
Debian:
* Fix #571 notification-daemon-xfce dependency circle
Deluge 0.5.4.1 (10 August 2007)
* Add "Open containing folder" and "Open File" to the torrent and file
menu, respectively
* Load Blocklist plugin last and have it not lock up the interface during
import
* Add full allocation to preferences for clarification
* Catch SIGINT, SIGHUP, SIGTERM and Gnome logoff to quit properly
* Add send local info to developers
* Fix up pieces, peers and files plugins
* UPnP fixes
* Add ExtraStats plugin
* FreeBSD full allocation fix
* Added per torrent max upload slots and max connections preferences
* A lot of other less visible improvements
Deluge 0.5.4 (06 August 2007)
Misc:
* Fix #547 add description to name field per HIG entry 2.1.1.1
* libtorrent updates
* Tray message includes session totals
* Ticket #198 - Display peers countries in the Peers tab.
* Ticket #474 - Multiple password prompts displayed
* Pause all/resume all in tray menu
* Peers and Files tabs are now plugins
* New Location plugin
* Option to use a random port every time
* Proxy system redone - you can now specify different information for each
type of proxy (DHT, peer, tracker, web-seed)
* TorrentPieces plugin to view piece updates and show pieces table per file
* EventLogger plugin to view/log every activity
* SpeedLimiter plugin, which allows you to set speed limits on a per-torrent
basis
* New release alerts - Client will inform user if their version of deluge is
outdated
Plugins:
* Point default blocklist url to our server and up interval to 4 days
Deluge 0.5.3 (25 July 2007)
Deluge 1.0.6 (01 December 2008)
Core:
* Fix #475 catch unicode decoding errors
* Add an option to not include IP overhead in rate limiting (this is equivalent
to how 0.5.x behaves)
* Have default blocklist url point to our server
* Added ChangeLog
* Ticket #53 - Added files priorities within torrent
* Ticket #111 - Remember directory of last added torrent
* Ticket #232 - Added Move completed downloads to feature
* Ticket #245 - Added ability to select torrent files before starting
* Ticked #368 - Added ability to prioritize first and last pieces of files
in torrents
* Ticket #371 - Proper full storage allocation of files on reiser4 and
ntfs-3g filesystems
* Ticket #420 - Show size of torrent minus size of unselected files as Total
Size
* Ticket #405 - Properly start in tray when run deluge --tray
* Ticket #437 - Gracefully upgrade from old versions
* Picking a file to not download now checks for compact_mode status to prevent
all sorts of problems such as downloading pieces into the wrong file
* RSS plugin inclusion
* Added ability to queue new torrents above completed ones when
seeds are set to queue at the bottom
* Added availability and piece size display in details, availailability
column
* Added ability to automatically remove torrents when max share ratio is set
* Show text from clipboard in Add URL dialog only if it looks like an URL
* Added Torrent Notification plugin
* Added event handling callbacks for plugins
* Added ability to designate a torrent as private (in file selection dialog)
* Added merging trackers of duplicate torrents
* Details, Peers and Files tabs more responsible and their perfomance
greatly improved especially on torrents with many files and peers
* A lot of other less visible improvements
GtkUI:
* Display the proper downloaded value in the statistics tab
Deluge 0.5.2 (05 July 2007)
* ticket #6 - Torrent creation built into main client
* ticket #315 - Plugins implemented as modules
* ticket #310 - Configuration options for PEX and UPnP
* ticket #390 - Individual file progress shown in File tab
* The usual slew of improvements
Windows:
* Fix broken graphic in new release dialog
Deluge 0.5.1 (11 June 2007)
* Peer Exchange
* ticket #254 - Encryption
* ticket #142 - UPnP + NATPMP
* Improved user interface
* Redesigned preferences dialog
* Proper startup and shutdown
Deluge 1.0.5 (09 November 2008)
GtkUI:
* Increase the per-torrent stop share ratio max to 99999.0
* Fix #528 make sure gtkui config file is written before exiting
* Fix UDP tracker support
WebUi:
* Javascript auto refresh for both templates.
Windows:
* Fix #577 adding torrents by drag n' drop
* Fix association in Vista
* Fix WebUI launch
Debian:
* SID packages now requires Boost 1.36
Ubuntu:
* Jaunty packages are now provided
Deluge 1.0.4 (31 October 2008)
Core:
* Fix #560 force an int value for global max connections
* Fix #545 use proper values in ratio calculation
* Fix UPnP again..
GtkUI:
* Fix #565 wait for the deluged process to start to prevent defunct processes
OS X:
* Fix issues with gettext
Windows:
* Fix starting on non-English versions of Windows
Deluge 1.0.3 (18 October 2008)
Core:
* Fix upnp - it should work on more routers now too
* Fix issue where Deluge would send improper stats to the tracker after a
pause/resume.
* Fix issue where fastresume files would be rejected when using FAT32. This
would cause the torrent to be rechecked on every startup.
* Fix ip filtering
GtkUI:
* Re-add the "Max Connections Per Second" option with a default setting of 20
WebUI:
* Fix White template for Opera
Misc:
* Deluge will now use a system libtorrent library if available.
* The build system will no longer build libtorrent if a system library is
detected.
Deluge 1.0.2 (10 October 2008)
Core:
* Fix issue where torrents will not be properly added to the session
Deluge 1.0.1 (10 October 2008)
Core:
* Change the default max global upload slots to 4 instead of -1 since libtorrent
will automatically open more slots to meet the upload speed limit.
* Fix display of tracker error messages
* Fix add_torrent_url() to download the torrent file in a thread to prevent
the main thread from blocking and causing the daemon to freeze.
* Removed the 'Maximum Connections Per Second' setting and replaced it with a
default setting of 20. This should alleviate speed issues some are experiencing.
* Changed max half-open connections default limit to 8 on XP/2000 and 4 on Vista
* Prevent being able to set file priorities for compactly allocated torrents as
it is not intended to work.
* Fix freezing on start-up issues on systems that do not have a properly
configured localhost entry.
* Change max connections default setting to 200
* Fix issue with invalid bencoding from some trackers
* Plenty of libtorrent updates that should improve core stability
GtkUI:
* Improve performance of files tab by only updating when values change
Misc:
* Fix #187 set a 5 second timer to save the config file after a config value
has been changed.
* Fix #503 change the boost lib detection logic to first look for -mt and
if not available, fall back to regular boost lib (non-multithreaded)
WebUI:
* Add enable "Auto Add" checkbox
Deluge 1.0.0 - "Sharks Are Bulletproof" (21 September 2008)
Core:
* Include GeoIP database for country look-ups
* Fix upgrading from 0.5.x state where torrents would have no trackers
Deluge 0.9.09 - "1.0.0_RC9" (15 September 2008)
Core:
* Bug fixes in libtorrent including a crash when the tracker doesn't
have 'announce' in it's url.
* Fix fastresume issue causing loss of data by deleting the fastresume file
before writing a new one
* Fix #475 the use of unicode paths when adding torrents
GtkUI:
* Fix add torrent dialog closing preventing another dialog from being shown
* Fix various issues when not using English
* Fix setting file priorities on folders
Deluge 0.9.08 - "1.0.0_RC8" (27 August 2008)
Core:
* Attempt to automatically upgrade a 0.5.x state file to new format
* Tracker errors now change the tracker status
Plugins:
* Fix bug in Blocklist that prevented downloading a new file every X days
GtkUI:
* Sort filenames alphabetically in add torrent dialog
* Fix setting file priorities on folders
* Fix #453 allow showing of text in the toolbar buttons
Deluge 0.9.07 - "1.0.0_RC7" (18 August 2008)
Core:
* Fix loading torrents from state when fastresume file is missing
* Fix UPnP
* Fix to prevent Deluge from segfaulting when trying to autoadd an incomplete torrent file
* Fix #407 possible negative ETA
GtkUI:
* Add 'edit' to edit trackers dialog
* Improve performance of initial torrent list load
* Fix hiding the bottom pane when disabling all the tabs
* Fix not showing new torrents if you don't use the All label first
* Fix size units to be more accurate
* Fix torrentview sorting to be persistent
* Fix not displaying file list when state changes
* Expand root folder in files tab by default
Null:
* Fix #415 crash when using 'config-set' with no parameters
Windows:
* Fix Vista slowness issue
* Fix properly shutting Deluge down when system shuts down
* Fix opening folders/files
Deluge 0.9.06 - "1.0.0_RC6" (13 August 2008)
Core:
* Fix CPU spikes
GtkUI:
* Fix move storage dialog when connected to a remote daemon
Deluge 0.9.05 - "1.0.0_RC5" (04 August 2008)
Core:
* Fix deluged running with ssh X forwarding by removing the Gnome lib import
* Save resume data periodically to help prevent data loss
* Fix queue order shuffling on restart
GtkUI:
* Handle shutting down more cleanly
* Add translators to credits
Plugins:
* Improve the Blocklist plugin preferences page.
Windows:
* Fix drag n' drop support
Deluge 0.9.04 - "1.0.0_RC4" (29 July 2008)
Core:
* Fix building with gcc 4.3
* Fix do not create torrentfiles folder unless 'copy_torrent_file' is True
GtkUI:
* Add drag n' drop support for adding .torrent files
* Double-clicking on host in ConnectionManager now will connect to that host
* Fix selecting torrents when right-clicking on them in torrentview and filestab
* Fix new release check
* Display 'total_wanted' instead of 'total_size' in Size column
* Fix displaying of torrents when language is not English
* Fix the view options to be persistent between sessions
* Fix signalreceiver when switching between daemons
Deluge 0.9.03 - "1.0.0_RC3" (21 July 2008)
Core:
* File progress fixes from libtorrent
* Fix building on FreeBSD
* Fix #350 stop seeds when stop ratio is reached
* Fix #358 properly emit torrent_removed signal when remove_at_ratio happens
UI:
* Default to gtkui when running 'deluge' instead of defaulting to last used.
GtkUI:
* Fix open folder
* Fix #349 tab ordering when hiding/showing
Windows:
* Fix torrent file association and adding files from command line
Plugins:
* Blocklist plugin has been rewritten
Misc:
* Some changes for python 2.6 compatibility
Deluge 0.9.02 - "1.0.0_RC2" (15 July 2008)
Core:
* Fix displaying of file progress
* Fix files to have proper read/write permissions
WebUI:
* Include missing 'classic' template
* Update options tab to include queue settings
Windows:
* Fix displaying of tray icon
* Fix scrolling of tray menu
* Fix hiding of tray icon when shutting down
* Fix tray icon tool tip length to show properly

40
HACKING
View File

@ -1,40 +0,0 @@
# Copyright (c) 2006 Marcos Pinto ('markybob') <markybob@gmail.com>
This is pretty much taken straight out of PEP 8, the "Style Guide for Python
Code" (http://www.python.org/dev/peps/pep-0008/)
More or less, if you try to submit a patch that doesn't follow this guide, odds
are your patch will be denied...unless it does some incredibly magnificient
things, in which case I *might* edit it. Don't bet on it, though.
Here are the highlights:
Indents are FOUR (4) spaces. Not 8, not 5 or 2 and definitely NOT tab.
Limit all lines to a maximum of 80 characters.
Use UTF-8 encoding
Every single import should be on its own line
Avoid extraneous whitespace in the following situations:
Yes: spam(ham[1], {eggs: 2})
No: spam( ham[ 1 ], { eggs: 2 } )
Yes: spam(1)
No: spam (1)
Yes: if x == 4: print x, y; x, y = y, x
No: if x == 4 : print x , y ; x , y = y , x
Yes: dict['key'] = list[index]
No: dict ['key'] = list [index]
Yes:
x = 1
y = 2
long_variable = 3
No:
x = 1
y = 2
long_variable = 3
Some more recommendations:
* "Don't repeat yourself (DRY). Every distinct concept and/or piece of
data should live in one, and only one, place. Redundancy is bad.
Normalization is good." (taken straight from django's Design philosophies)
* Try to use iterators/generators where applicable. The simplest change from
range to xrange is also good.
* In UI and deluge code for consistency we use notion of speed not rate.
Libtorrent mixes this usage and so do we on deluge-libtorrent boundary,
but all deluge only code should use speed.

859
LICENSE
View File

@ -1,350 +1,621 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
TERMS AND CONDITIONS
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
0. Definitions.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
"This License" refers to version 3 of the GNU General Public License.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
A "covered work" means either the unmodified Program or a work based
on the Program.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
1. Source Code.
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
The Corresponding Source for a work in source code form is that
same work.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
13. Use with the GNU Affero General Public License.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
14. Revised Versions of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
NO WARRANTY
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
15. Disclaimer of Warranty.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
END OF TERMS AND CONDITIONS
16. Limitation of Liability.
How to Apply These Terms to Your New Programs
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
17. Interpretation of Sections 15 and 16.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program 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 this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.
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.
END OF TERMS AND CONDITIONS

View File

@ -1,12 +0,0 @@
include LICENSE
include README
include README.Packagers
include Makefile
include deluge.desktop
include deluge.png
include msgfmt.py
recursive-include libtorrent/ *
recursive-include glade/ *.glade
recursive-include pixmaps/ *.png *.svg
recursive-include plugins/ *
recursive-include po/ *

View File

@ -1,31 +0,0 @@
#
# Makefile for Deluge
#
PYVER=`python -c "import sys; print sys.version[:3]"`
PREFIX ?= /usr
DESTDIR ?= ./
all:
python setup.py build
tarball:
python setup.py sdist
mv dist/deluge-*.tar.gz $(DESTDIR)
install:
python setup.py install --prefix=$(PREFIX)
clean:
python setup.py clean
rm -rf ./build
rm msgfmt.pyc
find . -name *.pyc -exec rm {} \;
uninstall:
-rm $(PREFIX)/bin/deluge
-rm -r $(PREFIX)/lib/python${PYVER}/site-packages/deluge
-rm -r $(PREFIX)/lib/python${PYVER}/site-packages/deluge-*.egg-info
-rm -r $(PREFIX)/share/deluge
-find ${PREFIX}/share/locale -name deluge.mo -exec rm {} \;
-rm $(PREFIX)/share/applications/deluge.desktop
-rm $(PREFIX)/share/pixmaps/deluge.png

View File

@ -1,10 +0,0 @@
Metadata-Version: 1.0
Name: deluge
Version: 0.5.2
Summary: A bittorrent client written in PyGTK
Home-page: http://deluge-torrent.org
Author: Zach Tibbitts, Alon Zakai, Marcos Pinto, Alex Dedul, Andrew Resch
Author-email: zach@collegegeek.org, kripkensteiner@gmail.com, marcospinto@dipconsultants.com, rotmer@gmail.com, alonzakai@gmail.com
License: GPLv2
Description: UNKNOWN
Platform: UNKNOWN

121
README
View File

@ -3,14 +3,22 @@
==========================
Authors:
Zach Tibbitts, aka zachtib
Alon Zakai, aka kripkenstein
Marcos Pinto, aka markybob
Andrew Resch, aka andar
Alex Dedul, aka plisk
Andrew Resch
Marcos Pinto
Martijn Voncken
Sadrul Habib Chowdhury
Homepage: http://deluge-torrent.org
==========================
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:
==========================
@ -25,77 +33,60 @@ We have two options available for support:
Installation Instructions:
==========================
First, make sure you have the proper build dependencies installed. On a normal
Debian or Ubuntu system, those dependencies are:
First, make sure you have the proper build dependencies installed. On a normal
Debian or Ubuntu system:
g++
make
python-all-dev
python-all version >= 2.4
python-dbus
python-gtk2 version >= 2.9
python-notify
librsvg2-common
python-xdg
python-support
libboost-dev >= 1.33.1
libboost-thread-dev
libboost-date-time-dev
libboost-filesystem-dev
libboost-serialization-dev
libssl-dev
zlib1g-dev
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-iostreams-dev \
libboost-thread-dev libboost-date-time-dev libboost-filesystem-dev \
libboost-serialization-dev libssl-dev zlib1g-dev python-setuptools
But the names of the packages may vary depending on your OS / distro.
The names of the packages may vary depending on your OS / distro.
Once you have the needed libraries installed, build Deluge by running:
Once you have the needed libraries installed, build and install by running:
$ make
$ python setup.py build
$ sudo python setup.py install
You shouldn't get any errors. Then run, as root (or by using sudo):
$ make install
and Deluge will be installed. By default, Deluge will be installed to the
prefix /usr. If you wish, you can install Deluge to a different prefix by
specifying it when you install it:
$ PREFIX=yourprefixhere make install
So, to install to /usr/local, run:
$ PREFIX=/usr/local make install
You can then run Deluge by executing:
$ deluge
==========================
Uninstallation/Upgrading:
FAQ
==========================
If you wish to upgrade from the older Deluge version please remove it first,
then install the latest version as per "Installation Instructions". If you
installed via the tarball, cd into the unpacked source tarball and then run,
as root (or by using sudo):
How to start the various user-interfaces
$ make uninstall
Gtk:
deluge --ui gtk
Console:
deluge --ui null
Web:
deluge --ui web
Go to http://localhost:8112/ default-password = "deluge"
If you installed via the deb package, run as root (or by using sudo:)
$ dpkg --purge remove deluge-torrent
I started "deluge" but i don't see the gtk-ui
Now install the latest version (and check out the additional notes).
The deluge command remembers the last interface it started. Be explicit and type one of the full "deluge -u <interface>" commands listed above.
==========================
Additional Notes:
==========================
Why is deluge still listed in my system tray even after I close it ?
1) On some distributions, boost libraries are renamed to have "-mt" at the end
(boost_thread_mt instead of boost_thread, for example), the "mt" indicating
"multithreaded". In some cases it appears the distros lack symlinks to connect
things. The solution is to either add symlinks from the short names to those
with "-mt", or to alter setup.py to look for the "-mt" versions.
2) After upgrading your Deluge installation, it may fail to start. If this
happens to you, you need to remove your ~/.config/deluge directory to allow
Deluge to rebuild it's configuration file.
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
I can't connect to the daemon from another machine
* Configure the daemon to allow remote connections
* Restart the daemon.
Note: do not do this on a public ip , use the webui for unsecure networks.
I upgraded from 0.5 and plugin x is missing
1.0 is a rewrite, all old 0.5 plugins have to be rewritten.

View File

@ -1,8 +0,0 @@
NOTE: Deluge 0.5.1 and newer uses an svn build of libtorrent. This build
differs from a clean libtorrent source checkout and has been hacked in order
to get it to work properly with Deluge. As a result, Deluge will likely not
build properly against a vanilla libtorrent 0.12 installation or a nightly
build oflibtorrent 0.13. It is recommended that you build against our included
libtorrent, as our build will not conflict with any installed libtorrent.
- zachtib

2
TODO
View File

@ -1,2 +0,0 @@
for 0.5.6
1. fix ratio saving

View File

@ -1,5 +1,6 @@
#!/bin/bash
for size in 16 22 24 32 36 48 64 72 96 128 192 256; do mkdir -p icons/hicolor/\
${size}x${size}/apps; rsvg-convert -w ${size} -h ${size} \
-o icons/hicolor/${size}x${size}/apps/deluge.png pixmaps/deluge.svg; mkdir -p \
icons/scalable/apps/; cp pixmaps/deluge.svg icons/scalable/apps/deluge.svg; done
for size in 16 22 24 32 36 48 64 72 96 128 192 256; do mkdir -p deluge/data/\
icons/hicolor/${size}x${size}/apps; rsvg-convert -w ${size} -h ${size} \
-o deluge/data/icons/hicolor/${size}x${size}/apps/deluge.png deluge/data/pixmaps\
/deluge.svg; mkdir -p deluge/data/icons/scalable/apps/; cp deluge/data/pixmaps/\
deluge.svg deluge/data/icons/scalable/apps/deluge.svg; done

5
debian/changelog vendored Normal file
View File

@ -0,0 +1,5 @@
deluge-torrent (1.0.7-1) unstable; urgency=low
* 1.0.7
-- Andrew Resch (andar) <andrewresch@gmail.com> Wed, 10 Dec 2008 20:10:00 -0000

5
debian/changelog.debian-lenny vendored Normal file
View File

@ -0,0 +1,5 @@
deluge-torrent (0.6.0-svn3235-1) lenny; urgency=low
* Daily Build
-- Andrew Resch (andar) <andrewresch@gmail.com> Tue, 17 Jun 2008 16:31:14 -0800

5
debian/changelog.debian-sid vendored Normal file
View File

@ -0,0 +1,5 @@
deluge-torrent (0.6.0-svn3235-1) unstable; urgency=low
* Daily Build
-- Andrew Resch (andar) <andrewresch@gmail.com> Tue, 17 Jun 2008 16:31:14 -0800

5
debian/changelog.ubuntu-gutsy vendored Normal file
View File

@ -0,0 +1,5 @@
deluge-torrent (0.6.0-svn3235-1) gutsy; urgency=low
* Daily Build
-- Andrew Resch (andar) <andrewresch@gmail.com> Tue, 17 Jun 2008 16:31:14 -0800

5
debian/changelog.ubuntu-hardy vendored Normal file
View File

@ -0,0 +1,5 @@
deluge-torrent (0.6.0-svn3235-1) hardy; urgency=low
* Daily Build
-- Andrew Resch (andar) <andrewresch@gmail.com> Tue, 17 Jun 2008 16:31:14 -0800

1
debian/compat vendored Normal file
View File

@ -0,0 +1 @@
5

21
debian/control vendored Normal file
View File

@ -0,0 +1,21 @@
Source: deluge-torrent
Section: net
Priority: optional
Maintainer: Andrew Resch (andar) <andrewresch@gmail.com>
Build-Depends: debhelper (>= 5.0.37.2), python-all-dev (>= 2.3.5-11), python-all, python-support (>= 0.5.3), libboost-dev (>= 1.34.1), libboost-thread-dev (>= 1.34.1), libboost-date-time-dev (>= 1.34.1), libboost-filesystem-dev (>= 1.34.1), libboost-python-dev (>= 1.34.1), libboost-iostreams-dev (>= 1.34.1), zlib1g-dev, libssl-dev, dpatch, python-setuptools
Standards-Version: 3.7.2
Package: deluge-torrent
Architecture: any
Depends: ${shlibs:Depends}, ${python:Depends}, python-gtk2, python-glade2, python-xdg, python-notify, notification-daemon | notification-daemon-xfce, python-dbus, librsvg2-common, python-pyopenssl, python-setuptools
Conflicts: deluge-torrent-common
Replaces: deluge-torrent-common
Description: A Bittorrent client written in Python/PyGTK
Deluge is a Bittorrent client, created using Python and GTK+.
.
Deluge is intended to bring a native, full-featured client to Linux GTK
desktop environments such as Gnome and XFCE.
.
It uses Rasterbar's version of libtorrent.
.
Homepage: http://www.deluge-torrent.org/

19
debian/control.debian-lenny vendored Normal file
View File

@ -0,0 +1,19 @@
Source: deluge-torrent
Section: net
Priority: optional
Maintainer: Andrew Resch (andar) <andrewresch@gmail.com>
Build-Depends: debhelper (>= 5.0.37.2), python-all-dev (>= 2.3.5-11), python-all, python-support (>= 0.5.3), libboost-dev (>= 1.33.1), libboost-thread-dev (>= 1.33.1), libboost-date-time-dev (>= 1.33.1), libboost-filesystem-dev (>= 1.33.1), libboost-serialization-dev (>= 1.33.1), libboost-program-options-dev (>= 1.33.1), libboost-regex-dev (>= 1.33.1), libboost-python-dev (>= 1.33.1), zlib1g-dev, libssl-dev, dpatch, python-setuptools
Standards-Version: 3.7.2
Package: deluge-torrent
Architecture: any
Depends: ${shlibs:Depends}, ${python:Depends}, python-gtk2, python-glade2, python-xdg, python-notify, notification-daemon | notification-daemon-xfce, python-dbus, librsvg2-common, python-pyopenssl, python-setuptools
Description: A Bittorrent client written in Python/PyGTK
Deluge is a Bittorrent client, created using Python and GTK+.
.
Deluge is intended to bring a native, full-featured client to Linux GTK
desktop environments such as Gnome and XFCE.
.
It uses Rasterbar's version of libtorrent.
.
Homepage: http://www.deluge-torrent.org/

19
debian/control.debian-sid vendored Normal file
View File

@ -0,0 +1,19 @@
Source: deluge-torrent
Section: net
Priority: optional
Maintainer: Andrew Resch (andar) <andrewresch@gmail.com>
Build-Depends: debhelper (>= 5.0.37.2), python-all-dev (>= 2.3.5-11), python-all, python-support (>= 0.5.3), libboost1.36-dev (>= 1.36), libboost-thread1.36-dev (>= 1.36), libboost-date-time1.36-dev (>= 1.36), libboost-filesystem1.36-dev (>= 1.36), libboost-serialization1.36-dev (>= 1.36), libboost-program-options1.36-dev (>= 1.36), libboost-regex1.36-dev (>= 1.36), libboost-python1.36-dev (>= 1.36), zlib1g-dev, libssl-dev, dpatch, python-setuptools
Standards-Version: 3.7.2
Package: deluge-torrent
Architecture: any
Depends: ${shlibs:Depends}, ${python:Depends}, python-gtk2, python-glade2, python-xdg, python-notify, notification-daemon | notification-daemon-xfce, python-dbus, librsvg2-common, python-pyopenssl, python-setuptools
Description: A Bittorrent client written in Python/PyGTK
Deluge is a Bittorrent client, created using Python and GTK+.
.
Deluge is intended to bring a native, full-featured client to Linux GTK
desktop environments such as Gnome and XFCE.
.
It uses Rasterbar's version of libtorrent.
.
Homepage: http://www.deluge-torrent.org/

19
debian/control.ubuntu-gutsy vendored Normal file
View File

@ -0,0 +1,19 @@
Source: deluge-torrent
Section: universe/net
Priority: optional
Maintainer: Andrew Resch (andar) <andrewresch@gmail.com>
Build-Depends: debhelper (>= 5.0.37.2), python-all-dev (>= 2.3.5-11), python-all, python-support (>= 0.5.3), libboost-dev (>= 1.33.1), libboost-thread-dev (>= 1.33.1), libboost-date-time-dev (>= 1.33.1), libboost-filesystem-dev (>= 1.33.1), libboost-serialization-dev (>= 1.33.1), libboost-program-options-dev (>= 1.33.1), libboost-regex-dev (>= 1.33.1), libboost-python-dev (>= 1.33.1), zlib1g-dev, libssl-dev, dpatch, python-setuptools
Standards-Version: 3.7.2
Package: deluge-torrent
Architecture: any
Depends: ${shlibs:Depends}, ${python:Depends}, python-gtk2, python-glade2, python-xdg, python-notify, notification-daemon | notification-daemon-xfce, python-dbus, librsvg2-common, python-pyopenssl, python-setuptools
Description: A Bittorrent client written in Python/PyGTK
Deluge is a Bittorrent client, created using Python and GTK+.
.
Deluge is intended to bring a native, full-featured client to Linux GTK
desktop environments such as Gnome and XFCE.
.
It uses Rasterbar's version of libtorrent.
.
Homepage: http://www.deluge-torrent.org/

19
debian/control.ubuntu-hardy vendored Normal file
View File

@ -0,0 +1,19 @@
Source: deluge-torrent
Section: universe/net
Priority: optional
Maintainer: Andrew Resch (andar) <andrewresch@gmail.com>
Build-Depends: debhelper (>= 5.0.37.2), python-all-dev (>= 2.3.5-11), python-all, python-support (>= 0.5.3), libboost-dev (>= 1.33.1), libboost-thread-dev (>= 1.33.1), libboost-date-time-dev (>= 1.33.1), libboost-filesystem-dev (>= 1.33.1), libboost-serialization-dev (>= 1.33.1), libboost-program-options-dev (>= 1.33.1), libboost-regex-dev (>= 1.33.1), libboost-python-dev (>= 1.33.1), zlib1g-dev, libssl-dev, dpatch, python-setuptools
Standards-Version: 3.7.2
Package: deluge-torrent
Architecture: any
Depends: ${shlibs:Depends}, ${python:Depends}, python-gtk2, python-glade2, python-xdg, python-notify, notification-daemon | notification-daemon-xfce, python-dbus, librsvg2-common, python-pyopenssl, python-setuptools
Description: A Bittorrent client written in Python/PyGTK
Deluge is a Bittorrent client, created using Python and GTK+.
.
Deluge is intended to bring a native, full-featured client to Linux GTK
desktop environments such as Gnome and XFCE.
.
It uses Rasterbar's version of libtorrent.
.
Homepage: http://www.deluge-torrent.org/

99
debian/copyright vendored Normal file
View File

@ -0,0 +1,99 @@
This package was debianized by Marcos Pinto (markybob) <markybob@gmail.com> on
Fri, 31 Jul 2008 22:03:13 +0100.
It was downloaded from http://www.deluge-torrent.org/
Upstream Authors & Copyright:
Andrew Resch
Marcos Pinto
Sadrul Habib Chowdhury
Martijn Voncken
License:
This package is free software; you can 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.
This package 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 this package; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, 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.
On Debian systems, the complete text of the GNU General
Public License can be found in `/usr/share/common-licenses/GPL'.
libtorrent is (C) 2003-2008 Arvid Norberg arvid@cs.umu.se and its
python bindings were initially written by Daniel Wallin in 2006.
It is distributed unders terms of the BSD License below:
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the distribution.
* Neither the name of the author nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
"libtorrent/include/libtorrent/asio*" are (C) 2003-2008 Christopher
M. Kohlhoff <chris@kohlhoff.com> and distributed under terms of the Boost
Software License, Version 1.0 :
Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software, and to permit third-parties to whom the Software is furnished to
do so, all subject to the following:
The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer,
must be included in all copies of the Software, in whole or in part, and
all derivative works of the Software, unless such copies or derivative
works are solely in the form of machine-executable object code generated by
a source language processor.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
"deluge/i18n/*" are (C) 2006 Rosetta Contributors and Canonical Ltd 2006 and distributed
under the same license as the deluge software.
The Debian packaging is (C) 2006-2008, Marcos Pinto (markybob)
<markybob@gmail.com> and is licensed under GPL3, see above.

2
debian/manpages vendored Normal file
View File

@ -0,0 +1,2 @@
deluge/docs/man/deluge.1
deluge/docs/man/deluged.1

3
debian/menu vendored Normal file
View File

@ -0,0 +1,3 @@
?package(deluge-torrent): needs="X11" section="Applications/Network/File Transfer" \
title="Deluge BitTorrent Client" longtitle="Bittorrent client written in Python/PyGTK" \
command="/usr/bin/deluge" icon="/usr/share/pixmaps/deluge.png"

0
debian/patches/00list vendored Normal file
View File

1
debian/pyversions vendored Normal file
View File

@ -0,0 +1 @@
2.5

1
debian/pyversions.debian-lenny vendored Normal file
View File

@ -0,0 +1 @@
2.5

1
debian/pyversions.debian-sid vendored Normal file
View File

@ -0,0 +1 @@
2.5

1
debian/pyversions.ubuntu-gutsy vendored Normal file
View File

@ -0,0 +1 @@
2.5

1
debian/pyversions.ubuntu-hardy vendored Normal file
View File

@ -0,0 +1 @@
2.5

77
debian/rules vendored Executable file
View File

@ -0,0 +1,77 @@
#!/usr/bin/make -f
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
# Dpatch targets
include /usr/share/dpatch/dpatch.make
# Available python (using debian/pyversions) and destdir
PYVERS = 2.5
DESTDIR = $(CURDIR)/debian/deluge-torrent
export PYTHONPATH=$(CURDIR)/debian/deluge-torrent/usr/lib/python2.5/site-packages/
# We need to known the target arch to enable/disable amd64 hack
ARCH = $(shell dpkg-architecture -qDEB_BUILD_ARCH_CPU)
ARCH64 = ia64 amd64 alpha kfreebsd-amd64 ppc64
CFLAGS = -Wall -g
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
CFLAGS += -O0
else
CFLAGS += -O2
endif
# python-libtorrent need to define AMD64 to work fine on a 64 bits system
ifneq (,$(findstring $(ARCH),$(ARCH64)))
CFLAGS += -DAMD64
endif
build: patch-stamp $(PYVERS:%=build-stamp%)
build-stamp%: patch-stamp
dh_testdir
CFLAGS="$(CFLAGS)" python$* setup.py build
touch $@
clean: unpatch
dh_testdir
dh_testroot
rm -rf build/
find . -name \*.pyc | xargs rm -f
rm -rf build-stamp*
dh_clean
install: build install-prereq $(PYVERS:%=install-%) install-finish
install-prereq:
dh_testdir
dh_testroot
dh_clean -k
dh_installdirs
install-%:
python$* setup.py install --root=$(DESTDIR) --prefix=/usr --no-compile
install-finish:
# Desktop menu
rm -rf $(DESTDIR)/usr/share/applications
install -D -m644 $(CURDIR)/deluge/data/share/applications/deluge.desktop $(DESTDIR)/usr/share/applications/deluge.desktop
binary-indep: build install
binary-arch: build install
dh_testdir
dh_testroot
dh_installchangelogs
dh_installdocs
dh_installmenu
dh_strip
dh_compress
dh_fixperms
dh_pysupport
dh_desktop
dh_installdeb
dh_shlibdeps
dh_gencontrol
dh_md5sums
dh_builddeb
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install

75
debian/rules.debian-lenny vendored Executable file
View File

@ -0,0 +1,75 @@
#!/usr/bin/make -f
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
# Dpatch targets
include /usr/share/dpatch/dpatch.make
# Available python (using debian/pyversions) and destdir
PYVERS = 2.4
DESTDIR = $(CURDIR)/debian/deluge-torrent
# We need to known the target arch to enable/disable amd64 hack
ARCH = $(shell dpkg-architecture -qDEB_BUILD_ARCH_CPU)
ARCH64 = ia64 amd64 alpha kfreebsd-amd64 ppc64
CFLAGS = -Wall -g
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
CFLAGS += -O0
else
CFLAGS += -O2
endif
# python-libtorrent need to define AMD64 to work fine on a 64 bits system
ifneq (,$(findstring $(ARCH),$(ARCH64)))
CFLAGS += -DAMD64
endif
build: patch-stamp $(PYVERS:%=build-stamp%)
build-stamp%: patch-stamp
dh_testdir
CFLAGS="$(CFLAGS)" python$* setup.py build
touch $@
clean: unpatch
dh_testdir
dh_testroot
rm -rf build/
find . -name \*.pyc | xargs rm -f
rm -rf build-stamp*
dh_clean
install: build install-prereq $(PYVERS:%=install-%) install-finish
install-prereq:
dh_testdir
dh_testroot
dh_clean -k
dh_installdirs
install-%:
python$* setup.py install --root=$(DESTDIR) --prefix=/usr --no-compile
install-finish:
# Desktop menu
rm -rf $(DESTDIR)/usr/share/applications
install -D -m644 $(CURDIR)/deluge/data/share/applications/deluge.desktop $(DESTDIR)/usr/share/applications/deluge.desktop
binary-indep: build install
binary-arch: build install
dh_testdir
dh_testroot
dh_installchangelogs
dh_installdocs
dh_installmenu
dh_strip
dh_compress
dh_fixperms
dh_pysupport
dh_desktop
dh_installdeb
dh_shlibdeps
dh_gencontrol
dh_md5sums
dh_builddeb
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install

75
debian/rules.debian-sid vendored Executable file
View File

@ -0,0 +1,75 @@
#!/usr/bin/make -f
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
# Dpatch targets
include /usr/share/dpatch/dpatch.make
# Available python (using debian/pyversions) and destdir
PYVERS = 2.4
DESTDIR = $(CURDIR)/debian/deluge-torrent
# We need to known the target arch to enable/disable amd64 hack
ARCH = $(shell dpkg-architecture -qDEB_BUILD_ARCH_CPU)
ARCH64 = ia64 amd64 alpha kfreebsd-amd64 ppc64
CFLAGS = -Wall -g
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
CFLAGS += -O0
else
CFLAGS += -O2
endif
# python-libtorrent need to define AMD64 to work fine on a 64 bits system
ifneq (,$(findstring $(ARCH),$(ARCH64)))
CFLAGS += -DAMD64
endif
build: patch-stamp $(PYVERS:%=build-stamp%)
build-stamp%: patch-stamp
dh_testdir
CFLAGS="$(CFLAGS)" python$* setup.py build
touch $@
clean: unpatch
dh_testdir
dh_testroot
rm -rf build/
find . -name \*.pyc | xargs rm -f
rm -rf build-stamp*
dh_clean
install: build install-prereq $(PYVERS:%=install-%) install-finish
install-prereq:
dh_testdir
dh_testroot
dh_clean -k
dh_installdirs
install-%:
python$* setup.py install --root=$(DESTDIR) --prefix=/usr --no-compile
install-finish:
# Desktop menu
rm -rf $(DESTDIR)/usr/share/applications
install -D -m644 $(CURDIR)/deluge/data/share/applications/deluge.desktop $(DESTDIR)/usr/share/applications/deluge.desktop
binary-indep: build install
binary-arch: build install
dh_testdir
dh_testroot
dh_installchangelogs
dh_installdocs
dh_installmenu
dh_strip
dh_compress
dh_fixperms
dh_pysupport
dh_desktop
dh_installdeb
dh_shlibdeps
dh_gencontrol
dh_md5sums
dh_builddeb
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install

75
debian/rules.ubuntu-gutsy vendored Executable file
View File

@ -0,0 +1,75 @@
#!/usr/bin/make -f
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
# Dpatch targets
include /usr/share/dpatch/dpatch.make
# Available python (using debian/pyversions) and destdir
PYVERS = 2.5
DESTDIR = $(CURDIR)/debian/deluge-torrent
# We need to known the target arch to enable/disable amd64 hack
ARCH = $(shell dpkg-architecture -qDEB_BUILD_ARCH_CPU)
ARCH64 = ia64 amd64 alpha kfreebsd-amd64 ppc64
CFLAGS = -Wall -g
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
CFLAGS += -O0
else
CFLAGS += -O2
endif
# python-libtorrent need to define AMD64 to work fine on a 64 bits system
ifneq (,$(findstring $(ARCH),$(ARCH64)))
CFLAGS += -DAMD64
endif
build: patch-stamp $(PYVERS:%=build-stamp%)
build-stamp%: patch-stamp
dh_testdir
CFLAGS="$(CFLAGS)" python$* setup.py build
touch $@
clean: unpatch
dh_testdir
dh_testroot
rm -rf build/
find . -name \*.pyc | xargs rm -f
rm -rf build-stamp*
dh_clean
install: build install-prereq $(PYVERS:%=install-%) install-finish
install-prereq:
dh_testdir
dh_testroot
dh_clean -k
dh_installdirs
install-%:
python$* setup.py install --root=$(DESTDIR) --prefix=/usr --no-compile
install-finish:
# Desktop menu
rm -rf $(DESTDIR)/usr/share/applications
install -D -m644 $(CURDIR)/deluge/data/share/applications/deluge.desktop $(DESTDIR)/usr/share/applications/deluge.desktop
binary-indep: build install
binary-arch: build install
dh_testdir
dh_testroot
dh_installchangelogs
dh_installdocs
dh_installmenu
dh_strip
dh_compress
dh_fixperms
dh_pysupport
dh_desktop
dh_installdeb
dh_shlibdeps
dh_gencontrol
dh_md5sums
dh_builddeb
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install

75
debian/rules.ubuntu-hardy vendored Executable file
View File

@ -0,0 +1,75 @@
#!/usr/bin/make -f
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
# Dpatch targets
include /usr/share/dpatch/dpatch.make
# Available python (using debian/pyversions) and destdir
PYVERS = 2.5
DESTDIR = $(CURDIR)/debian/deluge-torrent
# We need to known the target arch to enable/disable amd64 hack
ARCH = $(shell dpkg-architecture -qDEB_BUILD_ARCH_CPU)
ARCH64 = ia64 amd64 alpha kfreebsd-amd64 ppc64
CFLAGS = -Wall -g
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
CFLAGS += -O0
else
CFLAGS += -O2
endif
# python-libtorrent need to define AMD64 to work fine on a 64 bits system
ifneq (,$(findstring $(ARCH),$(ARCH64)))
CFLAGS += -DAMD64
endif
build: patch-stamp $(PYVERS:%=build-stamp%)
build-stamp%: patch-stamp
dh_testdir
CFLAGS="$(CFLAGS)" python$* setup.py build
touch $@
clean: unpatch
dh_testdir
dh_testroot
rm -rf build/
find . -name \*.pyc | xargs rm -f
rm -rf build-stamp*
dh_clean
install: build install-prereq $(PYVERS:%=install-%) install-finish
install-prereq:
dh_testdir
dh_testroot
dh_clean -k
dh_installdirs
install-%:
python$* setup.py install --root=$(DESTDIR) --prefix=/usr --no-compile
install-finish:
# Desktop menu
rm -rf $(DESTDIR)/usr/share/applications
install -D -m644 $(CURDIR)/deluge/data/share/applications/deluge.desktop $(DESTDIR)/usr/share/applications/deluge.desktop
binary-indep: build install
binary-arch: build install
dh_testdir
dh_testroot
dh_installchangelogs
dh_installdocs
dh_installmenu
dh_strip
dh_compress
dh_fixperms
dh_pysupport
dh_desktop
dh_installdeb
dh_shlibdeps
dh_gencontrol
dh_md5sums
dh_builddeb
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -0,0 +1,595 @@
"""Simple XML-RPC Server.
This module can be used to create simple XML-RPC servers
by creating a server and either installing functions, a
class instance, or by extending the SimpleXMLRPCServer
class.
It can also be used to handle XML-RPC requests in a CGI
environment using CGIXMLRPCRequestHandler.
A list of possible usage patterns follows:
1. Install functions:
server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(pow)
server.register_function(lambda x,y: x+y, 'add')
server.serve_forever()
2. Install an instance:
class MyFuncs:
def __init__(self):
# make all of the string functions available through
# string.func_name
import string
self.string = string
def _listMethods(self):
# implement this method so that system.listMethods
# knows to advertise the strings methods
return list_public_methods(self) + \
['string.' + method for method in list_public_methods(self.string)]
def pow(self, x, y): return pow(x, y)
def add(self, x, y) : return x + y
server = SimpleXMLRPCServer(("localhost", 8000))
server.register_introspection_functions()
server.register_instance(MyFuncs())
server.serve_forever()
3. Install an instance with custom dispatch method:
class Math:
def _listMethods(self):
# this method must be present for system.listMethods
# to work
return ['add', 'pow']
def _methodHelp(self, method):
# this method must be present for system.methodHelp
# to work
if method == 'add':
return "add(2,3) => 5"
elif method == 'pow':
return "pow(x, y[, z]) => number"
else:
# By convention, return empty
# string if no help is available
return ""
def _dispatch(self, method, params):
if method == 'pow':
return pow(*params)
elif method == 'add':
return params[0] + params[1]
else:
raise 'bad method'
server = SimpleXMLRPCServer(("localhost", 8000))
server.register_introspection_functions()
server.register_instance(Math())
server.serve_forever()
4. Subclass SimpleXMLRPCServer:
class MathServer(SimpleXMLRPCServer):
def _dispatch(self, method, params):
try:
# We are forcing the 'export_' prefix on methods that are
# callable through XML-RPC to prevent potential security
# problems
func = getattr(self, 'export_' + method)
except AttributeError:
raise Exception('method "%s" is not supported' % method)
else:
return func(*params)
def export_add(self, x, y):
return x + y
server = MathServer(("localhost", 8000))
server.serve_forever()
5. CGI script:
server = CGIXMLRPCRequestHandler()
server.register_function(pow)
server.handle_request()
"""
# Written by Brian Quinlan (brian@sweetapp.com).
# Based on code written by Fredrik Lundh.
import xmlrpclib
from xmlrpclib import Fault
import SocketServer
import BaseHTTPServer
import sys
import os
try:
import fcntl
except ImportError:
fcntl = None
def resolve_dotted_attribute(obj, attr, allow_dotted_names=True):
"""resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d
Resolves a dotted attribute name to an object. Raises
an AttributeError if any attribute in the chain starts with a '_'.
If the optional allow_dotted_names argument is false, dots are not
supported and this function operates similar to getattr(obj, attr).
"""
if allow_dotted_names:
attrs = attr.split('.')
else:
attrs = [attr]
for i in attrs:
if i.startswith('_'):
raise AttributeError(
'attempt to access private attribute "%s"' % i
)
else:
obj = getattr(obj,i)
return obj
def list_public_methods(obj):
"""Returns a list of attribute strings, found in the specified
object, which represent callable attributes"""
return [member for member in dir(obj)
if not member.startswith('_') and
callable(getattr(obj, member))]
def remove_duplicates(lst):
"""remove_duplicates([2,2,2,1,3,3]) => [3,1,2]
Returns a copy of a list without duplicates. Every list
item must be hashable and the order of the items in the
resulting list is not defined.
"""
u = {}
for x in lst:
u[x] = 1
return u.keys()
class SimpleXMLRPCDispatcher:
"""Mix-in class that dispatches XML-RPC requests.
This class is used to register XML-RPC method handlers
and then to dispatch them. There should never be any
reason to instantiate this class directly.
"""
def __init__(self, allow_none, encoding):
self.funcs = {}
self.instance = None
self.allow_none = allow_none
self.encoding = encoding
def register_instance(self, instance, allow_dotted_names=False):
"""Registers an instance to respond to XML-RPC requests.
Only one instance can be installed at a time.
If the registered instance has a _dispatch method then that
method will be called with the name of the XML-RPC method and
its parameters as a tuple
e.g. instance._dispatch('add',(2,3))
If the registered instance does not have a _dispatch method
then the instance will be searched to find a matching method
and, if found, will be called. Methods beginning with an '_'
are considered private and will not be called by
SimpleXMLRPCServer.
If a registered function matches a XML-RPC request, then it
will be called instead of the registered instance.
If the optional allow_dotted_names argument is true and the
instance does not have a _dispatch method, method names
containing dots are supported and resolved, as long as none of
the name segments start with an '_'.
*** SECURITY WARNING: ***
Enabling the allow_dotted_names options allows intruders
to access your module's global variables and may allow
intruders to execute arbitrary code on your machine. Only
use this option on a secure, closed network.
"""
self.instance = instance
self.allow_dotted_names = allow_dotted_names
def register_function(self, function, name = None):
"""Registers a function to respond to XML-RPC requests.
The optional name argument can be used to set a Unicode name
for the function.
"""
if name is None:
name = function.__name__
self.funcs[name] = function
def register_introspection_functions(self):
"""Registers the XML-RPC introspection methods in the system
namespace.
see http://xmlrpc.usefulinc.com/doc/reserved.html
"""
self.funcs.update({'system.listMethods' : self.system_listMethods,
'system.methodSignature' : self.system_methodSignature,
'system.methodHelp' : self.system_methodHelp})
def register_multicall_functions(self):
"""Registers the XML-RPC multicall method in the system
namespace.
see http://www.xmlrpc.com/discuss/msgReader$1208"""
self.funcs.update({'system.multicall' : self.system_multicall})
def _marshaled_dispatch(self, data, dispatch_method = None):
"""Dispatches an XML-RPC method from marshalled (XML) data.
XML-RPC methods are dispatched from the marshalled (XML) data
using the _dispatch method and the result is returned as
marshalled data. For backwards compatibility, a dispatch
function can be provided as an argument (see comment in
SimpleXMLRPCRequestHandler.do_POST) but overriding the
existing method through subclassing is the prefered means
of changing method dispatch behavior.
"""
try:
params, method = xmlrpclib.loads(data)
# generate response
if dispatch_method is not None:
response = dispatch_method(method, params)
else:
response = self._dispatch(method, params)
# wrap response in a singleton tuple
response = (response,)
response = xmlrpclib.dumps(response, methodresponse=1,
allow_none=self.allow_none, encoding=self.encoding)
except Fault, fault:
response = xmlrpclib.dumps(fault, allow_none=self.allow_none,
encoding=self.encoding)
except:
# report exception back to server
response = xmlrpclib.dumps(
xmlrpclib.Fault(1, "%s:%s" % (sys.exc_type, sys.exc_value)),
encoding=self.encoding, allow_none=self.allow_none,
)
return response
def system_listMethods(self):
"""system.listMethods() => ['add', 'subtract', 'multiple']
Returns a list of the methods supported by the server."""
methods = self.funcs.keys()
if self.instance is not None:
# Instance can implement _listMethod to return a list of
# methods
if hasattr(self.instance, '_listMethods'):
methods = remove_duplicates(
methods + self.instance._listMethods()
)
# if the instance has a _dispatch method then we
# don't have enough information to provide a list
# of methods
elif not hasattr(self.instance, '_dispatch'):
methods = remove_duplicates(
methods + list_public_methods(self.instance)
)
methods.sort()
return methods
def system_methodSignature(self, method_name):
"""system.methodSignature('add') => [double, int, int]
Returns a list describing the signature of the method. In the
above example, the add method takes two integers as arguments
and returns a double result.
This server does NOT support system.methodSignature."""
# See http://xmlrpc.usefulinc.com/doc/sysmethodsig.html
return 'signatures not supported'
def system_methodHelp(self, method_name):
"""system.methodHelp('add') => "Adds two integers together"
Returns a string containing documentation for the specified method."""
method = None
if self.funcs.has_key(method_name):
method = self.funcs[method_name]
elif self.instance is not None:
# Instance can implement _methodHelp to return help for a method
if hasattr(self.instance, '_methodHelp'):
return self.instance._methodHelp(method_name)
# if the instance has a _dispatch method then we
# don't have enough information to provide help
elif not hasattr(self.instance, '_dispatch'):
try:
method = resolve_dotted_attribute(
self.instance,
method_name,
self.allow_dotted_names
)
except AttributeError:
pass
# Note that we aren't checking that the method actually
# be a callable object of some kind
if method is None:
return ""
else:
import pydoc
return pydoc.getdoc(method)
def system_multicall(self, call_list):
"""system.multicall([{'methodName': 'add', 'params': [2, 2]}, ...]) => \
[[4], ...]
Allows the caller to package multiple XML-RPC calls into a single
request.
See http://www.xmlrpc.com/discuss/msgReader$1208
"""
results = []
for call in call_list:
method_name = call['methodName']
params = call['params']
try:
# XXX A marshalling error in any response will fail the entire
# multicall. If someone cares they should fix this.
results.append([self._dispatch(method_name, params)])
except Fault, fault:
results.append(
{'faultCode' : fault.faultCode,
'faultString' : fault.faultString}
)
except:
results.append(
{'faultCode' : 1,
'faultString' : "%s:%s" % (sys.exc_type, sys.exc_value)}
)
return results
def _dispatch(self, method, params):
"""Dispatches the XML-RPC method.
XML-RPC calls are forwarded to a registered function that
matches the called XML-RPC method name. If no such function
exists then the call is forwarded to the registered instance,
if available.
If the registered instance has a _dispatch method then that
method will be called with the name of the XML-RPC method and
its parameters as a tuple
e.g. instance._dispatch('add',(2,3))
If the registered instance does not have a _dispatch method
then the instance will be searched to find a matching method
and, if found, will be called.
Methods beginning with an '_' are considered private and will
not be called.
"""
func = None
try:
# check to see if a matching function has been registered
func = self.funcs[method]
except KeyError:
if self.instance is not None:
# check for a _dispatch method
if hasattr(self.instance, '_dispatch'):
return self.instance._dispatch(method, params)
else:
# call instance method directly
try:
func = resolve_dotted_attribute(
self.instance,
method,
self.allow_dotted_names
)
except AttributeError:
pass
if func is not None:
return func(*params)
else:
raise Exception('method "%s" is not supported' % method)
class SimpleXMLRPCRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
"""Simple XML-RPC request handler class.
Handles all HTTP POST requests and attempts to decode them as
XML-RPC requests.
"""
# Class attribute listing the accessible path components;
# paths not on this list will result in a 404 error.
rpc_paths = ('/', '/RPC2')
def is_rpc_path_valid(self):
if self.rpc_paths:
return self.path in self.rpc_paths
else:
# If .rpc_paths is empty, just assume all paths are legal
return True
def do_POST(self):
"""Handles the HTTP POST request.
Attempts to interpret all HTTP POST requests as XML-RPC calls,
which are forwarded to the server's _dispatch method for handling.
"""
# Check that the path is legal
if not self.is_rpc_path_valid():
self.report_404()
return
try:
# Get arguments by reading body of request.
# We read this in chunks to avoid straining
# socket.read(); around the 10 or 15Mb mark, some platforms
# begin to have problems (bug #792570).
max_chunk_size = 10*1024*1024
size_remaining = int(self.headers["content-length"])
L = []
while size_remaining:
chunk_size = min(size_remaining, max_chunk_size)
L.append(self.rfile.read(chunk_size))
size_remaining -= len(L[-1])
data = ''.join(L)
# In previous versions of SimpleXMLRPCServer, _dispatch
# could be overridden in this class, instead of in
# SimpleXMLRPCDispatcher. To maintain backwards compatibility,
# check to see if a subclass implements _dispatch and dispatch
# using that method if present.
response = self.server._marshaled_dispatch(
data, getattr(self, '_dispatch', None)
)
except: # This should only happen if the module is buggy
# internal error, report as HTTP server error
self.send_response(500)
self.end_headers()
else:
# got a valid XML RPC response
self.send_response(200)
self.send_header("Content-type", "text/xml")
self.send_header("Content-length", str(len(response)))
self.end_headers()
self.wfile.write(response)
# shut down the connection
self.wfile.flush()
self.connection.shutdown(1)
def report_404 (self):
# Report a 404 error
self.send_response(404)
response = 'No such page'
self.send_header("Content-type", "text/plain")
self.send_header("Content-length", str(len(response)))
self.end_headers()
self.wfile.write(response)
# shut down the connection
self.wfile.flush()
self.connection.shutdown(1)
def log_request(self, code='-', size='-'):
"""Selectively log an accepted request."""
if self.server.logRequests:
BaseHTTPServer.BaseHTTPRequestHandler.log_request(self, code, size)
class SimpleXMLRPCServer(SocketServer.TCPServer,
SimpleXMLRPCDispatcher):
"""Simple XML-RPC server.
Simple XML-RPC server that allows functions and a single instance
to be installed to handle requests. The default implementation
attempts to dispatch XML-RPC calls to the functions or instance
installed in the server. Override the _dispatch method inhereted
from SimpleXMLRPCDispatcher to change this behavior.
"""
allow_reuse_address = True
def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler,
logRequests=True, allow_none=False, encoding=None):
self.logRequests = logRequests
SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
SocketServer.TCPServer.__init__(self, addr, requestHandler)
# [Bug #1222790] If possible, set close-on-exec flag; if a
# method spawns a subprocess, the subprocess shouldn't have
# the listening socket open.
if fcntl is not None and hasattr(fcntl, 'FD_CLOEXEC'):
flags = fcntl.fcntl(self.fileno(), fcntl.F_GETFD)
flags |= fcntl.FD_CLOEXEC
fcntl.fcntl(self.fileno(), fcntl.F_SETFD, flags)
class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher):
"""Simple handler for XML-RPC data passed through CGI."""
def __init__(self, allow_none=False, encoding=None):
SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
def handle_xmlrpc(self, request_text):
"""Handle a single XML-RPC request"""
response = self._marshaled_dispatch(request_text)
print('Content-Type: text/xml')
print('Content-Length: %d' % len(response))
print(
sys.stdout.write(response))
def handle_get(self):
"""Handle a single HTTP GET request.
Default implementation indicates an error because
XML-RPC uses the POST method.
"""
code = 400
message, explain = \
BaseHTTPServer.BaseHTTPRequestHandler.responses[code]
response = BaseHTTPServer.DEFAULT_ERROR_MESSAGE % \
{
'code' : code,
'message' : message,
'explain' : explain
}
print('Status: %d %s' % (code, message))
print('Content-Type: text/html')
print('Content-Length: %d' % len(response))
print(
sys.stdout.write(response))
def handle_request(self, request_text = None):
"""Handle a single XML-RPC request passed through a CGI post method.
If no XML data is given then it is read from stdin. The resulting
XML-RPC response is printed to stdout along with the correct HTTP
headers.
"""
if request_text is None and \
os.environ.get('REQUEST_METHOD', None) == 'GET':
self.handle_get()
else:
# POST data is normally available through stdin
if request_text is None:
request_text = sys.stdin.read()
self.handle_xmlrpc(request_text)
if __name__ == '__main__':
print('Running XML-RPC server on port 8000')
server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(pow)
server.register_function(lambda x,y: x+y, 'add')
server.serve_forever()

1
deluge/__init__.py Normal file
View File

@ -0,0 +1 @@
"""Deluge"""

348
deluge/common.py Normal file
View File

@ -0,0 +1,348 @@
#
# common.py
#
# Copyright (C) 2007, 2008 Andrew Resch <andrewresch@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.
#
"""Common functions for various parts of Deluge to use."""
import os
import subprocess
import platform
import pkg_resources
import xdg, xdg.BaseDirectory
LT_TORRENT_STATE = {
"Queued": 0,
"Checking": 1,
"Downloading Metadata": 2,
"Downloading": 3,
"Finished": 4,
"Seeding": 5,
"Allocating": 6,
0: "Queued",
1: "Checking",
2: "Downloading Metadata",
3: "Downloading",
4: "Finished",
5: "Seeding",
6: "Allocating",
}
TORRENT_STATE = [
"Allocating",
"Checking",
"Downloading",
"Seeding",
"Paused",
"Error",
"Queued"
]
FILE_PRIORITY = {
0: "Do Not Download",
1: "Normal Priority",
2: "High Priority",
5: "Highest Priority",
"Do Not Download": 0,
"Normal Priority": 1,
"High Priority": 2,
"Highest Priority": 5
}
def get_version():
"""Returns the program version from the egg metadata"""
return pkg_resources.require("Deluge")[0].version.split("r")[0]
def get_revision():
revision = ""
try:
f = open(pkg_resources.resource_filename("deluge", os.path.join("data", "revision")))
revision = f.read()
f.close()
except IOError, e:
pass
return revision
def get_default_config_dir(filename=None):
""" Returns the config path if no filename is specified
Returns the config directory + filename as a path if filename is specified
"""
if windows_check():
if filename:
return os.path.join(os.environ.get("APPDATA"), "deluge", filename)
else:
return os.path.join(os.environ.get("APPDATA"), "deluge")
else:
if filename:
return os.path.join(xdg.BaseDirectory.save_config_path("deluge"), filename)
else:
return xdg.BaseDirectory.save_config_path("deluge")
def get_default_download_dir():
"""Returns the default download directory"""
if windows_check():
return os.path.expanduser("~")
else:
return os.environ.get("HOME")
def windows_check():
"""Checks if the current platform is Windows. Returns True if it is Windows
and False if not."""
return platform.system() in ('Windows', 'Microsoft')
def vista_check():
return platform.release() == "Vista"
def osx_check():
return platform.system() == "Darwin"
def get_pixmap(fname):
"""Returns a pixmap file included with deluge"""
return pkg_resources.resource_filename("deluge", os.path.join("data", \
"pixmaps", fname))
def get_logo(size):
"""Returns a deluge logo pixbuf based on the size parameter."""
import gtk
if windows_check():
return gtk.gdk.pixbuf_new_from_file_at_size(get_pixmap("deluge.png"), \
size, size)
else:
return gtk.gdk.pixbuf_new_from_file_at_size(get_pixmap("deluge.svg"), \
size, size)
def open_file(path):
"""Opens a file or folder."""
if windows_check():
os.startfile("%s" % path)
else:
subprocess.Popen(["xdg-open", "%s" % path])
def open_url_in_browser(url):
"""Opens link in the desktop's default browser"""
def start_browser():
import threading
import webbrowser
class BrowserThread(threading.Thread):
def __init__(self, url):
threading.Thread.__init__(self)
self.url = url
def run(self):
webbrowser.open(self.url)
BrowserThread(url).start()
return False
import gobject
gobject.idle_add(start_browser)
def build_menu_radio_list(value_list, callback, pref_value=None,
suffix=None, show_notset=False, notset_label=None, notset_lessthan=0,
show_other=False, show_activated=False, activated_label=None):
# Build a menu with radio menu items from a list and connect them to
# the callback. The pref_value is what you would like to test for the
# default active radio item.
import gtk
if notset_label is None:
notset_label = _("Unlimited")
if activated_label is None:
activated_label = _("Activated")
menu = gtk.Menu()
group = None
if show_activated is False:
if pref_value > -1 and pref_value not in value_list:
value_list.pop()
value_list.append(pref_value)
for value in sorted(value_list):
if suffix != None:
menuitem = gtk.RadioMenuItem(group, str(value) + " " + \
suffix)
else:
menuitem = gtk.RadioMenuItem(group, str(value))
group = menuitem
if value == pref_value and pref_value != None:
menuitem.set_active(True)
if callback != None:
menuitem.connect("toggled", callback)
menu.append(menuitem)
if show_activated is True:
for value in sorted(value_list):
menuitem = gtk.RadioMenuItem(group, str(activated_label))
group = menuitem
if value == pref_value and pref_value != None:
menuitem.set_active(True)
if callback != None:
menuitem.connect("toggled", callback)
menu.append(menuitem)
if show_notset:
menuitem = gtk.RadioMenuItem(group, notset_label)
menuitem.set_name(notset_label)
if pref_value < notset_lessthan and pref_value != None:
menuitem.set_active(True)
if show_activated and pref_value == 1:
menuitem.set_active(True)
menuitem.connect("toggled", callback)
menu.append(menuitem)
# Add the Other... menuitem
if show_other is True:
menuitem = gtk.SeparatorMenuItem()
menu.append(menuitem)
menuitem = gtk.MenuItem(_("Other..."))
menuitem.set_name(_("Other..."))
menuitem.connect("activate", callback)
menu.append(menuitem)
return menu
def show_other_dialog(string, default=None):
"""Shows a dialog to get an 'other' speed and return the value"""
import gtk
import gtk.glade
dialog_glade = gtk.glade.XML(
pkg_resources.resource_filename("deluge.ui.gtkui",
"glade/dgtkpopups.glade"))
speed_dialog = dialog_glade.get_widget("speed_dialog")
spin_title = dialog_glade.get_widget("spin_title")
spin_title.set_text(_("%s" % string))
spin_speed = dialog_glade.get_widget("spin_speed")
if default != None:
spin_speed.set_value(default)
spin_speed.select_region(0, -1)
response = speed_dialog.run()
if response == 1: # OK Response
value = spin_speed.get_value()
else:
speed_dialog.destroy()
return None
speed_dialog.destroy()
return value
## Formatting text functions
def fsize(fsize_b):
"""Returns formatted string describing filesize
fsize_b should be in bytes
Returned value will be in either KiB, MiB, or GiB
"""
fsize_kb = fsize_b / 1024.0
if fsize_kb < 1024:
return "%.1f KiB" % fsize_kb
fsize_mb = fsize_kb / 1024.0
if fsize_mb < 1024:
return "%.1f MiB" % fsize_mb
fsize_gb = fsize_mb / 1024.0
return "%.1f GiB" % fsize_gb
def fpcnt(dec):
"""Returns a formatted string representing a percentage"""
return '%.2f%%' % (dec * 100)
def fspeed(bps):
"""Returns a formatted string representing transfer speed"""
return '%s/s' % (fsize(bps))
def fpeer(num_peers, total_peers):
"""Returns a formatted string num_peers (total_peers)"""
if total_peers > -1:
return "%d (%d)" % (num_peers, total_peers)
else:
return "%d" % num_peers
def ftime(seconds):
"""Returns a formatted time string"""
if seconds == 0:
return "Infinity"
if seconds < 60:
return '%ds' % (seconds)
minutes = seconds / 60
seconds = seconds % 60
if minutes < 60:
return '%dm %ds' % (minutes, seconds)
hours = minutes / 60
minutes = minutes % 60
if hours < 24:
return '%dh %dm' % (hours, minutes)
days = hours / 24
hours = hours % 24
if days < 7:
return '%dd %dh' % (days, hours)
weeks = days / 7
days = days % 7
if weeks < 10:
return '%dw %dd' % (weeks, days)
return 'unknown'
def is_url(url):
"""A simple regex test to check if the URL is valid."""
import re
return bool(re.search('^(https?|ftp|udp)://', url))
def fetch_url(url):
"""Downloads a torrent file from a given
URL and checks the file's validity."""
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 pythonize(var):
"""Translates DBUS types back to basic Python types."""
if isinstance(var, list):
return [pythonize(value) for value in var]
if isinstance(var, tuple):
return tuple([pythonize(value) for value in var])
if isinstance(var, dict):
return dict(
[(pythonize(key), pythonize(value)) for key, value in var.iteritems()]
)
for klass in [unicode, str, bool, int, float, long]:
if isinstance(var, klass):
return klass(var)
return var

221
deluge/component.py Normal file
View File

@ -0,0 +1,221 @@
#
# component.py
#
# Copyright (C) 2007, 2008 Andrew Resch <andrewresch@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.
#
import gobject
from deluge.log import LOG as log
COMPONENT_STATE = [
"Stopped",
"Started",
"Paused"
]
class Component:
def __init__(self, name, interval=1000, depend=None):
# Register with the ComponentRegistry
register(name, self, depend)
self._interval = interval
self._timer = None
self._state = COMPONENT_STATE.index("Stopped")
def get_state(self):
return self._state
def start(self):
pass
def _start(self):
self._state = COMPONENT_STATE.index("Started")
if self._update():
self._timer = gobject.timeout_add(self._interval, self._update)
def stop(self):
pass
def _stop(self):
self._state = COMPONENT_STATE.index("Stopped")
try:
gobject.source_remove(self._timer)
except:
pass
def _pause(self):
self._state = COMPONENT_STATE.index("Paused")
try:
gobject.source_remove(self._timer)
except:
pass
def _resume(self):
self._start()
def shutdown(self):
pass
def _update(self):
try:
self.update()
except AttributeError:
# This will stop the timer since the component doesn't have an
# update method.
return False
return True
class ComponentRegistry:
def __init__(self):
self.components = {}
self.depend = {}
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
def get(self, name):
"""Returns a reference to the component 'name'"""
return self.components[name]
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()
def stop(self):
"""Stops all components"""
for component in self.components.keys():
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()
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
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(): %s", e)
_ComponentRegistry = ComponentRegistry()
def register(name, obj, depend=None):
"""Registers a component with the registry"""
_ComponentRegistry.register(name, obj, depend)
def start(component=None):
"""Starts all components"""
if component == None:
_ComponentRegistry.start()
else:
_ComponentRegistry.start_component(component)
def stop(component=None):
"""Stops all or specified components"""
if component == None:
_ComponentRegistry.stop()
else:
_ComponentRegistry.stop_component(component)
def pause(component=None):
"""Pauses all or specificed components"""
if component == None:
_ComponentRegistry.pause()
else:
_ComponentRegistry.pause_component(component)
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)

180
deluge/config.py Normal file
View File

@ -0,0 +1,180 @@
#
# config.py
#
# Copyright (C) 2007 Andrew Resch <andrewresch@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.
#
"""Configuration class used to access/create/modify configuration files."""
import cPickle
import os.path
import gobject
import deluge.common
from deluge.log import LOG as log
class Config:
"""This class is used to access configuration files."""
def __init__(self, filename, defaults=None, config_dir=None):
log.debug("Config created with filename: %s", filename)
log.debug("Config defaults: %s", defaults)
self.config = {}
self.previous_config = {}
self.set_functions = {}
self._change_callback = None
# If defaults is not None then we need to use "defaults".
if defaults != None:
self.config = defaults
# Load the config from file in the config_dir
if config_dir == None:
self.config_file = deluge.common.get_default_config_dir(filename)
else:
self.config_file = os.path.join(config_dir, filename)
self.load(self.config_file)
# Save
self.save()
# This will get set with a gobject.timeout_add whenever a config option
# is set.
self.save_timer = None
def __del__(self):
self.save()
def load(self, filename=None):
"""Load a config file either by 'filename' or the filename set during
construction of this object."""
# Use self.config_file if filename is None
if filename is None:
filename = self.config_file
try:
# Un-pickle the file and update the config dictionary
pkl_file = open(filename, "rb")
filedump = cPickle.load(pkl_file)
self.config.update(filedump)
pkl_file.close()
except IOError:
log.warning("IOError: Unable to load file '%s'", filename)
except EOFError:
pkl_file.close()
def save(self, filename=None):
"""Save configuration to either 'filename' or the filename set during
construction of this object."""
# Saves the config dictionary
if filename is None:
filename = self.config_file
# Check to see if the current config differs from the one on disk
# We will only write a new config file if there is a difference
try:
pkl_file = open(filename, "rb")
filedump = cPickle.load(pkl_file)
pkl_file.close()
if filedump == self.config:
# The config has not changed so lets just return
self.save_timer = None
return
except (EOFError, IOError):
log.warning("IOError: Unable to open file: '%s'", filename)
try:
pkl_file = open(filename, "wb")
cPickle.dump(self.config, pkl_file)
pkl_file.close()
except IOError:
log.warning("IOError: Unable to save file '%s'", filename)
self.save_timer = None
def set(self, key, value):
"""Set the 'key' with 'value'."""
# Sets the "key" with "value" in the config dict
if self.config[key] != value:
log.debug("Setting '%s' to %s of %s", key, value, type(value))
# Make a copy of the current config prior to changing it
self.previous_config = self.config.copy()
self.config[key] = value
# Run the set_function for this key if any
try:
gobject.idle_add(self.set_functions[key], key, value)
except KeyError:
pass
try:
gobject.idle_add(self._change_callback, key, value)
except:
pass
# We set the save_timer for 5 seconds if not already set
log.debug("save_timer: %s", self.save_timer)
if not self.save_timer:
self.save_timer = gobject.timeout_add(5000, self.save)
def get(self, key):
"""Get the value of 'key'. If it is an invalid key then get() will
return None."""
# Attempts to get the "key" value and returns None if the key is
# invalid
try:
value = self.config[key]
log.debug("Getting '%s' as %s of %s", key, value, type(value))
return value
except KeyError:
log.warning("Key does not exist, returning None")
return None
def get_config(self):
"""Returns the entire configuration as a dictionary."""
return self.config
def get_previous_config(self):
"""Returns the config prior to the last set()"""
return self.previous_config
def register_change_callback(self, callback):
"""Registers a callback that will be called when a value is changed"""
self._change_callback = callback
def register_set_function(self, key, function, apply_now=True):
"""Register a function to be run when a config value changes."""
log.debug("Registering function for %s key..", key)
self.set_functions[key] = function
# Run the function now if apply_now is set
if apply_now:
self.set_functions[key](key, self.config[key])
return
def apply_all(self):
"""Runs all set functions"""
log.debug("Running all set functions..")
for key in self.set_functions.keys():
self.set_functions[key](key, self.config[key])
def __getitem__(self, key):
return self.config[key]
def __setitem__(self, key, value):
self.set(key, value)

104
deluge/configmanager.py Normal file
View File

@ -0,0 +1,104 @@
#
# configmanager.py
#
# Copyright (C) 2007 Andrew Resch <andrewresch@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.
#
import gobject
import os
import os.path
import deluge.common
from deluge.log import LOG as log
from deluge.config import Config
class _ConfigManager:
def __init__(self):
log.debug("ConfigManager started..")
self.config_files = {}
self.config_directory = deluge.common.get_default_config_dir()
# Set a 5 minute timer to call save()
gobject.timeout_add(300000, self.save)
def __del__(self):
log.debug("ConfigManager stopping..")
del self.config_files
def set_config_dir(self, directory):
"""Sets the config directory"""
if directory == None:
return
log.info("Setting config directory to: %s", directory)
if not os.path.exists(directory):
# Try to create the config folder if it doesn't exist
try:
os.makedirs(directory)
except Exception, e:
log.warning("Unable to make config directory: %s", e)
self.config_directory = directory
def get_config_dir(self):
log.debug("get_config_dir: %s", self.config_directory)
return self.config_directory
def close(self, config):
"""Closes a config file."""
try:
del self.config_files[config]
except KeyError:
pass
def save(self):
"""Saves all the configs to disk."""
for key in self.config_files.keys():
self.config_files[key].save()
# We need to return True to keep the timer active
return True
def get_config(self, config_file, defaults=None):
"""Get a reference to the Config object for this filename"""
log.debug("Getting config '%s'", config_file)
# Create the config object if not already created
if config_file not in self.config_files.keys():
self.config_files[config_file] = Config(config_file, defaults, self.config_directory)
return self.config_files[config_file]
# Singleton functions
_configmanager = _ConfigManager()
def ConfigManager(config, defaults=None):
return _configmanager.get_config(config, defaults)
def set_config_dir(directory):
"""Sets the config directory, else just uses default"""
return _configmanager.set_config_dir(directory)
def get_config_dir(filename=None):
if filename != None:
return os.path.join(_configmanager.get_config_dir(), filename)
else:
return _configmanager.get_config_dir()
def close(config):
return _configmanager.close(config)

0
deluge/core/__init__.py Normal file
View File

111
deluge/core/alertmanager.py Normal file
View File

@ -0,0 +1,111 @@
#
# alertmanager.py
#
# Copyright (C) 2007 Andrew Resch <andrewresch@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.
#
"""The AlertManager handles all the libtorrent alerts."""
import gobject
import deluge.component as component
try:
import deluge.libtorrent as lt
except ImportError:
import libtorrent as lt
if not (libtorrent.version_major == 0 and libtorrent.version_minor == 14):
raise ImportError("This version of Deluge requires libtorrent 0.14!")
from deluge.log import LOG as log
class AlertManager(component.Component):
def __init__(self, session):
log.debug("AlertManager initialized..")
component.Component.__init__(self, "AlertManager", interval=50)
self.session = session
self.session.set_alert_mask(
lt.alert.category_t.error_notification |
lt.alert.category_t.port_mapping_notification |
lt.alert.category_t.storage_notification |
lt.alert.category_t.tracker_notification |
lt.alert.category_t.status_notification |
lt.alert.category_t.ip_block_notification)
# handlers is a dictionary of lists {"alert_type": [handler1,h2,..]}
self.handlers = {}
def update(self):
self.handle_alerts()
def shutdown(self):
del self.session
del self.handlers
def register_handler(self, alert_type, handler):
"""Registers a function that will be called when 'alert_type' is pop'd
in handle_alerts. The handler function should look like:
handler(alert)
Where 'alert' is the actual alert object from libtorrent
"""
if alert_type not in self.handlers.keys():
# There is no entry for this alert type yet, so lets make it with an
# empty list.
self.handlers[alert_type] = []
# Append the handler to the list in the handlers dictionary
self.handlers[alert_type].append(handler)
log.debug("Registered handler for alert %s", alert_type)
def deregister_handler(self, handler):
"""De-registers the 'handler' function from all alert types."""
# Iterate through all handlers and remove 'handler' where found
for (key, value) in self.handlers:
if handler in value:
# Handler is in this alert type list
value.remove(handler)
def handle_alerts(self, wait=False):
"""Pops all libtorrent alerts in the session queue and handles them
appropriately."""
alert = self.session.pop_alert()
while alert is not None:
# Loop through all alerts in the queue
# Do some magic to get the alert type as a string
alert_type = str(type(alert)).split("'")[1].split(".")[-1]
# Display the alert message
try:
log.debug("%s: %s", alert_type, alert.message())
except RuntimeError:
log.debug("%s", alert_type)
# Call any handlers for this alert type
if alert_type in self.handlers.keys():
for handler in self.handlers[alert_type]:
if not wait:
gobject.idle_add(handler, alert)
else:
handler(alert)
alert = self.session.pop_alert()
# Return True so that the timer continues
return True

125
deluge/core/autoadd.py Normal file
View File

@ -0,0 +1,125 @@
#
# autoadd.py
#
# Copyright (C) 2008 Andrew Resch <andrewresch@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.
#
import os
try:
import deluge.libtorrent as lt
except ImportError:
import libtorrent as lt
if not (libtorrent.version_major == 0 and libtorrent.version_minor == 14):
raise ImportError("This version of Deluge requires libtorrent 0.14!")
import deluge.component as component
from deluge.configmanager import ConfigManager
from deluge.log import LOG as log
MAX_NUM_ATTEMPTS = 10
class AutoAdd(component.Component):
def __init__(self):
component.Component.__init__(self, "AutoAdd", depend=["TorrentManager"], interval=5000)
# Get the core config
self.config = ConfigManager("core.conf")
# A list of filenames
self.invalid_torrents = []
# Filename:Attempts
self.attempts = {}
# Register set functions
self.config.register_set_function("autoadd_enable",
self._on_autoadd_enable, apply_now=True)
self.config.register_set_function("autoadd_location",
self._on_autoadd_location)
def update(self):
if not self.config["autoadd_enable"]:
# We shouldn't be updating because autoadd is not enabled
component.pause("AutoAdd")
return
# Check the auto add folder for new torrents to add
if not os.path.exists(self.config["autoadd_location"]):
log.warning("Invalid AutoAdd folder: %s", self.config["autoadd_location"])
component.pause("AutoAdd")
return
for filename in os.listdir(self.config["autoadd_location"]):
if filename.split(".")[-1] == "torrent":
filepath = os.path.join(self.config["autoadd_location"], filename)
try:
filedump = self.load_torrent(filepath)
except Exception, e:
# If the torrent is invalid, we keep track of it so that we
# can try again on the next pass. This is because some
# torrents may not be fully saved during the pass.
log.debug("Torrent is invalid: %s", e)
if filename in self.invalid_torrents:
self.attempts[filename] += 1
if self.attempts[filename] >= MAX_NUM_ATTEMPTS:
os.rename(filepath, filepath + ".invalid")
del self.attempts[filename]
self.invalid_torrents.remove(filename)
else:
self.invalid_torrents.append(filename)
self.attempts[filename] = 1
continue
# The torrent looks good, so lets add it to the session
component.get("TorrentManager").add(filedump=filedump, filename=filename)
os.remove(filepath)
def load_torrent(self, filename):
try:
log.debug("Attempting to open %s for add.", filename)
_file = open(filename, "rb")
filedump = _file.read()
if not filedump:
raise RuntimeError, "Torrent is 0 bytes!"
_file.close()
except IOError, e:
log.warning("Unable to open %s: %s", filename, e)
raise e
# Get the info to see if any exceptions are raised
info = lt.torrent_info(lt.bdecode(filedump))
return filedump
def _on_autoadd_enable(self, key, value):
log.debug("_on_autoadd_enable")
if value:
component.resume("AutoAdd")
else:
component.pause("AutoAdd")
def _on_autoadd_location(self, key, value):
log.debug("_on_autoadd_location")
# We need to resume the component just incase it was paused due to
# an invalid autoadd location.
if self.config["autoadd_enable"]:
component.resume("AutoAdd")

953
deluge/core/core.py Normal file
View File

@ -0,0 +1,953 @@
#
# core.py
#
# Copyright (C) 2007, 2008 Andrew Resch <andrewresch@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.
#
import gettext
import locale
import pkg_resources
import sys
import shutil
import os
import os.path
import signal
import deluge.SimpleXMLRPCServer as SimpleXMLRPCServer
from SocketServer import ThreadingMixIn
import deluge.xmlrpclib as xmlrpclib
import gobject
import threading
import socket
try:
import deluge.libtorrent as lt
except ImportError:
import libtorrent as lt
if not (libtorrent.version_major == 0 and libtorrent.version_minor == 14):
raise ImportError("This version of Deluge requires libtorrent 0.14!")
import deluge.configmanager
import deluge.common
import deluge.component as component
from deluge.core.torrentmanager import TorrentManager
from deluge.core.pluginmanager import PluginManager
from deluge.core.alertmanager import AlertManager
from deluge.core.signalmanager import SignalManager
from deluge.core.autoadd import AutoAdd
from deluge.log import LOG as log
DEFAULT_PREFS = {
"config_location": deluge.configmanager.get_config_dir(),
"send_info": False,
"info_sent": 0.0,
"daemon_port": 58846,
"allow_remote": False,
"compact_allocation": False,
"download_location": deluge.common.get_default_download_dir(),
"listen_ports": [6881, 6891],
"copy_torrent_file": False,
"torrentfiles_location": deluge.common.get_default_download_dir(),
"plugins_location": os.path.join(deluge.configmanager.get_config_dir(), "plugins"),
"state_location": os.path.join(deluge.configmanager.get_config_dir(), "state"),
"prioritize_first_last_pieces": False,
"random_port": True,
"dht": True,
"upnp": True,
"natpmp": True,
"utpex": True,
"lsd": True,
"enc_in_policy": 1,
"enc_out_policy": 1,
"enc_level": 2,
"enc_prefer_rc4": True,
"max_connections_global": 200,
"max_upload_speed": -1.0,
"max_download_speed": -1.0,
"max_upload_slots_global": 4,
"max_half_open_connections": (lambda: deluge.common.windows_check() and
(lambda: deluge.common.vista_check() and 4 or 8)() or -1)(),
"max_connections_per_second": 20,
"ignore_limits_on_local_network": True,
"max_connections_per_torrent": -1,
"max_upload_slots_per_torrent": -1,
"max_upload_speed_per_torrent": -1,
"max_download_speed_per_torrent": -1,
"enabled_plugins": [],
"autoadd_location": deluge.common.get_default_download_dir(),
"autoadd_enable": False,
"add_paused": False,
"max_active_seeding": 5,
"max_active_downloading": 3,
"max_active_limit": 8,
"dont_count_slow_torrents": False,
"queue_new_to_top": False,
"stop_seed_at_ratio": False,
"remove_seed_at_ratio": False,
"stop_seed_ratio": 2.00,
"share_ratio_limit": 2.00,
"seed_time_ratio_limit": 7.00,
"seed_time_limit": 180,
"auto_managed": True,
"move_completed": False,
"move_completed_path": deluge.common.get_default_download_dir(),
"new_release_check": True,
"rate_limit_ip_overhead": True
}
class Core(
ThreadingMixIn,
SimpleXMLRPCServer.SimpleXMLRPCServer,
component.Component):
def __init__(self, port):
log.debug("Core init..")
component.Component.__init__(self, "Core")
self.client_address = None
# Get config
self.config = deluge.configmanager.ConfigManager("core.conf", DEFAULT_PREFS)
if port == None:
port = self.config["daemon_port"]
if self.config["allow_remote"]:
hostname = ""
else:
hostname = "127.0.0.1"
# Setup the xmlrpc server
try:
log.info("Starting XMLRPC server on port %s", port)
SimpleXMLRPCServer.SimpleXMLRPCServer.__init__(
self, (hostname, port), logRequests=False, allow_none=True)
except:
log.info("Daemon already running or port not available..")
sys.exit(0)
self.register_multicall_functions()
# Register all export_* functions
for func in dir(self):
if func.startswith("export_"):
self.register_function(getattr(self, "%s" % func), func[7:])
self.register_introspection_functions()
# Initialize gettext
locale.setlocale(locale.LC_ALL, '')
if hasattr(locale, "bindtextdomain"):
locale.bindtextdomain("deluge", pkg_resources.resource_filename("deluge", "i18n"))
if hasattr(locale, "textdomain"):
locale.textdomain("deluge")
gettext.bindtextdomain("deluge", pkg_resources.resource_filename("deluge", "i18n"))
gettext.textdomain("deluge")
gettext.install("deluge", pkg_resources.resource_filename("deluge", "i18n"))
# Setup signals
signal.signal(signal.SIGINT, self._shutdown)
signal.signal(signal.SIGTERM, self._shutdown)
if not deluge.common.windows_check():
signal.signal(signal.SIGHUP, self._shutdown)
else:
from win32api import SetConsoleCtrlHandler
from win32con import CTRL_CLOSE_EVENT
from win32con import CTRL_SHUTDOWN_EVENT
result = 0
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()
result = 1
return result
SetConsoleCtrlHandler(win_handler)
def get_request(self):
"""Get the request and client address from the socket.
We override this so that we can get the ip address of the client.
"""
request, client_address = self.socket.accept()
self.client_address = client_address[0]
return (request, client_address)
def run(self):
"""Starts the core"""
# Create the client fingerprint
version = []
for value in deluge.common.get_version().split("."):
version.append(int(value.split("-")[0]))
while len(version) < 4:
version.append(0)
fingerprint = lt.fingerprint("DE", *version)
# Start the libtorrent session
log.debug("Starting libtorrent session..")
self.session = lt.session(fingerprint, flags=0)
# Set the user agent
self.settings = lt.session_settings()
self.settings.user_agent = "Deluge %s" % deluge.common.get_version()
# Load the GeoIP DB for country look-ups if available
geoip_db = pkg_resources.resource_filename("deluge", os.path.join("data", "GeoIP.dat"))
if os.path.exists(geoip_db):
self.session.load_country_db(geoip_db)
# Set session settings
self.settings.lazy_bitfields = 1
self.settings.send_redundant_have = True
self.session.set_settings(self.settings)
# Create an ip filter
self.ip_filter = lt.ip_filter()
# This keeps track of the timer to set the ip filter.. We do this a few
# seconds aftering adding a rule so that 'batch' adding of rules isn't slow.
self._set_ip_filter_timer = None
# Load metadata extension
self.session.add_extension(lt.create_metadata_plugin)
# Register set functions in the Config
self.config.register_set_function("torrentfiles_location",
self._on_set_torrentfiles_location)
self.config.register_set_function("state_location",
self._on_set_state_location)
self.config.register_set_function("listen_ports",
self._on_set_listen_ports)
self.config.register_set_function("random_port",
self._on_set_random_port)
self.config.register_set_function("dht", self._on_set_dht)
self.config.register_set_function("upnp", self._on_set_upnp)
self.config.register_set_function("natpmp", self._on_set_natpmp)
self.config.register_set_function("utpex", self._on_set_utpex)
self.config.register_set_function("lsd", self._on_set_lsd)
self.config.register_set_function("enc_in_policy",
self._on_set_encryption)
self.config.register_set_function("enc_out_policy",
self._on_set_encryption)
self.config.register_set_function("enc_level",
self._on_set_encryption)
self.config.register_set_function("enc_prefer_rc4",
self._on_set_encryption)
self.config.register_set_function("max_connections_global",
self._on_set_max_connections_global)
self.config.register_set_function("max_upload_speed",
self._on_set_max_upload_speed)
self.config.register_set_function("max_download_speed",
self._on_set_max_download_speed)
self.config.register_set_function("max_upload_slots_global",
self._on_set_max_upload_slots_global)
self.config.register_set_function("max_half_open_connections",
self._on_set_max_half_open_connections)
self.config.register_set_function("max_connections_per_second",
self._on_set_max_connections_per_second)
self.config.register_set_function("ignore_limits_on_local_network",
self._on_ignore_limits_on_local_network)
self.config.register_set_function("share_ratio_limit",
self._on_set_share_ratio_limit)
self.config.register_set_function("seed_time_ratio_limit",
self._on_set_seed_time_ratio_limit)
self.config.register_set_function("seed_time_limit",
self._on_set_seed_time_limit)
self.config.register_set_function("max_active_downloading",
self._on_set_max_active_downloading)
self.config.register_set_function("max_active_seeding",
self._on_set_max_active_seeding)
self.config.register_set_function("max_active_limit",
self._on_set_max_active_limit)
self.config.register_set_function("dont_count_slow_torrents",
self._on_set_dont_count_slow_torrents)
self.config.register_set_function("send_info",
self._on_send_info)
self.new_release = None
self.new_release_timer = None
self.config.register_set_function("new_release_check",
self._on_new_release_check)
self.config.register_set_function("rate_limit_ip_overhead",
self._on_rate_limit_ip_overhead)
self.config.register_change_callback(self._on_config_value_change)
# Start the AlertManager
self.alerts = AlertManager(self.session)
# Start the SignalManager
self.signals = SignalManager()
# Load plugins
self.plugins = PluginManager(self)
# Start the TorrentManager
self.torrents = TorrentManager(self.session, self.alerts)
# Create the AutoAdd component
self.autoadd = AutoAdd()
component.start()
self._should_shutdown = False
self.listen_thread = threading.Thread(target=self.handle_thread)
self.listen_thread.setDaemon(False)
self.listen_thread.start()
gobject.threads_init()
self.loop = gobject.MainLoop()
try:
self.loop.run()
except KeyboardInterrupt:
self._shutdown()
def handle_thread(self):
try:
while not self._should_shutdown:
self.handle_request()
self._should_shutdown = False
except Exception, e:
log.debug("handle_thread: %s", e)
def shutdown(self):
pass
def _shutdown(self, *data):
"""This is called by a thread from shutdown()"""
log.info("Shutting down core..")
self._should_shutdown = True
# Shutdown the socket
try:
self.socket.shutdown(socket.SHUT_RDWR)
except Exception, e:
log.debug("exception in socket shutdown: %s", e)
log.debug("Joining listen thread to make sure it shutdowns cleanly..")
# Join the listen thread for a maximum of 1 second
self.listen_thread.join(1.0)
# Start shutting down the components
component.shutdown()
# Make sure the config file has been saved
self.config.save()
del self.config
del deluge.configmanager
del self.session
self.loop.quit()
try:
self.gnome_client.disconnect()
except:
pass
# Exported Methods
def export_ping(self):
"""A method to see if the core is running"""
return True
def export_shutdown(self):
"""Shutdown the core"""
# Make shutdown an async call
gobject.idle_add(self._shutdown)
def export_register_client(self, port):
"""Registers a client with the signal manager so that signals are
sent to it."""
self.signals.register_client(self.client_address, port)
if self.config["new_release_check"]:
self.check_new_release()
def export_deregister_client(self):
"""De-registers a client with the signal manager."""
self.signals.deregister_client(self.client_address)
def export_add_torrent_file(self, filename, filedump, options):
"""Adds a torrent file to the libtorrent session
This requires the torrents filename and a dump of it's content
"""
gobject.idle_add(self._add_torrent_file, filename, filedump, options)
def _add_torrent_file(self, filename, filedump, options):
# Turn the filedump into a torrent_info
if not isinstance(filedump, str):
filedump = filedump.data
if len(filedump) == 0:
log.warning("Torrent file is corrupt!")
return
try:
torrent_info = lt.torrent_info(lt.bdecode(filedump))
except RuntimeError, e:
log.warning("Unable to decode torrent file: %s", e)
return None
torrent_id = self.torrents.add(filedump=filedump, options=options, filename=filename)
# Run the plugin hooks for 'post_torrent_add'
self.plugins.run_post_torrent_add(torrent_id)
def export_add_torrent_url(self, url, options):
log.info("Attempting to add url %s", url)
threading.Thread(target=self.fetch_torrent_url_thread, args=(self.export_add_torrent_file, url, options)).start()
def fetch_torrent_url_thread(self, callback, url, options):
# Get the actual filename of the torrent from the url provided.
filename = url.split("/")[-1]
# Get the .torrent file from the url
torrent_file = deluge.common.fetch_url(url)
if torrent_file is None:
return False
# Dump the torrents file contents to a string
try:
filedump = open(torrent_file, "rb").read()
except IOError:
log.warning("Unable to open %s for reading.", torrent_file)
return False
# Add the torrent to session
return callback(filename, filedump, options)
def export_remove_torrent(self, torrent_ids, remove_torrent, remove_data):
log.debug("Removing torrent %s from the core.", torrent_ids)
for torrent_id in torrent_ids:
if self.torrents.remove(torrent_id, remove_torrent, remove_data):
# Run the plugin hooks for 'post_torrent_remove'
self.plugins.run_post_torrent_remove(torrent_id)
def export_force_reannounce(self, torrent_ids):
log.debug("Forcing reannouncment to: %s", torrent_ids)
for torrent_id in torrent_ids:
self.torrents[torrent_id].force_reannounce()
def export_pause_torrent(self, torrent_ids):
log.debug("Pausing: %s", torrent_ids)
for torrent_id in torrent_ids:
if not self.torrents[torrent_id].pause():
log.warning("Error pausing torrent %s", torrent_id)
def export_move_storage(self, torrent_ids, dest):
log.debug("Moving storage %s to %s", torrent_ids, dest)
for torrent_id in torrent_ids:
if not self.torrents[torrent_id].move_storage(dest):
log.warning("Error moving torrent %s to %s", torrent_id, dest)
def export_pause_all_torrents(self):
"""Pause all torrents in the session"""
if not self.torrents.pause_all():
log.warning("Error pausing all torrents..")
def export_resume_all_torrents(self):
"""Resume all torrents in the session"""
if self.torrents.resume_all():
# Emit the 'torrent_all_resumed' signal
self.torrent_all_resumed()
def export_resume_torrent(self, torrent_ids):
log.debug("Resuming: %s", torrent_ids)
for torrent_id in torrent_ids:
if self.torrents[torrent_id].resume():
self.torrent_resumed(torrent_id)
def export_get_torrent_status(self, torrent_id, keys):
# Build the status dictionary
try:
status = self.torrents[torrent_id].get_status(keys)
except KeyError, e:
log.debug(e)
# The torrent_id is not found in the torrentmanager, so return None
return None
# Get the leftover fields and ask the plugin manager to fill them
leftover_fields = list(set(keys) - set(status.keys()))
if len(leftover_fields) > 0:
status.update(self.plugins.get_status(torrent_id, leftover_fields))
return status
def export_get_torrents_status(self, torrent_ids, keys):
status_dict = {}.fromkeys(torrent_ids)
# Get the torrent status for each torrent_id
for torrent_id in torrent_ids:
try:
status = self.torrents[torrent_id].get_status(keys)
except KeyError, e:
log.debug(e)
return None
# Get the leftover fields and ask the plugin manager to fill them
leftover_fields = list(set(keys) - set(status.keys()))
if len(leftover_fields) > 0:
status.update(
self.plugins.get_status(torrent_id, leftover_fields))
status_dict[torrent_id] = status
# Emit the torrent_status signal to the clients
return status_dict
def export_get_session_state(self):
"""Returns a list of torrent_ids in the session."""
# Get the torrent list from the TorrentManager
return self.torrents.get_torrent_list()
def export_save_state(self):
"""Save the current session state to file."""
# Have the TorrentManager save it's state
self.torrents.save_state()
def export_get_config(self):
"""Get all the preferences as a dictionary"""
return self.config.get_config()
def export_get_config_value(self, key):
"""Get the config value for key"""
try:
value = self.config[key]
except KeyError:
return None
return value
def export_set_config(self, config):
"""Set the config with values from dictionary"""
config = deluge.common.pythonize(config)
# Load all the values into the configuration
for key in config.keys():
if isinstance(config[key], unicode) or isinstance(config[key], str):
config[key] = config[key].encode("utf8")
self.config[key] = config[key]
def export_get_listen_port(self):
"""Returns the active listen port"""
return self.session.listen_port()
def export_get_num_connections(self):
"""Returns the current number of connections"""
return self.session.num_connections()
def export_get_dht_nodes(self):
"""Returns the number of dht nodes"""
return self.session.status().dht_nodes
def export_get_download_rate(self):
"""Returns the payload download rate"""
return self.session.status().payload_download_rate
def export_get_upload_rate(self):
"""Returns the payload upload rate"""
return self.session.status().payload_upload_rate
def export_get_available_plugins(self):
"""Returns a list of plugins available in the core"""
return self.plugins.get_available_plugins()
def export_get_enabled_plugins(self):
"""Returns a list of enabled plugins in the core"""
return self.plugins.get_enabled_plugins()
def export_enable_plugin(self, plugin):
self.plugins.enable_plugin(plugin)
return None
def export_disable_plugin(self, plugin):
self.plugins.disable_plugin(plugin)
return None
def export_force_recheck(self, torrent_ids):
"""Forces a data recheck on torrent_ids"""
for torrent_id in torrent_ids:
self.torrents[torrent_id].force_recheck()
def export_set_torrent_trackers(self, torrent_id, trackers):
"""Sets a torrents tracker list. trackers will be [{"url", "tier"}]"""
return self.torrents[torrent_id].set_trackers(trackers)
def export_set_torrent_max_connections(self, torrent_id, value):
"""Sets a torrents max number of connections"""
return self.torrents[torrent_id].set_max_connections(value)
def export_set_torrent_max_upload_slots(self, torrent_id, value):
"""Sets a torrents max number of upload slots"""
return self.torrents[torrent_id].set_max_upload_slots(value)
def export_set_torrent_max_upload_speed(self, torrent_id, value):
"""Sets a torrents max upload speed"""
return self.torrents[torrent_id].set_max_upload_speed(value)
def export_set_torrent_max_download_speed(self, torrent_id, value):
"""Sets a torrents max download speed"""
return self.torrents[torrent_id].set_max_download_speed(value)
def export_set_torrent_file_priorities(self, torrent_id, priorities):
"""Sets a torrents file priorities"""
return self.torrents[torrent_id].set_file_priorities(priorities)
def export_set_torrent_prioritize_first_last(self, torrent_id, value):
"""Sets a higher priority to the first and last pieces"""
return self.torrents[torrent_id].set_prioritize_first_last(value)
def export_set_torrent_auto_managed(self, torrent_id, value):
"""Sets the auto managed flag for queueing purposes"""
return self.torrents[torrent_id].set_auto_managed(value)
def export_set_torrent_stop_at_ratio(self, torrent_id, value):
"""Sets the torrent to stop at 'stop_ratio'"""
return self.torrents[torrent_id].set_stop_at_ratio(value)
def export_set_torrent_stop_ratio(self, torrent_id, value):
"""Sets the ratio when to stop a torrent if 'stop_at_ratio' is set"""
return self.torrents[torrent_id].set_stop_ratio(value)
def export_set_torrent_remove_at_ratio(self, torrent_id, value):
"""Sets the torrent to be removed at 'stop_ratio'"""
return self.torrents[torrent_id].set_remove_at_ratio(value)
def export_block_ip_range(self, range):
"""Block an ip range"""
self.ip_filter.add_rule(range[0], range[1], 1)
# Start a 2 second timer (and remove the previous one if it exists)
if self._set_ip_filter_timer:
gobject.source_remove(self._set_ip_filter_timer)
self._set_ip_filter_timer = gobject.timeout_add(2000, self.session.set_ip_filter, self.ip_filter)
def export_reset_ip_filter(self):
"""Clears the ip filter"""
self.ip_filter = lt.ip_filter()
self.session.set_ip_filter(self.ip_filter)
def export_get_health(self):
"""Returns True if we have established incoming connections"""
return self.session.status().has_incoming_connections
## Queueing functions ##
def export_queue_top(self, torrent_ids):
log.debug("Attempting to queue %s to top", torrent_ids)
for torrent_id in torrent_ids:
try:
# If the queue method returns True, then we should emit a signal
if self.torrents.queue_top(torrent_id):
self._torrent_queue_changed()
except KeyError:
log.warning("torrent_id: %s does not exist in the queue", torrent_id)
def export_queue_up(self, torrent_ids):
log.debug("Attempting to queue %s to up", torrent_ids)
#torrent_ids must be sorted before moving.
torrent_ids.sort(key = lambda id: self.torrents.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.torrents.queue_up(torrent_id):
self._torrent_queue_changed()
except KeyError:
log.warning("torrent_id: %s does not exist in the queue", torrent_id)
def export_queue_down(self, torrent_ids):
log.debug("Attempting to queue %s to down", torrent_ids)
#torrent_ids must be sorted before moving.
torrent_ids.sort(key = lambda id: -self.torrents.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.torrents.queue_down(torrent_id):
self._torrent_queue_changed()
except KeyError:
log.warning("torrent_id: %s does not exist in the queue", torrent_id)
def export_queue_bottom(self, torrent_ids):
log.debug("Attempting to queue %s to bottom", torrent_ids)
for torrent_id in torrent_ids:
try:
# If the queue method returns True, then we should emit a signal
if self.torrents.queue_bottom(torrent_id):
self._torrent_queue_changed()
except KeyError:
log.warning("torrent_id: %s does not exist in the queue", torrent_id)
# Signals
def torrent_removed(self, torrent_id):
"""Emitted when a torrent has been removed from the core"""
log.debug("torrent_remove signal emitted")
self.signals.emit("torrent_removed", torrent_id)
def torrent_paused(self, torrent_id):
"""Emitted when a torrent is paused"""
log.debug("torrent_paused signal emitted")
self.signals.emit("torrent_paused", torrent_id)
def torrent_resumed(self, torrent_id):
"""Emitted when a torrent is resumed"""
log.debug("torrent_resumed signal emitted")
self.signals.emit("torrent_resumed", torrent_id)
def torrent_all_paused(self):
"""Emitted when all torrents have been paused"""
log.debug("torrent_all_paused signal emitted")
self.signals.emit("torrent_all_paused")
def torrent_all_resumed(self):
"""Emitted when all torrents have been resumed"""
log.debug("torrent_all_resumed signal emitted")
self.signals.emit("torrent_all_resumed")
def config_value_changed(self, key, value):
"""Emitted when a config value has changed"""
log.debug("config_value_changed signal emitted")
self.signals.emit("config_value_changed", key, value)
def _torrent_queue_changed(self):
"""Emitted when a torrent queue position is changed"""
log.debug("torrent_queue_changed signal emitted")
self.signals.emit("torrent_queue_changed")
# Config set functions
def _on_config_value_change(self, key, value):
self.config_value_changed(key, value)
def _on_set_torrentfiles_location(self, key, value):
if self.config["copy_torrent_file"]:
try:
os.makedirs(value)
except Exception, e:
log.debug("Unable to make directory: %s", e)
def _on_set_state_location(self, key, value):
if not os.access(value, os.F_OK):
try:
os.makedirs(value)
except Exception, e:
log.debug("Unable to make directory: %s", e)
def _on_set_listen_ports(self, key, value):
# Only set the listen ports if random_port is not true
if self.config["random_port"] is not True:
log.debug("listen port range set to %s-%s", value[0], value[1])
self.session.listen_on(value[0], value[1])
def _on_set_random_port(self, key, value):
log.debug("random port value set to %s", value)
# We need to check if the value has been changed to true and false
# and then handle accordingly.
if value:
import random
listen_ports = []
randrange = lambda: random.randrange(49152, 65525)
listen_ports.append(randrange())
listen_ports.append(listen_ports[0]+10)
else:
listen_ports = self.config["listen_ports"]
# Set the listen ports
log.debug("listen port range set to %s-%s", listen_ports[0],
listen_ports[1])
self.session.listen_on(listen_ports[0], listen_ports[1])
def _on_set_dht(self, key, value):
log.debug("dht value set to %s", value)
if value:
self.session.start_dht(None)
self.session.add_dht_router("router.bittorrent.com", 6881)
self.session.add_dht_router("router.utorrent.com", 6881)
self.session.add_dht_router("router.bitcomet.com", 6881)
else:
self.session.stop_dht()
def _on_set_upnp(self, key, value):
log.debug("upnp value set to %s", value)
if value:
self.session.start_upnp()
else:
self.session.stop_upnp()
def _on_set_natpmp(self, key, value):
log.debug("natpmp value set to %s", value)
if value:
self.session.start_natpmp()
else:
self.session.stop_natpmp()
def _on_set_lsd(self, key, value):
log.debug("lsd value set to %s", value)
if value:
self.session.start_lsd()
else:
self.session.stop_lsd()
def _on_set_utpex(self, key, value):
log.debug("utpex value set to %s", value)
if value:
self.session.add_extension(lt.create_ut_pex_plugin)
def _on_set_encryption(self, key, value):
log.debug("encryption value %s set to %s..", key, value)
pe_settings = lt.pe_settings()
pe_settings.out_enc_policy = \
lt.enc_policy(self.config["enc_out_policy"])
pe_settings.in_enc_policy = lt.enc_policy(self.config["enc_in_policy"])
pe_settings.allowed_enc_level = lt.enc_level(self.config["enc_level"])
pe_settings.prefer_rc4 = self.config["enc_prefer_rc4"]
self.session.set_pe_settings(pe_settings)
set = self.session.get_pe_settings()
log.debug("encryption settings:\n\t\t\tout_policy: %s\n\t\t\
in_policy: %s\n\t\t\tlevel: %s\n\t\t\tprefer_rc4: %s",
set.out_enc_policy,
set.in_enc_policy,
set.allowed_enc_level,
set.prefer_rc4)
def _on_set_max_connections_global(self, key, value):
log.debug("max_connections_global set to %s..", value)
# Add this in to overwrite bad float values in the config, to prevent
# future issues with 1.1
if type(value) is not int:
self.config[key] = int(value)
self.session.set_max_connections(int(value))
def _on_set_max_upload_speed(self, key, value):
log.debug("max_upload_speed set to %s..", value)
# We need to convert Kb/s to B/s
self.session.set_upload_rate_limit(int(value * 1024))
def _on_set_max_download_speed(self, key, value):
log.debug("max_download_speed set to %s..", value)
# We need to convert Kb/s to B/s
self.session.set_download_rate_limit(int(value * 1024))
def _on_set_max_upload_slots_global(self, key, value):
log.debug("max_upload_slots_global set to %s..", value)
self.session.set_max_uploads(value)
def _on_set_max_half_open_connections(self, key, value):
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)
def _on_ignore_limits_on_local_network(self, key, value):
self.settings.ignore_limits_on_local_network = value
self.session.set_settings(self.settings)
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)
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)
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)
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)
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)
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)
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)
def _on_send_info(self, key, value):
log.debug("Sending anonymous stats..")
"""sends anonymous stats home"""
class Send_Info_Thread(threading.Thread):
def __init__(self, config):
self.config = config
threading.Thread.__init__(self)
def run(self):
import time
now = time.time()
# check if we've done this within the last week or never
if (now - self.config["info_sent"]) >= (60 * 60 * 24 * 7):
import deluge.common
from urllib import quote_plus
from urllib2 import urlopen
import platform
try:
url = "http://deluge-torrent.org/stats_get.php?processor=" + \
platform.machine() + "&python=" + platform.python_version() \
+ "&deluge=" + deluge.common.get_version() \
+ "&os=" + platform.system() \
+ "&plugins=" + quote_plus(self.config["enabled_plugins"])
urlopen(url)
except IOError, e:
log.debug("Network error while trying to send info: %s", e)
else:
self.config["info_sent"] = now
if value:
Send_Info_Thread(self.config).start()
def get_new_release(self):
log.debug("get_new_release")
from urllib2 import urlopen
try:
self.new_release = urlopen(
"http://download.deluge-torrent.org/version").read().strip()
except Exception, e:
log.debug("Unable to get release info from website: %s", e)
return
self.check_new_release()
def check_new_release(self):
if self.new_release:
log.debug("new_release: %s", self.new_release)
if self.new_release > deluge.common.get_version():
self.signals.emit("new_version_available", self.new_release)
return self.new_release
return False
def _on_new_release_check(self, key, value):
if value:
log.debug("Checking for new release..")
threading.Thread(target=self.get_new_release).start()
if self.new_release_timer:
gobject.source_remove(self.new_release_timer)
# Set a timer to check for a new release every 3 days
self.new_release_timer = gobject.timeout_add(
72 * 60 * 60 * 1000, self._on_new_release_check, "new_release_check", True)
else:
if self.new_release_timer:
gobject.source.remove(self.new_release_timer)
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)

45
deluge/core/daemon.py Normal file
View File

@ -0,0 +1,45 @@
#
# daemon.py
#
# Copyright (C) 2007 Andrew Resch <andrewresch@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.
#
import deluge.configmanager
import deluge.common
from deluge.log import LOG as log
class Daemon:
def __init__(self, options, args):
version = deluge.common.get_version()
if deluge.common.get_revision() != "":
version = version + "r" + deluge.common.get_revision()
log.info("Deluge daemon %s", version)
log.debug("options: %s", options)
log.debug("args: %s", args)
# Set the config directory
deluge.configmanager.set_config_dir(options.config)
from deluge.core.core import Core
# Start the core as a thread and join it until it's done
self.core = Core(options.port).run()

View File

@ -0,0 +1,130 @@
#
# oldstateupgrader.py
#
# Copyright (C) 2008 Andrew Resch <andrewresch@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.
#
import os
import os.path
import pickle
import cPickle
import shutil
try:
import deluge.libtorrent as lt
except ImportError:
import libtorrent as lt
if not (libtorrent.version_major == 0 and libtorrent.version_minor == 14):
raise ImportError("This version of Deluge requires libtorrent 0.14!")
from deluge.configmanager import ConfigManager
import deluge.core.torrentmanager
from deluge.log import LOG as log
#start : http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/286203
def makeFakeClass(module, name):
class FakeThing(object):
pass
FakeThing.__name__ = name
FakeThing.__module__ = '(fake)' + module
return FakeThing
class PickleUpgrader(pickle.Unpickler):
def find_class(self, module, cname):
# Pickle tries to load a couple things like copy_reg and
# __builtin__.object even though a pickle file doesn't
# explicitly reference them (afaict): allow them to be loaded
# normally.
if module in ('copy_reg', '__builtin__'):
thing = pickle.Unpickler.find_class(self, module, cname)
return thing
return makeFakeClass(module, cname)
# end: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/286203
class OldStateUpgrader:
def __init__(self):
self.config = ConfigManager("core.conf")
self.state05_location = os.path.join(self.config["config_location"], "persistent.state")
self.state10_location = os.path.join(self.config["state_location"], "torrents.state")
if os.path.exists(self.state05_location) and not os.path.exists(self.state10_location):
# If the 0.5 state file exists and the 1.0 doesn't, then let's upgrade it
self.upgrade05()
def upgrade05(self):
try:
state = PickleUpgrader(open(self.state05_location, "rb")).load()
except Exception, e:
log.debug("Unable to open 0.5 state file: %s", e)
return
new_state = deluge.core.torrentmanager.TorrentManagerState()
for ti, uid in state.torrents.items():
torrent_path = os.path.join(self.config["config_location"], "torrentfiles", ti.filename)
try:
torrent_info = None
log.debug("Attempting to create torrent_info from %s", torrent_path)
_file = open(torrent_path, "rb")
torrent_info = lt.torrent_info(lt.bdecode(_file.read()))
_file.close()
except (IOError, RuntimeError), e:
log.warning("Unable to open %s: %s", filepath, e)
# Copy the torrent file to the new location
import shutil
shutil.copyfile(torrent_path, os.path.join(self.config["state_location"], str(torrent_info.info_hash()) + ".torrent"))
# Set the file prioritiy property if not already there
if not hasattr(ti, "priorities"):
ti.priorities = [1] * torrent_info.num_files()
# Create the new TorrentState object
new_torrent = deluge.core.torrentmanager.TorrentState(
torrent_id=str(torrent_info.info_hash()),
filename=ti.filename,
save_path=ti.save_dir,
compact=ti.compact,
paused=ti.user_paused,
total_uploaded=ti.uploaded_memory,
max_upload_speed=ti.upload_rate_limit,
max_download_speed=ti.download_rate_limit,
file_priorities=ti.priorities,
queue=state.queue.index(ti)
)
# Append the object to the state list
new_state.torrents.append(new_torrent)
# Now we need to write out the new state file
try:
log.debug("Saving torrent state file.")
state_file = open(
os.path.join(self.config["state_location"], "torrents.state"), "wb")
cPickle.dump(new_state, state_file)
state_file.close()
except IOError, e:
log.warning("Unable to save state file: %s", e)
return
# Rename the persistent.state file
try:
os.rename(self.state05_location, self.state05_location + ".old")
except Exception, e:
log.debug("Unable to rename old persistent.state file! %s", e)

View File

@ -0,0 +1,154 @@
#
# pluginmanager.py
#
# Copyright (C) 2007 Andrew Resch <andrewresch@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.
#
"""PluginManager for Core"""
import gobject
import deluge.pluginmanagerbase
import deluge.component as component
from deluge.log import LOG as log
class PluginManager(deluge.pluginmanagerbase.PluginManagerBase,
component.Component):
"""PluginManager handles the loading of plugins and provides plugins with
functions to access parts of the core."""
def __init__(self, core):
component.Component.__init__(self, "PluginManager")
self.core = core
# Set up the hooks dictionary
self.hooks = {
"post_torrent_add": [],
"post_torrent_remove": [],
"post_session_load": []
}
self.status_fields = {}
# Call the PluginManagerBase constructor
deluge.pluginmanagerbase.PluginManagerBase.__init__(
self, "core.conf", "deluge.plugin.core")
def start(self):
# Enable plugins that are enabled in the config
self.enable_plugins()
# Set update timer to call update() in plugins every second
self.update_timer = gobject.timeout_add(1000, self.update_plugins)
def stop(self):
# Disable all enabled plugins
self.disable_plugins()
# Stop the update timer
gobject.source_remove(self.update_timer)
def shutdown(self):
self.stop()
def update_plugins(self):
for plugin in self.plugins.keys():
try:
self.plugins[plugin].update()
except AttributeError:
# We don't care if this doesn't work
pass
def get_core(self):
"""Returns a reference to the core"""
return self.core
def register_status_field(self, field, function):
"""Register a new status field. This can be used in the same way the
client requests other status information from core."""
log.debug("Registering status field %s with PluginManager", field)
self.status_fields[field] = function
def deregister_status_field(self, field):
"""Deregisters a status field"""
log.debug("Deregistering status field %s with PluginManager", field)
try:
del self.status_fields[field]
except:
log.warning("Unable to deregister status field %s", field)
def get_status(self, torrent_id, fields):
"""Return the value of status fields for the selected torrent_id."""
status = {}
for field in fields:
try:
status[field] = self.status_fields[field](torrent_id)
except KeyError:
log.warning("Status field %s is not registered with the\
PluginManager.", field)
return status
def register_hook(self, hook, function):
"""Register a hook function with the plugin manager"""
try:
self.hooks[hook].append(function)
except KeyError:
log.warning("Plugin attempting to register invalid hook.")
def deregister_hook(self, hook, function):
"""Deregisters a hook function"""
try:
self.hooks[hook].remove(function)
except:
log.warning("Unable to deregister hook %s", hook)
def run_post_torrent_add(self, torrent_id):
"""This hook is run after a torrent has been added to the session."""
log.debug("run_post_torrent_add")
for function in self.hooks["post_torrent_add"]:
function(torrent_id)
def run_post_torrent_remove(self, torrent_id):
"""This hook is run after a torrent has been removed from the session.
"""
log.debug("run_post_torrent_remove")
for function in self.hooks["post_torrent_remove"]:
function(torrent_id)
def run_post_session_load(self):
"""This hook is run after all the torrents have been loaded into the
session from the saved state. It is called prior to resuming the
torrents and they all will have a 'Paused' state."""
log.debug("run_post_session_load")
for function in self.hooks["post_session_load"]:
function()
def get_torrent_list(self):
"""Returns a list of torrent_id's in the current session."""
return component.get("TorrentManager").get_torrent_list()
def block_ip_range(self, range):
"""Blocks the ip range in the core"""
return self.core.export_block_ip_range(range)
def reset_ip_filter(self):
"""Resets the ip filter"""
return self.core.export_reset_ip_filter()

View File

@ -0,0 +1,73 @@
#
# signalmanager.py
#
# Copyright (C) 2007, 2008 Andrew Resch <andrewresch@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.
#
import deluge.xmlrpclib as xmlrpclib
import socket
import gobject
import deluge.component as component
from deluge.log import LOG as log
class SignalManager(component.Component):
def __init__(self):
component.Component.__init__(self, "SignalManager")
self.clients = {}
def shutdown(self):
self.clients = {}
def deregister_client(self, address):
"""Deregisters a client"""
log.debug("Deregistering %s as a signal reciever..", address)
for client in self.clients.keys():
if client.split("//")[1].split(":")[0] == address:
del self.clients[client]
break
def register_client(self, address, port):
"""Registers a client to emit signals to."""
uri = "http://" + str(address) + ":" + str(port)
log.debug("Registering %s as a signal reciever..", uri)
self.clients[uri] = xmlrpclib.ServerProxy(uri)
def emit(self, signal, *data):
for uri in self.clients:
gobject.idle_add(self._emit, uri, signal, 1, *data)
def _emit(self, uri, signal, count, *data):
if uri not in self.clients:
return
client = self.clients[uri]
try:
client.emit_signal(signal, *data)
except (socket.error, Exception), e:
log.warning("Unable to emit signal to client %s: %s (%d)", client, e, count)
if count < 30:
gobject.timeout_add(1000, self._emit, uri, signal, count + 1, *data)
else:
log.info("Removing %s because it couldn't be reached..", uri)
del self.clients[uri]

616
deluge/core/torrent.py Normal file
View File

@ -0,0 +1,616 @@
#
# torrent.py
#
# Copyright (C) 2007, 2008 Andrew Resch <andrewresch@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.
#
"""Internal Torrent class"""
import os
try:
import deluge.libtorrent as lt
except ImportError:
import libtorrent as lt
if not (libtorrent.version_major == 0 and libtorrent.version_minor == 14):
raise ImportError("This version of Deluge requires libtorrent 0.14!")
import deluge.common
import deluge.component as component
from deluge.configmanager import ConfigManager
from deluge.log import LOG as log
import deluge.xmlrpclib
TORRENT_STATE = deluge.common.TORRENT_STATE
class Torrent:
"""Torrent holds information about torrents added to the libtorrent session.
"""
def __init__(self, handle, options, state=None, filename=None):
log.debug("Creating torrent object %s", str(handle.info_hash()))
# Get the core config
self.config = ConfigManager("core.conf")
self.signals = component.get("SignalManager")
# Set the libtorrent handle
self.handle = handle
# Set the torrent_id for this torrent
self.torrent_id = str(handle.info_hash())
# We store the filename just in case we need to make a copy of the torrentfile
self.filename = filename
# Holds status info so that we don't need to keep getting it from lt
self.status = self.handle.status()
self.torrent_info = self.handle.get_torrent_info()
# Files dictionary
self.files = self.get_files()
# Set the default file priorities to normal
self.file_priorities = [1]* len(self.files)
# Default total_uploaded to 0, this may be changed by the state
self.total_uploaded = 0
# Set default auto_managed value
self.auto_managed = options["auto_managed"]
if not handle.is_paused():
handle.auto_managed(self.auto_managed)
# We need to keep track if the torrent is finished in the state to prevent
# some weird things on state load.
self.is_finished = False
# Queueing options
self.stop_at_ratio = False
self.stop_ratio = 2.00
self.remove_at_ratio = False
# Load values from state if we have it
if state is not None:
# This is for saving the total uploaded between sessions
self.total_uploaded = state.total_uploaded
# Set the trackers
self.set_trackers(state.trackers)
# Set the filename
self.filename = state.filename
self.is_finished = state.is_finished
# Set the per-torrent queue options
self.set_stop_at_ratio(state.stop_at_ratio)
self.set_stop_ratio(state.stop_ratio)
self.set_remove_at_ratio(state.remove_at_ratio)
else:
# Tracker list
self.trackers = []
# Create a list of trackers
for value in self.handle.trackers():
tracker = {}
tracker["url"] = value.url
tracker["tier"] = value.tier
self.trackers.append(tracker)
# Set the allocation mode
self.compact = options["compact_allocation"]
# Various torrent options
self.set_max_connections(options["max_connections_per_torrent"])
self.set_max_upload_slots(options["max_upload_slots_per_torrent"])
self.set_max_upload_speed(options["max_upload_speed_per_torrent"])
self.set_max_download_speed(options["max_download_speed_per_torrent"])
self.set_prioritize_first_last(options["prioritize_first_last_pieces"])
self.handle.resolve_countries(True)
if options.has_key("file_priorities"):
self.set_file_priorities(options["file_priorities"])
# Where the torrent is being saved to
self.save_path = options["download_location"]
# Status message holds error info about the torrent
self.statusmsg = "OK"
# The torrents state
self.update_state()
# The tracker status
self.tracker_status = ""
log.debug("Torrent object created.")
def set_tracker_status(self, status):
"""Sets the tracker status"""
self.tracker_status = status
def set_max_connections(self, max_connections):
self.max_connections = int(max_connections)
self.handle.set_max_connections(self.max_connections)
def set_max_upload_slots(self, max_slots):
self.max_upload_slots = int(max_slots)
self.handle.set_max_uploads(self.max_upload_slots)
def set_max_upload_speed(self, m_up_speed):
self.max_upload_speed = m_up_speed
self.handle.set_upload_limit(int(m_up_speed * 1024))
def set_max_download_speed(self, m_down_speed):
self.max_download_speed = m_down_speed
self.handle.set_download_limit(int(m_down_speed * 1024))
def set_prioritize_first_last(self, prioritize):
self.prioritize_first_last = prioritize
if self.prioritize_first_last:
if self.handle.get_torrent_info().num_files() == 1:
# We only do this if one file is in the torrent
priorities = [1] * self.handle.get_torrent_info().num_pieces()
priorities[0] = 7
priorities[-1] = 7
self.handle.prioritize_pieces(priorities)
def set_save_path(self, save_path):
self.save_path = save_path
def set_auto_managed(self, auto_managed):
self.auto_managed = auto_managed
self.handle.auto_managed(auto_managed)
self.update_state()
def set_stop_ratio(self, stop_ratio):
self.stop_ratio = stop_ratio
def set_stop_at_ratio(self, stop_at_ratio):
self.stop_at_ratio = stop_at_ratio
def set_remove_at_ratio(self, remove_at_ratio):
self.remove_at_ratio = remove_at_ratio
def set_file_priorities(self, file_priorities):
if len(file_priorities) != len(self.files):
log.debug("file_priorities len != num_files")
self.options["file_priorities"] = self.handle.file_priorities()
return
if self.compact:
log.debug("setting file priority with compact allocation does not work!")
self.file_priorities = self.handle.file_priorities()
return
log.debug("setting %s's file priorities: %s", self.torrent_id, file_priorities)
self.handle.prioritize_files(file_priorities)
if 0 in self.file_priorities:
# We have previously marked a file 'Do Not Download'
# Check to see if we have changed any 0's to >0 and change state accordingly
for index, priority in enumerate(self.file_priorities):
if priority == 0 and file_priorities[index] > 0:
# We have a changed 'Do Not Download' to a download priority
self.is_finished = False
self.update_state()
break
self.file_priorities = file_priorities
# Set the first/last priorities if needed
self.set_prioritize_first_last(self.prioritize_first_last)
def set_trackers(self, trackers):
"""Sets trackers"""
if trackers == None:
trackers = []
for value in self.handle.trackers():
tracker = {}
tracker["url"] = value.url
tracker["tier"] = value.tier
trackers.append(tracker)
self.trackers = trackers
return
log.debug("Setting trackers for %s: %s", self.torrent_id, trackers)
tracker_list = []
for tracker in trackers:
new_entry = lt.announce_entry(tracker["url"])
new_entry.tier = tracker["tier"]
tracker_list.append(new_entry)
self.handle.replace_trackers(tracker_list)
# Print out the trackers
for t in self.handle.trackers():
log.debug("tier: %s tracker: %s", t.tier, t.url)
# Set the tracker list in the torrent object
self.trackers = trackers
if len(trackers) > 0:
# Force a reannounce if there is at least 1 tracker
self.force_reannounce()
def update_state(self):
"""Updates the state based on what libtorrent's state for the torrent is"""
# Set the initial state based on the lt state
LTSTATE = deluge.common.LT_TORRENT_STATE
ltstate = int(self.handle.status().state)
log.debug("set_state_based_on_ltstate: %s", ltstate)
if ltstate == LTSTATE["Queued"] or ltstate == LTSTATE["Checking"]:
self.state = "Checking"
return
elif ltstate == LTSTATE["Downloading"] or ltstate == LTSTATE["Downloading Metadata"]:
self.state = "Downloading"
elif ltstate == LTSTATE["Finished"] or ltstate == LTSTATE["Seeding"]:
self.state = "Seeding"
elif ltstate == LTSTATE["Allocating"]:
self.state = "Allocating"
if self.handle.is_paused() and len(self.handle.status().error) > 0:
# This is an error'd torrent
self.state = "Error"
self.set_status_message(self.handle.status().error)
self.handle.auto_managed(False)
elif self.handle.is_paused() and self.handle.is_auto_managed():
self.state = "Queued"
elif self.handle.is_paused() and not self.handle.is_auto_managed():
self.state = "Paused"
def set_state(self, state):
"""Accepts state strings, ie, "Paused", "Seeding", etc."""
if state not in TORRENT_STATE:
log.debug("Trying to set an invalid state %s", state)
return
self.state = state
return
def set_status_message(self, message):
self.statusmsg = message
def get_eta(self):
"""Returns the ETA in seconds for this torrent"""
if self.status == None:
status = self.handle.status()
else:
status = self.status
left = status.total_wanted - status.total_done
if left <= 0 or status.download_payload_rate == 0:
return 0
try:
eta = left / status.download_payload_rate
except ZeroDivisionError:
eta = 0
return eta
def get_ratio(self):
"""Returns the ratio for this torrent"""
if self.status == None:
status = self.handle.status()
else:
status = self.status
# Return -1.0 if the downloaded bytes is 0, this is to represent infinity
if status.all_time_download == 0:
return -1.0
return float(status.all_time_upload) / float(status.all_time_download)
def get_files(self):
"""Returns a list of files this torrent contains"""
if self.torrent_info == None:
torrent_info = self.handle.get_torrent_info()
else:
torrent_info = self.torrent_info
ret = []
files = torrent_info.files()
for index, file in enumerate(files):
ret.append({
'index': index,
'path': file.path.decode("utf8", "ignore"),
'size': file.size,
'offset': file.offset
})
return ret
def get_peers(self):
"""Returns a list of peers and various information about them"""
ret = []
peers = self.handle.get_peer_info()
for peer in peers:
# We do not want to report peers that are half-connected
if peer.flags & peer.connecting or peer.flags & peer.handshake:
continue
try:
client = str(peer.client).decode("utf-8")
except UnicodeDecodeError:
client = str(peer.client).decode("latin-1")
# Make country a proper string
country = str()
for c in peer.country:
if not c.isalpha():
country += " "
else:
country += c
ret.append({
"ip": "%s:%s" % (peer.ip[0], peer.ip[1]),
"up_speed": peer.up_speed,
"down_speed": peer.down_speed,
"country": country,
"client": client,
"seed": peer.flags & peer.seed
})
return ret
def get_queue_position(self):
"""Returns the torrents queue position"""
return self.handle.queue_position()
def get_file_progress(self):
"""Returns the file progress as a list of floats.. 0.0 -> 1.0"""
file_progress = self.handle.file_progress()
ret = []
for i,f in enumerate(self.files):
try:
ret.append(float(file_progress[i]) / float(f["size"]))
except ZeroDivisionError:
ret.append(0.0)
return ret
def get_status(self, keys):
"""Returns the status of the torrent based on the keys provided"""
# Create the full dictionary
self.status = self.handle.status()
self.torrent_info = self.handle.get_torrent_info()
# Adjust progress to be 0-100 value
progress = self.status.progress * 100
# Adjust status.distributed_copies to return a non-negative value
distributed_copies = self.status.distributed_copies
if distributed_copies < 0:
distributed_copies = 0.0
full_status = {
"distributed_copies": distributed_copies,
"total_done": self.status.total_done,
"total_uploaded": self.status.all_time_upload,
"all_time_download": self.status.all_time_download,
"state": self.state,
"paused": self.status.paused,
"progress": progress,
"next_announce": self.status.next_announce.seconds,
"total_payload_download": self.status.total_payload_download,
"total_payload_upload": self.status.total_payload_upload,
"download_payload_rate": self.status.download_payload_rate,
"upload_payload_rate": self.status.upload_payload_rate,
"num_peers": self.status.num_peers - self.status.num_seeds,
"num_seeds": self.status.num_seeds,
"total_peers": self.status.num_incomplete,
"total_seeds": self.status.num_complete,
"total_wanted": self.status.total_wanted,
"tracker": self.status.current_tracker,
"trackers": self.trackers,
"tracker_status": self.tracker_status,
"save_path": self.save_path,
"files": self.files,
"file_priorities": self.file_priorities,
"compact": self.compact,
"max_connections": self.max_connections,
"max_upload_slots": self.max_upload_slots,
"max_upload_speed": self.max_upload_speed,
"max_download_speed": self.max_download_speed,
"prioritize_first_last": self.prioritize_first_last,
"message": self.statusmsg,
"hash": self.torrent_id,
"active_time": self.status.active_time,
"seeding_time": self.status.seeding_time,
"seed_rank": self.status.seed_rank,
"is_auto_managed": self.auto_managed,
"stop_ratio": self.stop_ratio,
"stop_at_ratio": self.stop_at_ratio,
"remove_at_ratio": self.remove_at_ratio
}
def ti_name():
if self.handle.has_metadata():
try:
return self.torrent_info.name().decode("utf8", "ignore")
except UnicodeDecodeError:
return self.torrent_info.name()
return self.torrent_id
fns = {
"name": ti_name,
"private": self.torrent_info.priv,
"total_size": self.torrent_info.total_size,
"num_files": self.torrent_info.num_files,
"num_pieces": self.torrent_info.num_pieces,
"piece_length": self.torrent_info.piece_length,
"eta": self.get_eta,
"ratio": self.get_ratio,
"file_progress": self.get_file_progress,
"queue": self.handle.queue_position,
"is_seed": self.handle.is_seed,
"peers": self.get_peers,
}
# Create the desired status dictionary and return it
status_dict = {}
if len(keys) == 0:
status_dict = full_status
for key in fns:
status_dict[key] = fns[key]()
else:
for key in keys:
if key in full_status:
status_dict[key] = full_status[key]
elif key in fns:
status_dict[key] = fns[key]()
self.status = None
self.torrent_info = None
return status_dict
def apply_options(self):
"""Applies the per-torrent options that are set."""
self.handle.set_max_connections(self.max_connections)
self.handle.set_max_uploads(self.max_upload_slots)
self.handle.set_upload_limit(int(self.max_upload_speed * 1024))
self.handle.set_download_limit(int(self.max_download_speed * 1024))
self.handle.prioritize_files(self.file_priorities)
self.handle.resolve_countries(True)
def pause(self):
"""Pause this torrent"""
# Turn off auto-management so the torrent will not be unpaused by lt queueing
self.handle.auto_managed(False)
if self.handle.is_paused():
# This torrent was probably paused due to being auto managed by lt
# Since we turned auto_managed off, we should update the state which should
# show it as 'Paused'. We need to emit a torrent_paused signal because
# the torrent_paused alert from libtorrent will not be generated.
self.update_state()
self.signals.emit("torrent_paused", self.torrent_id)
else:
try:
self.handle.pause()
except Exception, e:
log.debug("Unable to pause torrent: %s", e)
return False
return True
def resume(self):
"""Resumes this torrent"""
if self.handle.is_paused() and self.handle.is_auto_managed():
log.debug("Torrent is being auto-managed, cannot resume!")
return
else:
# Reset the status message just in case of resuming an Error'd torrent
self.set_status_message("OK")
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.stop_at_ratio:
if self.stop_at_ratio:
ratio = self.stop_ratio
else:
ratio = self.config["stop_seed_ratio"]
if self.get_ratio() >= ratio:
self.signals.emit("torrent_resume_at_stop_ratio")
return
if self.auto_managed:
# This torrent is to be auto-managed by lt queueing
self.handle.auto_managed(True)
try:
self.handle.resume()
except:
pass
return True
def move_storage(self, dest):
"""Move a torrent's storage location"""
try:
self.handle.move_storage(dest.encode("utf8"))
except:
return False
return True
def write_fastresume(self):
"""Writes the .fastresume file for the torrent"""
resume_data = lt.bencode(self.handle.write_resume_data())
path = "%s/%s.fastresume" % (
self.config["state_location"],
self.torrent_id)
log.debug("Saving fastresume file: %s", path)
try:
self.delete_fastresume()
fastresume = open(path, "wb")
fastresume.write(resume_data)
fastresume.close()
except IOError:
log.warning("Error trying to save fastresume file")
def delete_fastresume(self):
"""Deletes the .fastresume file"""
path = "%s/%s.fastresume" % (
self.config["state_location"],
self.torrent_id)
log.debug("Deleting fastresume file: %s", path)
try:
os.remove(path)
except Exception, e:
log.warning("Unable to delete the fastresume file: %s", e)
def delete_torrentfile(self):
"""Deletes the .torrent file in the state"""
path = "%s/%s.torrent" % (
self.config["state_location"],
self.torrent_id)
log.debug("Deleting torrent file: %s", path)
try:
os.remove(path)
except Exception, e:
log.warning("Unable to delete the torrent file: %s", e)
def force_reannounce(self):
"""Force a tracker reannounce"""
try:
self.handle.force_reannounce()
except Exception, e:
log.debug("Unable to force reannounce: %s", e)
return False
return True
def scrape_tracker(self):
"""Scrape the tracker"""
try:
self.handle.scrape_tracker()
except Exception, e:
log.debug("Unable to scrape tracker: %s", e)
return False
return True
def force_recheck(self):
"""Forces a recheck of the torrents pieces"""
try:
self.handle.force_recheck()
except Exception, e:
log.debug("Unable to force recheck: %s", e)
return False
return True

View File

@ -0,0 +1,749 @@
#
# torrentmanager.py
#
# Copyright (C) 2007, 2008 Andrew Resch <andrewresch@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.
#
"""TorrentManager handles Torrent objects"""
import cPickle
import os.path
import os
import time
import gobject
try:
import deluge.libtorrent as lt
except ImportError:
import libtorrent as lt
if not (libtorrent.version_major == 0 and libtorrent.version_minor == 14):
raise ImportError("This version of Deluge requires libtorrent 0.14!")
import deluge.common
import deluge.component as component
from deluge.configmanager import ConfigManager
from deluge.core.torrent import Torrent
import deluge.core.oldstateupgrader
from deluge.log import LOG as log
class TorrentState:
def __init__(self,
torrent_id=None,
filename=None,
total_uploaded=0,
trackers=None,
compact=False,
paused=False,
save_path=None,
max_connections=-1,
max_upload_slots=-1,
max_upload_speed=-1.0,
max_download_speed=-1.0,
prioritize_first_last=False,
file_priorities=None,
queue=None,
auto_managed=True,
is_finished=False,
stop_ratio=2.00,
stop_at_ratio=False,
remove_at_ratio=False
):
self.torrent_id = torrent_id
self.filename = filename
self.total_uploaded = total_uploaded
self.trackers = trackers
self.queue = queue
self.is_finished = is_finished
# Options
self.compact = compact
self.paused = paused
self.save_path = save_path
self.max_connections = max_connections
self.max_upload_slots = max_upload_slots
self.max_upload_speed = max_upload_speed
self.max_download_speed = max_download_speed
self.prioritize_first_last = prioritize_first_last
self.file_priorities = file_priorities
self.auto_managed = auto_managed
self.stop_ratio = stop_ratio
self.stop_at_ratio = stop_at_ratio
self.remove_at_ratio = remove_at_ratio
class TorrentManagerState:
def __init__(self):
self.torrents = []
class TorrentManager(component.Component):
"""TorrentManager contains a list of torrents in the current libtorrent
session. This object is also responsible for saving the state of the
session for use on restart."""
def __init__(self, session, alerts):
component.Component.__init__(self, "TorrentManager", interval=5000, depend=["PluginManager"])
log.debug("TorrentManager init..")
# Set the libtorrent session
self.session = session
# Set the alertmanager
self.alerts = alerts
# Get the core config
self.config = ConfigManager("core.conf")
# Create the torrents dict { torrent_id: Torrent }
self.torrents = {}
# 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
# and that their resume data has been written.
self.shutdown_torrent_pause_list = []
# Register set functions
self.config.register_set_function("max_connections_per_torrent",
self.on_set_max_connections_per_torrent)
self.config.register_set_function("max_upload_slots_per_torrent",
self.on_set_max_upload_slots_per_torrent)
self.config.register_set_function("max_upload_speed_per_torrent",
self.on_set_max_upload_speed_per_torrent)
self.config.register_set_function("max_download_speed_per_torrent",
self.on_set_max_download_speed_per_torrent)
# Register alert functions
self.alerts.register_handler("torrent_finished_alert",
self.on_alert_torrent_finished)
self.alerts.register_handler("torrent_paused_alert",
self.on_alert_torrent_paused)
self.alerts.register_handler("torrent_checked_alert",
self.on_alert_torrent_checked)
self.alerts.register_handler("tracker_reply_alert",
self.on_alert_tracker_reply)
self.alerts.register_handler("tracker_announce_alert",
self.on_alert_tracker_announce)
self.alerts.register_handler("tracker_alert", self.on_alert_tracker)
self.alerts.register_handler("tracker_warning_alert",
self.on_alert_tracker_warning)
self.alerts.register_handler("tracker_error_alert",
self.on_alert_tracker_error)
self.alerts.register_handler("storage_moved_alert",
self.on_alert_storage_moved)
self.alerts.register_handler("torrent_resumed_alert",
self.on_alert_torrent_resumed)
self.alerts.register_handler("state_changed_alert",
self.on_alert_state_changed)
def start(self):
# Get the pluginmanager reference
self.plugins = component.get("PluginManager")
self.signals = component.get("SignalManager")
# Run the old state upgrader before loading state
deluge.core.oldstateupgrader.OldStateUpgrader()
# Try to load the state from file
self.load_state()
# Save the state every 5 minutes
self.save_state_timer = gobject.timeout_add(300000, self.save_state)
self.save_resume_data_timer = gobject.timeout_add(290000, self.save_resume_data)
def stop(self):
# Save state on shutdown
self.save_state()
component.pause("AlertManager")
for key in self.torrents.keys():
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)
self.torrents[key].handle.pause()
self.shutdown_torrent_pause_list.append(key)
while self.shutdown_torrent_pause_list:
time.sleep(0.1)
# Wait for all alerts
self.alerts.handle_alerts(True)
def update(self):
for torrent_id, torrent in self.torrents.items():
if self.config["stop_seed_at_ratio"] or torrent.stop_at_ratio:
stop_ratio = self.config["stop_seed_ratio"]
if torrent.stop_at_ratio:
stop_ratio = torrent.stop_ratio
if torrent.get_ratio() >= stop_ratio and torrent.is_finished:
if self.config["remove_seed_at_ratio"] or torrent.remove_at_ratio:
self.remove(torrent_id)
break
if not torrent.handle.is_paused():
torrent.pause()
def __getitem__(self, torrent_id):
"""Return the Torrent with torrent_id"""
return self.torrents[torrent_id]
def get_torrent_list(self):
"""Returns a list of torrent_ids"""
return self.torrents.keys()
def get_torrent_info_from_file(self, filepath):
"""Returns a torrent_info for the file specified or None"""
torrent_info = None
# Get the torrent data from the torrent file
try:
log.debug("Attempting to create torrent_info from %s", filepath)
_file = open(filepath, "rb")
torrent_info = lt.torrent_info(lt.bdecode(_file.read()))
_file.close()
except (IOError, RuntimeError), e:
log.warning("Unable to open %s: %s", filepath, e)
return torrent_info
def get_resume_data_from_file(self, torrent_id):
"""Returns an entry with the resume data or None"""
fastresume = ""
try:
_file = open(
os.path.join(
self.config["state_location"],
torrent_id + ".fastresume"),
"rb")
fastresume = _file.read()
_file.close()
except IOError, e:
log.debug("Unable to load .fastresume: %s", e)
return str(fastresume)
def add(self, torrent_info=None, state=None, options=None, save_state=True,
filedump=None, filename=None):
"""Add a torrent to the manager and returns it's torrent_id"""
if torrent_info is None and state is None and filedump is None:
log.debug("You must specify a valid torrent_info or a torrent state object!")
return
log.debug("torrentmanager.add")
add_torrent_params = {}
if filedump is not None:
try:
torrent_info = lt.torrent_info(lt.bdecode(filedump))
except Exception, e:
log.error("Unable to decode torrent file!: %s", e)
if torrent_info is None:
# We have no torrent_info so we need to add the torrent with information
# from the state object.
# Populate the options dict from state
options = {}
options["max_connections_per_torrent"] = state.max_connections
options["max_upload_slots_per_torrent"] = state.max_upload_slots
options["max_upload_speed_per_torrent"] = state.max_upload_speed
options["max_download_speed_per_torrent"] = state.max_download_speed
options["prioritize_first_last_pieces"] = state.prioritize_first_last
options["file_priorities"] = state.file_priorities
options["compact_allocation"] = state.compact
options["download_location"] = state.save_path
options["auto_managed"] = state.auto_managed
options["add_paused"] = state.paused
add_torrent_params["ti"] =\
self.get_torrent_info_from_file(
os.path.join(self.config["state_location"], state.torrent_id + ".torrent"))
if not add_torrent_params["ti"]:
log.error("Unable to add torrent!")
return
add_torrent_params["resume_data"] = self.get_resume_data_from_file(state.torrent_id)
else:
# We have a torrent_info object so we're not loading from state.
# Check if options is None and load defaults
options_keys = [
"compact_allocation",
"max_connections_per_torrent",
"max_upload_slots_per_torrent",
"max_upload_speed_per_torrent",
"max_download_speed_per_torrent",
"prioritize_first_last_pieces",
"download_location",
"add_paused",
"auto_managed"
]
if options == None:
options = {}
for key in options_keys:
options[key] = self.config[key]
else:
for key in options_keys:
if not options.has_key(key):
options[key] = self.config[key]
add_torrent_params["ti"] = torrent_info
add_torrent_params["resume_data"] = ""
#log.info("Adding torrent: %s", filename)
log.debug("options: %s", options)
# Set the right storage_mode
if options["compact_allocation"]:
storage_mode = lt.storage_mode_t(2)
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["storage_mode"] = storage_mode
add_torrent_params["paused"] = True
add_torrent_params["auto_managed"] = False
add_torrent_params["duplicate_is_error"] = True
# We need to pause the AlertManager momentarily to prevent alerts
# for this torrent being generated before a Torrent object is created.
component.pause("AlertManager")
handle = None
try:
handle = self.session.add_torrent(add_torrent_params)
except RuntimeError, e:
log.warning("Error adding torrent: %s", e)
if not handle or not handle.is_valid():
log.debug("torrent handle is invalid!")
# The torrent was not added to the session
component.resume("AlertManager")
return
log.debug("handle id: %s", str(handle.info_hash()))
# Create a Torrent object
torrent = Torrent(handle, options, state, filename)
# Add the torrent object to the dictionary
self.torrents[torrent.torrent_id] = torrent
if self.config["queue_new_to_top"]:
handle.queue_position_top()
component.resume("AlertManager")
# Resume the torrent if needed
if not options["add_paused"]:
handle.resume()
handle.auto_managed(options["auto_managed"])
# Write the .torrent file to the state directory
if filedump:
try:
save_file = open(os.path.join(self.config["state_location"],
torrent.torrent_id + ".torrent"),
"wb")
save_file.write(filedump)
save_file.close()
except IOError, e:
log.warning("Unable to save torrent file: %s", e)
# If the user has requested a copy of the torrent be saved elsewhere
# we need to do that.
if self.config["copy_torrent_file"] and filename is not None:
try:
save_file = open(
os.path.join(self.config["torrentfiles_location"], filename),
"wb")
save_file.write(filedump)
save_file.close()
except IOError, e:
log.warning("Unable to save torrent file: %s", e)
if save_state:
# Save the session state
self.save_state()
# Emit the torrent_added signal
self.signals.emit("torrent_added", torrent.torrent_id)
return torrent.torrent_id
def load_torrent(self, torrent_id):
"""Load a torrent file from state and return it's torrent info"""
filedump = None
# Get the torrent data from the torrent file
try:
log.debug("Attempting to open %s for add.", torrent_id)
_file = open(
os.path.join(
self.config["state_location"], torrent_id + ".torrent"),
"rb")
filedump = lt.bdecode(_file.read())
_file.close()
except (IOError, RuntimeError), e:
log.warning("Unable to open %s: %s", torrent_id, e)
return False
return filedump
def remove(self, torrent_id, remove_torrent=False, remove_data=False):
"""Remove a torrent from the manager"""
try:
# Remove from libtorrent session
option = 0
# Remove data if set
if remove_data:
option = 1
self.session.remove_torrent(self.torrents[torrent_id].handle,
option)
except (RuntimeError, KeyError), e:
log.warning("Error removing torrent: %s", e)
return False
# Remove the .torrent file if requested
if remove_torrent:
try:
torrent_file = os.path.join(
self.config["torrentfiles_location"],
self.torrents[torrent_id].filename)
os.remove(torrent_file)
except Exception, e:
log.warning("Unable to remove .torrent file: %s", e)
# Remove the .fastresume if it exists
self.torrents[torrent_id].delete_fastresume()
# Remove the .torrent file in the state
self.torrents[torrent_id].delete_torrentfile()
# Remove the torrent from deluge's session
try:
del self.torrents[torrent_id]
except KeyError, ValueError:
return False
# Save the session state
self.save_state()
# Emit the signal to the clients
self.signals.emit("torrent_removed", torrent_id)
return True
def pause_all(self):
"""Pauses all torrents.. Returns a list of torrents paused."""
torrent_was_paused = False
for key in self.torrents.keys():
try:
self.torrents[key].pause()
torrent_was_paused = True
except:
log.warning("Unable to pause torrent %s", key)
return torrent_was_paused
def resume_all(self):
"""Resumes all torrents.. Returns True if at least 1 torrent is resumed"""
torrent_was_resumed = False
for key in self.torrents.keys():
if self.torrents[key].resume():
torrent_was_resumed = True
else:
log.warning("Unable to resume torrent %s", key)
return torrent_was_resumed
def load_state(self):
"""Load the state of the TorrentManager from the torrents.state file"""
state = TorrentManagerState()
try:
log.debug("Opening torrent state file for load.")
state_file = open(
os.path.join(self.config["state_location"], "torrents.state"), "rb")
state = cPickle.load(state_file)
state_file.close()
except (EOFError, IOError, Exception), e:
log.warning("Unable to load state file: %s", e)
# Try to use an old state
try:
if dir(state.torrents[0]) != dir(TorrentState()):
for attr in (set(dir(TorrentState())) - set(dir(state.torrents[0]))):
for s in state.torrents:
setattr(s, attr, getattr(TorrentState(), attr, None))
except Exception, e:
log.warning("Unable to update state file to a compatible version: %s", e)
# Reorder the state.torrents list to add torrents in the correct queue
# order.
ordered_state = []
for torrent_state in state.torrents:
for t in ordered_state:
if torrent_state.queue < t.queue:
ordered_state.insert(ordered_state.index(t), torrent_state)
break
if torrent_state not in ordered_state:
ordered_state.append(torrent_state)
for torrent_state in ordered_state:
try:
self.add(state=torrent_state, save_state=False)
except AttributeError, e:
log.error("Torrent state file is either corrupt or incompatible!")
break
# Run the post_session_load plugin hooks
self.plugins.run_post_session_load()
def save_state(self):
"""Save the state of the TorrentManager to the torrents.state file"""
state = TorrentManagerState()
# Create the state for each Torrent and append to the list
for torrent in self.torrents.values():
paused = False
if torrent.state == "Paused":
paused = True
torrent_state = TorrentState(
torrent.torrent_id,
torrent.filename,
torrent.get_status(["total_uploaded"])["total_uploaded"],
torrent.trackers,
torrent.compact,
paused,
torrent.save_path,
torrent.max_connections,
torrent.max_upload_slots,
torrent.max_upload_speed,
torrent.max_download_speed,
torrent.prioritize_first_last,
torrent.file_priorities,
torrent.get_queue_position(),
torrent.auto_managed,
torrent.is_finished,
torrent.stop_ratio,
torrent.stop_at_ratio,
torrent.remove_at_ratio
)
state.torrents.append(torrent_state)
# Pickle the TorrentManagerState object
try:
log.debug("Saving torrent state file.")
state_file = open(
os.path.join(self.config["state_location"], "torrents.state"),
"wb")
cPickle.dump(state, state_file)
state_file.close()
except IOError:
log.warning("Unable to save state file.")
# We return True so that the timer thread will continue
return True
def save_resume_data(self):
"""Saves resume data for all the torrents"""
for torrent in self.torrents.values():
torrent.write_fastresume()
def queue_top(self, torrent_id):
"""Queue torrent to top"""
if self.torrents[torrent_id].get_queue_position() == 0:
return False
self.torrents[torrent_id].handle.queue_position_top()
return True
def queue_up(self, torrent_id):
"""Queue torrent up one position"""
if self.torrents[torrent_id].get_queue_position() == 0:
return False
self.torrents[torrent_id].handle.queue_position_up()
return True
def queue_down(self, torrent_id):
"""Queue torrent down one position"""
if self.torrents[torrent_id].get_queue_position() == (len(self.torrents) - 1):
return False
self.torrents[torrent_id].handle.queue_position_down()
return True
def queue_bottom(self, torrent_id):
"""Queue torrent to bottom"""
if self.torrents[torrent_id].get_queue_position() == (len(self.torrents) - 1):
return False
self.torrents[torrent_id].handle.queue_position_bottom()
return True
def on_set_max_connections_per_torrent(self, key, value):
"""Sets the per-torrent connection limit"""
log.debug("max_connections_per_torrent set to %s..", value)
for key in self.torrents.keys():
self.torrents[key].set_max_connections(value)
def on_set_max_upload_slots_per_torrent(self, key, value):
"""Sets the per-torrent upload slot limit"""
log.debug("max_upload_slots_per_torrent set to %s..", value)
for key in self.torrents.keys():
self.torrents[key].set_max_upload_slots(value)
def on_set_max_upload_speed_per_torrent(self, key, value):
log.debug("max_upload_speed_per_torrent set to %s..", value)
for key in self.torrents.keys():
self.torrents[key].set_max_upload_speed(value)
def on_set_max_download_speed_per_torrent(self, key, value):
log.debug("max_download_speed_per_torrent set to %s..", value)
for key in self.torrents.keys():
self.torrents[key].set_max_download_speed(value)
## Alert handlers ##
def on_alert_torrent_finished(self, alert):
log.debug("on_alert_torrent_finished")
# Get the torrent_id
torrent_id = str(alert.handle.info_hash())
torrent = self.torrents[torrent_id]
log.debug("%s is finished..", torrent_id)
# Move completed download to completed folder if needed
if self.config["move_completed"] and not torrent.is_finished:
if torrent.save_path != self.config["move_completed_path"]:
torrent.move_storage(self.config["move_completed_path"])
torrent.is_finished = True
torrent.update_state()
torrent.write_fastresume()
component.get("SignalManager").emit("torrent_finished", torrent_id)
def on_alert_torrent_paused(self, alert):
log.debug("on_alert_torrent_paused")
# Get the torrent_id
torrent_id = str(alert.handle.info_hash())
# Set the torrent state
self.torrents[torrent_id].update_state()
component.get("SignalManager").emit("torrent_paused", torrent_id)
# Write the fastresume file
self.torrents[torrent_id].write_fastresume()
if torrent_id in self.shutdown_torrent_pause_list:
self.shutdown_torrent_pause_list.remove(torrent_id)
def on_alert_torrent_checked(self, alert):
log.debug("on_alert_torrent_checked")
# Get the torrent_id
torrent_id = str(alert.handle.info_hash())
# Set the torrent state
self.torrents[torrent_id].update_state()
def on_alert_tracker_reply(self, alert):
log.debug("on_alert_tracker_reply")
# Get the torrent_id
torrent_id = str(alert.handle.info_hash())
# Set the tracker status for the torrent
try:
if alert.message != "Got peers from DHT":
self.torrents[torrent_id].set_tracker_status(_("Announce OK"))
except KeyError:
log.debug("torrent_id doesn't exist.")
# Check to see if we got any peer information from the tracker
if alert.handle.status().num_complete == -1 or \
alert.handle.status().num_incomplete == -1:
# We didn't get peer information, so lets send a scrape request
self.torrents[torrent_id].scrape_tracker()
def on_alert_tracker_announce(self, alert):
log.debug("on_alert_tracker_announce")
# Get the torrent_id
try:
torrent_id = str(alert.handle.info_hash())
except RuntimeError:
log.debug("Invalid torrent handle.")
return
# Set the tracker status for the torrent
try:
self.torrents[torrent_id].set_tracker_status(_("Announce Sent"))
except KeyError:
log.debug("torrent_id doesn't exist.")
def on_alert_tracker(self, alert):
log.debug("on_alert_tracker")
# Get the torrent_id
torrent_id = str(alert.handle.info_hash())
tracker_status = "%s: %s" % \
(_("Alert"), str(alert.message()).strip('"')[8:])
# Set the tracker status for the torrent
try:
self.torrents[torrent_id].set_tracker_status(tracker_status)
except KeyError:
log.debug("torrent_id doesn't exist.")
def on_alert_tracker_warning(self, alert):
log.debug("on_alert_tracker_warning")
# Get the torrent_id
torrent_id = str(alert.handle.info_hash())
tracker_status = '%s: %s' % (_("Warning"), str(alert.message()))
# Set the tracker status for the torrent
try:
self.torrents[torrent_id].set_tracker_status(tracker_status)
except KeyError:
log.debug("torrent_id doesn't exist.")
def on_alert_tracker_error(self, alert):
log.debug("on_alert_tracker_error")
torrent = self.torrents[str(alert.handle.info_hash())]
tracker_status = "%s: %s" % (_("Error"), alert.msg)
try:
torrent.set_tracker_status(tracker_status)
except KeyError:
log.debug("torrent_id doesn't exist.")
def on_alert_storage_moved(self, alert):
log.debug("on_alert_storage_moved")
log.debug("save_path: %s", alert.handle.save_path())
# Get the torrent_id
torrent_id = str(alert.handle.info_hash())
try:
log.debug("save_path2: %s", self.torrents[torrent_id].handle.save_path())
self.torrents[torrent_id].set_save_path(alert.handle.save_path())
except KeyError:
log.debug("torrent_id doesn't exist.")
def on_alert_torrent_resumed(self, alert):
log.debug("on_alert_torrent_resumed")
torrent = self.torrents[str(alert.handle.info_hash())]
torrent.is_finished = torrent.handle.is_seed()
torrent.update_state()
def on_alert_state_changed(self, alert):
log.debug("on_alert_state_changed")
torrent_id = str(alert.handle.info_hash())
self.torrents[torrent_id].update_state()
component.get("SignalManager").emit("torrent_state_changed", torrent_id)

View File

@ -0,0 +1,39 @@
There are two licenses, one for the C library software, and one for
the database.
SOFTWARE LICENSE (C library)
The GeoIP C Library is licensed under the LGPL. For details see
the COPYING file.
OPEN DATA LICENSE (GeoLite Country and GeoLite City databases)
Copyright (c) 2008 MaxMind, Inc. All Rights Reserved.
All advertising materials and documentation mentioning features or use of
this database must display the following acknowledgment:
"This product includes GeoLite data created by MaxMind, available from
http://maxmind.com/"
Redistribution and use with or without modification, are permitted provided
that the following conditions are met:
1. Redistributions must retain the above copyright notice, this list of
conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
2. All advertising materials and documentation mentioning features or use of
this database must display the following acknowledgement:
"This product includes GeoLite data created by MaxMind, available from
http://maxmind.com/"
3. "MaxMind" may not be used to endorse or promote products derived from this
database without specific prior written permission.
THIS DATABASE IS PROVIDED BY MAXMIND, INC ``AS IS'' AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL MAXMIND BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
DATABASE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

BIN
deluge/data/GeoIP.dat Normal file

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 722 B

After

Width:  |  Height:  |  Size: 722 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -14,11 +14,11 @@
id="svg3440"
sodipodi:version="0.32"
inkscape:version="0.45"
sodipodi:docbase="/home/zach/deluge/trunk"
sodipodi:docname="deluge.svg"
inkscape:export-filename="/home/zach/deluge.png"
inkscape:export-xdpi="480"
inkscape:export-ydpi="480"
sodipodi:docbase="/home/andrew"
sodipodi:docname="alert.svg"
inkscape:export-filename="/home/andrew/alert16.png"
inkscape:export-xdpi="32.603073"
inkscape:export-ydpi="32.603073"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
sodipodi:modified="TRUE">
<defs
@ -261,17 +261,6 @@
fx="65.800331"
fy="27.16758"
r="12.972491" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4989"
id="radialGradient6115"
cx="16.651781"
cy="32.187485"
fx="16.651781"
fy="32.187485"
r="17.089519"
gradientTransform="matrix(1.486175,-1.536108,0.932321,0.902016,-38.10476,31.42646)"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
@ -280,17 +269,17 @@
borderopacity="0.17254902"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="8"
inkscape:cx="36.250498"
inkscape:cy="38.275489"
inkscape:zoom="7.4062501"
inkscape:cx="11.667315"
inkscape:cy="19.059135"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1266"
inkscape:window-height="944"
inkscape:window-x="124"
inkscape:window-y="52"
inkscape:window-width="1024"
inkscape:window-height="693"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:showpageshadow="false" />
<metadata
id="metadata4">
@ -345,58 +334,27 @@
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
sodipodi:type="arc"
style="fill:url(#radialGradient6090);fill-opacity:1;stroke:none;stroke-opacity:1"
id="path4112"
sodipodi:cx="24.849752"
sodipodi:cy="38.908627"
sodipodi:rx="20.203051"
sodipodi:ry="7.4751287"
d="M 45.052803 38.908627 A 20.203051 7.4751287 0 1 1 4.6467018,38.908627 A 20.203051 7.4751287 0 1 1 45.052803 38.908627 z"
transform="matrix(0.947409,0,0,1.17786,1.244375,-6.853427)"
inkscape:export-xdpi="480"
inkscape:export-ydpi="480" />
<path
style="fill:url(#radialGradient6115);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 23.942923,0.9561338 L 37.330543,18.266721 C 46.998995,29.84687 41.49692,43.923891 26.7742,45.000491 C 6.0597413,45.582655 6.5086231,27.37483 11.255313,18.609381 L 23.942923,0.9561338 z "
id="path2069"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#1b4075;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 35.111358,26.143133 C 28.972772,13.030586 17.560684,17.697957 17.274449,26.949974 C 16.894738,39.223415 34.748874,37.615429 36.715244,41.468778 C 28.821643,47.675479 14.973233,45.226508 10.962289,39.715204 C 6.9574776,34.212326 7.2383598,25.630263 10.784249,19.587632 C 24.158625,0.978654 39.749127,24.383766 35.111358,26.143133 z "
id="path2969"
sodipodi:nodetypes="cscscc" />
<path
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1.1000706;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.36612022"
d="M 23.996861,3.5433428 L 36.057351,19.151045 C 44.769741,29.58253 39.419346,42.414092 26.125181,43.508521 C 7.3917365,44.015286 7.4275065,28.119221 12.17284,20.333442 L 23.996861,3.5433428 z "
id="path2071"
sodipodi:nodetypes="ccccc" />
<path
style="opacity:0.46;fill:url(#radialGradient6109);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 23.940758,0.96491709 L 34.727367,14.909752 C 42.647208,24.392311 40.447304,20.283975 28.362481,21.278846 C 25.083165,11.203805 18.13871,11.859899 13.523802,15.675236 L 23.940758,0.96491709 z "
id="path3945"
sodipodi:nodetypes="ccccc" />
<path
style="fill:url(#radialGradient6106);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 35.159701,26.173667 C 29.021115,13.06112 18.734027,17.978491 18.447792,27.230508 C 18.068081,39.503949 34.797217,37.645963 36.763587,41.499312 C 28.869986,47.706013 15.021576,45.257042 11.010632,39.745738 C 7.0058197,34.24286 7.2867027,25.660797 10.832592,19.618166 C 24.206968,1.0091879 39.79747,24.4143 35.159701,26.173667 z "
id="path3868"
sodipodi:nodetypes="cscscc" />
<path
style="fill:url(#radialGradient6103);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 35.120795,26.14195 C 28.553327,12.814962 15.685968,17.224233 15.399733,26.47625 C 15.020022,38.749691 32.874158,37.141705 34.840528,40.995054 C 26.946927,47.201755 13.098517,44.752784 9.0875727,39.24148 C 5.0827617,33.738602 5.3636437,25.156539 8.9095327,19.113908 C 22.315509,0.47615954 40.03233,23.660113 35.120795,26.14195 z "
id="path4874"
sodipodi:nodetypes="cscscc" />
<path
transform="matrix(-0.829136,1.052307,1.239307,7.58326e-2,26.32898,25.58605)"
inkscape:r_cy="true"
inkscape:r_cx="true"
d="M 18.788838 12.493138 A 6.7175145 6.7175145 0 1 1 5.3538089,12.493138 A 6.7175145 6.7175145 0 1 1 18.788838 12.493138 z"
sodipodi:ry="6.7175145"
sodipodi:rx="6.7175145"
sodipodi:cy="12.493138"
sodipodi:cx="12.071323"
id="path4941"
style="opacity:0.21999996;color:black;fill:url(#radialGradient6098);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc" />
<text
xml:space="preserve"
style="font-size:55.97062302px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#ff7878;fill-opacity:1;stroke:#000000;stroke-width:0.70000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans"
x="5.0072942"
y="59.560848"
id="text2767"
transform="scale(1.4928735,0.6698491)"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan2769"
x="5.0072942"
y="59.560848"
style="font-size:55.97062302px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;stroke-width:0.70000001;font-family:Bitstream Vera Sans;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-linecap:round">!</tspan></text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

View File

@ -0,0 +1,297 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48px"
height="48px"
id="svg3440"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docbase="/home/andrew/Projects/deluge-icons"
sodipodi:docname="checking.svg"
inkscape:export-filename="/home/andrew/checking16.png"
inkscape:export-xdpi="32.603073"
inkscape:export-ydpi="32.603073"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.17254902"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="8"
inkscape:cx="37.674028"
inkscape:cy="16.114442"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="768"
inkscape:window-height="722"
inkscape:window-x="4"
inkscape:window-y="25"
inkscape:showpageshadow="false" />
<defs
id="defs3">
<inkscape:perspective
id="perspective2513"
inkscape:persp3d-origin="24 : 16 : 1"
inkscape:vp_z="48 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 24 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
id="linearGradient2973"
inkscape:collect="always">
<stop
id="stop2975"
offset="0"
style="stop-color:#eeeeec;stop-opacity:1;" />
<stop
id="stop2977"
offset="1"
style="stop-color:#eeeeec;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient4126">
<stop
id="stop4128"
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
<stop
id="stop4130"
offset="1.0000000"
style="stop-color:#ffffff;stop-opacity:0.16494845;" />
</linearGradient>
<linearGradient
id="linearGradient4114"
inkscape:collect="always">
<stop
id="stop4116"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop4118"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient3962">
<stop
id="stop3964"
offset="0.0000000"
style="stop-color:#d3e9ff;stop-opacity:1.0000000;" />
<stop
id="stop4134"
offset="0.15517241"
style="stop-color:#d3e9ff;stop-opacity:1.0000000;" />
<stop
id="stop4346"
offset="0.75000000"
style="stop-color:#4074ae;stop-opacity:1.0000000;" />
<stop
id="stop3966"
offset="1.0000000"
style="stop-color:#36486c;stop-opacity:1.0000000;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3993"
id="radialGradient4019"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.791446,-14.01786,-11.28667)"
cx="-10.089286"
cy="33.506763"
fx="-10.089286"
fy="33.506763"
r="13.994944" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3993"
id="radialGradient4004"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.792374,-19.58761,2.818569)"
cx="-10.323107"
cy="31.329016"
fx="-10.323107"
fy="31.329016"
r="14.057444" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3993"
id="radialGradient3999"
cx="-10.323107"
cy="31.329016"
fx="-10.323107"
fy="31.329016"
r="14.057444"
gradientTransform="matrix(1,0,0,0.792374,0,6.785475)"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1312"
id="radialGradient3943"
cx="61.662098"
cy="24.241488"
fx="61.662098"
fy="24.241488"
r="13.994946"
gradientTransform="matrix(0.341185,-0.153831,1.08001,2.395374,-15.42222,-25.62103)"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient1312">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop1314" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop1316" />
</linearGradient>
<linearGradient
id="linearGradient3993">
<stop
id="stop3995"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop3997"
offset="1"
style="stop-color:#000000;stop-opacity:0" />
</linearGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.140022,40.17678,1.347091)"
r="14.33462"
fy="18.499998"
fx="-22.375"
cy="18.499998"
cx="-22.375"
id="radialGradient3866"
xlink:href="#linearGradient2973"
inkscape:collect="always" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4114"
id="radialGradient5000"
gradientTransform="scale(1.643990,0.608276)"
cx="15.115514"
cy="63.965388"
fx="15.115514"
fy="63.965388"
r="12.289036"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4989">
<stop
style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop4991" />
<stop
style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
offset="0.15517241"
id="stop4993" />
<stop
style="stop-color:#4074ae;stop-opacity:1.0000000;"
offset="0.75000000"
id="stop4995" />
<stop
style="stop-color:#36486c;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop4997" />
</linearGradient>
<linearGradient
id="linearGradient4977">
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop4979" />
<stop
style="stop-color:#ffffff;stop-opacity:0.16494845;"
offset="1.0000000"
id="stop4981" />
</linearGradient>
</defs>
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Internet Category</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:contributor>
<cc:Agent>
<dc:title>Tuomas Kuosmanen</dc:title>
</cc:Agent>
</dc:contributor>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
<dc:source>http://jimmac.musichall.cz</dc:source>
<dc:subject>
<rdf:Bag>
<rdf:li>internet</rdf:li>
<rdf:li>tools</rdf:li>
<rdf:li>applications</rdf:li>
<rdf:li>category</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
<cc:permits
rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits
rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Notice" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Attribution" />
<cc:permits
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
<cc:requires
rdf:resource="http://web.resource.org/cc/ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
inkscape:label="Layer 1"
id="layer1">
<path
sodipodi:nodetypes="ccccc"
id="path2069"
d="M 23.854535,1.0445221 L 37.242155,18.355109 C 46.910607,29.935258 41.408532,44.012279 26.685812,45.088879 C 5.971353,45.671043 6.4202348,27.463218 11.166925,18.697769 L 23.854535,1.0445221 z "
style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="ccccc"
id="path2071"
d="M 23.996861,3.5433428 L 36.057351,19.151045 C 44.769741,29.58253 39.419346,42.414092 26.125181,43.508521 C 7.3917365,44.015286 7.4275065,28.119221 12.17284,20.333442 L 23.996861,3.5433428 z "
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1.1000706;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.36612022" />
<path
sodipodi:nodetypes="ccccccccc"
style="fill:#cfcfcf;fill-opacity:1;stroke:#000000;stroke-width:0.65121293;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 11.907735,28.259103 C 15.765379,27.553911 20.775812,26.031856 24.400866,26.377315 C 22.598873,25.111024 22.522108,24.694978 21.821837,23.470303 C 26.445155,22.178774 28.937476,23.679964 34.217776,26.922312 C 35.006715,25.3802 35.778476,24.67098 36.817957,22.869809 C 31.198009,18.792719 25.868522,17.760268 20.454911,19.207042 C 19.842813,18.404348 19.795799,17.541278 19.728831,15.812086 C 17.778356,18.179212 14.825215,22.457523 11.907735,28.259103 C 11.907735,28.259103 11.907735,28.259103 11.907735,28.259103"
id="path3463" />
<path
id="path3485"
d="M 36.668898,28.597896 C 32.811254,29.303088 27.800821,30.825143 24.175767,30.479684 C 25.97776,31.745975 26.054525,32.162021 26.754796,33.386696 C 22.131478,34.678225 19.639157,33.177035 14.358857,29.934687 C 13.569918,31.476799 12.798157,32.186019 11.758676,33.98719 C 17.378624,38.06428 22.708111,39.096731 28.121722,37.649957 C 28.73382,38.452651 28.780834,39.315721 28.847802,41.044913 C 30.798277,38.677787 33.751418,34.399476 36.668898,28.597896 C 36.668898,28.597896 36.668898,28.597896 36.668898,28.597896"
style="fill:#cfcfcf;fill-opacity:1;stroke:#000000;stroke-width:0.65121293;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
sodipodi:nodetypes="ccccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 683 B

View File

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

View File

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View File

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,433 @@
/* XPM */
static char * deluge_xpm[] = {
"32 32 398 2",
" c None",
". c #7B869E",
"+ c #7B869D",
"@ c #A5ADBE",
"# c #A7AFBE",
"$ c #8894A9",
"% c #A4ADBD",
"& c #A7AFBF",
"* c #95A0B4",
"= c #6F7E99",
"- c #A0AABD",
"; c #8594AD",
"> c #8A98B1",
", c #A7B3C6",
"' c #8496AF",
") c #5B6F90",
"! c #8F9EB6",
"~ c #8194AF",
"{ c #7C91AF",
"] c #8096B3",
"^ c #859BB8",
"/ c #A0B1C8",
"( c #728CAD",
"_ c #758BAA",
": c #849AB7",
"< c #6F8AAE",
"[ c #7591B3",
"} c #7995B8",
"| c #7A97B9",
"1 c #86A0C0",
"2 c #93ABC7",
"3 c #6585AE",
"4 c #5A78A0",
"5 c #879FBE",
"6 c #6485AF",
"7 c #698CB5",
"8 c #6E91BA",
"9 c #7295BD",
"0 c #7497BF",
"a c #7296BF",
"b c #89A6C8",
"c c #809FC4",
"d c #436B9C",
"e c #7B99BE",
"f c #5378A6",
"g c #446A9A",
"h c #4B6F9C",
"i c #5577A2",
"j c #6183AE",
"k c #6D92BD",
"l c #7097C3",
"m c #6E96C1",
"n c #8DACCF",
"o c #6C93BF",
"p c #587DA9",
"q c #446592",
"r c #1B4075",
"s c #204478",
"t c #2F5081",
"u c #496791",
"v c #4F6B94",
"w c #5879A4",
"x c #6B93BE",
"y c #6E97C2",
"z c #8EADCF",
"A c #5E89BA",
"B c #3E669A",
"C c #567198",
"D c #24477A",
"E c #315281",
"F c #365685",
"G c #3A5A86",
"H c #405E8A",
"I c #567197",
"J c #577298",
"K c #516E97",
"L c #6187B3",
"M c #7098C4",
"N c #85A7CC",
"O c #5280B6",
"P c #305C92",
"Q c #5A759B",
"R c #2B4D7E",
"S c #3B5A88",
"T c #4C6991",
"U c #597397",
"V c #60799D",
"W c #5C769A",
"X c #587298",
"Y c #637C9E",
"Z c #5D769B",
"` c #526F96",
" . c #5B84B0",
".. c #759BC6",
"+. c #7398C4",
"@. c #325D95",
"#. c #4C6A94",
"$. c #3B5B87",
"%. c #44628C",
"&. c #5B7599",
"*. c #6D84A5",
"=. c #647D9F",
"-. c #6784A8",
";. c #7194BD",
">. c #769EC9",
",. c #709AC4",
"'. c #7293B8",
"). c #6D86A9",
"!. c #526E96",
"~. c #5782B1",
"{. c #7A9EC8",
"]. c #5D8ABC",
"^. c #325485",
"/. c #4F6C94",
"(. c #3D5C88",
"_. c #5E779B",
":. c #7489A8",
"<. c #667FA1",
"[. c #8BA3C1",
"}. c #8BAED4",
"|. c #83A9D3",
"1. c #82A8D2",
"2. c #7FA6D1",
"3. c #7CA4CE",
"4. c #7AA0CC",
"5. c #708EB4",
"6. c #5F789C",
"7. c #4E6C96",
"8. c #5986B9",
"9. c #7FA2CA",
"0. c #4B7CB2",
"a. c #2B5387",
"b. c #567199",
"c. c #305282",
"d. c #506B93",
"e. c #7187A5",
"f. c #6F85A3",
"g. c #8EA4BF",
"h. c #9DBBDC",
"i. c #8EB2D9",
"j. c #8DB1D8",
"k. c #8AAED6",
"l. c #84AAD3",
"m. c #7EA5D0",
"n. c #779FCC",
"o. c #6C8BB0",
"p. c #5E779A",
"q. c #5178A6",
"r. c #5C89BC",
"s. c #7198C4",
"t. c #325486",
"u. c #4C6993",
"v. c #5E789B",
"w. c #778CA8",
"x. c #7389A7",
"y. c #B6CADF",
"z. c #9ABBDF",
"A. c #9BBCE0",
"B. c #9ABCDF",
"C. c #97B9DE",
"D. c #93B6DB",
"E. c #8CB1D8",
"F. c #85ABD4",
"G. c #7CA4CF",
"H. c #749BC9",
"I. c #6783A6",
"J. c #56739C",
"K. c #5283B8",
"L. c #6F96C3",
"M. c #4E7BAE",
"N. c #42618D",
"O. c #3E5C88",
"P. c #667E9F",
"Q. c #7288A7",
"R. c #8EA1BA",
"S. c #B9CFE7",
"T. c #A6C5E6",
"U. c #A7C6E6",
"V. c #A5C4E6",
"W. c #A1C1E3",
"X. c #93B6DC",
"Y. c #8AAFD7",
"Z. c #80A7D1",
"`. c #769FCC",
" + c #6992BF",
".+ c #5D789D",
"++ c #5483B9",
"@+ c #5281B7",
"#+ c #688FBB",
"$+ c #557198",
"%+ c #1E4277",
"&+ c #3F5E88",
"*+ c #687FA0",
"=+ c #6F85A5",
"-+ c #A0B2C8",
";+ c #BFD5ED",
">+ c #B3CFED",
",+ c #B2CFED",
"'+ c #AFCCEB",
")+ c #A9C8E8",
"!+ c #A2C2E4",
"~+ c #99BADF",
"{+ c #78A1CD",
"]+ c #6C97C6",
"^+ c #5D88B7",
"/+ c #4779B2",
"(+ c #7295BE",
"_+ c #3C6699",
":+ c #2B4F83",
"<+ c #59749A",
"[+ c #657D9E",
"}+ c #6C83A3",
"|+ c #A3B4CA",
"1+ c #C7DDF2",
"2+ c #BFD9F4",
"3+ c #BDD7F2",
"4+ c #B8D3F0",
"5+ c #B0CDEC",
"6+ c #9CBDE0",
"7+ c #91B4DA",
"8+ c #79A1CD",
"9+ c #5F8DBF",
"0+ c #4578B1",
"a+ c #6B90BA",
"b+ c #446A9B",
"c+ c #2D5184",
"d+ c #577299",
"e+ c #305181",
"f+ c #5B749A",
"g+ c #6C82A2",
"h+ c #98AAC3",
"i+ c #D2E5F6",
"j+ c #CAE2FA",
"k+ c #C6DEF8",
"l+ c #BED8F3",
"m+ c #B4D0EE",
"n+ c #9EBEE1",
"o+ c #92B5DB",
"p+ c #78A0CD",
"q+ c #6B96C5",
"r+ c #5D8BBE",
"s+ c #5081B7",
"t+ c #4276AF",
"u+ c #6489B4",
"v+ c #4B6E9B",
"w+ c #2C5284",
"x+ c #234679",
"y+ c #4C6990",
"z+ c #6C82A3",
"A+ c #738AA9",
"B+ c #D9E9F9",
"C+ c #D3E9FF",
"D+ c #CCE3FB",
"E+ c #C2DBF5",
"F+ c #B6D2EF",
"G+ c #AAC8E8",
"H+ c #9DBEE1",
"I+ c #90B3DA",
"J+ c #759ECB",
"K+ c #6893C4",
"L+ c #5A89BC",
"M+ c #4D7EB5",
"N+ c #3F73AD",
"O+ c #6386B1",
"P+ c #486A96",
"Q+ c #2A5082",
"R+ c #58739A",
"S+ c #375685",
"T+ c #5F789B",
"U+ c #ADBED3",
"V+ c #D4E9FE",
"W+ c #CFE6FD",
"X+ c #C2DCF6",
"Y+ c #A8C7E7",
"Z+ c #719BC9",
"`+ c #6490C1",
" @ c #5685BA",
".@ c #487AB2",
"+@ c #3F70A8",
"@@ c #6B8BB2",
"#@ c #3F608D",
"$@ c #536F97",
"%@ c #1F4377",
"&@ c #224679",
"*@ c #46638D",
"=@ c #6880A0",
"-@ c #6F86A5",
";@ c #BBCDE0",
">@ c #CEE4FC",
",@ c #C0DAF4",
"'@ c #A5C4E5",
")@ c #96B9DD",
"!@ c #88AED6",
"~@ c #7CA3CE",
"{@ c #719BC8",
"]@ c #6692C2",
"^@ c #5987BA",
"/@ c #4C7CB3",
"(@ c #4672A5",
"_@ c #728DB1",
":@ c #385884",
"<@ c #3C5C89",
"[@ c #385886",
"}@ c #26497B",
"|@ c #4B6790",
"1@ c #6980A1",
"2@ c #768BA9",
"3@ c #9CB1CA",
"4@ c #B9D3EE",
"5@ c #ADCAEA",
"6@ c #9EBFE2",
"7@ c #90B4DA",
"8@ c #87ACD5",
"9@ c #7EA4CE",
"0@ c #749CC8",
"a@ c #6993C1",
"b@ c #5C89BB",
"c@ c #4F7DB1",
"d@ c #5D80AC",
"e@ c #617EA4",
"f@ c #3A547B",
"g@ c #2A4C7E",
"h@ c #1C4176",
"i@ c #27497B",
"j@ c #45628D",
"k@ c #60799C",
"l@ c #7288A6",
"m@ c #7D91AD",
"n@ c #859FBE",
"o@ c #93B4D7",
"p@ c #8FB2D8",
"q@ c #86ABD2",
"r@ c #7EA4CD",
"s@ c #759CC8",
"t@ c #6A94C2",
"u@ c #5C89BA",
"v@ c #547EAE",
"w@ c #7994B6",
"x@ c #44628A",
"y@ c #375786",
"z@ c #476590",
"A@ c #4C6890",
"B@ c #5B7498",
"C@ c #667EA0",
"D@ c #6F86A7",
"E@ c #738CAD",
"F@ c #7592B7",
"G@ c #779AC1",
"H@ c #779DC7",
"I@ c #6993C0",
"J@ c #5B86B6",
"K@ c #7B97BB",
"L@ c #5A769E",
"M@ c #394E6E",
"N@ c #21426C",
"O@ c #45638E",
"P@ c #496691",
"Q@ c #1D4176",
"R@ c #41608B",
"S@ c #4C6891",
"T@ c #506D95",
"U@ c #4E6B94",
"V@ c #4B6A95",
"W@ c #5176A3",
"X@ c #7C99BC",
"Y@ c #6280A8",
"Z@ c #3E567A",
"`@ c #25446F",
" # c #395987",
".# c #214579",
"+# c #294C7E",
"@# c #315383",
"## c #3D5C8A",
"$# c #43618D",
"%# c #5C769C",
"&# c #6D84A6",
"*# c #405E8B",
"=# c #375179",
"-# c #1B304F",
";# c #2E5181",
"># c #415F8C",
",# c #547098",
"'# c #486590",
")# c #43618E",
"!# c #476690",
"~# c #6981A4",
"{# c #677FA3",
"]# c #496690",
"^# c #2E5283",
"/# c #294467",
"(# c #32507C",
"_# c #325684",
":# c #335484",
"<# c #3F5E8B",
"[# c #3E5F8D",
"}# c #345887",
"|# c #305383",
"1# c #2A4466",
" ",
" . + ",
" @ # ",
" $ % & * ",
" = - ; > , ' ",
" ) ! ~ { ] ^ / ( ",
" _ : < [ } | 1 2 3 ",
" 4 5 6 7 8 9 0 a b c ",
" d e f g h i j k l m n o ",
" p q r r s t u v w x y z A ",
" B C r D E F G H I J K L M N O ",
" P Q R S T U V W I X Y Z ` ...+. ",
" @.#.$.%.&.*.=.-.;.>.,.'.).V !.~.{.]. ",
" ^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0. ",
" a.b.c.d.e.f.g.h.i.i.j.k.l.m.n.o.p.q.r.s. ",
" t.u.F v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M. ",
" N.c.O.P.Q.R.S.T.U.V.W.A.X.Y.Z.`. +.+++@+#+ ",
" $+%+&+*+=+-+;+>+,+'+)+!+~+i.|.{+]+^+++/+(+_+ ",
" :+<+r G [+}+|+1+2+3+4+5+T.6+7+F.8+]+9+K.0+a+b+ ",
" c+d+r e+f+g+h+i+j+k+l+m+)+n+o+l.p+q+r+s+t+u+v+ ",
" w+Q r x+y+z+A+B+C+D+E+F+G+H+I+|.J+K+L+M+N+O+P+ ",
" Q+R+r r S+T+*+U+V+W+X+F+Y+A.j.2.Z+`+ @.@+@@@#@ ",
" $@%@r &@*@=@-@;@>@,@,+'@)@!@~@{@]@^@/@(@_@:@ ",
" <@[@r r }@|@1@2@3@4@5@6@7@8@9@0@a@b@c@d@e@f@ ",
" g@b.h@r r i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@ ",
" y@z@r r r %@y@A@B@C@D@E@F@G@H@I@J@K@L@M@ ",
" N@O@P@Q@r r r s e+R@S@T@` U@V@W@X@Y@Z@ ",
" `@ #Q y@Q@r r .#+#@#[@##$#%#&#*#=# ",
" -#;#>#d+,#'#)#!#u.Q ~#{#]#^#/# ",
" (#_#:# #<#$#[#}#|#1# ",
" ",
" "};

Binary file not shown.

After

Width:  |  Height:  |  Size: 607 B

View File

@ -0,0 +1,350 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48px"
height="48px"
id="svg3440"
sodipodi:version="0.32"
inkscape:version="0.45.1"
sodipodi:docbase="/home/andrew/Projects/deluge-icons"
sodipodi:docname="downloading-border.svg"
inkscape:export-filename="/home/andrew/Projects/deluge-icons/downloading16.png"
inkscape:export-xdpi="32.603073"
inkscape:export-ydpi="32.603073"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<linearGradient
inkscape:collect="always"
id="linearGradient2973">
<stop
style="stop-color:#eeeeec;stop-opacity:1;"
offset="0"
id="stop2975" />
<stop
style="stop-color:#eeeeec;stop-opacity:0;"
offset="1"
id="stop2977" />
</linearGradient>
<linearGradient
id="linearGradient4126">
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop4128" />
<stop
style="stop-color:#ffffff;stop-opacity:0.16494845;"
offset="1.0000000"
id="stop4130" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4114">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop4116" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop4118" />
</linearGradient>
<linearGradient
id="linearGradient3962">
<stop
style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop3964" />
<stop
style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
offset="0.15517241"
id="stop4134" />
<stop
style="stop-color:#4074ae;stop-opacity:1.0000000;"
offset="0.75000000"
id="stop4346" />
<stop
style="stop-color:#36486c;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop3966" />
</linearGradient>
<radialGradient
r="13.994944"
fy="33.506763"
fx="-10.089286"
cy="33.506763"
cx="-10.089286"
gradientTransform="matrix(1,0,0,0.791446,-14.01786,-11.28667)"
gradientUnits="userSpaceOnUse"
id="radialGradient4019"
xlink:href="#linearGradient3993"
inkscape:collect="always" />
<radialGradient
r="14.057444"
fy="31.329016"
fx="-10.323107"
cy="31.329016"
cx="-10.323107"
gradientTransform="matrix(1,0,0,0.792374,-19.58761,2.818569)"
gradientUnits="userSpaceOnUse"
id="radialGradient4004"
xlink:href="#linearGradient3993"
inkscape:collect="always" />
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.792374,0,6.785475)"
r="14.057444"
fy="31.329016"
fx="-10.323107"
cy="31.329016"
cx="-10.323107"
id="radialGradient3999"
xlink:href="#linearGradient3993"
inkscape:collect="always" />
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.341185,-0.153831,1.08001,2.395374,-15.42222,-25.62103)"
r="13.994946"
fy="24.241488"
fx="61.662098"
cy="24.241488"
cx="61.662098"
id="radialGradient3943"
xlink:href="#linearGradient1312"
inkscape:collect="always" />
<linearGradient
id="linearGradient1312">
<stop
id="stop1314"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop1316"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient3993">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3995" />
<stop
style="stop-color:#000000;stop-opacity:0"
offset="1"
id="stop3997" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2973"
id="radialGradient3866"
cx="-22.375"
cy="18.499998"
fx="-22.375"
fy="18.499998"
r="14.33462"
gradientTransform="matrix(1,0,0,1.140022,40.17678,1.347091)"
gradientUnits="userSpaceOnUse" />
<radialGradient
gradientUnits="userSpaceOnUse"
r="12.289036"
fy="63.965388"
fx="15.115514"
cy="63.965388"
cx="15.115514"
gradientTransform="scale(1.643990,0.608276)"
id="radialGradient5000"
xlink:href="#linearGradient4114"
inkscape:collect="always" />
<linearGradient
id="linearGradient4989">
<stop
id="stop4991"
offset="0.0000000"
style="stop-color:#d3e9ff;stop-opacity:1.0000000;" />
<stop
id="stop4993"
offset="0.15517241"
style="stop-color:#d3e9ff;stop-opacity:1.0000000;" />
<stop
id="stop4995"
offset="0.75000000"
style="stop-color:#4074ae;stop-opacity:1.0000000;" />
<stop
id="stop4997"
offset="1.0000000"
style="stop-color:#36486c;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient4977">
<stop
id="stop4979"
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
<stop
id="stop4981"
offset="1.0000000"
style="stop-color:#ffffff;stop-opacity:0.16494845;" />
</linearGradient>
<linearGradient
id="linearGradient4825"
inkscape:collect="always">
<stop
id="stop4827"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop4829"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4114"
id="radialGradient6090"
gradientUnits="userSpaceOnUse"
gradientTransform="scale(1.64399,0.608276)"
cx="15.115514"
cy="63.965388"
fx="15.115514"
fy="63.965388"
r="12.289036" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4825"
id="radialGradient6098"
gradientUnits="userSpaceOnUse"
cx="12.071323"
cy="12.493138"
fx="12.071323"
fy="12.493138"
r="6.7175145" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2973"
id="radialGradient6103"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.25463,-0.898371,0.979785,0.277703,-18.00903,32.03312)"
cx="17.903898"
cy="40.159222"
fx="17.903898"
fy="40.159222"
r="14.33681" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2973"
id="radialGradient6106"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.583269,-0.431533,0.577146,0.78008,-5.80022,4.004109)"
cx="12.525543"
cy="38.09042"
fx="12.525543"
fy="38.09042"
r="14.33681" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1312"
id="radialGradient6109"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.768231,1.13675,-0.820972,0.554824,-3.72248,-85.07126)"
cx="65.800331"
cy="27.16758"
fx="65.800331"
fy="27.16758"
r="12.972491" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.17254902"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="8"
inkscape:cx="34.258571"
inkscape:cy="32.884169"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1266"
inkscape:window-height="944"
inkscape:window-x="12"
inkscape:window-y="34"
inkscape:showpageshadow="false" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Internet Category</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:contributor>
<cc:Agent>
<dc:title>Tuomas Kuosmanen</dc:title>
</cc:Agent>
</dc:contributor>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
<dc:source>http://jimmac.musichall.cz</dc:source>
<dc:subject>
<rdf:Bag>
<rdf:li>internet</rdf:li>
<rdf:li>tools</rdf:li>
<rdf:li>applications</rdf:li>
<rdf:li>category</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
<cc:permits
rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits
rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Notice" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Attribution" />
<cc:permits
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
<cc:requires
rdf:resource="http://web.resource.org/cc/ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
style="fill:#8dd35f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.07523891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 23.942923,0.9561338 L 37.330543,18.266721 C 46.998995,29.84687 41.49692,43.923891 26.7742,45.000491 C 6.0597413,45.582655 6.5086231,27.37483 11.255313,18.609381 L 23.942923,0.9561338 z "
id="path2069"
sodipodi:nodetypes="ccccc" />
<path
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1.1000706;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.36612022"
d="M 23.996861,3.5433428 L 36.057351,19.151045 C 44.769741,29.58253 39.419346,42.414092 26.125181,43.508521 C 7.3917365,44.015286 7.4275065,28.119221 12.17284,20.333442 L 23.996861,3.5433428 z "
id="path2071"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#b7e399;fill-opacity:1;stroke:#000000;stroke-opacity:1;marker-end:none;stroke-width:0.7;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-linecap:round;stroke-linejoin:round"
d="M 19.34375 17.5625 C 19.34375 21.552083 19.34375 25.541668 19.34375 29.53125 C 17.636839 29.528128 15.925661 29.534372 14.21875 29.53125 C 17.623975 32.921687 21.032275 36.297063 24.4375 39.6875 C 27.880752 36.309591 31.337996 32.94041 34.78125 29.5625 C 32.928627 29.559111 31.071373 29.565889 29.21875 29.5625 C 29.21875 25.5625 29.21875 21.562501 29.21875 17.5625 C 25.927083 17.5625 22.635418 17.562501 19.34375 17.5625 z "
id="rect2634" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 662 B

After

Width:  |  Height:  |  Size: 662 B

View File

@ -0,0 +1,2 @@
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: 643 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 408 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 600 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

View File

Before

Width:  |  Height:  |  Size: 836 B

After

Width:  |  Height:  |  Size: 836 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 506 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 647 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 663 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 593 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 B

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