
    iʫ                         S 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  SSKrSSKJr  SSKJr  SSKJrJr  SS	KJrJrJrJrJrJr   " S
 S5      r  " S S\ 5      r! " S S\ 5      r"\"r#g)uv   
本模块负责与aria2 json rpc通信

参数参考 http://aria2.github.io/manual/en/html/aria2c.html#rpc-interface
    N)defaultdict)stack)	AnyAsyncGeneratorDefaultDictDictIterableListNoReturnOptionalUnion)Literal)Aria2rpcException)CallBack	IdFactory)DEFAULT_JSON_DECODERDEFAULT_JSON_ENCODERResultStoreadd_options_and_positionb64encode_file
get_statusc                       \ rS rSrSr    SPS\S\\   S\S   S\S	\	R                  4
S
 jjr SQS\S\\\      S\S\\\\4   \\   \S4   4S jjrS\\\4   S\\\\4   \4   4S jrS\4S jr SRS\\   S\\\4   S\S\4S jjr   SSS\S\\   S\\\4   S\S\\\\4   \4   4
S jjr SRS\S\\\4   S\S\\\\4   \4   4S jjrS\S\\\\4   \4   4S jrS\S\\\\4   \4   4S jrS\S\\\\4   \4   4S jrS\\\\4   \4   4S jrS\\\\4   \4   4S  jrS\\\\4   \4   4S! jrS\S\\\\4   \4   4S" jrS\\\\4   \4   4S# jr STS\S$\\   S\\\\4   \4   4S% jjrS\S\\\\4   \4   4S& jr S\S\\\\4   \4   4S' jr!S\S\\\\4   \4   4S( jr"S\S\\\\4   \4   4S) jr# STS$\\\      S\\\\4   \4   4S* jjr$ STS+\S,\S$\\   S\\\\4   \4   4S- jjr% STS+\S,\S$\\   S\\\\4   \4   4S. jjr&S\S/\S0\S\\\\4   \4   4S1 jr' STS\S2\S3\\   S4\\   S\S\\\\4   \4   4S5 jjr(S\S\\\\4   \4   4S6 jr)S\S\\\4   S\S7   4S8 jr*S\\\\4   \4   4S9 jr+S\\\4   S\\\\4   \4   4S: jr,S\\\4   4S; jr-S\S7   4S< jr.S\S\S7   4S= jr/S\\\4   4S> jr0S\\\4   4S? jr1S\S7   4S@ jr2S\S7   4SA jr3S\S7   4SB jr4SC\\\\4      S\\   4SD jr5S\\   4SE jr6S\\   4SF jr7   SSSG\S\\   S\\\4   S\S\\\\4   \4   4
SH jjr8 SRS\\\4   S\S\\\\4   \4   4SI jjr9S\S\\\4   4SJ jr:SK\;S\<\SL   S4   4SM jr=SUSN jr>SOr?g)V_Aria2BaseClient&   u   
与jsonrpc通信的接口
Nurlidentitymodenormalbatchformattokenqueuec                     Uc  [         R                  " 5       OUU l        U=(       d    [        R                  U l        Xl        X0l        X@l        g)u-  
:param identity: 操作rpc接口的id 生成他的工厂函数
:param url: rpc服务器地址
:param mode:
    normal - 立即处理请求
    batch - 请求加入队列，由process_queue方法处理
    format - 返回rpc请求json结构
:param token: rpc服务器密码 (用 `--rpc-secret`设置)
N)	asyncioQueuer#   r   get_idr   r   r   r"   )selfr   r   r   r"   r#   s         </app/mltbenv/lib/python3.13/site-packages/aioaria2/client.py__init___Aria2BaseClient.__init__+   s8    " ).W]]_5
 6K$6$6	
    methodparamsprefixreturnc                 >  #    U(       d  / nU R                   bJ  SU R                    3nUS:X  a#  US    H  n US   R                  SU5        M     OUR                  SU5        U R                  5       n[        R
                  " U5      (       a
  UI Sh  vN nSUX1-   US.nU R                  S:X  a$  U R                  R                  U5      I Sh  vN   gU R                  S	:X  a  U$ U R                  U5      I Sh  vN $ ! [         a
    U/US'    M  f = f N NI N7f)
uy   
组装json数据
:param method: 请求方法
:param params: 参数
:param prefix: 请求的头部
:return: 响应结果
Nztoken:	multicallr   r.   z2.0)jsonrpcidr-   r.   r    r!   )
r"   insertKeyErrorr   r%   iscoroutiner   r#   putsend_request)r(   r-   r.   r/   	token_strparamr   req_objs           r)   r3   _Aria2BaseClient.jsonrpcB   s     F::! -I$#AYE6h..q)< ' a+==?x((%~Ho	
 99**..)))99 N&&w///' $ 6+4+h6 & * 0sY   4DD ADD;DD+D;D<D DDDDDDr<   c                    #    [         e7fN)NotImplementedError)r(   r<   s     r)   r9   _Aria2BaseClient.send_requestj   s     !!s   	c                 Z  #    / nU R                   R                  5       (       dR  UR                  U R                   R                  5       I Sh  vN 5        U R                   R                  5       (       d  MR  [        R
                  " [        U R                  U5      6 I Sh  vN nU$  NZ N7f)u   
