class File(RTorrentRpcObject): _attrs = { 'path': 'f.get_path', 'size': 'f.get_size_bytes', 'size_chunks': 'f.get_size_chunks', 'completed_chunks': 'f.get_completed_chunks', } percent = property(fget=lambda self: filter_bytes( float(self.completed_chunks) / self.size_chunks, "%")) def rpc_call(self, method): return self.server.__getattr__(method)(self.torrent.key, self.index) def __init__(self, torrent, index, *args, **kwargs): self.torrent = torrent self.index = index RTorrentRpcObject.__init__(self, *args, **kwargs) def update(self): self.pop_cache('completed_chunks') def get_completed(self, units="KiB"): value = int(self.completed_chunks) * float(self.torrent.chunk_size) if value > self.size and self.size > 0: value = self.size return filter_bytes(value, units) def get_size(self, units="KiB"): if self.size < 0: return "~" + filter_bytes( self.size_chunks * float(self.torrent.chunk_size), units) return filter_bytes(self.size, units)
class Torrent(RTorrentRpcObject): _attrs = { 'hash': 'd.get_hash', 'name': 'd.get_name', 'chunk_size': 'd.get_chunk_size', 'size_chunks': 'd.get_size_chunks', 'completed_chunks': 'd.get_completed_chunks', 'down_rate': 'd.get_down_rate', 'up_rate': 'd.get_up_rate', 'open': 'd.is_open', 'active': 'd.is_active', } def rpc_call(self, method): return self.server.__getattr__(method)(self.key) def __init__(self, key, *args, **kwargs): RTorrentRpcObject.__init__(self, *args, **kwargs) self.key = key #self.update() self.files = FileList(self, self.server) def update(self): self.pop_cache('completed_chunks') self.pop_cache('open') self.pop_cache('active') self.pop_cache('down_rate') self.pop_cache('up_rate') size = property(fget=lambda self: self.size_chunks * self.chunk_size) size_MiB = property(fget=lambda self: filter_bytes(self.size, "MiB")) percent = property(fget=lambda self: filter_bytes( float(self.completed_chunks) / self.size_chunks, "%")) # required due to overflow in d.completed_bytes with torrents > 2GiB completed_MiB = property(fget=lambda self: filter_bytes( self.completed_chunks * self.chunk_size, "MiB")) def all_files(self): self.files.get('path', 'size', 'completed_chunks') return self.files def __unicode__(self): return self.name
def __getattr__(self, name): unit = None if len(name) > 4 and name[-1] == 'B': if name[-3:] in ('_GB', '_MB', '_KB'): unit = name[-2:] name = name[:-3] elif name[-4:] in ('_GiB', '_MiB', '_KiB'): unit = name[-3:] name = name[:-4] if self._attrs.has_key(name): rpc_attr = self._attrs[name] if self._cache.has_key(rpc_attr): value = self._cache[rpc_attr] else: value = self.rpc_call(rpc_attr) self.set_cache(rpc_attr, value) if unit is not None: return filter_bytes(value, unit) else: return value else: return self.__dict__[name]
def get_size(self, units="KiB"): if self.size < 0: return "~" + filter_bytes( self.size_chunks * float(self.torrent.chunk_size), units) return filter_bytes(self.size, units)
def get_completed(self, units="KiB"): value = int(self.completed_chunks) * float(self.torrent.chunk_size) if value > self.size and self.size > 0: value = self.size return filter_bytes(value, units)
def get_size(self, units="KiB"): if self.size < 0: return "~" + filter_bytes(self.size_chunks * float(self.torrent.chunk_size), units) return filter_bytes(self.size, units)