11#-*- coding:utf-8 -*-
22import requests
33import time
4+ from .. import logger
45from ..torrent import Torrent
6+ from ..clientstatus import ClientStatus
57from ..torrentstatus import TorrentStatus
8+ from ..portstatus import PortStatus
69from ..exception .loginfailure import LoginFailure
710from ..exception .connectionfailure import ConnectionFailure
811from ..exception .incompatibleapi import IncompatibleAPIVersion
@@ -37,6 +40,10 @@ def client_version(self):
3740 def login (self , username , password ):
3841 return self ._session .post (self ._host + '/login' , data = {'username' :username , 'password' :password })
3942
43+ # Get server state
44+ def server_state (self ):
45+ return self ._session .get (self ._host + '/sync/maindata' )
46+
4047 # Get torrent list
4148 def torrent_list (self ):
4249 return self ._session .get (self ._host + '/query/torrents' )
@@ -86,6 +93,10 @@ def client_version(self):
8693 def login (self , username , password ):
8794 return self ._session .post (self ._host + '/api/v2/auth/login' , data = {'username' :username , 'password' :password })
8895
96+ # Get server state
97+ def server_state (self ):
98+ return self ._session .get (self ._host + '/api/v2/sync/maindata' )
99+
89100 # Get torrent list
90101 def torrent_list (self ):
91102 return self ._session .get (self ._host + '/api/v2/torrents/info' )
@@ -107,6 +118,9 @@ def delete_torrents_and_data(self, torrent_hash_list):
107118 return self ._session .get (self ._host + '/api/v2/torrents/delete' , params = {'hashes' :'|' .join (torrent_hash_list ), 'deleteFiles' : True })
108119
109120 def __init__ (self , host ):
121+ # Logger
122+ self ._logger = logger .Logger .register (__name__ )
123+
110124 # Torrents list cache
111125 self ._torrents_list_cache = []
112126 self ._refresh_cycle = 30
@@ -135,6 +149,29 @@ def login(self, username, password):
135149 else :
136150 raise LoginFailure ('The server returned HTTP %d.' % request .status_code )
137151
152+ # Get client status
153+ def client_status (self ):
154+ status = self ._request_handler .server_state ().json ()['server_state' ]
155+
156+ cs = ClientStatus ()
157+ # Remote free space checker
158+ cs .free_space = self .remote_free_space
159+ # Downloading speed and downloaded size
160+ cs .download_speed = status ['dl_info_speed' ]
161+ cs .total_downloaded = status ['dl_info_data' ]
162+ # Uploading speed and uploaded size
163+ cs .upload_speed = status ['up_info_speed' ]
164+ cs .total_uploaded = status ['up_info_data' ]
165+ # Outgoing port status
166+ if status ['connection_status' ] == 'connected' :
167+ cs .port_status = PortStatus .Open
168+ elif status ['connection_status' ] == 'firewalled' :
169+ cs .port_status = PortStatus .Firewalled
170+ else :
171+ cs .port_status = PortStatus .Closed
172+
173+ return cs
174+
138175 # Get qBittorrent Version
139176 def version (self ):
140177 request = self ._request_handler .client_version ()
@@ -182,6 +219,7 @@ def torrent_properties(self, torrent_hash):
182219 torrent_obj .size = torrent ['size' ]
183220 torrent_obj .ratio = torrent ['ratio' ]
184221 torrent_obj .uploaded = properties ['total_uploaded' ]
222+ torrent_obj .downloaded = properties ['total_downloaded' ]
185223 torrent_obj .create_time = properties ['addition_date' ]
186224 torrent_obj .seeding_time = properties ['seeding_time' ]
187225 torrent_obj .upload_speed = properties ['up_speed' ]
@@ -200,6 +238,18 @@ def torrent_properties(self, torrent_hash):
200238
201239 return torrent_obj
202240
241+ # Get free space
242+ def remote_free_space (self , path ):
243+ # Actually the path is ignored
244+ self ._logger .info ('Get Free Space: The path is ignored ' +
245+ 'since qBitorrent does not support to specific a path to check the free space.' )
246+ status = self ._request_handler .server_state ().json ()['server_state' ]
247+
248+ # There is no free space data in qBittorrent 3.x
249+ if 'free_space_on_disk' in status :
250+ return status ['free_space_on_disk' ]
251+ return None
252+
203253 # Judge Torrent Status (qBittorrent doesn't have stopped status)
204254 @staticmethod
205255 def _judge_status (state ):
0 commit comments