@ -18,40 +18,38 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
import rtorrent . rpc
# from rtorrent.rpc import Method
import rtorrent . peer
import rtorrent . tracker
import rtorrent . file
import rtorrent . compat
from . common import safe_repr
from rtorrent . common import safe_repr
from . file import File , methods as file_methods
from . peer import Peer , methods as peer_methods
from . tracker import Tracker , methods as tracker_methods
from . rpc import Method
import rpc
Peer = rtorrent . peer . Peer
Tracker = rtorrent . tracker . Tracker
File = rtorrent . file . File
Method = rtorrent . rpc . Method
class Torrent :
class Torrent ( object ) :
""" Represents an individual torrent within a L {RTorrent} instance. """
def __init__ ( self , _rt_obj , info_hash , * * kwargs ) :
self . _rt_obj = _rt_obj
self . info_hash = info_hash # : info hash for the torrent
self . rpc_id = self . info_hash # : unique id to pass to rTorrent
for k in kwargs . keys ( ) :
for k in kwargs :
setattr ( self , k , kwargs . get ( k , None ) )
self . peers = [ ]
self . trackers = [ ]
self . files = [ ]
self . hashing = None
self . state = None
self . directory = None
self . active = None
self . _call_custom_methods ( )
def __repr__ ( self ) :
return safe_repr ( " Torrent(info_hash= \" {0} \" name= \" {1} \" ) " ,
self . info_hash , self . name )
return safe_repr ( ' Torrent(info_hash= " {0} " name= " {1} " ) ' ,
self . info_hash , self . name )
def _call_custom_methods ( self ) :
""" only calls methods that check instance variables. """
@ -68,25 +66,23 @@ class Torrent:
@note : also assigns return value to self . peers
"""
self . peers = [ ]
retriever_methods = [ m for m in rtorrent . peer . methods
if m . is_retriever ( ) and m . is_available ( self . _rt_obj ) ]
retriever_methods = filter ( lambda m : m . is_retriever ( ) and m . is_available ( self . _rt_obj ) , peer_methods )
mc = rpc . Multicall ( self )
# need to leave 2nd arg empty (dunno why)
m = rtorrent . rpc . Multicall ( self )
m . add ( " p.multicall " , self . info_hash , " " ,
* [ method . rpc_call + " = " for method in retriever_methods ] )
mc . add ( ' p.multicall ' , self . info_hash , ' ' , * [ method . rpc_call + ' = ' for method in retriever_methods ] )
results = m . call ( ) [ 0 ] # only sent one call, only need first result
results = mc . call ( ) [ 0 ] # only sent one call, only need first result
for result in results :
results_dict = { }
# build results_dict
for m , r in zip ( retriever_methods , result ) :
results_dict [ m . varname ] = rtorrent . r pc . process_result ( m , r )
for mc , r in zip ( retriever_methods , result ) :
results_dict [ mc . varname ] = rpc . process_result ( mc , r )
self . peers . append ( Peer (
self . _rt_obj , self . info_hash , * * results_dict ) )
self . peers . append ( Peer ( self . _rt_obj , self . info_hash , * * results_dict ) )
return ( self . peers )
return self . peers
def get_trackers ( self ) :
""" Get list of Tracker instances for given torrent.
@ -97,26 +93,23 @@ class Torrent:
@note : also assigns return value to self . trackers
"""
self . trackers = [ ]
retriever_methods = [ m for m in rtorrent . tracker . methods
if m . is_retriever ( ) and m . is_available ( self . _rt_obj ) ]
retriever_methods = filter ( lambda m : m . is_retriever ( ) and m . is_available ( self . _rt_obj ) , tracker_methods )
mc = rpc . Multicall ( self )
# need to leave 2nd arg empty (dunno why)
m = rtorrent . rpc . Multicall ( self )
m . add ( " t.multicall " , self . info_hash , " " ,
* [ method . rpc_call + " = " for method in retriever_methods ] )
mc . add ( ' t.multicall ' , self . info_hash , ' ' , * [ method . rpc_call + ' = ' for method in retriever_methods ] )
results = m . call ( ) [ 0 ] # only sent one call, only need first result
results = mc . call ( ) [ 0 ] # only sent one call, only need first result
for result in results :
results_dict = { }
# build results_dict
for m , r in zip ( retriever_methods , result ) :
results_dict [ m . varname ] = rtorrent . r pc . process_result ( m , r )
for mc , r in zip ( retriever_methods , result ) :
results_dict [ mc . varname ] = rpc . process_result ( mc , r )
self . trackers . append ( Tracker (
self . _rt_obj , self . info_hash , * * results_dict ) )
self . trackers . append ( Tracker ( self . _rt_obj , self . info_hash , * * results_dict ) )
return ( self . trackers )
return self . trackers
def get_files ( self ) :
""" Get list of File instances for given torrent.
@ -128,18 +121,15 @@ class Torrent:
"""
self . files = [ ]
retriever_methods = [ m for m in rtorrent . file . methods
if m . is_retriever ( ) and m . is_available ( self . _rt_obj ) ]
retriever_methods = filter ( lambda m : m . is_retriever ( ) and m . is_available ( self . _rt_obj ) , file_methods )
mc = rpc . Multicall ( self )
# 2nd arg can be anything, but it'll return all files in torrent
# regardless
m = rtorrent . rpc . Multicall ( self )
m . add ( " f.multicall " , self . info_hash , " " ,
* [ method . rpc_call + " = " for method in retriever_methods ] )
mc . add ( ' f.multicall ' , self . info_hash , ' ' , * [ method . rpc_call + ' = ' for method in retriever_methods ] )
results = m . call ( ) [ 0 ] # only sent one call, only need first result
results = mc . call ( ) [ 0 ] # only sent one call, only need first result
offset_method_index = retriever_methods . index (
rtorrent . rpc . find_method ( " f.get_offset " ) )
offset_method_index = retriever_methods . index ( rpc . find_method ( ' f.get_offset ' ) )
# make a list of the offsets of all the files, sort appropriately
offset_list = sorted ( [ r [ offset_method_index ] for r in results ] )
@ -147,17 +137,33 @@ class Torrent:
for result in results :
results_dict = { }
# build results_dict
for m , r in zip ( retriever_methods , result ) :
results_dict [ m . varname ] = rtorrent . r pc . process_result ( m , r )
for mc , r in zip ( retriever_methods , result ) :
results_dict [ mc . varname ] = rpc . process_result ( mc , r )
# get proper index positions for each file (based on the file
# offset)
f_index = offset_list . index ( results_dict [ " offset " ] )
f_index = offset_list . index ( results_dict [ ' offset ' ] )
self . files . append ( File ( self . _rt_obj , self . info_hash , f_index , * * results_dict ) )
return self . files
def _get_method ( self , * choices ) :
try :
return filter ( lambda method : self . _rt_obj . method_exists ( method ) , choices ) [ 0 ]
except ( Exception , BaseException ) :
pass
self . files . append ( File ( self . _rt_obj , self . info_hash ,
f_index , * * results_dict ) )
def get_state ( self ) :
return ( self . files )
method = self . _get_method ( * ( ' d.get_state ' , ' d.state ' ) )
if method :
mc = rpc . Multicall ( self )
self . multicall_add ( mc , method )
return mc . call ( ) [ - 1 ]
def set_directory ( self , d ) :
""" Modify download directory
@ -166,11 +172,14 @@ class Torrent:
Also doesn ' t restart after directory is set, that must be called
separately .
"""
m = rtorrent . rpc . Multicall ( self )
self . multicall_add ( m , " d.try_stop " )
self . multicall_add ( m , " d.set_directory " , d )
method = self . _get_method ( * ( ' d.set_directory ' , ' d.directory.set ' ) )
if method :
mc = rpc . Multicall ( self )
self . multicall_add ( mc , ' d.try_stop ' )
self . multicall_add ( mc , method , d )
self . directory = m . call ( ) [ - 1 ]
self . directory = mc . call ( ) [ - 1 ]
def set_directory_base ( self , d ) :
""" Modify base download directory
@ -179,64 +188,74 @@ class Torrent:
Also doesn ' t restart after directory is set, that must be called
separately .
"""
m = rtorrent . rpc . Multicall ( self )
self . multicall_add ( m , " d.try_stop " )
self . multicall_add ( m , " d.set_directory_base " , d )
method = self . _get_method ( * ( ' d.set_directory_base ' , ' d.directory_base.set ' ) )
if method :
mc = rpc . Multicall ( self )
self . multicall_add ( mc , ' d.try_stop ' )
self . multicall_add ( mc , method , d )
def start ( self ) :
""" Start the torrent """
m = rtorrent . rpc . Multicall ( self )
self . multicall_add ( m , " d.try_start " )
self . multicall_add ( m , " d.is_active " )
mc = rpc . Multicall ( self )
self . multicall_add ( mc , ' d.try_start ' )
self . multicall_add ( mc , ' d.is_active ' )
self . active = m . call ( ) [ - 1 ]
return ( self . active )
self . active = mc . call ( ) [ - 1 ]
return self . active
def stop ( self ) :
""" " Stop the torrent """
m = rtorrent . rpc . Multicall ( self )
self . multicall_add ( m , " d.try_stop " )
self . multicall_add ( m , " d.is_active " )
mc = rpc . Multicall ( self )
self . multicall_add ( mc , ' d.try_stop ' )
self . multicall_add ( mc , ' d.is_active ' )
self . active = m . call ( ) [ - 1 ]
return ( self . active )
self . active = mc . call ( ) [ - 1 ]
return self . active
def pause ( self ) :
""" Pause the torrent """
m = rtorrent . rpc . Multicall ( self )
self . multicall_add ( m , " d.pause " )
mc = rpc . Multicall ( self )
return ( m . call ( ) [ - 1 ] )
self . multicall_add ( mc , ' d.pause ' )
return mc . call ( ) [ - 1 ]
def resume ( self ) :
""" Resume the torrent """
m = rtorrent . rpc . Multicall ( self )
self . multicall_add ( m , " d.resume " )
mc = rpc . Multicall ( self )
self . multicall_add ( mc , ' d.resume ' )
return ( m . call ( ) [ - 1 ] )
return mc . call ( ) [ - 1 ]
def close ( self ) :
""" Close the torrent and it ' s files """
m = rtorrent . rpc . Multicall ( self )
self . multicall_add ( m , " d.close " )
mc = rpc . Multicall ( self )
self . multicall_add ( mc , ' d.close ' )
return ( m . call ( ) [ - 1 ] )
return mc . call ( ) [ - 1 ]
def erase ( self ) :
""" Delete the torrent
@note : doesn ' t delete the downloaded files " " "
m = rtorrent . rpc . Multicall ( self )
self . multicall_add ( m , " d.erase " )
mc = rpc . Multicall ( self )
return ( m . call ( ) [ - 1 ] )
self . multicall_add ( mc , ' d.erase ' )
return mc . call ( ) [ - 1 ]
def check_hash ( self ) :
""" (Re)hash check the torrent """
m = rtorrent . rpc . Multicall ( self )
self . multicall_add ( m , " d.check_hash " )
mc = rpc . Multicall ( self )
self . multicall_add ( mc , ' d.check_hash ' )
return ( m . call ( ) [ - 1 ] )
return mc . call ( ) [ - 1 ]
def poll ( self ) :
""" poll rTorrent to get latest peer/tracker/file information """
@ -251,13 +270,12 @@ class Torrent:
@return : None
"""
multicall = rtorrent . rpc . Multicall ( self )
retriever_methods = [ m for m in methods
if m . is_retriever ( ) and m . is_available ( self . _rt_obj ) ]
for method in retriever_methods :
multicall . add ( method , self . rpc_id )
mc = rpc . Multicall ( self )
for method in filter ( lambda m : m . is_retriever ( ) and m . is_available ( self . _rt_obj ) , methods ) :
mc . add ( method , self . rpc_id )
multi call . call ( )
mc . call ( )
# custom functions (only call private methods, since they only check
# local variables and are therefore faster)
@ -268,27 +286,23 @@ class Torrent:
@param accept_seeds : enable / disable accepting seeders
@type accept_seeds : bool """
if accept_seeds :
call = " d.accepting_seeders.enable "
else :
call = " d.accepting_seeders.disable "
mc = rpc . Multicall ( self )
m = rtorrent . rpc . Multicall ( self )
self . multicall_add ( m , call )
self . multicall_add ( mc , ( ' d.accepting_seeders.disable ' , ' d.accepting_seeders.enable ' ) [ accept_seeds ] )
return ( m . call ( ) [ - 1 ] )
return mc . call ( ) [ - 1 ]
def announce ( self ) :
""" Announce torrent info to tracker(s) """
m = rtorrent . rpc . Multicall ( self )
self . multicall_add ( m , " d.tracker_announce " )
mc = rpc . Multicall ( self )
return ( m . call ( ) [ - 1 ] )
self . multicall_add ( mc , ' d.tracker_announce ' )
return mc . call ( ) [ - 1 ]
@staticmethod
def _assert_custom_key_valid ( key ) :
assert type ( key ) == int and key > 0 and key < 6 , \
" key must be an integer between 1-5 "
assert type ( key ) == int and 0 < key < 6 , ' key must be an integer between 1-5 '
def get_custom ( self , key ) :
"""
@ -301,13 +315,16 @@ class Torrent:
"""
self . _assert_custom_key_valid ( key )
m = rtorrent . rpc . Multicall ( self )
field = " custom {0} " . format ( key )
self . multicall_add ( m , " d.get_ {0} " . format ( field ) )
setattr ( self , field , m . call ( ) [ - 1 ] )
field = ' custom %s ' % key
method = self . _get_method ( * ( ' d.get_ %s ' % field , ' d. %s ' % field ) )
if method :
mc = rpc . Multicall ( self )
self . multicall_add ( mc , method )
return ( getattr ( self , field ) )
setattr ( self , field , mc . call ( ) [ - 1 ] )
return getattr ( self , field )
def set_custom ( self , key , value ) :
"""
@ -324,19 +341,23 @@ class Torrent:
"""
self . _assert_custom_key_valid ( key )
m = rtorrent . rpc . Multicall ( self )
self . multicall_add ( m , " d.set_custom {0} " . format ( key ) , value )
field = ' custom %s ' % key
method = self . _get_method ( * ( ' d.set_ %s ' % field , ' d. %s .set ' % field ) )
if method :
mc = rpc . Multicall ( self )
self . multicall_add ( mc , method , value )
return ( m . call ( ) [ - 1 ] )
return mc . call ( ) [ - 1 ]
def set_visible ( self , view , visible = True ) :
p = self . _rt_obj . _get_conn ( )
p = self . _rt_obj . get_connectio n ( )
if visible :
return p . view . set_visible ( self . info_hash , view )
else :
return p . view . set_not_visible ( self . info_hash , view )
return p . view . set_not_visible ( self . info_hash , view )
def add_tracker ( self , group , tracker ) :
"""
@ -351,10 +372,11 @@ class Torrent:
@return : if successful , 0
@rtype : int
"""
m = rtorrent . rpc . Multicall ( self )
self . multicall_add ( m , " d.tracker.insert " , group , tracker )
mc = rpc . Multicall ( self )
self . multicall_add ( mc , ' d.tracker.insert ' , group , tracker )
return ( m . call ( ) [ - 1 ] )
return mc . call ( ) [ - 1 ]
############################################################################
# CUSTOM METHODS (Not part of the official rTorrent API)
@ -366,45 +388,48 @@ class Torrent:
self . hash_checking_queued = ( self . hashing == 3 and
self . hash_checking is False )
return ( self . hash_checking_queued )
return self . hash_checking_queued
def is_hash_checking_queued ( self ) :
""" Check if torrent is waiting to be hash checked
@note : Variable where the result for this method is stored Torrent . hash_checking_queued """
m = rtorrent . rpc . Multicall ( self )
self . multicall_add ( m , " d.get_hashing " )
self . multicall_add ( m , " d.is_hash_checking " )
results = m . call ( )
setattr ( self , " hashing " , results [ 0 ] )
setattr ( self , " hash_checking " , results [ 1 ] )
method = self . _get_method ( * ( ' d.get_hashing ' , ' d.hashing ' ) )
if method :
mc = rpc . Multicall ( self )
self . multicall_add ( mc , method )
self . multicall_add ( mc , ' d.is_hash_checking ' )
results = mc . call ( )
return ( self . _is_hash_checking_queued ( ) )
setattr ( self , ' hashing ' , results [ 0 ] )
setattr ( self , ' hash_checking ' , results [ 1 ] )
return self . _is_hash_checking_queued ( )
def _is_paused ( self ) :
""" Only checks instance variables, shouldn ' t be called directly """
self . paused = ( self . state == 0 )
return ( self . paused )
return self . paused
def is_paused ( self ) :
""" Check if torrent is paused
@note : Variable where the result for this method is stored : Torrent . paused """
self . get_state ( )
return ( self . _is_paused ( ) )
return self . _is_paused ( )
def _is_started ( self ) :
""" Only checks instance variables, shouldn ' t be called directly """
self . started = ( self . state == 1 )
return ( self . started )
return self . started
def is_started ( self ) :
""" Check if torrent is started
@note : Variable where the result for this method is stored : Torrent . started """
self . get_state ( )
return ( self . _is_started ( ) )
return self . _is_started ( )
methods = [
@ -415,121 +440,197 @@ methods = [
Method ( Torrent , ' is_hash_checking ' , ' d.is_hash_checking ' ,
boolean = True ,
) ,
Method ( Torrent , ' get_peers_max ' , ' d.get_peers_max ' ) ,
Method ( Torrent , ' get_tracker_focus ' , ' d.get_tracker_focus ' ) ,
Method ( Torrent , ' get_skip_total ' , ' d.get_skip_total ' ) ,
Method ( Torrent , ' get_state ' , ' d.get_state ' ) ,
Method ( Torrent , ' get_peer_exchange ' , ' d.get_peer_exchange ' ) ,
Method ( Torrent , ' get_down_rate ' , ' d.get_down_rate ' ) ,
Method ( Torrent , ' get_connection_seed ' , ' d.get_connection_seed ' ) ,
Method ( Torrent , ' get_uploads_max ' , ' d.get_uploads_max ' ) ,
Method ( Torrent , ' get_priority_str ' , ' d.get_priority_str ' ) ,
Method ( Torrent , ' get_peers_max ' , ' d.get_peers_max ' ,
aliases = ( ' d.peers_max ' , ) ) ,
Method ( Torrent , ' get_tracker_focus ' , ' d.get_tracker_focus ' ,
aliases = ( ' d.tracker_focus ' , ) ) ,
Method ( Torrent , ' get_skip_total ' , ' d.get_skip_total ' ,
aliases = ( ' d.skip.total ' , ) ) ,
Method ( Torrent , ' get_state ' , ' d.get_state ' ,
aliases = ( ' d.state ' , ) ) ,
Method ( Torrent , ' get_peer_exchange ' , ' d.get_peer_exchange ' ,
aliases = ( ' d.peer_exchange ' , ) ) ,
Method ( Torrent , ' get_down_rate ' , ' d.get_down_rate ' ,
aliases = ( ' d.down.rate ' , ) ) ,
Method ( Torrent , ' get_connection_seed ' , ' d.get_connection_seed ' ,
aliases = ( ' d.connection_seed ' , ) ) ,
Method ( Torrent , ' get_uploads_max ' , ' d.get_uploads_max ' ,
aliases = ( ' d.uploads_max ' , ) ) ,
Method ( Torrent , ' get_priority_str ' , ' d.get_priority_str ' ,
aliases = ( ' d.priority_str ' , ) ) ,
Method ( Torrent , ' is_open ' , ' d.is_open ' ,
boolean = True ,
) ,
Method ( Torrent , ' get_peers_min ' , ' d.get_peers_min ' ) ,
Method ( Torrent , ' get_peers_complete ' , ' d.get_peers_complete ' ) ,
Method ( Torrent , ' get_tracker_numwant ' , ' d.get_tracker_numwant ' ) ,
Method ( Torrent , ' get_connection_current ' , ' d.get_connection_current ' ) ,
Method ( Torrent , ' get_peers_min ' , ' d.get_peers_min ' ,
aliases = ( ' d.peers_min ' , ) ) ,
Method ( Torrent , ' get_peers_complete ' , ' d.get_peers_complete ' ,
aliases = ( ' d.peers_complete ' , ) ) ,
Method ( Torrent , ' get_tracker_numwant ' , ' d.get_tracker_numwant ' ,
aliases = ( ' d.tracker_numwant ' , ) ) ,
Method ( Torrent , ' get_connection_current ' , ' d.get_connection_current ' ,
aliases = ( ' d.connection_current ' , ) ) ,
Method ( Torrent , ' is_complete ' , ' d.get_complete ' ,
boolean = True ,
aliases = ( ' d.complete ' , )
) ,
Method ( Torrent , ' get_peers_connected ' , ' d.get_peers_connected ' ) ,
Method ( Torrent , ' get_chunk_size ' , ' d.get_chunk_size ' ) ,
Method ( Torrent , ' get_state_counter ' , ' d.get_state_counter ' ) ,
Method ( Torrent , ' get_base_filename ' , ' d.get_base_filename ' ) ,
Method ( Torrent , ' get_state_changed ' , ' d.get_state_changed ' ) ,
Method ( Torrent , ' get_peers_not_connected ' , ' d.get_peers_not_connected ' ) ,
Method ( Torrent , ' get_directory ' , ' d.get_directory ' ) ,
Method ( Torrent , ' get_peers_connected ' , ' d.get_peers_connected ' ,
aliases = ( ' d.peers_connected ' , ) ) ,
Method ( Torrent , ' get_chunk_size ' , ' d.get_chunk_size ' ,
aliases = ( ' d.chunk_size ' , ) ) ,
Method ( Torrent , ' get_state_counter ' , ' d.get_state_counter ' ,
aliases = ( ' d.state_counter ' , ) ) ,
Method ( Torrent , ' get_base_filename ' , ' d.get_base_filename ' ,
aliases = ( ' d.base_filename ' , ) ) ,
Method ( Torrent , ' get_state_changed ' , ' d.get_state_changed ' ,
aliases = ( ' d.state_changed ' , ) ) ,
Method ( Torrent , ' get_peers_not_connected ' , ' d.get_peers_not_connected ' ,
aliases = ( ' d.peers_not_connected ' , ) ) ,
Method ( Torrent , ' get_directory ' , ' d.get_directory ' ,
aliases = ( ' d.directory ' , ) ) ,
Method ( Torrent , ' is_incomplete ' , ' d.incomplete ' ,
boolean = True ,
) ,
Method ( Torrent , ' get_tracker_size ' , ' d.get_tracker_size ' ) ,
Method ( Torrent , ' get_tracker_size ' , ' d.get_tracker_size ' ,
aliases = ( ' d.tracker_size ' , ) ) ,
Method ( Torrent , ' is_multi_file ' , ' d.is_multi_file ' ,
boolean = True ,
) ,
Method ( Torrent , ' get_local_id ' , ' d.get_local_id ' ) ,
Method ( Torrent , ' get_local_id ' , ' d.get_local_id ' ,
aliases = ( ' d.local_id ' , ) ) ,
Method ( Torrent , ' get_ratio ' , ' d.get_ratio ' ,
post_process_func = lambda x : x / 1000.0 ,
aliases = ( ' d.ratio ' , )
) ,
Method ( Torrent , ' get_loaded_file ' , ' d.get_loaded_file ' ) ,
Method ( Torrent , ' get_max_file_size ' , ' d.get_max_file_size ' ) ,
Method ( Torrent , ' get_size_chunks ' , ' d.get_size_chunks ' ) ,
Method ( Torrent , ' get_loaded_file ' , ' d.get_loaded_file ' ,
aliases = ( ' d.loaded_file ' , ) ) ,
Method ( Torrent , ' get_max_file_size ' , ' d.get_max_file_size ' ,
aliases = ( ' d.max_file_size ' , ) ) ,
Method ( Torrent , ' get_size_chunks ' , ' d.get_size_chunks ' ,
aliases = ( ' d.size_chunks ' , ) ) ,
Method ( Torrent , ' is_pex_active ' , ' d.is_pex_active ' ,
boolean = True ,
) ,
Method ( Torrent , ' get_hashing ' , ' d.get_hashing ' ) ,
Method ( Torrent , ' get_bitfield ' , ' d.get_bitfield ' ) ,
Method ( Torrent , ' get_local_id_html ' , ' d.get_local_id_html ' ) ,
Method ( Torrent , ' get_connection_leech ' , ' d.get_connection_leech ' ) ,
Method ( Torrent , ' get_peers_accounted ' , ' d.get_peers_accounted ' ) ,
Method ( Torrent , ' get_message ' , ' d.get_message ' ) ,
Method ( Torrent , ' get_hashing ' , ' d.get_hashing ' ,
aliases = ( ' d.hashing ' , ) ) ,
Method ( Torrent , ' get_bitfield ' , ' d.get_bitfield ' ,
aliases = ( ' d.bitfield ' , ) ) ,
Method ( Torrent , ' get_local_id_html ' , ' d.get_local_id_html ' ,
aliases = ( ' d.bitfield ' , ) ) ,
Method ( Torrent , ' get_connection_leech ' , ' d.get_connection_leech ' ,
aliases = ( ' d.connection_leech ' , ) ) ,
Method ( Torrent , ' get_peers_accounted ' , ' d.get_peers_accounted ' ,
aliases = ( ' d.peers_accounted ' , ) ) ,
Method ( Torrent , ' get_message ' , ' d.get_message ' ,
aliases = ( ' d.message ' , ) ) ,
Method ( Torrent , ' is_active ' , ' d.is_active ' ,
boolean = True ,
) ,
Method ( Torrent , ' get_size_bytes ' , ' d.get_size_bytes ' ) ,
Method ( Torrent , ' get_ignore_commands ' , ' d.get_ignore_commands ' ) ,
Method ( Torrent , ' get_creation_date ' , ' d.get_creation_date ' ) ,
Method ( Torrent , ' get_base_path ' , ' d.get_base_path ' ) ,
Method ( Torrent , ' get_left_bytes ' , ' d.get_left_bytes ' ) ,
Method ( Torrent , ' get_size_files ' , ' d.get_size_files ' ) ,
Method ( Torrent , ' get_size_pex ' , ' d.get_size_pex ' ) ,
Method ( Torrent , ' get_size_bytes ' , ' d.get_size_bytes ' ,
aliases = ( ' d.size_bytes ' , ) ) ,
Method ( Torrent , ' get_ignore_commands ' , ' d.get_ignore_commands ' ,
aliases = ( ' d.ignore_commands ' , ) ) ,
Method ( Torrent , ' get_creation_date ' , ' d.get_creation_date ' ,
aliases = ( ' d.creation_date ' , ) ) ,
Method ( Torrent , ' get_base_path ' , ' d.get_base_path ' ,
aliases = ( ' d.base_path ' , ) ) ,
Method ( Torrent , ' get_left_bytes ' , ' d.get_left_bytes ' ,
aliases = ( ' d.left_bytes ' , ) ) ,
Method ( Torrent , ' get_size_files ' , ' d.get_size_files ' ,
aliases = ( ' d.size_files ' , ) ) ,
Method ( Torrent , ' get_size_pex ' , ' d.get_size_pex ' ,
aliases = ( ' d.size_pex ' , ) ) ,
Method ( Torrent , ' is_private ' , ' d.is_private ' ,
boolean = True ,
) ,
Method ( Torrent , ' get_max_size_pex ' , ' d.get_max_size_pex ' ) ,
Method ( Torrent , ' get_num_chunks_hashed ' , ' d.get_chunks_hashed ' ,
aliases = ( " get_chunks_hashed " , ) ) ,
aliases = ( ' get_chunks_hashed ' , ' d.chunks_hashed ' ) ) ,
Method ( Torrent , ' get_num_chunks_wanted ' , ' d.wanted_chunks ' ) ,
Method ( Torrent , ' get_priority ' , ' d.get_priority ' ) ,
Method ( Torrent , ' get_skip_rate ' , ' d.get_skip_rate ' ) ,
Method ( Torrent , ' get_completed_bytes ' , ' d.get_completed_bytes ' ) ,
Method ( Torrent , ' get_name ' , ' d.get_name ' ) ,
Method ( Torrent , ' get_completed_chunks ' , ' d.get_completed_chunks ' ) ,
Method ( Torrent , ' get_throttle_name ' , ' d.get_throttle_name ' ) ,
Method ( Torrent , ' get_free_diskspace ' , ' d.get_free_diskspace ' ) ,
Method ( Torrent , ' get_directory_base ' , ' d.get_directory_base ' ) ,
Method ( Torrent , ' get_hashing_failed ' , ' d.get_hashing_failed ' ) ,
Method ( Torrent , ' get_tied_to_file ' , ' d.get_tied_to_file ' ) ,
Method ( Torrent , ' get_down_total ' , ' d.get_down_total ' ) ,
Method ( Torrent , ' get_bytes_done ' , ' d.get_bytes_done ' ) ,
Method ( Torrent , ' get_up_rate ' , ' d.get_up_rate ' ) ,
Method ( Torrent , ' get_up_total ' , ' d.get_up_total ' ) ,
Method ( Torrent , ' get_priority ' , ' d.get_priority ' ,
aliases = ( ' d.priority ' , ) ) ,
Method ( Torrent , ' get_skip_rate ' , ' d.get_skip_rate ' ,
aliases = ( ' d.skip.rate ' , ) ) ,
Method ( Torrent , ' get_completed_bytes ' , ' d.get_completed_bytes ' ,
aliases = ( ' d.completed_bytes ' , ) ) ,
Method ( Torrent , ' get_name ' , ' d.get_name ' ,
aliases = ( ' d.name ' , ) ) ,
Method ( Torrent , ' get_completed_chunks ' , ' d.get_completed_chunks ' ,
aliases = ( ' d.completed_chunks ' , ) ) ,
Method ( Torrent , ' get_throttle_name ' , ' d.get_throttle_name ' ,
aliases = ( ' d.throttle_name ' , ) ) ,
Method ( Torrent , ' get_free_diskspace ' , ' d.get_free_diskspace ' ,
aliases = ( ' d.free_diskspace ' , ) ) ,
Method ( Torrent , ' get_directory_base ' , ' d.get_directory_base ' ,
aliases = ( ' d.directory_base ' , ) ) ,
Method ( Torrent , ' get_hashing_failed ' , ' d.get_hashing_failed ' ,
aliases = ( ' d.hashing_failed ' , ) ) ,
Method ( Torrent , ' get_tied_to_file ' , ' d.get_tied_to_file ' ,
aliases = ( ' d.tied_to_file ' , ) ) ,
Method ( Torrent , ' get_down_total ' , ' d.get_down_total ' ,
aliases = ( ' d.down.total ' , ) ) ,
Method ( Torrent , ' get_bytes_done ' , ' d.get_bytes_done ' ,
aliases = ( ' d.bytes_done ' , ) ) ,
Method ( Torrent , ' get_up_rate ' , ' d.get_up_rate ' ,
aliases = ( ' d.up.rate ' , ) ) ,
Method ( Torrent , ' get_up_total ' , ' d.get_up_total ' ,
aliases = ( ' d.up.total ' , ) ) ,
Method ( Torrent , ' is_accepting_seeders ' , ' d.accepting_seeders ' ,
boolean = True ,
) ,
Method ( Torrent , " get_chunks_seen " , " d.chunks_seen " ,
Method ( Torrent , ' get_chunks_seen ' , ' d.chunks_seen ' ,
min_version = ( 0 , 9 , 1 ) ,
) ,
Method ( Torrent , " is_partially_done " , " d.is_partially_done " ,
Method ( Torrent , ' is_partially_done ' , ' d.is_partially_done ' ,
boolean = True ,
) ,
Method ( Torrent , " is_not_partially_done " , " d.is_not_partially_done " ,
Method ( Torrent , ' is_not_partially_done ' , ' d.is_not_partially_done ' ,
boolean = True ,
) ,
Method ( Torrent , " get_time_started " , " d.timestamp.started " ) ,
Method ( Torrent , " get_custom1 " , " d.get_custom1 " ) ,
Method ( Torrent , " get_custom2 " , " d.get_custom2 " ) ,
Method ( Torrent , " get_custom3 " , " d.get_custom3 " ) ,
Method ( Torrent , " get_custom4 " , " d.get_custom4 " ) ,
Method ( Torrent , " get_custom5 " , " d.get_custom5 " ) ,
Method ( Torrent , ' get_time_started ' , ' d.timestamp.started ' ) ,
Method ( Torrent , ' get_custom1 ' , ' d.get_custom1 ' ,
aliases = ( ' d.custom1 ' , ) ) ,
Method ( Torrent , ' get_custom2 ' , ' d.get_custom2 ' ,
aliases = ( ' d.custom2 ' , ) ) ,
Method ( Torrent , ' get_custom3 ' , ' d.get_custom3 ' ,
aliases = ( ' d.custom3 ' , ) ) ,
Method ( Torrent , ' get_custom4 ' , ' d.get_custom4 ' ,
aliases = ( ' d.custom4 ' , ) ) ,
Method ( Torrent , ' get_custom5 ' , ' d.get_custom5 ' ,
aliases = ( ' d.custom5 ' , ) ) ,
# MODIFIERS
Method ( Torrent , ' set_uploads_max ' , ' d.set_uploads_max ' ) ,
Method ( Torrent , ' set_tied_to_file ' , ' d.set_tied_to_file ' ) ,
Method ( Torrent , ' set_tracker_numwant ' , ' d.set_tracker_numwant ' ) ,
Method ( Torrent , ' set_priority ' , ' d.set_priority ' ) ,
Method ( Torrent , ' set_peers_max ' , ' d.set_peers_max ' ) ,
Method ( Torrent , ' set_hashing_failed ' , ' d.set_hashing_failed ' ) ,
Method ( Torrent , ' set_message ' , ' d.set_message ' ) ,
Method ( Torrent , ' set_throttle_name ' , ' d.set_throttle_name ' ) ,
Method ( Torrent , ' set_peers_min ' , ' d.set_peers_min ' ) ,
Method ( Torrent , ' set_ignore_commands ' , ' d.set_ignore_commands ' ) ,
Method ( Torrent , ' set_max_file_size ' , ' d.set_max_file_size ' ) ,
Method ( Torrent , ' set_custom5 ' , ' d.set_custom5 ' ) ,
Method ( Torrent , ' set_custom4 ' , ' d.set_custom4 ' ) ,
Method ( Torrent , ' set_custom2 ' , ' d.set_custom2 ' ) ,
Method ( Torrent , ' set_custom1 ' , ' d.set_custom1 ' ) ,
Method ( Torrent , ' set_custom3 ' , ' d.set_custom3 ' ) ,
Method ( Torrent , ' set_connection_current ' , ' d.set_connection_current ' ) ,
Method ( Torrent , ' set_uploads_max ' , ' d.set_uploads_max ' ,
aliases = ( ' d.uploads_max.set ' , ) ) ,
Method ( Torrent , ' set_tied_to_file ' , ' d.set_tied_to_file ' ,
aliases = ( ' d.tied_to_file.set ' , ) ) ,
Method ( Torrent , ' set_tracker_numwant ' , ' d.set_tracker_numwant ' ,
aliases = ( ' d.tracker_numwant.set ' , ) ) ,
Method ( Torrent , ' set_priority ' , ' d.set_priority ' ,
aliases = ( ' d.priority.set ' , ) ) ,
Method ( Torrent , ' set_peers_max ' , ' d.set_peers_max ' ,
aliases = ( ' d.peers_max.set ' , ) ) ,
Method ( Torrent , ' set_hashing_failed ' , ' d.set_hashing_failed ' ,
aliases = ( ' d.hashing_failed.set ' , ) ) ,
Method ( Torrent , ' set_message ' , ' d.set_message ' ,
aliases = ( ' d.message.set ' , ) ) ,
Method ( Torrent , ' set_throttle_name ' , ' d.set_throttle_name ' ,
aliases = ( ' d.throttle_name.set ' , ) ) ,
Method ( Torrent , ' set_peers_min ' , ' d.set_peers_min ' ,
aliases = ( ' d.peers_min.set ' , ) ) ,
Method ( Torrent , ' set_ignore_commands ' , ' d.set_ignore_commands ' ,
aliases = ( ' d.ignore_commands.set ' , ) ) ,
Method ( Torrent , ' set_max_file_size ' , ' d.set_max_file_size ' ,
aliases = ( ' d.max_file_size.set ' , ) ) ,
Method ( Torrent , ' set_custom5 ' , ' d.set_custom5 ' ,
aliases = ( ' d.custom5.set ' , ) ) ,
Method ( Torrent , ' set_custom4 ' , ' d.set_custom4 ' ,
aliases = ( ' d.custom4.set ' , ) ) ,
Method ( Torrent , ' set_custom2 ' , ' d.set_custom2 ' ,
aliases = ( ' d.custom2.set ' , ) ) ,
Method ( Torrent , ' set_custom1 ' , ' d.set_custom1 ' ,
aliases = ( ' d.custom1.set ' , ) ) ,
Method ( Torrent , ' set_custom3 ' , ' d.set_custom3 ' ,
aliases = ( ' d.custom3.set ' , ) ) ,
Method ( Torrent , ' set_connection_current ' , ' d.set_connection_current ' ,
aliases = ( ' d.connection_current.set ' , ) ) ,
]