Skip to content

feat(aria2): 新增 Aria2 RPC 导出功能(支持文件夹递归下载) - #344

Open
swlfigo wants to merge 1 commit into
cbingb666:mainfrom
swlfigo:pr/aria2-export
Open

feat(aria2): 新增 Aria2 RPC 导出功能(支持文件夹递归下载)#344
swlfigo wants to merge 1 commit into
cbingb666:mainfrom
swlfigo:pr/aria2-export

Conversation

@swlfigo

@swlfigo swlfigo commented Apr 22, 2026

Copy link
Copy Markdown

背景

115 文件夹下载目前在脚本内直接 alert('当前未支持文件夹下载')FileItemMod/download.ts:39),只能靠 115 原生下载且一次只能一个文件。本 PR 集成 aria2 JSON-RPC,补齐文件夹批量下载能力。

主要变更

在文件列表每行的 .file-opr 容器(即 115 原生下载按钮所在处)新增「推送 Aria2」按钮,按 RPC 预设数量自适应三种形态:

RPC 预设数量 行内呈现
0 ⚙ 配置 Aria2 — 引导打开设置面板
1 ⇩ <预设名> — 单按钮直接推送
≥2 ⇩ Aria2 ▾ — hover 下拉选择
  • 文件行:点击后直接拿直链推给 aria2
  • 文件夹行:异步递归遍历子目录(drive115.getFilesshow_dir=1),批量推送所有文件,aria2 落盘时保留目录结构
  • 推送时自动注入 Cookie / UA / Referer 到 aria2 headers,下载端可通过 115 鉴权(否则 403)

设置面板

通过行内下拉的「⚙ 设置」项打开,持久化到 GM_setValue('ARIA2_SETTINGS')

  • RPC 列表(多预设,名称 + URL,支持 http://token:密钥@host:port/jsonrpc#k=v&k2=v2,行内「测试」按钮调用 aria2.getVersion 回显版本)
  • 下载路径、递归间隔、SHA1 校验
  • UA(默认使用浏览器 UA,可自定义)、Referer、自定义 Headers(每行 Key: Value

架构

apps/monkey/src/
├── utils/aria2/              # 纯逻辑层,无 Vue / DOM 依赖
│   ├── types.ts              # 类型定义 + 默认设置常量
│   ├── config.ts             # GM 持久化 + 发布订阅
│   ├── headers.ts            # 构造 aria2 addUri 的 header 数组
│   ├── rpc.ts                # RPC URL 解析 / addUri / getVersion
│   ├── walker.ts             # async generator 递归遍历目录
│   ├── events.ts             # mitt 事件总线
│   └── index.ts              # 对外 API:pushFile / pushFolder / testRpc
│
├── components/
│   ├── Aria2SettingsDialog/  # Vue 设置面板 + RPC 列表编辑子组件
│   └── MasterToast/          # 新增通用 toast 组件(info/success/error/loading)
│
└── pages/home/FileListMod/FileItemMod/
    └── aria2Push.ts          # 行内三态按钮 Mod

测试

utils/aria2/ 为纯逻辑层,覆盖了单元测试(Vitest):

被测模块 用例数 覆盖
config.ts 5 读/写/订阅/取消订阅
headers.ts 5 UA 切换、Referer/Cookie/自定义 Headers、空值过滤
rpc.ts 12 URL 解析(无认证 / token / basic / fragment options),addUri payload 构造(token 前置、basic 不改、dir、checksum、fragment 合并)
walker.ts 4 单层目录、嵌套目录、失败重试成功、失败两次抛出

全部通过:pnpm --filter @115master/monkey test → 36/36。

手动冒烟(本机)

  1. aria2c --enable-rpc --rpc-listen-all --rpc-secret=<密钥>
  2. 设置面板加 RPC:http://token:<密钥>@localhost:6800/jsonrpc → 点「测试」显示版本
  3. 单文件行 → 点按钮 → aria2 面板出现任务,下载成功
  4. 文件夹行 → toast 实时显示「正在获取文件列表 → 推送中 x/y → 已推送 N 个」,aria2 中每个任务的 out 含相对路径,目录结构保留
  5. 配置 2 个 RPC → 按钮变下拉 → 不同预设分别推送
  6. 关闭 aria2 → 推送时 toast 红色错误,控制台 Aria2 logger 有堆栈

兼容性

  • is115Browser 为 true 时不渲染(与现有 FileItemModDownload 一致,115 浏览器内置不走代理)
  • 文件列表网格视图下不渲染(与现有 FileItemModExtMenu 一致)
  • userSettings 没动,Aria2 配置持久化用独立 key ARIA2_SETTINGS

Changeset

已随 PR 附上 @115master/monkey minor bump。

非目标 / 后续可选

  • 顶部工具栏批量推送入口(v1 仅行内按钮)
  • 文本导出(aria2c.down / IDM.ef2 / 纯链接 / 复制)
  • 小文件优先排序
  • walker 仅请求一页(limit=1150),超大目录后续可加分页

在 115 文件列表每行 115 原生下载按钮旁增加「推送 Aria2」按钮,
点击文件直接推送、点击文件夹递归遍历后批量推送,补齐当前缺失的文件夹下载体验。

主要能力:
- 文件 / 文件夹行内按钮;文件夹递归遍历子目录后批量推送,保留目录结构
- 支持多个 RPC 预设:0 个时显示配置引导、1 个时单按钮、≥2 个时下拉选择
- 独立设置面板:RPC 列表(带连通测试)、下载路径、递归间隔、SHA1 校验、UA / Referer / 自定义 Headers
- 新增通用 MasterToast 组件,支持 info / success / error / loading 进度更新
- 推送时自动注入 115 的 Cookie / UA / Referer 到 aria2,下载端可通过 115 鉴权
- 单元测试覆盖 config / headers / rpc / walker 共 36 个用例
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant