# aioaria2
[![pypi](https://img.shields.io/pypi/v/aioaria2.svg)](https://pypi.org/project/aioaria2/)
![python](https://img.shields.io/pypi/pyversions/aioaria2)
![implementation](https://img.shields.io/pypi/implementation/aioaria2)
![wheel](https://img.shields.io/pypi/wheel/aioaria2)
![license](https://img.shields.io/github/license/synodriver/aioaria2.svg)
## Support async rpc call with aria2 and process management
## Usage:
### example
```python
import asyncio
from pprint import pprint
import aioaria2
async def main():
async with aioaria2.Aria2HttpClient("http://117.0.0.1:6800/jsonrpc",
token="token") as client:
pprint(await client.getVersion())
asyncio.run(main())
```
### The ip address should be replaced with your own
### See [aria2 manual](http://aria2.github.io/manual/en/html/) for more detail about client methods
```python
# exampe of http
import asyncio
from pprint import pprint
import aioaria2
import ujson
async def main():
async with aioaria2.Aria2HttpClient("http://127.0.0.1:6800/jsonrpc",
token="token",
loads=ujson.loads,
dumps=ujson.dumps) as client:
pprint(await client.addUri(["http://www.demo.com"])) # that would start downloading
asyncio.run(main())
```
```python
# exampe of websocket
import asyncio
from pprint import pprint
import aioaria2
import ujson
@aioaria2.run_sync
def on_download_complete(trigger, data):
print(f"downlaod complete {data}")
async def main():
client: aioaria2.Aria2WebsocketTrigger = await aioaria2.Aria2WebsocketTrigger.new("http://127.0.0.1:6800/jsonrpc",
token="token",
loads=ujson.loads,
dumps=ujson.dumps)
client.onDownloadComplete(on_download_complete)
pprint(await client.addUri(["http://www.demo.com"]))
loop = asyncio.get_event_loop()
loop.create_task(main())
loop.run_forever()
```
- Run that coroutine function and each method represent an aria2-rpc call. As for server, each instance represent an aria2 process.
```python
import aioaria2
import asyncio
async def main():
server = aioaria2.AsyncAria2Server(r"aria2c.exe",
r"--conf-path=aria2.conf", "--rpc-secret=admin", daemon=True)
await server.start()
await server.wait()
asyncio.run(main())
```
#### this start an aria2 process
[Aria2 Manual](http://aria2.github.io/manual/en/html/)
### todolist
- [x] async http
- [x] async websocket
- [x] async process management
- [x] unitest
This module is built on top of [aria2jsonrpc](https://xyne.archlinux.ca/projects/python3-aria2jsonrpc)
with async and websocket support.
### For windows users, you should
```
# for start async aria2 process
asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
asyncio.set_event_loop(asyncio.ProactorEventLoop())
```
For python version greater than 3.8, asyncio uses ProactorEventLoop by default, so there is no need to modify
#### v1.2.0
new Aria2WebsocketTrigger class for websocket events, use on* methods to add callbacks
Like
```
@trigger.onDownloadStart
async def onDownloadStart(trigger, future):
print("下载开始{0}".format(future.result()))
```
#### v1.2.3
Now you can add multiple callbacks for one event ,must be coroutine function or an async callable, use ```aioaria2.run_sync``` to wrap a sync function
```
@trigger.onDownloadStart
async def callback1(trigger, future):
print("第一个回调{0}".format(future.result()))
@trigger.onDownloadStart
@run_sync
def callback2(trigger, future):
print("第二个回调{0}".format(future.result()))
```
#### v1.3.0
* Big changes for class```Aria2WebsocketTrigger```
* Callbacks now accept```dict```as second parameter instead of```asyncio.Future```
* methods of class```Aria2WebsocketTrigger``` now have same return value as ```Aria2HttpClient```
* ```id``` parameter now accept a callable as idfactory to generate uuid, otherwise default uuid factory is used.
```
@trigger.onDownloadStart
async def callback1(trigger, data:dict):
print("第一个回调{0}".format(data))
@trigger.onDownloadStart
@run_sync
def callback2(trigger, data:dict):
print("第二个回调{0}".format(data))
```
### v1.3.1
* custom json library with keyword arguments ```loads``` ```dumps```
### v1.3.2
* fix unclosed client_session when exception occurs during ws_connect
* alias for ```Aria2WebsocketTrigger```,named ```Aria2WebsocketClient```
### v1.3.3
* fix method problems in client
### v1.3.4rc1
* handle reconnect simply
* handle InvalidstateError while trying to ping aria2
### v1.3.4
* add async id factory support
* allow unregister callbacks in websocketclient
* add contextvars support in ```run_sync```
Raw data
{
"_id": null,
"home_page": "https://github.com/synodriver/aioaria2",
"name": "aioaria2",
"maintainer": "v-vinson",
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": "",
"keywords": "asyncio,Aria2",
"author": "synodriver",
"author_email": "diguohuangjiajinweijun@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/37/7b/4c1fb78d55d9ea7ec14e862d85d9d7edd905c3a3f09e25d27bce0e4a434e/aioaria2-1.3.4.tar.gz",
"platform": "",
"description": "# aioaria2\n\n\n[![pypi](https://img.shields.io/pypi/v/aioaria2.svg)](https://pypi.org/project/aioaria2/)\n![python](https://img.shields.io/pypi/pyversions/aioaria2)\n![implementation](https://img.shields.io/pypi/implementation/aioaria2)\n![wheel](https://img.shields.io/pypi/wheel/aioaria2)\n![license](https://img.shields.io/github/license/synodriver/aioaria2.svg)\n\n## Support async rpc call with aria2 and process management\n\n## Usage:\n\n### example\n\n```python\nimport asyncio\nfrom pprint import pprint\n\nimport aioaria2\n\n\nasync def main():\n async with aioaria2.Aria2HttpClient(\"http://117.0.0.1:6800/jsonrpc\",\n token=\"token\") as client:\n pprint(await client.getVersion())\n\n\nasyncio.run(main())\n```\n\n### The ip address should be replaced with your own\n\n### See [aria2 manual](http://aria2.github.io/manual/en/html/) for more detail about client methods\n\n```python\n# exampe of http\nimport asyncio\nfrom pprint import pprint\n\nimport aioaria2\nimport ujson\n\n\nasync def main():\n async with aioaria2.Aria2HttpClient(\"http://127.0.0.1:6800/jsonrpc\",\n token=\"token\",\n loads=ujson.loads,\n dumps=ujson.dumps) as client:\n pprint(await client.addUri([\"http://www.demo.com\"])) # that would start downloading\n\n\nasyncio.run(main())\n```\n\n```python\n# exampe of websocket\nimport asyncio\nfrom pprint import pprint\n\nimport aioaria2\nimport ujson\n\n\n@aioaria2.run_sync\ndef on_download_complete(trigger, data):\n print(f\"downlaod complete {data}\")\n\n\nasync def main():\n client: aioaria2.Aria2WebsocketTrigger = await aioaria2.Aria2WebsocketTrigger.new(\"http://127.0.0.1:6800/jsonrpc\",\n token=\"token\",\n loads=ujson.loads,\n dumps=ujson.dumps)\n client.onDownloadComplete(on_download_complete)\n pprint(await client.addUri([\"http://www.demo.com\"]))\n\n\nloop = asyncio.get_event_loop()\nloop.create_task(main())\nloop.run_forever()\n```\n\n- Run that coroutine function and each method represent an aria2-rpc call. As for server, each instance represent an aria2 process.\n\n```python\nimport aioaria2\nimport asyncio\n\n\nasync def main():\n server = aioaria2.AsyncAria2Server(r\"aria2c.exe\",\n r\"--conf-path=aria2.conf\", \"--rpc-secret=admin\", daemon=True)\n await server.start()\n await server.wait()\n\n\nasyncio.run(main())\n```\n\n#### this start an aria2 process\n\n[Aria2 Manual](http://aria2.github.io/manual/en/html/)\n\n### todolist\n\n- [x] async http\n- [x] async websocket\n- [x] async process management\n- [x] unitest\n\nThis module is built on top of [aria2jsonrpc](https://xyne.archlinux.ca/projects/python3-aria2jsonrpc)\nwith async and websocket support.\n\n### For windows users, you should\n\n```\n# for start async aria2 process\nasyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())\nasyncio.set_event_loop(asyncio.ProactorEventLoop())\n```\n\nFor python version greater than 3.8, asyncio uses ProactorEventLoop by default, so there is no need to modify\n\n#### v1.2.0\n\nnew Aria2WebsocketTrigger class for websocket events, use on* methods to add callbacks\n\nLike\n\n```\n@trigger.onDownloadStart\nasync def onDownloadStart(trigger, future):\n print(\"\u4e0b\u8f7d\u5f00\u59cb{0}\".format(future.result()))\n```\n\n#### v1.2.3\n\nNow you can add multiple callbacks for one event ,must be coroutine function or an async callable, use ```aioaria2.run_sync``` to wrap a sync function\n\n```\n@trigger.onDownloadStart\nasync def callback1(trigger, future):\n print(\"\u7b2c\u4e00\u4e2a\u56de\u8c03{0}\".format(future.result()))\n\n@trigger.onDownloadStart\n@run_sync\ndef callback2(trigger, future):\n print(\"\u7b2c\u4e8c\u4e2a\u56de\u8c03{0}\".format(future.result()))\n```\n\n#### v1.3.0\n\n* Big changes for class```Aria2WebsocketTrigger```\n\n* Callbacks now accept```dict```as second parameter instead of```asyncio.Future```\n* methods of class```Aria2WebsocketTrigger``` now have same return value as ```Aria2HttpClient```\n* ```id``` parameter now accept a callable as idfactory to generate uuid, otherwise default uuid factory is used.\n\n\n```\n@trigger.onDownloadStart\nasync def callback1(trigger, data:dict):\n print(\"\u7b2c\u4e00\u4e2a\u56de\u8c03{0}\".format(data))\n\n@trigger.onDownloadStart\n@run_sync\ndef callback2(trigger, data:dict):\n print(\"\u7b2c\u4e8c\u4e2a\u56de\u8c03{0}\".format(data))\n```\n\n### v1.3.1\n\n* custom json library with keyword arguments ```loads``` ```dumps```\n\n### v1.3.2\n\n* fix unclosed client_session when exception occurs during ws_connect\n* alias for ```Aria2WebsocketTrigger```,named ```Aria2WebsocketClient```\n\n### v1.3.3\n\n* fix method problems in client\n\n### v1.3.4rc1\n\n* handle reconnect simply\n* handle InvalidstateError while trying to ping aria2\n\n### v1.3.4\n\n* add async id factory support\n* allow unregister callbacks in websocketclient\n* add contextvars support in ```run_sync```\n\n",
"bugtrack_url": null,
"license": "GPLv3",
"summary": "Support Aria2 rpc client and manage server with async/await",
"version": "1.3.4",
"split_keywords": [
"asyncio",
"aria2"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "4dd2c17d19a54b10f9f683fc4e19f28844d453615ea2c31eb22b96e3e9db5582",
"md5": "a72ac9d8024e4593bf92b71895246c05",
"sha256": "f9040cc2bf04dbff40ebc375681deaa6e2d4d5d0f9a537155e0c6e6c632e07c8"
},
"downloads": -1,
"filename": "aioaria2-1.3.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a72ac9d8024e4593bf92b71895246c05",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 31463,
"upload_time": "2021-12-03T15:07:28",
"upload_time_iso_8601": "2021-12-03T15:07:28.265313Z",
"url": "https://files.pythonhosted.org/packages/4d/d2/c17d19a54b10f9f683fc4e19f28844d453615ea2c31eb22b96e3e9db5582/aioaria2-1.3.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "377b4c1fb78d55d9ea7ec14e862d85d9d7edd905c3a3f09e25d27bce0e4a434e",
"md5": "06c2430a209a0f6507f07c74c70d6f1b",
"sha256": "8250a5e1d22e00e4f030a14d4ba274b3d98f8340299ed26abd2c5751afe1201d"
},
"downloads": -1,
"filename": "aioaria2-1.3.4.tar.gz",
"has_sig": false,
"md5_digest": "06c2430a209a0f6507f07c74c70d6f1b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 32046,
"upload_time": "2021-12-03T15:07:29",
"upload_time_iso_8601": "2021-12-03T15:07:29.727329Z",
"url": "https://files.pythonhosted.org/packages/37/7b/4c1fb78d55d9ea7ec14e862d85d9d7edd905c3a3f09e25d27bce0e4a434e/aioaria2-1.3.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2021-12-03 15:07:29",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "synodriver",
"github_project": "aioaria2",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "aioaria2"
}