处理队列请求
N)r#   emptyappendgetr%   gathermapr9   )r(   req_objsresultss      r)   process_queue_Aria2BaseClient.process_queuem   s{      **""$$OO$**.."223 **""$$  D,=,=x(HII 3Is*   A
B+B''B+6*B+ B)!B+)B+urisoptionspositionc                 `   #    U/n[        XBU5      nU R                  SU5      I Sh  vN $  N7f)u   
添加新的任务到下载队列
:param uris: 要添加的链接 务必是list HTTP/FTP/SFTP/BitTorrent URIs (strings)
:param options:附加参数
:param position:在下载队列中的位置
:return:包含结果的json
{"result":"2089b05ecca3d829"}
addUriNr   r3   )r(   rL   rM   rN   r.   s        r)   rP   _Aria2BaseClient.addUri{   s1      )&8D\\(F3333   %.,.torrentc                    #    U/nU(       a  UR                  U5        [        XSU5      nU R                  SU5      I Sh  vN $  N7f)u  
下载种子
:param torrent: base64编码的种子文件 base64.b64encode(open("xxx.torrent","rb").read())
:param uris: uri用于播种 对于单个文件，URI可以是指向资源的完整URI;如果URI以/结尾，则添加到torrent文件。
    对于多文件的torrent，则会在torrent文件中添加名称和路径以生成每个文件的URI。
:param options:参数字典
:param position:在下载队列中的位置
:return:包含结果的json
{"result":"2089b05ecca3d829"}

addTorrentN)rD   r   r3   )r(   rT   rL   rM   rN   r.   s         r)   rV   _Aria2BaseClient.addTorrent   s@     " MM$)&8D\\,7777s   =AA Ametalinkc                 `   #    U/n[        XBU5      nU R                  SU5      I Sh  vN $  N7f)uk  
此方法通过上载一个来添加一个Metalink下载 metalink是一个用base64编码的字符串，其中包含“.metalink”文件。
:param metalink: base64编码的字符串 base64.b64encode(open('file.meta4',"rb").read())
:param options:参数字典
:param position:在下载队列中的位置
:return:包含结果的json
{"result":"2089b05ecca3d829"}
addMetalinkNrQ   )r(   rX   rM   rN   r.   s        r)   rZ   _Aria2BaseClient.addMetalink   s1      )&8D\\-8888rS   gidc                 H   #    U/nU R                  SU5      I Sh  vN $  N7f)u   
正在下载的停止下载 停止的删除状态
:param gid: GID(或GID)是管理每个下载的密钥。每个下载将被分配一个唯一的GID。GID在aria2中存储为64位二进制值。
:return:包含结果的json
{"result":"2089b05ecca3d829"}
removeNr3   r(   r\   r.   s      r)   r^   _Aria2BaseClient.remove   s%      \\(F3333   " "c                 H   #    U/nU R                  SU5      I Sh  vN $  N7f)ut  
此方法删除由gid表示的下载。这个方法的行为就像aria2.remove(),但是会立即生效，而不执行任何需要时间的操作，
例如联系BitTorrent跟踪器先取消下载。
:param gid: GID(或GID)是管理每个下载的密钥。每个下载将被分配一个唯一的GID。GID在aria2中存储为64位二进制值。
:return:包含结果的json
forceRemoveNr_   r`   s      r)   rd   _Aria2BaseClient.forceRemove   s%      \\-8888rb   c                 H   #    U/nU R                  SU5      I Sh  vN $  N7f)u  
此方法暂停由gid(字符串)表示的下载。暂停下载的状态变为暂停。如果下载是活动的，下载将放在等待队列的前面。
当状态暂停时，下载不会启动。要将状态更改为等待，请使用aria2.unpause()方法
:param gid: GID(或GID)是管理每个下载的密钥。每个下载将被分配一个唯一的GID。GID在aria2中存储为64位二进制值。
:return:包含结果的json
pauseNr_   r`   s      r)   rg   _Aria2BaseClient.pause   s%      \\'62222rb   c                 @   #    U R                  S5      I Sh  vN $  N7f)u   
这个方法相当于为每个活动/等待的下载调用aria2.pause()。这个方法返回OK。
:return:包含结果的json
pauseAllNr_   r(   s    r)   rj   _Aria2BaseClient.pauseAll        
 \\*----   c                 H   #    U/nU R                  SU5      I Sh  vN $  N7f)uy  
此方法暂停由gid表示的下载。这个方法的行为就像aria2.pause()，只是这个方法暂停下载，不执行任何需要时间的操作，
比如联系BitTorrent tracker先取消下载。
:param gid:GID(或GID)是管理每个下载的密钥。每个下载将被分配一个唯一的GID。GID在aria2中存储为64位二进制值。
:return:包含结果的json

forcePauseNr_   r`   s      r)   rp   _Aria2BaseClient.forcePause   s%      \\,7777rb   c                 @   #    U R                  S5      I Sh  vN $  N7f)u   
这个方法相当于对每个活动/等待的下载调用aria2.forcePause()。这个方法返回OK
:return:包含结果的json
forcePauseAllNr_   rk   s    r)   rs   _Aria2BaseClient.forcePauseAll        
 \\/2222rn   c                 H   #    U/nU R                  SU5      I Sh  vN $  N7f)uM  
此方法将由gid (string)表示的下载状态从暂停更改为等待，从而使下载符合重新启动的条件。此方法返回未暂停下载的GID。
:param gid:GID(或GID)是管理每个下载的密钥。每个下载将被分配一个唯一的GID。GID在aria2中存储为64位二进制值。
:return:包含结果的json
unpauseNr_   r`   s      r)   rw   _Aria2BaseClient.unpause   s%      \\)V4444rb   c                 @   #    U R                  S5      I Sh  vN $  N7f)uw   
这个方法相当于对每个暂停的下载调用aria2.unpause()。这个方法返回OK
:return:包含结果的json

unpauseAllNr_   rk   s    r)   rz   _Aria2BaseClient.unpauseAll   s     
 \\,////rn   keysc                 x   #    U/nU(       a  UR                  U5        U R                  SU5      I Sh  vN $  N7f)u  
