hack to fix stderr screwing currses in peer view
[tore.git] / torc / views.py
blob965cf5407ad7359674b6f404c96bc527cb92d5d1
1 from tord.common import *
2 from list import Columns, Column
4 class Base:
5 def __init__(self):
6 self.ids = {}
7 self.hashs = {}
8 self.bindings = {}
9 self.restall = False
11 @test
12 def get_id(self, hash):
13 if hash not in self.ids:
14 self.ids[hash] = len(self.ids)
15 self.hashs[self.ids[hash]] = hash
16 return self.ids[hash]
18 @test
19 def get_hash(self, id):
20 return self.hashs[id]
22 @test
23 def get_args(self, args):
24 core, ids = self.core, self.selected
25 if args:
26 new_core, new_ids = args
27 if new_core: core = new_core
28 if new_ids: ids = new_ids
29 return core, ids
31 class Torrents(Columns, Base):
32 def __init__(self, core):
33 Columns.__init__(self)
34 Base.__init__(self)
36 self.name = 'Torrents'
37 self.core = core
39 self.keys = ['state', 'download_payload_rate', 'upload_payload_rate', 'progress', 'eta', 'total_wanted', 'num_peers', 'all_time_upload', 'name']
41 self.add_column('state', Column("Status", fstate, 7, aright))
42 self.add_column('download_payload_rate', Column('D Rate', fspeed, 7, aright))
43 self.add_column('upload_payload_rate', Column('U Rate', fspeed, 7, aright))
44 self.add_column('all_time_upload', Column('U Total', fspeed, 7, aright))
45 self.add_column('all_time_download', Column('D Total', fspeed, 7, aright))
46 self.add_column('progress', Column("Progress", fbar, 10, aright))
47 self.add_column('_progress', Column("Progress", fpcnt, 8, aright))
48 self.add_column('ratio', Column("Ratio", fratio, 5, aright))
49 self.add_column('eta', Column("ETA", ftime, 7, aright))
50 self.add_column('total_wanted', Column("Size", fsize, 6, aright))
51 self.add_column('num_peers', Column("Peers", str, 3, aright))
52 self.add_column('name', Column('Name', str, 0, aleft))
53 self.add_column('torrent_hash', Column('Hash', str, 0, aleft))
54 #self.add_column('peers_flags', Column('Flags', str, 0, aright))
55 #self.add_column('peers_ip', Column('Flags', ip, 0, aright))
57 self.bindings['b'] = lambda x,l: log.info(core.get_torrents_status([x], 'torrent_hash', ['torrent_file']))
58 self.bindings['n'] = lambda x,l: log.info(x)
60 self.bindings['f'] = lambda x,l: l.change_view('Files', [x], x)
61 self.bindings['l'] = lambda x,l: l.change_view('Peers', [x], x)
62 self.bindings['F'] = lambda x,l: l.change_view('Files', None, x)
63 self.bindings['L'] = lambda x,l: l.change_view('Peers', None, x)
64 self.bindings['y'] = lambda x,l: self.swap_columns('_progress', 'progress') or l.refresh(reset=True, sync=True)
66 self.bindings['A'] = lambda x,l: core.set_torrents_state([x], 'queue_position_top', publish='update', all=True)
67 self.bindings['Z'] = lambda x,l: core.set_torrents_state([x], 'queue_position_bottom', publish='update', all=True)
68 self.bindings['a'] = lambda x,l: core.set_torrents_state([x], 'queue_position_up', publish='sort', all=True)
69 self.bindings['z'] = lambda x,l: core.set_torrents_state([x], 'queue_position_down', publish='sort', all=True)
73 self.bindings['R'] = lambda x,l: core.set_torrents_state(None, 'resume')
74 self.bindings['P'] = lambda x,l: core.set_torrents_state(None, 'pause')
75 self.bindings['t'] = lambda x,l: core.set_torrents_state([x], 'toggle_pause')
77 self.bindings['W'] = lambda x,l: core.set_torrents_state(None, 'fastresume_write')
78 self.bindings['w'] = lambda x,l: core.set_torrents_state([x], 'fastresume_write')
80 self.bindings['i'] = lambda x,l: core.set_torrents_state([x], 'force_reannounce')
81 self.bindings['h'] = lambda x,l: core.set_torrents_state([x], 'recheck', publish='update')
82 self.bindings['H'] = lambda x,l: core.set_torrents_state(None, 'force_recheck', publish='update', all=True)
84 self.bindings['D'] = lambda x,l: core.remove(x, True)
85 self.bindings['d'] = lambda x,l: core.remove(x)
87 self.bindings['x'] = lambda x,l: core.set_torrents_state(None, 'set_sequential_download', publish='update', msg=tuple([True]))
88 self.bindings['X'] = lambda x,l: core.set_torrents_state(None, 'set_sequential_download', publish='update', msg=tuple([False]))
90 self.bindings['<'] = lambda x,l: core.set_torrents_state(None, 'toggle_managed', publish='update', msg=tuple([True]))
91 self.bindings['>'] = lambda x,l: core.set_torrents_state(None, 'toggle_managed', publish='update', msg=tuple([False]))
92 self.bindings['m'] = lambda x,l: core.set_torrents_state([x], 'toggle_managed', publish='update')
94 self.bindings['Q'] = lambda x,l: core.killServer()
96 @test
97 def get_data(self, args):
98 c, i = self.get_args(args)
99 return c.get_torrents_status(i, 'torrent_hash', self.keys)
101 class Files(Columns, Base):
102 def __init__(self, core):
103 Columns.__init__(self)
104 Base.__init__(self)
106 self.name = "Files"
107 self.core = core
109 self.keys = ['files_priority', 'files_size', 'files_progress', 'files_path']
111 def percent(a): return fpcnt(float(a[0])/a[1])
112 def bar(a): return fbar(float(a[0])/a[1])
114 self.add_column('files_priority', Column("Priority", str, 1, aright))
115 self.add_column('files_size', Column("Size", fsize, 6, aright))
116 self.add_column('files_progress', Column("Progress", percent, 9, aleft))
117 self.add_column('_files_progress', Column("Progress", bar, 5, aright))
118 self.add_column('files_path', Column('Name', str, 0, aleft))
120 self.bindings['f'] = lambda x,l: l.change_view('Torrents', None)
121 self.bindings['y'] = lambda x,l: self.swap_columns('_files_progress', 'files_progress') or l.refresh(reset=True, sync=True)
122 self.bindings['-'] = lambda (t,f),l: core.set_torrents_state([t], 'prioritize', publish='update', msg=(f,-1))
123 self.bindings['='] = lambda (t,f),l: core.set_torrents_state([t], 'prioritize', publish='update', msg=(f,1))
125 def get_data(self, args):
126 files = []
127 c, i = self.get_args(args)
128 for id, data in c.get_torrents_status(i, 'files_id', self.keys):
129 files += [((h,i), [d[i] for d in data]) for h, i in id]
130 return files
132 class Peers(Columns, Base):
133 def __init__(self, core):
134 Columns.__init__(self)
135 Base.__init__(self)
137 self.name = "Peers"
138 self.core = core
140 self.keys = ['peers_ip', 'peers_read_state', 'peers_write_state', 'peers_flags', 'peers_source_flags', 'peers_up_speed', 'peers_down_speed', 'peers_payload_up_speed', 'peers_payload_down_speed', 'peers_download_queue_length', 'peers_upload_queue_length']
142 def ip(x): return x[0]
144 def state(x):
145 s = ['idle','torrent', 'global', 'network']
146 return s[ord(x)]
148 def flags(x):
149 t = ['I', 'C', 'i', 'c', 'e', 'l', 'H', 'C', 'Q', 'P', 's', 'O', 'S']
150 f = ['.', '.', '.', '.', '.', 'r', '.', '.', '.', '.', '.', '.', '.']
151 return "".join([((1<<i & x) and t[i]) or f[i] for i in range(len(t))])
153 def source(x):
154 s = ['t', 'd', 'p', 'l', 'r', 'i']
155 return "".join([((1<<i & x) and s[i]) or ' ' for i in range(len(s))])
157 self.add_column('peers_ip', Column('Address', ip, 15, aleft))
158 self.add_column('peers_read_state', Column("R State", state, 7, aleft))
159 self.add_column('peers_write_state', Column("W State", state, 7, aleft))
160 self.add_column('peers_flags', Column("Flags", flags, 13, aleft))
161 self.add_column('peers_source_flags', Column("Source", source, 6, aleft))
162 self.add_column('peers_up_speed', Column("U Speed", fspeed, 7, aleft))
163 self.add_column('peers_down_speed', Column("D Speed", fspeed, 7, aleft))
164 self.add_column('peers_payload_up_speed', Column("PU Speed", fspeed, 7, aleft))
165 self.add_column('peers_payload_down_speed', Column("PD Speed", fspeed, 7, aleft))
166 self.add_column('peers_download_queue_length', Column("D Queue", str, 7, aleft))
167 self.add_column('peers_upload_queue_length', Column("U Queue", str, 7, aleft))
169 self.bindings['l'] = lambda x,l: l.change_view('Torrents', None)
170 self.bindings['L'] = lambda x,l: l.change_view('Torrents', None)
172 @test
173 def get_data(self, args):
174 peers = []
175 c, i = self.get_args(args)
176 try:
177 for ids, ds in c.get_torrents_status(i, 'peers_ip', self.keys):
178 for n, i in enumerate(ids):
179 peers += [(i,[d[n] for d in ds])]
180 except:
181 return []
183 return peers