
    iI                        S r SSKrSSKrSSKrSSKJr  SSKJr  SSKJ	r	J
r
JrJrJrJrJrJrJrJrJrJrJrJr  SSKrSSKJr  SSKJr  SSKJr  SS	KJ r   SS
K!J"r"  SSK#J$r$  SSK%J&r&  SSK'J(r(J)r)  \	(       a  SSK*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2  Sr3\" S5      r4\" S5      r5 " S S5      r6 " S S\S9r7S(S\8S\\\8\
4      S\84S jjr9  S)SSSS.S\8S\\8   S\\8   S\\:   S\\Rv                     S \\   S\64S! jjjr<S"\\(\\=\=\=4   4   S\\4/\44   4S# jr>\S$SS\\4/\44   4S% j5       r?\S$\4S\44S& j5       r?S(S$\
S\
4S' jjr?g)*
    N)ABCMeta)
SSLContext)TYPE_CHECKINGAnyCallableDictListMappingNoReturnOptionalSequenceTupleTypeTypeVarUnionoverload)RETRY_AFTER)Self)URL)exc)cached_property)	ParamDict)ObjectMapper)
APIVersionClientVersion)AppAPIAuthAPILogAPIRSSAPI	SearchAPISyncAPITorrentsAPITransferAPI)	APIClientAPIGroupcreate_clientTKc                      \ rS rSrSrSSSSSSSS.S\S\\   S\\R                     S\\
   S	\\   S
\\   S\\   S\\R                     SS4S jjrS\4S jrS\4S jrS\\\      S\\   S\\R.                     SS4S jrS\4S jr\S\4S j5       rS>S jrSSSSSS.S\S\S\S\S\S \S\\
   S!\ S\RB                  4S" jjr"S#\S$\S%\\RB                     S\#\\4   4S& jr$S'\%S%\\RB                     S(\&S\'4S) jr(S\S\S!\S\4S* jr)S\S\S!\S\4S+ jr*S,\\+   S\,\\4   S\+4S- jr-S,\\+   S\.\,\\4      S\/\+   4S. jr0S,\\+   S\,\1\,\\4   4   S\2\1\+4   4S/ jr3\S\\   4S0 j5       r4\4Rj                  S1\\   SS4S2 j5       r4\S\\   4S3 j5       r6\6Rj                  S1\\   SS4S4 j5       r6\7S?S5 j5       r8\7S@S6 j5       r9\7SAS7 j5       r:\7SBS8 j5       r;\7SCS9 j5       r<\7SDS: j5       r=\7SES; j5       r>\7SFS< j5       r?S=r@g)Gr%   ;   z(
Represent a remote qBittorrent client.
N)mapperhttpsslclient_versionapi_versionlogout_when_closeloggerbase_urlr,   r-   r.   r/   r0   r1   r2   returnc                   UcC  [         R                  " [        U 5      R                  < S[        U 5      R                  < 35      nUR                  S5      nUc
  [        5       nUc  [        R                  " 5       nSn	OSn	UUUS.n
Xl	        X l
        Xl        X0l        Xl        X@l        Xl        1 SkU l        Xpl        g )N./TF)r,   r/   r0   >         )logging	getLoggertype
__module____qualname__rstripr   aiohttpClientSession_logger_mapper_context_http_http_owner_sslr3   _retry_statuses_logout_when_close)selfr3   r,   r-   r.   r/   r0   r1   r2   
http_ownercontexts              :/app/mltbenv/lib/python3.13/site-packages/aioqbt/client.py__init__APIClient.__init__@   s     >&&:00$t*2I2IJF ??3'>!^F<((*DJJ ,&#
 6:
%	  

 #4    c                 P    S[        U 5      R                   SU R                  < S3$ )N< >)r=   __name__r3   rK   s    rN   __repr__APIClient.__repr__p   s'    4:&&'q(9;;rQ   c                    #    U $ 7fN rW   s    rN   