此方法返回由gid(字符串)表示的下载进度
:param gid: GID(或GID)是管理每个下载的密钥。每个下载将被分配一个唯一的GID。GID在aria2中存储为64位二进制值。
:param keys:如果指定，则返回结果只包含keys数组中的键。如果键keys空或省略，则返回结果包含所有键。
    status:
        active: 当前下载/做种
        waiting: 等待队列
        paused: 当前暂停的下载
        error: 出错的下载
        complete: 停止和完成的下载
        removed: 用户移除的下载
    totalLength: 文件总长度(字节)
    completedLength: 已经下载的长度(字节)
    uploadLength: 已经上传的长度(字节)
    bitfield:下载进度的十六进制表示。最高位对应于下标0处的块。任何为1的位表示已加载的块，而为0位表示尚未加载和/或缺失的块。
            任何最后的溢出位都被置为0。当下载尚未启动时，此key将不包含在响应中。
    downloadSpeed: 下载速度 单位bytes/sec
    uploadSpeed:  上传速度 单位bytes/sec
    infoHash: hash值 仅针对bt下载
    numSeeders: 连接的peer数，仅针对bt下载
    seeder: 如果本机在做种true 否则false 仅针对bt下载
    pieceLength: 分片长度 单位byte
    numPieces: 分片数量
    connections: aria2连接的种子/服务器数量
    errorCode: 错误代码 仅针对停止/完成的下载
    errorMessage: 与errorCode关联的错误信息
    followedBy: 下载结果的gid列表
    following: 此结果在followedBy中，是他的反向连接
    belongsTo: 父下载的GID。有些下载是另一个下载的一部分。例如，如果一个文件在一个Metalink有BitTorrent资源，
    下载的“.torrent“文件是父文件的一部分。如果此下载没有父节点，则此键将不会包含在响应中。
    dir: 保存文件的路径
    files: 返回文件列表。这个列表的元素与aria2.getFiles()方法中使用的结构相同
    bittorrent: 从种子文件检索到的信息结构，仅针对bt 包含以下
        announceList: 匿名uri的列表。如果种子文件包含announcement而没有announcer -list, announcement将被转换成announcer -list格式
        comment: 种子的评论 如果可以将使用utf-8
        creationDate: 创造时间轴。该值是自元年以来的整数，以秒为单位。
        mode: 文件模式。不是single就是multi
        info: 包含json数据的信息 包括以下key
            name: 字典的名字。如果可以将使用utf-8
    verifiedLength: 文件被哈希检查时已验证的字节数。此键仅在对下载任务进行散列检查时存在。
    verifyIntegrityPending: 如果此下载任务正在队列中等待hash检查，则为true。此key仅在下载文件在队列中时存在。

:return: json格式的结果
{'bitfield': '0000000000',
     'completedLength': '901120',
     'connections': '1',
     'dir': '/downloads',
     'downloadSpeed': '15158',
     'files': [{'index': '1',
                 'length': '34896138',
                 'completedLength': '34896138',
                 'path': '/downloads/file',
                 'selected': 'true',
                 'uris': [{'status': 'used',
                            'uri': 'http://example.org/file'}]}],
     'gid': '2089b05ecca3d829',
     'numPieces': '34',
     'pieceLength': '1048576',
     'status': 'active',
     'totalLength': '34896138',
     'uploadLength': '0',
     'uploadSpeed': '0'}

:example:  await client.tellStatus(xxxxx,["status","downloadSpeed"])

tellStatusNrD   r3   )r(   r\   r|   r.   s       r)   r~   _Aria2BaseClient.tellStatus   s5     H MM$\\,7777   1:8:c                 H   #    U/nU R                  SU5      I Sh  vN $  N7f)u  
此方法返回由gid(字符串)表示的下载中使用的uri。响应是一个json，它包含以下键。值是字符串
:param gid: GID(或GID)是管理每个下载的密钥。每个下载将被分配一个唯一的GID。GID在aria2中存储为64位二进制值。
:return:json格式的结果
[{'status': 'used',  如果url已经使用就是used ，还在队列中就是waiting
      'uri': 'http://example.org/file'},...]
getUrisNr_   r`   s      r)   r   _Aria2BaseClient.getUris?  s%      \\)V4444rb   c                 H   #    U/nU R                  SU5      I Sh  vN $  N7f)u  
返回下载文件列表
:param gid: GID(或GID)是管理每个下载的密钥。每个下载将被分配一个唯一的GID。GID在aria2中存储为64位二进制值。
:return:
 [{'index': '1',  件的索引，从1开始，与文件在多文件中出现的顺序相同
      'length': '34896138',  文件大小 byte
      'completedLength': '34896138',  此文件的完整长度(以字节为单位)。请注意，
                completedLength的和可能小于aria2.tellStatus()方法返回的completedLength。
              这是因为在aria2.getFiles()中completedLength只包含完成的片段。
              另一方面，在aria2.tellStatus()中完成的长度也包括部分完成的片段。
      'path': '/downloads/file',   路径
      'selected': 'true',   如果此文件是由——select-file选项选择的，则为true。
      如果——select-file没有指定，或者这是单文件的torrent文件，或者根本不是torrent下载，那么这个值总是为真。否则错误。
      'uris': [{'status': 'used',  返回此文件的uri列表。元素类型与aria2.getUris()方法中使用的结构相同。
                 'uri': 'http://example.org/file'}]}]
getFilesNr_   r`   s      r)   r   _Aria2BaseClient.getFilesJ  s%     " \\*f5555rb   c                 H   #    U/nU R                  SU5      I Sh  vN $  N7f)u  
返回下载对象，仅适用于bt
:param gid: GID(或GID)是管理每个下载的密钥。每个下载将被分配一个唯一的GID。GID在aria2中存储为64位二进制值。
:return:
[{'amChoking': 'true',
      'bitfield': 'ffffffffffffffffffffffffffffffffffffffff',
      'downloadSpeed': '10602',
      'ip': '10.0.0.9',
      'peerChoking': 'false',
      'peerId': 'aria2%2F1%2E10%2E5%2D%87%2A%EDz%2F%F7%E6',
      'port': '6881',
      'seeder': 'true',
      'uploadSpeed': '0'},
     {'amChoking': 'false',
      'bitfield': 'ffffeff0fffffffbfffffff9fffffcfff7f4ffff',
      'downloadSpeed': '8654',
      'ip': '10.0.0.30',
      'peerChoking': 'false',
      'peerId': 'bittorrent client758',
      'port': '37842',
      'seeder': 'false',
      'uploadSpeed': '6890'}]
