Ticket #1858: 0004-Implement-console-command-for-displaying-and-setting.patch

File 0004-Implement-console-command-for-displaying-and-setting.patch, 5.6 KB (added by eirikba, 14 years ago)
  • new file deluge/ui/console/commands/torrent_option.py

    From b437beae2c96d0d408363167614d66a421709f7e Mon Sep 17 00:00:00 2001
    From: Eirik Byrkjeflot Anonsen <eirik@eirikba.org>
    Date: Thu, 19 May 2011 21:19:13 +0200
    Subject: [PATCH 4/4] Implement console command for displaying and setting per-torrent options.
    
    ---
     deluge/ui/console/commands/torrent_option.py |  134 ++++++++++++++++++++++++++
     1 files changed, 134 insertions(+), 0 deletions(-)
     create mode 100644 deluge/ui/console/commands/torrent_option.py
    
    diff --git a/deluge/ui/console/commands/torrent_option.py b/deluge/ui/console/commands/torrent_option.py
    new file mode 100644
    index 0000000..beb0093
    - +  
     1#
     2# config.py
     3#
     4# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
     5# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
     6#
     7# Deluge is free software.
     8#
     9# You may redistribute it and/or modify it under the terms of the
     10# GNU General Public License, as published by the Free Software
     11# Foundation; either version 3 of the License, or (at your option)
     12# any later version.
     13#
     14# deluge is distributed in the hope that it will be useful,
     15# but WITHOUT ANY WARRANTY; without even the implied warranty of
     16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     17# See the GNU General Public License for more details.
     18#
     19# You should have received a copy of the GNU General Public License
     20# along with deluge.    If not, write to:
     21#       The Free Software Foundation, Inc.,
     22#       51 Franklin Street, Fifth Floor
     23#       Boston, MA  02110-1301, USA.
     24#
     25#    In addition, as a special exception, the copyright holders give
     26#    permission to link the code of portions of this program with the OpenSSL
     27#    library.
     28#    You must obey the GNU General Public License in all respects for all of
     29#    the code used other than OpenSSL. If you modify file(s) with this
     30#    exception, you may extend this exception to your version of the file(s),
     31#    but you are not obligated to do so. If you do not wish to do so, delete
     32#    this exception statement from your version. If you delete this exception
     33#    statement from all source files in the program, then also delete it here.
     34#
     35#
     36
     37from twisted.internet import defer
     38
     39from deluge.ui.console.main import BaseCommand
     40import deluge.ui.console.colors as colors
     41from deluge.ui.client import client
     42import deluge.component as component
     43from deluge.log import LOG as log
     44
     45from optparse import make_option
     46
     47torrent_options = {
     48    "max_download_speed": float,
     49    "max_upload_speed": float,
     50    "max_connections": int,
     51    "max_upload_slots": int,
     52    "private": bool,
     53    "prioritize_first_last": bool,
     54    "is_auto_managed": bool,
     55    "stop_at_ratio": bool,
     56    "stop_ratio": float,
     57    "remove_at_ratio": bool,
     58    "move_on_completed": bool,
     59    "move_on_completed_path": str
     60    }
     61
     62
     63class Command(BaseCommand):
     64    """Show and set per-torrent options"""
     65
     66    option_list = BaseCommand.option_list + (
     67            make_option('-s', '--set', action='store', nargs=2, dest='set',
     68                        help='set value for key'),
     69    )
     70    usage = "Usage: torrent_option <torrent-id> [<key1> [<key2> ...]]\n"\
     71            "       torrent_option <torrent-id> --set <key> <value>"
     72
     73    def handle(self, *args, **options):
     74        self.console = component.get("ConsoleUI")
     75        if options['set']:
     76            return self._set_option(*args, **options)
     77        else:
     78            return self._get_option(*args, **options)
     79
     80
     81    def _get_option(self, *args, **options):
     82
     83        def on_torrents_status(status):
     84            for torrentid, data in status.items():
     85                self.console.write('')
     86                if 'name' in data:
     87                    self.console.write('{!info!}Name: {!input!}%s' % data.get('name'))
     88                self.console.write('{!info!}ID: {!input!}%s' % torrentid)
     89                for k, v in data.items():
     90                    if k != 'name':
     91                        self.console.write('{!info!}%s: {!input!}%s' % (k, v))
     92
     93        def on_torrents_status_fail(reason):
     94            self.console.write('{!error!}Failed to get torrent data.')
     95
     96        torrent_ids = []
     97        torrent_ids.extend(self.console.match_torrent(args[0]))
     98
     99        request_options = []
     100        for opt in args[1:]:
     101            if opt not in torrent_options:
     102                self.console.write('{!error!}Unknown torrent option: %s' % opt)
     103                return
     104            request_options.append(opt)
     105        if not request_options:
     106            request_options = [ opt for opt in torrent_options.keys() ]
     107        request_options.append('name')
     108
     109        d = client.core.get_torrents_status({"id": torrent_ids}, request_options)
     110        d.addCallback(on_torrents_status)
     111        d.addErrback(on_torrents_status_fail)
     112        return d
     113
     114
     115    def _set_option(self, *args, **options):
     116        deferred = defer.Deferred()
     117        torrent_ids = []
     118        torrent_ids.extend(self.console.match_torrent(args[0]))
     119        key = options["set"][0]
     120        val = options["set"][1] + " " .join(args[1:])
     121
     122        if key not in torrent_options:
     123            self.console.write("{!error!}The key '%s' is invalid!" % key)
     124            return
     125
     126        val = torrent_options[key](val)
     127
     128        def on_set_config(result):
     129            self.console.write("{!success!}Torrent option successfully updated.")
     130            deferred.callback(True)
     131
     132        self.console.write("Setting %s to %s for torrents %s.." % (key, val, torrent_ids))
     133        client.core.set_torrent_options(torrent_ids, {key: val}).addCallback(on_set_config)
     134        return deferred