#python #ruby #aria2
#python #ruby #aria2
Вопрос:
Я пытаюсь организовать загрузку файлов с помощью инструмента aria2. В документации есть пример, например:
import urllib2, json
jsonreq = json.dumps({'jsonrpc':'2.0', 'id':'qwer',
'method':'aria2.addUri',
'params':[['http://example.org/file']]})
c = urllib2.urlopen('http://localhost:6800/jsonrpc', jsonreq)
c.read()
# The result:
# '{"id":"qwer","jsonrpc":"2.0","result":"2089b05ecca3d829"}'
Он запускает загрузку http://example.org/file
и возвращает некоторый GID (идентификатор загрузки) 2089b05ecca3d829
…
Aria2 поддерживает уведомления. Но нет никаких примеров, как получить уведомление, например, OnDownloadComplete, onDownloadError и т.д. Я предполагаю, что есть способ запросить aria2 вызвать меня через JSON-RPC (HTTP) на каком-либо (моем) IP и порту. Но я не могу найти способ, как запросить aria2 для этого (как подписаться на уведомления с моим IP, портом). Любой пример на Python, Ruby или подобном будет очень полезен.
Комментарии:
1. Это связанный пример, как это сделать — github.com/pawamoy/aria2p/blob/master/src/aria2p/client.py . Aria2 отправляет уведомления только через WebSockets.
Ответ №1:
Ссылаясь на документы aria2, вы должны использовать websocket для связи с сервером RPC:
import websocket
from pprint import pprint
ws_server = "ws://localhost:6800/jsonrpc"
socket = websocket.create_connection(ws_server)
while 1:
message = socket.recv()
pprint(message)
time.sleep(3)
socket.close()
после того, как вы получите сообщение (объект json), вы получите событие OnDownloadComplete, после чего вы можете делать все, что захотите.
Я предлагаю вам использовать ariap (выше @RandomB упоминал об этом), https://pawamoy.github.io/aria2p/reference/api/#aria2p.api.API.listen_to_notifications
установите уведомление с обратным вызовом.
......
def start_listen(self):
self.api.listen_to_notifications(
threaded=True,
on_download_complete=self.done,
timeout=1,
handle_signals=False
)
def done(self, api, gid):
down = api.get_download(gid)
dataMedia = str(down.files[0].path)
def stop_listen(self):
while len(self.links) > 0:
gids = list(self.links.keys())
for down in self.api.get_downloads(gids):
if down.status in ['waiting', 'active']:
time.sleep(5)
break
else:
del self.links[down.gid]
if down.status in ['complete']:
#print(f'>>>>>{down.gid} Completed')
pass
else:
print(Back.RED f'{down.gid}|{down.files[0]}|{down.status}|error msg: {down.error_message}', end = '')
print(Style.RESET_ALL)
print('all finished!!!!')
self.api.stop_listening()