getPeersNr_   r`   s      r)   r   _Aria2BaseClient.getPeers^  s%     0 \\*f5555rb   c                 H   #    U/nU R                  SU5      I Sh  vN $  N7f)u&  
此方法返回当前连接的HTTP(S)/FTP/SFTP服务器的下载，用gid(字符串)表示。响应是一个结构数组，包含以下key。值是字符串。
:param gid:GID(或GID)是管理每个下载的密钥。每个下载将被分配一个唯一的GID。GID在aria2中存储为64位二进制值。
:return:
[{'index': '1',
      'servers': [{'currentUri': 'http://example.org/file',  # 正在使用的
                    'downloadSpeed': '10467',    # 下载速度(byte/sec)
                    'uri': 'http://example.org/file'}]}]}  #原url

getServersNr_   r`   s      r)   r   _Aria2BaseClient.getServersy  s%      \\,7777rb   c                 Z   #    U(       a  U/OSnU R                  SU5      I Sh  vN $  N7f)u  
此方法返回活动下载列表。响应是一个与aria2.tellStatus()方法返回的结构相同的数组。关于keys参数，请参考aria2.tellStatus()方法。
:param keys: 如果指定，则返回结果只包含keys数组中的键。如果键keys空或省略，则返回结果包含所有键。
:return:
json格式的结果
{'bitfield': '0000000000',
     'completedLength': '901120',
     'connections': '1',
     'dir': '/downloads',
     'downloadSpeed': '15158',
     'files': [{'index': '1',
                 'length': '34896138',
                 'completedLength': '34896138',
                 'path': '/downloads/file',
                 'selected': 'true',
                 'uris': [{'status': 'used',
                            'uri': 'http://example.org/file'}]}],
     'gid': '2089b05ecca3d829',
     'numPieces': '34',
     'pieceLength': '1048576',
     'status': 'active',
     'totalLength': '34896138',
     'uploadLength': '0',
     'uploadSpeed': '0'}

:example:  await client.tellActive(xxxxx,["status","downloadSpeed"])
N
tellActiver_   )r(   r|   r.   s      r)   r   _Aria2BaseClient.tellActive  s)     <  $T\\,7777s   "+)+offsetnumc                 x   #    X/nU(       a  UR                  U5        U R                  SU5      I Sh  vN $  N7f)uY  
此方法返回等待下载的列表，包括暂停的下载。偏移量是一个整数，它指定等待在前面的下载的偏移量。
num是一个整数，指定最大值。要返回的下载数量。关于keys参数，请参考aria2.tellStatus()方法。
:param offset: 起始索引
:param num: 数量
:param keys: 同上
:return: 同上
tellWaitingNr   r(   r   r   r|   r.   s        r)   r   _Aria2BaseClient.tellWaiting  s4      MM$\\-8888r   c                 x   #    X/nU(       a  UR                  U5        U R                  SU5      I Sh  vN $  N7f)u   
此方法返回停止下载的列表 关于keys参数，请参考aria2.tellStatus()方法。
:param offset: 起始索引
:param num: 数量
:param keys: 同上
:return: 同上
tellStoppedNr   r   s        r)   r   _Aria2BaseClient.tellStopped  s4      MM$\\-8888r   poshowc                 J   #    XU/nU R                  SU5      I Sh  vN $  N7f)u  
此方法更改队列中由gid表示的下载位置。pos是一个整数。how是一个字符串。
如果how是POS_SET，它将下载移动到相对于队列开头的位置。
如果how是POS_CUR，它将下载移动到相对于当前位置的位置。
如果how是POS_END，它将下载移动到相对于队列末尾的位置。
如果目标位置小于0或超过队列的末尾，则将下载分别移动到队列的开头或末尾。响应是一个表示结果位置的整数。
:param gid: GID(或GID)是管理每个下载的密钥。每个下载将被分配一个唯一的GID。GID在aria2中存储为64位二进制值。
:param pos: 偏移量
:param how: 方法
:return：位置 int
changePositionNr_   )r(   r\   r   r   r.   s        r)   r   _Aria2BaseClient.changePosition  s(      C\\"2F;;;;s   #!#	fileIndexdelUrisaddUrisc                 z   #    XX4/nU(       a  UR                  U5        U R                  SU5      I Sh  vN $  N7f)u  
此方法从delUris中删除uri，并将addUris中的uri附加到以gid表示的下载中。
delUris和addUris是字符串列表。下载可以包含多个文件，每个文件都附加了uri。
fileIndex用于选择要删除/附加哪个文件。fileIndex从0开始。

当位置被省略时，uri被附加到列表的后面。这个方法首先执行删除，然后执行添加。
position是删除uri后的位置，而不是调用此方法时的位置。在删除URI时，如果下载中存在相同的URI，
则对于deluri中的每个URI只删除一个URI。换句话说，如果有三个uri http://example.org/aria2，并且您希望将它们全部删除，
则必须在delUris中指定(至少)3个http://example.org/aria2。这个方法返回一个包含两个整数的列表。第一个整数是删除uri的数目。
第二个整数是添加的uri的数量。

:param gid: GID(或GID)是管理每个下载的密钥。每个下载将被分配一个唯一的GID。GID在aria2中存储为64位二进制值。
:param fileIndex:用于选择要删除/附加哪个文件。fileIndex从0开始。
:param delUris: 要删除的
:param addUris: 要添加的
:param position: position用于指定在现有的等待URI列表中插入URI的位置 0开始
:return:
 [0, 1]
	changeUriNr   )r(   r\   r   r   r   rN   r.   s          r)   r   _Aria2BaseClient.changeUri  s7     6 '3MM(#\\+v6666s   2;9;c                 H   #    U/nU R                  SU5      I Sh  vN $  N7f)u  
