2009-04-06 20:24:02 +00:00

140 lines
5.8 KiB
Python

#!/usr/bin/env python
#
# info.py
#
# Copyright (C) 2008-2009 Ido Abramovich <ido.deluge@gmail.com>
#
# Deluge is free software.
#
# You may redistribute it and/or modify it under the terms of the
# GNU General Public License, as published by the Free Software
# Foundation; either version 3 of the License, or (at your option)
# any later version.
#
# deluge is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with deluge. If not, write to:
# The Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor
# Boston, MA 02110-1301, USA.
#
# In addition, as a special exception, the copyright holders give
# permission to link the code of portions of this program with the OpenSSL
# library.
# You must obey the GNU General Public License in all respects for all of
# the code used other than OpenSSL. If you modify file(s) with this
# exception, you may extend this exception to your version of the file(s),
# but you are not obligated to do so. If you do not wish to do so, delete
# this exception statement from your version. If you delete this exception
# statement from all source files in the program, then also delete it here.
#
#
from deluge.ui.console.main import BaseCommand, match_torrents
from deluge.ui.console import mapping
from deluge.ui.console.colors import templates
from deluge.ui.client import aclient as client
import deluge.common as common
from optparse import make_option
status_keys = ["state",
"save_path",
"tracker",
"next_announce",
"name",
"total_size",
"progress",
"num_seeds",
"total_seeds",
"num_peers",
"total_peers",
"eta",
"download_payload_rate",
"upload_payload_rate",
"ratio",
"distributed_copies",
"num_pieces",
"piece_length",
"total_done",
"files",
"file_priorities",
"file_progress",
"peers",
"is_seed",
]
class Command(BaseCommand):
"""Show information about the torrents"""
option_list = BaseCommand.option_list + (
make_option('-v', '--verbose', action='store_true', default=False, dest='verbose',
help='shows more information per torrent'),
make_option('-i', '--id', action='store_true', default=False, dest='tid',
help='use internal id instead of torrent name'),
)
usage = "Usage: info [<torrent-id> [<torrent-id> ...]]\n"\
" You can give the first few characters of a torrent-id to identify the torrent."
def handle(self, *args, **options):
args = mapping.to_ids(args)
self.torrents = match_torrents(args)
for tor in self.torrents:
self.show_info(tor, options.get('verbose'))
def complete(self, text, *args):
torrents = match_torrents()
names = mapping.get_names(torrents)
return [ x[1] for x in names if x[1].startswith(text) ]
def show_info(self, torrent, verbose):
def _got_torrent_status(state):
print templates.info_general('ID', torrent)
print templates.info_general('Name', state['name'])
#self._mapping[state['name']] = torrent # update mapping
print templates.info_general('Path', state['save_path'])
if verbose or not state['is_seed']:
print templates.info_transfers("Completed", common.fsize(state['total_done']) + "/" + common.fsize(state['total_size']))
print templates.info_transfers("Status", state['state'])
if verbose or state['state'] == 'Downloading':
print templates.info_transfers("Download Speed", common.fspeed(state['download_payload_rate']))
if verbose or state['state'] in ('Downloading', 'Seeding'):
print templates.info_transfers("Upload Speed", common.fspeed(state['upload_payload_rate']))
print templates.info_transfers("Share Ratio", "%.1f" % state['ratio'])
if state['state'] == ('Downloading'):
print templates.info_transfers("ETA", common.ftime(state['eta']))
if verbose:
print templates.info_network("Seeders", "%s (%s)" % (state['num_seeds'], state['total_seeds']))
print templates.info_network("Peers", "%s (%s)" % (state['num_peers'], state['total_peers']))
print templates.info_network("Availability", "%.1f" % state['distributed_copies'])
print templates.info_files_header("Files")
for i, file in enumerate(state['files']):
status = ""
if not state['is_seed']:
if state['file_priorities'][i] == 0:
status = " - Do not download"
else:
status = " - %1.f%% completed" % (state['file_progress'][i] * 100)
print "\t* %s (%s)%s" % (file['path'], common.fsize(file['size']), status)
print templates.info_peers_header("Peers")
if len(state['peers']) == 0:
print "\t* None"
for peer in state['peers']:
client_str = unicode(peer['client'])
client_str += unicode(peer['seed']) if peer['seed'] else ''
print templates.info_peers(str(peer['ip']), unicode(client_str),
str(common.fspeed(peer['up_speed'])), str(common.fspeed(peer['down_speed'])))
print ""
client.get_torrent_status(_got_torrent_status, torrent, status_keys)