__aenter__APIClient.__aenter__s   s
     s   exc_typeexc_valexc_tbc                 @   #    U R                  5       I S h  vN   g  N7fr[   )close)rK   r_   r`   ra   s       rN   	__aexit__APIClient.__aexit__v   s      jjls   c                     U R                   SL $ )zTell whether client is closedNrF   rW   s    rN   	is_closedAPIClient.is_closed~   s    zzT!!rQ   c                     U R                   S L $ r[   rg   rW   s    rN   closedAPIClient.closed   s     zzT!!rQ   c                    #    U R                   c  gU R                  (       a#   U R                  R                  5       I Sh  vN   [        U 5      nS HO  nX!;  a  M
  [        XS5      n[        U[        5      (       d  M-  UR                  5         UR                  US5        MQ     U R                  (       a"  U R                   R                  5       I Sh  vN   SU l         g N! [        R
                   a     Nf = f N(7f)z=
Close client.

Release/detach resources acquired by client.
N)appauthlogsynctorrentstransfer)rF   rJ   ro   logoutr   ForbiddenErrorvarsgetattr
isinstancer&   _closepoprG   rc   )rK   	vars_dictnamegroups       rN   rc   APIClient.close   s      ::""ii&&(((
 J	JD$D-E%**dD) K **""$$$ 
) )%%   %sM    C>C"  C C" 6C>?AC>C<C> C" "C96C>8C99C>      )paramsdatamax_attemptsretry_delayr.   methodendpointr   r   r   r   kwargsc                z  #    US::  a  [        SU< 35      eUR                  5       S;  a  SnU R                  c  [        S5      eU R                  S-   UR                  S5      -   n	[        U[        5      (       a  UR                  5       n[        U[        5      (       a  UR                  5       nUc  U R                  nSn
 SnS	n U R                  R                  " UU	4UUUS
S.UD6I Sh  vN nUR                  S:X  a  U$ UR                  5       I Sh  vN nUR                  5         [        R                  " UR                   UR"                  UR                  [%        UR&                  5      UR(                  S9e N Ni! [        R*                  [        R                  4 a3  nU R,                  R/                  SU
UU[1        X5      SS9  Un SnAOSnAff = fX:  aC  U R3                  XnU5      u  nnU(       a'  U
S-  n
[4        R6                  " U5      I Sh  vN    GMd  U R9                  XU5        GMx  7f)a  
Send an HTTP request and return a response object.

Argument ``method`` specifies the HTTP method (e.g. ``GET``)
while ``endpoint`` the API endpoint (e.g. ``torrents/info``).

``params`` forms the query string of the request URL.
``data`` is the payload in the request body.
See the underlying :meth:`ClientSession.request <aiohttp.ClientSession.request>`
for their allowed values.

``max_attempts`` is the maximum number of attempts.
Retry is performed if two additional conditions are satisfied:

* ``GET`` or ``HEAD`` requets
* Remote disconnection, or repsonse status
  429 (Too many requests), 503 (Service unavailable), or 502 (Bad gateway).

The result is :class:`aiohttp.ClientResponse`, and should be used in ``async with``.

:param str method: HTTP method.
:param str endpoint: API endpoint.
:param params: parameters in query string
:param data: data in request body
:param int max_attempts: maximum number of attempts
:param float retry_delay: maximum delay between attempts
:param ssl: :class:`~ssl.SSLContext`, optional
:raise APIError: API errors (non-``200`` status).
:raise aiohttp.ClientError: connection errors
:return: :class:`~aiohttp.ClientResponse`
r   zmax_attempts <= 0: )GETHEAD   Nclosed clientr7   TrQ   F)r   r   r.   raise_for_status   )statusmessageheaderszRequest %d/%d: %s %r)exc_info)
ValueErrorupperrF   RuntimeErrorr3   lstriprx   r   to_dictrH   requestr   readreleaserA   ClientResponseErrorrequest_infohistorystrreasonr   ServerDisconnectedErrorrC   warning	_real_url_retry_strategyasynciosleep_handle_error)rK   r   r   r   r   r   r   r.   r   urlattempt_countresp	resp_bodyexlast_excshould_retrysleeping_times                    rN   r   APIClient.request   s"    X 12<2BCDD\\^?2L:://mmc!HOOC$88fi((^^%FdI&&<<>D;))C59D"I&!ZZ// "%*   ;;#%K #'))+-	11%%LL;;, LL % . //++  $$*! c*! %   +.2.B.B;Z^._+m!Q&M!--666xy9i sb   CH;&F .F /F H;F FA(F F $G()GH;GAH;H H;retry_pauser   r   c                 >   Uc$  [        U[        R                  5      (       a  SU4$ gUR                  U R                  ;  a  gSn[
        UR                  ;   a%   [        UR                  [
           5      nUS:  a  SnUc  SU4$ XA::  a  SU4$ g! [         a     gf = f)z`
Ruturn a tuple of a bool and a sleeping time.

The bool indicate whether retry should be made.
NT)Fr   r   )	rx   rA   r   r   rI   _RETRY_AFTERr   intr   )rK   r   r   r   retry_afters        rN   r   APIClient._retry_strategy  s     <"g==>>[((;;d222%)4<<'	 !$,,|"<=?"&K $$'$$      s   $B 
BBerrorr   c                     Uc  Ue UR                  SS5      n[        R                  R	                  UR
                  [        R                  5      nUR                  X$5      Ue! [         a    Sn NXf = f)z(
Handle errors which are not retryable.
utf-8strict )decodeUnicodeDecodeErrorr   _ERROR_TABLEgetr   APIErrorfrom_response)rK   r   r   r   r   	exc_classs         rN   r   APIClient._handle_errorL  sp     <K	&&w9G $$((cllC	%%d4%?	 " 	G	s   A# #A21A2c                    #    U R                   " X40 UD6I Sh  vN nU ISh  vN   UR                  SS9I Sh  vN sSSS5      ISh  vN   $  N7 N. N N! , ISh  vN  (       d  f       g= f7f)z"
Send a request and return a str.
Nr   )encoding)r   text)rK   r   r   r   r   s        rN   request_textAPIClient.request_textb  sR      \\&=f==4G44 44 >4 444sc   A3A
A3AA3AAAA3AA3A3AA3A0A" A0,A3c                    #    U R                   " X40 UD6I Sh  vN nU ISh  vN   UR                  5       I Sh  vN nSSS5      ISh  vN   U$  N9 N0 N N! , ISh  vN  (       d  f       W$ = f7f)z2
Send a request and return a JSON-decoded object.
N)r   json)rK   r   r   r   r   results         rN   request_jsonAPIClient.request_jsonp  sY      \\&=f==499;&F 4 	 >& 44 sd   A6A
A6AA6AAAA6AA6A6AA6A3!A$"A3.A6rtypec                 N    U R                   R                  XU R                  5      $ r[   )rD   create_objectrE   rK   r   r   s      rN   _create_objectAPIClient._create_object  s    ||))%t}}EErQ   c                 N    U R                   R                  XU R                  5      $ r[   )rD   create_listrE   r   s      rN   _create_listAPIClient._create_list      ||''T]]CCrQ   c                 N    U R                   R                  XU R                  5      $ r[   )rD   create_dictrE   r   s      rN   _create_dictAPIClient._create_dict  r   rQ   c                 8    U R                   R                  S5      $ )zqBittorrent client versionr/   rE   r   rW   s    rN   r/   APIClient.client_version  s     }}  !122rQ   versionc                      XR                   S'   g )Nr/   rE   rK   r   s     rN   r/   r     s    *1&'rQ   c                 8    U R                   R                  S5      $ )zqBittorrent API versionr0   r   rW   s    rN   r0   APIClient.api_version  s     }}  //rQ   c                      XR                   S'   g )Nr0   r   r   s     rN   r0   r     s    '.m$rQ   c                     SSK Jn  U" U 5      $ )z
Application API methods.
r   )r   )aioqbt.api.appr   )rK   r   s     rN   rn   APIClient.app      
 	*d|rQ   c                     SSK Jn  U" U 5      $ )z
Authentication API methods.
r   )r   )aioqbt.api.authr   )rK   r   s     rN   ro   APIClient.auth      
 	,t}rQ   c                     SSK Jn  U" U 5      $ )z
Log API methods.
r   )r   )aioqbt.api.logr   )rK   r   s     rN   rp   APIClient.log  r   rQ   c                     SSK Jn  U" U 5      $ )z
RSS API methods.
r   )r    )aioqbt.api.rssr    )rK   r    s     rN   rssAPIClient.rss  r   rQ   c                     SSK Jn  U" U 5      $ )z
Search API methods.
r   )r!   )aioqbt.api.searchr!   )rK   r!   s     rN   searchAPIClient.search  s    
 	0rQ   c                     SSK Jn  U" U 5      $ )z
Sync API methods.
r   )r"   )aioqbt.api.syncr"   )rK   r"   s     rN   rq   APIClient.sync  r   rQ   c                     SSK Jn  U" U 5      $ )z
Torrents API methods.
r   )r#   )aioqbt.api.torrentsr#   )rK   r#   s     rN   rr   APIClient.torrents      
 	44  rQ   c                     SSK Jn  U" U 5      $ )z
Transfer API methods.
r   )r$   )aioqbt.api.transferr$   )rK   r$   s     rN   rs   APIClient.transfer  r   rQ   )	rE   rF   rG   rC   rJ   rD   rI   rH   r3   r4   N)r4   r   )r4   r   )r4   r   )r4   r    )r4   r!   )r4   r"   )r4   r#   )r4   r$   )ArV   r>   r?   __firstlineno____doc__r   r   r   rA   rB   r   r   r   boolr;   LoggerrO   rX   r   r]   r   BaseExceptiontypesTracebackTyperd   rh   propertyrk   rc   r   r   floatobjectClientResponser   r   r   	Exceptionbytesr   r   r   r   r(   r   r   r   r
   r   r)   r	   r   r/   setterr0   r   rn   ro   rp   r   r   rq   rr   rs   __static_attributes__r\   rQ   rN   r%   r%   ;   se    *.04$(26,0,0+/.4.4 &	.4
 w,,-.4 j!.4 !/.4 j).4 $D>.4 (.4 
.4`<# <$ 4./ -( ,,-	
 
"4 " " " " N $(t:t: t:
 t: t: t: t: j!t: t: 
		t:l++ + w--.	+
 
tU{	+Z@@ w--.@ 	@
 
@,55 5 	5
 
5  	
 
FDG F7383D F FD$q' D'#s(:K1L DQUVWQX DD$q' DGCH<M9M1N DSWXY[\X\S] D 3 7 3 3 2h}&= 2$ 2 2 0Xj1 0 0 /8J#7 /D / /             ! ! ! !rQ   r%   c                   *   \ rS rSr% SrSr\S   \S'   SS jrSS jr	SS	 jr
S
\S\S\S\R                  4S jrS
\S\S\S\4S jrS
\S\S\S\4S jrS\\   S
\S\S\S\4
S jrS\\   S
\S\S\S\\   4
S jrS\\   S
\S\S\S\\\4   4
S jrSrg)r&   i  z
API group of methods.
Nr%   _client_refc                 L    UR                  5       (       a  S U l        g UU l        g r[   )rh   r  rK   clients     rN   rO   APIGroup.__init__  s    #)#3#3#5#546rQ   r4   c                 :    U R                   nUc  [        S5      eU$ )Nr   )r  r   r  s     rN   _clientAPIGroup._client  s"    !!>//rQ   c                     S U l         g r[   r  rW   s    rN   ry   APIGroup._close  s
    rQ   r   r   r   c                 `   #    U R                  5       R                  " X40 UD6I S h  vN $  N7fr[   )r  r   rK   r   r   r   s       rN   _requestAPIGroup._request  s)      \\^++FGGGGG   %.,.c                 `   #    U R                  5       R                  " X40 UD6I S h  vN $  N7fr[   )r  r   r   s       rN   _request_textAPIGroup._request_text  )      \\^00LVLLLLr#  c                 `   #    U R                  5       R                  " X40 UD6I S h  vN $  N7fr[   )r  r   r   s       rN   _request_jsonAPIGroup._request_json	  r'  r#  r   c                    #    U R                  5       nUR                  " X#40 UD6I S h  vN nUR                  X5      $  N7fr[   )r  r   r   rK   r   r   r   r   r  r   s          rN   _request_mapped_objectAPIGroup._request_mapped_object  sA      **6FvFF$$U33 G   'A?Ac                    #    U R                  5       nUR                  " X#40 UD6I S h  vN nUR                  X5      $  N7fr[   )r  r   r   r,  s          rN   _request_mapped_listAPIGroup._request_mapped_list  A      **6FvFF""511 Gr/  c                    #    U R                  5       nUR                  " X#40 UD6I S h  vN nUR                  X5      $  N7fr[   )r  r   r   r,  s          rN   _request_mapped_dictAPIGroup._request_mapped_dict'  r3  r/  r  )r  r%   )r4   r%   r  )rV   r>   r?   r  r  r  r   __annotations__rO   r  ry   r   r   rA   r  r!  r%  r)  r   r(   r-  r
   r1  r	   r5  r  r\   rQ   rN   r&   r&     su    *.K+&-B HH H 	H
 
		HMM M 	M
 
MMM M 	M
 
M	4Aw	4 	4 		4
 	4 
	4	2Aw	2 	2 		2
 	2 
a	2	2Aw	2 	2 		2
 	2 
c1f	2rQ   r&   )	metaclassr   r   r4   c                 V    [        U 5      nUb  UR                  U5      n[        U5      $ r[   )r   
with_queryr   )r   r   url_objs      rN   r   r   3  s+    #hG$$V,w<rQ   )r1   r-   r.   usernamepasswordr1   r-   r.   c                  #    USL USL :w  a  [        S5      eUc  USLn[        5       n[        U UUUUS9nUb;  [        U[        5      (       d   e UR
                  R                  X5      I Sh  vN    [        R                  " UR                  R                  5       UR                  R                  5       5      I Sh  vN u  p[        R                   " U5      Ul        [$        R                   " U	5      Ul        U$  N! [        R                   a    UR                  5       I Sh  vN    e f = f Nr! [        R(                   a     U$ f = f7f)a  
Create :class:`APIClient`.

When both ``username`` and ``password`` are given,
the returned client will have been successfully authenticated and automatically configured.
Otherwise, :exc:`LoginError <aioqbt.exc.LoginError>` is raised.

If they are omitted, :meth:`client.auth.login() <.AuthAPI.login>` need to be called manually.

If the URL host is expresed in IP address instead of domain name,
session cookies are not preserved properly and
subsequent requests result in :exc:`~.ForbiddenError`.
See :issue:`GH-2 <2#issuecomment-1925461178>` for details.

:param str url: URL to WebUI API, for example, ``https://localhost:8080/api/v2/``
:param str username: login name
:param str password: login password
:param logout_when_close: whether logout during :meth:`~.APIClient.close`.
:param http: :class:`aiohttp.ClientSession` object
:param ssl: :class:`ssl.SSLContext` for custom TLS connections
:raises LoginError: if authentication is failed.
Nz@Specify both username and password arguments, or neither of them)r3   r,   r-   r.   r1   )	TypeErrorr   r%   rx   r   ro   loginr   
LoginErrorrc   r   gatherrn   r   webapi_versionr   parser/   r   r0   ru   )
r   r<  r=  r1   r-   r.   r,   r  r/   r0   s
             rN   r'   r'   ;  sE    > 	Dh$./Z[[ $D0^F+F (C((((	++##H777
	;,3NNJJ JJ%%'-
 '
# !. 3 3N C'--k:M! 8~~ 	,,.  	
'
  
 Msm   AED  /C>0D  5A
D4 ?D2 D4 8E>D   'D/'D*(D//E2D4 4EEEEr   c                 j   ^  [        T [        5      (       d  [        T 6 m S[        S[        4U 4S jjnU$ )z%
Annotate function with API version.
fnr4   c                    > TU l         U $ r[   )_api_version)rF  r   s    rN   	decoratorsince.<locals>.decorator  s    !	rQ   )rx   r   r(   )r   rI  s   ` rN   sincerK    s7    
 gz**g&a A  rQ   rF  c                     g r[   r\   rF  s    rN   virtualrN    s    +.rQ   c                     g r[   r\   rM  s    rN   rN  rN    s    rQ   c                     U c  [         $ U $ )z'
Mark function not backed by endpoint.
)rN  rM  s    rN   rN  rN    s     
z	rQ   r[   )NN)@r  r   r;   r	  abcr   r.   r   typingr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   rA   aiohttp.hdrsr   r   typing_extensionsr   yarlr   aioqbtr   aioqbt._compatr   aioqbt._paramdictr   aioqbt.mapperr   aioqbt.versionr   r   
aioqbt.apir   r   r   r    r!   r"   r#   r$   __all__r(   r)   r%   r&   r   r   r  rB   r'   r   rK  rN  r\   rQ   rN   <module>r]     s          "  4 "   * ' & 4	 	 	 CLCLe! e!PM2 M2`3 c): ; s  #"A
 )-,0 $A	AsmA smA
  ~A 7((
)A 
*	A A`5U3S=%99: xQ?O  
 . .1#q&) . 
 . 
  a  
  s rQ   