此方法返回由gid表示的下载选项。
注意，此方法不会返回没有默认值,也没有在配置文件或RPC方法的命令行上设置这些的选项
:param gid: GID(或GID)是管理每个下载的密钥。每个下载将被分配一个唯一的GID。GID在aria2中存储为64位二进制值。
:return:
{'allow-overwrite': 'false',
     'allow-piece-length-change': 'false',
     'always-resume': 'true',
     'async-dns': 'true',
	getOptionNr_   r`   s      r)   r   _Aria2BaseClient.getOption  s%      \\+v6666rb   OKc                 H   #    X/nU R                  SU5      I Sh  vN $  N7f)u  
此方法动态地更改由gid (string)表示的下载选项。options是一个字典。输入文件小节中列出的选项是可用的，但以下选项除外:
    dry-run
    metalink-base-uri
    parameterized-uri
    pause
    piece-length
    rpc-save-upload-metadata
除了以下选项外，更改活动下载的其他选项将使其重新启动(重新启动本身由aria2管理，不需要用户干预):
    bt-max-peers
    bt-request-peer-speed-limit
    bt-remove-unselected-file
    force-save
    max-download-limit
    max-upload-limit
此方法返回OK表示成功。
:param gid: GID(或GID)是管理每个下载的密钥。每个下载将被分配一个唯一的GID。GID在aria2中存储为64位二进制值。
:param options:
:return:
"OK"
changeOptionNr_   )r(   r\   rM   r.   s       r)   r   _Aria2BaseClient.changeOption  s%     , \\.&9999rb   c                 @   #    U R                  S5      I Sh  vN $  N7f)uh  
此方法返回全局选项。响应是一个结构体。它的键是选项的名称。值是字符串。
注意，此方法不会返回没有默认值的选项，也不会在配置文件或RPC方法的命令行上设置这些选项。
因为全局选项用作新添加下载选项的模板，所以响应包含aria2.getOption()方法返回的键。
:return:
getGlobalOptionNr_   rk   s    r)   r    _Aria2BaseClient.getGlobalOption  s      \\"34444rn   c                 H   #    U/nU R                  SU5      I Sh  vN $  N7f)u  
此方法动态更改全局选项。options是一个字典。以下是可供选择的方案:
    bt-max-open-files
    download-result
    keep-unfinished-download-result
    log
    log-level
    max-concurrent-downloads
    max-download-result
    max-overall-download-limit
    max-overall-upload-limit
    optimize-concurrent-downloads
    save-cookies
    save-session
    server-stat-of
:param options: 参数字典
:return:  "OK"
changeGlobalOptionNr_   )r(   rM   r.   s      r)   r   #_Aria2BaseClient.changeGlobalOption'  s&     * \\"6????rb   c                 @   #    U R                  S5      I Sh  vN $  N7f)u{  
此方法返回全局统计信息，如总下载和上传速度。响应是一个字典，包含以下键。值是字符串
:return:
{'downloadSpeed': '21846',
     'numActive': '2',  #活动下载数
     'numStopped': '0',  #  当前会话中停止的下载数量。以 --max-download-result 选项为上限
     'numWaiting': '0',  # 等待下载数
     'uploadSpeed': '0'}
getGlobalStatNr_   rk   s    r)   r   _Aria2BaseClient.getGlobalStat?  s      \\/2222rn   c                 @   #    U R                  S5      I Sh  vN $  N7f)uk   
此方法将已完成/错误/删除的下载清除到空闲内存。这个方法返回OK。
:return: "OK"
purgeDownloadResultNr_   rk   s    r)   r   $_Aria2BaseClient.purgeDownloadResultK  s     
 \\"78888rn   c                 H   #    U/nU R                  SU5      I Sh  vN $  N7f)u  
此方法从内存中删除由gid表示的已完成/错误/已删除的下载。此方法返回OK表示成功。
:param gid: GID(或GID)是管理每个下载的密钥。每个下载将被分配一个唯一的GID。GID在aria2中存储为64位二进制值
:return: "OK"
removeDownloadResultNr_   r`   s      r)   r   %_Aria2BaseClient.removeDownloadResultR  s&      \\"8&AAAArb   c                 @   #    U R                  S5      I Sh  vN $  N7f)u   
此方法返回aria2的版本和启用的特性列表
:return:一个字典，包含以下键
    version: aria2的版本
    enabledFeatures: 启用功能的列表。每个特性都以字符串的形式给出

getVersionNr_   rk   s    r)   r   _Aria2BaseClient.getVersion[  s      \\,////rn   c                 @   #    U R                  S5      I Sh  vN $  N7f)uj   
返回会话信息
:return:字典，包含以下键
    sessionId: 每次调用aria2时生成的会话id
getSessionInfoNr_   rk   s    r)   r   _Aria2BaseClient.getSessionInfod  s      \\"23333rn   c                 @   #    U R                  S5      I Sh  vN $  N7f)u   
关闭aria2
:return: "OK"
shutdownNr_   rk   s    r)   r   _Aria2BaseClient.shutdownl  rm   rn   c                 @   #    U R                  S5      I Sh  vN $  N7f)u   
该方法关闭了aria2()。该方法的行为像aria2.shutdown而没有执行任何需要时间的操作，比如联系BitTorrent跟踪器先注销下载。
:return:"OK"
forceShutdownNr_   rk   s    r)   r   _Aria2BaseClient.forceShutdowns  ru   rn   c                 @   #    U R                  S5      I Sh  vN $  N7f)u`   
此方法将当前会话保存到由——save-session选项指定的文件中。
:return:"OK"
saveSessionNr_   rk   s    r)   r   _Aria2BaseClient.saveSessionz  s     
 \\-0000rn   methodsc                 B   #    U R                  SU/SS9I Sh  vN $  N7f)u  
此方法将多个方法调用封装在单个请求中
:param methods: 字典数组。结构包含两个键:methodName和params。methodName是要调用的方法名，params是包含方法调用参数的数组。
    此方法返回一个响应数组。元素要么是一个包含方法调用返回值的单条目数组，要么是一个封装的方法调用失败时的fault元素结构。
    example: [{'methodName':'aria2.addUri',
                          'params':[['http://example.org']]},
                        {'methodName':'aria2.addTorrent',
                          'params':[base64.b64encode(open('file.torrent').read())]}]
:return:
r2   system.r/   Nr_   )r(   r   s     r)   r2   _Aria2BaseClient.multicall  s$      \\+y\KKKKs   c                 >   #    U R                  SSS9I Sh  vN $  N7f)u   
此方法在字符串数组中返回所有可用的RPC方法。与其他方法不同，此方法不需要秘密令牌。这是安全的，因为这个方法只返回可用的方法名。
:return:
listMethodsr   r   Nr_   rk   s    r)   r   _Aria2BaseClient.listMethods  s      
 \\-	\BBBB   c                 >   #    U R                  SSS9I Sh  vN $  N7f)u   
