新增 aria2 插件,可创建下载任务

- 提供 RPC 接口配置和任务处理功能
- 支持自动下载和自定义下载目录
This commit is contained in:
Cp0204 2024-11-25 01:20:34 +08:00
parent c3c4ad6c00
commit c9c83cb65a
2 changed files with 91 additions and 0 deletions

View File

@ -2,6 +2,7 @@
"alist", "alist",
"alist_strm", "alist_strm",
"alist_strm_gen", "alist_strm_gen",
"aria2",
"emby", "emby",
"plex" "plex"
] ]

90
plugins/aria2.py Normal file
View File

@ -0,0 +1,90 @@
import os
import requests
class Aria2:
default_config = {
"host_port": "172.17.0.1:6800", # Aria2 RPC地址
"secret": "", # Aria2 RPC 密钥
"dir": "/Downloads", # 下载目录需要Aria2有权限访问
}
default_task_config = {
"auto_download": False, # 是否开启自动下载
}
is_active = False
rpc_url = None
def __init__(self, **kwargs):
self.plugin_name = self.__class__.__name__.lower()
if kwargs:
for key, _ in self.default_config.items():
if key in kwargs:
setattr(self, key, kwargs[key])
else:
print(f"{self.plugin_name} 模块缺少必要参数: {key}")
if self.host_port and self.secret:
self.rpc_url = f"http://{self.host_port}/jsonrpc"
if self.get_version():
self.is_active = True
def run(self, task, **kwargs):
if task_config := task.get("addition", {}).get(self.plugin_name, {}):
if not task_config.get("auto_download"):
return
if (tree := kwargs.get("tree")) and (account := kwargs.get("account")):
for node in tree.all_nodes_itr():
if not node.data.get("is_dir", True):
quark_path = node.data.get("path")
quark_fid = node.data.get("fid")
save_path = f"{self.dir}{quark_path}"
print(f"📥 Aria2下载: {quark_path}")
download_return, cookie = account.download([quark_fid])
download_url = [
item["download_url"] for item in download_return["data"]
]
aria2_params = [
download_url,
{
"header": [
f"Cookie: {cookie}",
f"User-Agent: {account.common_headers().get('user-agent')}",
],
"out": os.path.basename(save_path),
"dir": os.path.dirname(save_path),
},
]
self.add_uri(aria2_params)
def _make_rpc_request(self, method, params=None):
"""发出 JSON-RPC 请求."""
jsonrpc_data = {
"jsonrpc": "2.0",
"id": "quark-auto-save",
"method": method,
"params": params or [],
}
if self.secret:
jsonrpc_data["params"].insert(0, f"token:{self.secret}")
try:
response = requests.post(self.rpc_url, json=jsonrpc_data)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"Aria2下载: 错误{e}")
return None
def get_version(self):
"""检查与 Aria2 的连接."""
response = self._make_rpc_request("aria2.getVersion")
if response.get("result"):
print(f"Aria2下载: v{response['result']['version']}")
return True
else:
print(f"Aria2下载: 连接失败{response.get('error')}")
return False
def add_uri(self, params=None):
"""添加 URI 下载任务."""
response = self._make_rpc_request("aria2.addUri", params)
return response.get("result") if response else None