此方法以字符串数组的形式返回所有可用的RPC通知。与其他方法不同，此方法不需要秘密令牌。
这是安全的，因为这个方法只返回可用的通知名称。
:return:
listNotificationsr   r   Nr_   rk   s    r)   r   "_Aria2BaseClient.listNotifications  s!      \\"5i\HHHHr   pathc                 l   #    [        U5      I Sh  vN nU R                  XRX45      I Sh  vN $  N N7f)u   
直接添加种子路径
:param path: 文件路径
:param uris:  参考addTorrent方法
:param options: 参考addTorrent方法
:param position: 参考addTorrent方法
:return:包含结果的json   gid
N)r   rV   )r(   r   rL   rM   rN   rT   s         r)   add_torrent_Aria2BaseClient.add_torrent  s0      't,,__WGFFF -F   404244c                 l   #    [        U5      I Sh  vN nU R                  XBU5      I Sh  vN $  N N7f)u   
直接添加metalink路径
:param path:  文件路径
:param options:  参考addMetalink方法
:param position: 参考addMetalink方法
:return:
N)r   rZ   )r(   r   rM   rN   rX   s        r)   add_metalink_Aria2BaseClient.add_metalink  s2      (--%%hBBB .Br   c                 Z   #    U R                  US/5      I Sh  vN n[        U5      $  N7f)u,   
取一个gid的状态
:param gid:
:return:
statusN)r~   r   )r(   r\   responses      r)   r   _Aria2BaseClient.get_status  s,      xj99(## :s   +)+gids)activewaitingpausederrorcompleteremovedr   c                >  #    U Vs/ s H  nSUSS//S.PM     nnU R                  U5      I Sh  vN nU(       a0  U Vs0 s H  oUS   S   US   S   _M     nnU H  n Xb   7v   M     gU H  nS7v   M
     gs  snf  NOs  snf ! [         a	    S7v    M=  f = f7f)uI   
取得每个gid的状态 是一个异步生成器
:param gids:
:return:
zaria2.tellStatusr\   r   )
methodNamer.   Nr   r   )r2   r6   )r(   r   r\   r   rI   rr   s          r)   get_statuses_Aria2BaseClient.get_statuses  s      
 .#x?P9QR 	 
 w//;BC7ad5k1Q4>17FC" +%   
 0C   "!M"sO   BA;BB B BB B'BBBBBBc                 T   #    U R                   R                  5       I S h  vN   g  N7fr?   )client_sessioncloserk   s    r)   r   _Aria2BaseClient.close  s     !!'')))s   (&()r   r   r#   r"   r   )Nr   NN)Nzaria2.)NN)NNNr?   r0   N)@__name__
__module____qualname____firstlineno____doc__strr   r   r   r%   r&   r*   r
   r   r   r   r3   r9   rJ   intrP   rV   rZ   r^   rd   rg   rj   rp   rs   rw   rz   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   r   r   r   r   r   r	   r   r   r   __static_attributes__ r,   r)   r   r   &   sS    )-5=# 9% 12	
  }}0 NV&0&0#+DI#6&0GJ&0	tCH~tCy#t3	4&0P"$sCx. "U4S>SVCV=W "T  PT4I4(,S#X4IL4	4$ "&88 3i8 c3h	8
 8 
tCH~s"	#80 OS99'+CH~9HK9	tCH~s"	#94 4d38nc.A(B 49S 9U4S>33F-G 93s 3uT#s(^S-@'A 3.d38nc&9 : .8uT#s(^S-@'A 83U4S>3+>%? 35 5tCH~s/B)C 50%S#X(;"< 0 +/G8G8"3iG8	tCH~s"	#G8R	5 	5tCH~s/B)C 	56# 6%S#X0C*D 6(6# 6%S#X0C*D 668C 8E$sCx.#2E,F 8 +/8T#Y'8	tCH~s"	#8D 8<99 #9+/99	tCH~s"	#9" 8<99 #9+/99	tCH~s"	#9<< <'*<	tCH~s"	#<. 77 7 c	7
 c7 7 
tCH~s"	#7@73 75c3h1D+E 7:c :DcN :wt} :25uT#s(^S-@'A 5@CH~@	tCH~s"	#@0
3T#s(^ 
3974= 9Bc Bgdm B0$sCx. 04d38n 4. .3WT] 3174= 1LtDcN'; LS	 LC49 CIc I "&GG 3iG c3h	G
 G 
tCH~s"	#G& EIC!#s(^C>AC	tCH~s"	#C$C $DcN $x NVW	5 2*r,   r   c                      ^  \ rS rSr     SS\S\S\S   S\S\R                  4
U 4S jjjr	S	\
\\4   S
\\
\\4   \4   4S jrS rS rSrU =r$ )Aria2HttpClienti  r   r   r   r   r"   r   c                 d  > [         TU ]  XX4U5        Xpl        SU R                  ;   a  U R                  R                  S5      O[        U l        SU R                  ;   a  U R                  R                  S5      O[        U l        U=(       d    [        R                  " U R                  S9U l
        g)u  
:param identity: 操作rpc接口的id
:param url: rpc服务器地址
:param mode:
    normal - 立即处理请求
    batch - 请求加入队列，由process_queue方法处理
    format - 返回rpc请求json结构
:param token: rpc服务器密码 (用 `--rpc-secret`设置)
:param queue: 请求队列
:param client_session: aiohttp的session
:param kw: aiohttp.session.post的相关参数
    new in v1.3.1 loads: DEFAULT_JSON_DECODER   json.loads
    dumps json.dumps
loadsdumpsjson_serializeN)superr*   kwpopr   r   r   r   aiohttpClientSessionr   )	r(   r   r   r   r"   r#   r   r  	__class__s	           r)   r*   Aria2HttpClient.__init__  s    0 	U;$+tww$6DGGKK <P 	
 %,tww$6DGGKK <P 	
 - 
0E0E::1
r,   r<   r0   c                   #     U R                   R                  " U R                  4SU0U R                  D6 IS h  vN n U R	                  UR                  5       I S h  vN 5      nUS   sS S S 5      IS h  vN   $  NB N  N	! [         a    [        SW 35      ef = f! , IS h  vN  (       d  f       g = f! [        R                   a%  n[        [        U5      S[        U5      ;   S9UeS nAff = f7f)Njsonresultunexpected result: Cannot connectconnection_error)r   postr   r  r   textr6   r   r  ClientConnectionErrorr   )r(   r<   r   dataerrs        r)   r9   Aria2HttpClient.send_request	  s     	**//&*.'' J::HMMO&;<D>   '<	   J+.A$,HIIJ   ,, 	#C,<C,H	s   C67B: A>B: B BB 
 B,B: 8B9B: =C6>B:  BB: BB  B7&B)'B73B: 6C67B: :C3 C..C33C6c                    #    U $ 7fr?   r   rk   s    r)   
__aenter__Aria2HttpClient.__aenter__  s
     s   c                 @   #    U R                  5       I S h  vN   g  N7fr?   r   r(   exc_typeexc_valexc_tbs       r)   	__aexit__Aria2HttpClient.__aexit__       jjl   )r   r   r  r   )Nr   NNN)r   r   r   r   r   r   r   r  r  r*   r   r   r   r9   r  r   r   __classcell__r  s   @r)   r   r     s     #5=04"
"
 "
 12	"

 "
  --"
 "
H$sCx. U4S>SVCV=W  r,   r   c                     ^  \ rS rSr      S"S\S\S\S   S\R                  S\	R                  S	\4U 4S
 jjjr\      S"S\S\S\S   S\S\R                  S\	R                  S	\SS 4S jj5       rS\\\4   S\\\\4   \\4   4S jr\S\4S j5       rS#U 4S jjrS#S jrS\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 jrS\S\4S jrS\S\4S jr S\S\4S jr!S\S\4S jr"S\S\4S jr#S r$S  r%S!r&U =r'$ )$Aria2WebsocketClienti  Nr   r   r   r   r#   r   reconnect_intervalc                 t  > [        5       S   R                  S;  a=  [        R                  " SR	                  SU R
                  R                   S35      5        [        T	U ]!  XX4U5        Xl	        SU R                  ;   a  U R                  R                  S5      O[        U l        SU R                  ;   a  U R                  R                  S5      O[        U l        U=(       d    [        R                   " U R                  S9U l        Xpl        ['        [(        5      U l        S	U l        [/        5       U l        g	)
u  
:param identity: 操作rpc接口的id 工厂函数
:param url: rpc服务器地址
:param mode:
    normal - 立即处理请求
    batch - 请求加入队列，由process_queue方法处理
    format - 返回rpc请求json结构
:param token: rpc服务器密码 (用 `--rpc-secret`设置)
:param queue: 请求队列
:param kw: ws_connect()的相关参数
    new in v1.3.1 loads: DEFAULT_JSON_DECODER   json.loads
    dumps json.dumps
   )neweval_in_contextz$do not init directly,use {0} insteadzawait z.newr   r   r  N)r   functionwarningswarnr!   r  r   r  r*   r  r  r   r   r   r   r  r  _client_sessionr(  r   list	functions_listen_taskset_pending_tasks)
r(   r   r   r   r"   r#   r   r(  r  r  s
            r)   r*   Aria2WebsocketClient.__init__   s    0 GAJ(BBMM6==T^^445T: 	U;$+tww$6DGGKK <P 	
 %,tww$6DGGKK <P 	
  .  
1F1F::2
 #5;F<
 !!er,   r"   r0   c           	        #     U " UUUUUUU40 UD6n	U	R                   R                  " U	R                  40 U	R                  D6I Sh  vN U	l        [
        R                  " U	R                  5       5      U	l        U	$  N4! [        R                   aH  n
W	R                   R                  5       I Sh  vN    [        [        U
5      S[        U
5      ;   S9U
eSn
A
ff = f7f)u  
真正创建实例
:param queue: 继承下来的任务队列
:param identity: 操作rpc接口的id
:param url:  rpc服务器地址
:param mode: 同上
:param token: rpc服务器密码 (用 `--rpc-secret`设置)
:param kw: ws_connect()的相关参数
:return: 真正的实例
Nr  r  )r0  
ws_connectr   r  r   r%   create_tasklistenr3  r  ClientErrorr   r   r   )clsr   r   r   r"   r#   r   r(  r  r(   r  s              r)   r+  Aria2WebsocketClient.newQ  s     ,	"	 	D )-(<(<(G(G) GG) #D !( 3 3DKKM BDK	#
 "" 	&&,,...#C,<C,H	sG   CAA> A<3A> ;C<A> >CC/B20%CCCr<   c                   #     U R                   R                  XR                  S9I S h  vN   [        R                  " US   U R
                  R                  SS 5      =(       d    S5      I S h  vN nUS   $  NN N! [         a    [        SW 35      e[         ax  nU R                  (       d]  SUR                  ;   aH  [        R                  " U R                  5      I S h  vN    U R                  U5      I S h  vN  s S nA$  S nAg  S nAg S nAf[         a%  n[        [!        U5      S[!        U5      ;   S9UeS nAff = f7f)	N)r   r4   timeoutg      $@r  r  r  r  )r   	send_jsonr   r   fetchr  rE   r6   r   closedmsgr%   sleepr(  r9   	Exceptionr   )r(   r<   r  r  s       r)   r9   !Aria2WebsocketClient.send_request}  s    	%%//zz/JJJ$**tww{{9d;Ct D >!	 K  	B#&9$$@AA  	8;;9#7mmD$;$;<<<!..w7777 $8;  	#C,<C,H	s|   E&A= A9AA= /A;0A= 8E9A= ;A= =!EAD"C%#D<C?=DEEE D>>EEc                 .    U R                   R                  $ r?   )r   rB  rk   s    r)   rB  Aria2WebsocketClient.closed  s    "")))r,   c                 |  >#    U R                   (       aN  U R                   R                  5       (       d/  U R                   R                  5          U R                   I S h  vN   [
        TU ]  5       I S h  vN   U R                  R                  5       I S h  vN   g  N=! [        R                   a     NQf = f NC N#7fr?   )r3  	cancelledcancelr%   CancelledErrorr  r   r0  )r(   r  s    r)   r   Aria2WebsocketClient.close  s     T%6%6%@%@%B%B$$&'''' gmo""((***	 ()) *sZ   AB<B BB #B<4B85!B<B:B<B B52B<4B55B<:B<c                   #     U R                   (       d   U R                  R                  U R                  S9I Sh  vN nU(       a  [        U[        5      (       d  M[  [        R                  " U R                  U5      5      nU R                  R                  U5        UR                  U R                  R                  5        U R                   (       d  M  gg N! [         a     M  f = f! [        R                   a     gf = f7f)u   
轮询返回数据
)r   N)rB  r   receive_jsonr   	TypeError
isinstancedictr%   r9  handle_eventr5  addadd_done_callbackdiscardrL  )r(   r  tasks      r)   r:  Aria2WebsocketClient.listen  s     	kk!%!4!4!A!A

!A!SSD :dD#9#9**4+<+<T+BC##''-&&t':':'B'BC kkkS   %% 		s\   DC, &C CC BC, DC 
C)%C, (C))C, ,D DDDr  c                    ^ ^#    ST;   d  ST;   a  [         R                  " T5        ST;   aN  TS   nUT R                  ;   a8  [        R                  " [        UU 4S jT R                  U   5      6 I Sh  vN   ggg N7f)u   
基础回调函数 当websocket服务器向客户端发送数据时候 此方法会自动调用
:param data: receive_json包装对象 显然,与http不同,你得自己过滤出result字段,因为这个是完整的jsonrpc响应
:return:
r  r   r-   c                    > U " TT5      $ r?   r   )xr  r(   s    r)   <lambda>3Aria2WebsocketClient.handle_event.<locals>.<lambda>  s    1T4=r,   N)r   
add_resultr2  r%   rF   rG   )r(   r  r-   s   `` r)   rS  !Aria2WebsocketClient.handle_event  s|      tw$""4( t(^F'nn0$..2HI   ( s   A0A>4A<5A>functype_c                 @    U R                   U   R                  U5        g)u)   
注册响应websocket的事件
:return:
N)r2  rD   r(   r`  ra  s      r)   registerAria2WebsocketClient.register  s    
 	u$$T*r,   c                 b     U R                   U   R                  U5        g! [         a     gf = f)u/   
取消注册响应websocket的事件
:return:
N)r2  r^   
ValueErrorrc  s      r)   
unregisterAria2WebsocketClient.unregister  s0    
	NN5!((. 		s   ! 
..c                 *    U R                  US5        U$ )u   
注册回调事件
func的第二个参数的task.result()型如{'jsonrpc': '2.0', 'method': 'aria2.onDownloadStart', 'params': [{'gid': '5de52dc4eba048ca'}]}
:param func:
:return:
zaria2.onDownloadStartrd  r(   r`  s     r)   onDownloadStart$Aria2WebsocketClient.onDownloadStart  s     	d34r,   c                 *    U R                  US5        U$ )*   
注册回调事件
:param func:
:return:
zaria2.onDownloadPauserk  rl  s     r)   onDownloadPause$Aria2WebsocketClient.onDownloadPause       	d34r,   c                 *    U R                  US5        U$ )rp  zaria2.onDownloadStoprk  rl  s     r)   onDownloadStop#Aria2WebsocketClient.onDownloadStop  s     	d23r,   c                 *    U R                  US5        U$ )rp  zaria2.onDownloadCompleterk  rl  s     r)   onDownloadComplete'Aria2WebsocketClient.onDownloadComplete  s     	d67r,   c                 *    U R                  US5        U$ )rp  zaria2.onDownloadErrorrk  rl  s     r)   onDownloadError$Aria2WebsocketClient.onDownloadError  rs  r,   c                 *    U R                  US5        U$ )rp  zaria2.onBtDownloadCompleterk  rl  s     r)   onBtDownloadComplete)Aria2WebsocketClient.onBtDownloadComplete  s     	d89r,   c                   #    [        U S5      (       di  U R                  R                  " U R                  40 U R                  D6I S h  vN U l        [        R                  " U R                  5       5      U l	        U $ U $  N67f)Nr   )
hasattrr0  r8  r   r  r   r%   r9  r:  r3  rk   s    r)   r  Aria2WebsocketClient.__aenter__  sj     t-..**55dhhJ$''JJ  !( 3 3DKKM BDK	 Ks   ABA?	7Bc                 @   #    U R                  5       I S h  vN   g  N7fr?   r  r  s       r)   r   Aria2WebsocketClient.__aexit__  r"  r#  )	r0  r3  r5  r   r   r2  r  r   r(  )Nr   NNNr*  r   )(r   r   r   r   r   r   r   r%   r&   r  r  r   r*   classmethodr+  r   r   r   r   r9   propertyboolrB  r   r:  rR  rS  r   rd  rh  rm  rq  ru  rx  r{  r~  r  r   r   r$  r%  s   @r)   r'  r'    s    #5=#04"#/$/$ /$ 12	/$ }}/$  --/$  /$ /$b  #5=#04"#)) ) 12	)
 ) }})  --)  ) 
 ) )V$sCx. U4S>SVX`C`=a $ * * *+$t  (+X +c +d +x   H  H  8  x H H   h  r,   r'  )$r   r%   r.  collectionsr   inspectr   typingr   r   r   r   r	   r
   r   r   r   r  typing_extensionsr   aioaria2.exceptionsr   aioaria2.typingr   r   aioaria2.utilsr   r   r   r   r   r   r   r   r'  Aria2WebsocketTriggerr   r,   r)   <module>r     sr   
   # 
 
 
  % 1 / {
* {
*|8& 8vx+ xv - r,   