Skip to content

[Feature]: 支持 aria2 BT / Magnet 离线下载 #249

Description

@AptS-1738

Problem

当前离线下载 / 链接导入只接受 http://https:// URL,并且任务模型假设最终只导入一个文件。现在已经支持 aria2 作为外部下载引擎,但还没有开放 aria2 已经具备的 BitTorrent / Magnet 能力。

用户希望可以把磁力链接或 BT 资源交给 AsterDrive 离线下载,再导入到目标文件夹。

初步调查:

  • aria2 官方文档说明 aria2.addUri() 支持 HTTP/FTP/SFTP/BitTorrent Magnet URI;添加 Magnet URI 时 uris 必须只有一个元素。
  • aria2 官方文档说明 .torrent 文件内容应通过 aria2.addTorrent() 上传,torrent 参数是 base64 编码的 .torrent 文件内容;如果是 Magnet URI,则应继续使用 aria2.addUri()
  • AsterDrive 当前 OfflineDownloadTaskResult 是单文件结果:file_idfile_namefolder_idfile_pathcontent_lengthsha256。BT 任务可能产出目录或多个文件,不能直接塞进现有单文件结果模型。
  • 当前存储导入路径走 store_from_temp_internal(),也是单文件导入接口。完整 BT 支持需要补目录 / 多文件导入流程和结果展示。

参考:

Proposed solution

建议分阶段实现,避免一次把任务模型和存储导入打烂:

  1. 第一阶段支持 Magnet URI 的受限版本:

    • parse_and_validate_source_url() 允许 magnet: scheme。
    • Magnet 任务只能在 aria2 引擎启用时执行;内置下载器遇到 Magnet 应直接返回明确错误,不能 fallback 成 HTTP 下载。
    • Magnet 任务继续通过 aria2.addUri() 提交。
    • aria2 完成后检查结果路径:
      • 如果最终只有一个普通文件,则按现有单文件导入流程导入。
      • 如果产出目录、多个文件、或无法唯一定位单文件,则任务失败并给出明确错误,提示后续需要多文件 BT 支持。
    • 对 Magnet 任务禁用 expected_sha256,或只在单文件结果明确后继续支持校验;需要在设计里明确。
    • 任务展示和文档明确这是 “Magnet 单文件导入” 的阶段性能力。
  2. 第二阶段支持完整 BT / 多文件导入:

    • 设计新的任务 result 结构,例如 file_id 单文件结果和 folder_id / imported_files 多文件结果二选一。
    • 增加从临时目录批量导入到 workspace 的 service,处理目录创建、文件名冲突、配额、去重、失败回滚或部分失败策略。
    • 前端任务详情支持展示多个导入结果或目标目录。
    • 支持 .torrent 文件输入时,再设计 API 形态:上传 torrent 文件、通过 URL 拉取 .torrent 后转 addTorrent(),还是只支持 Magnet。
  3. 安全与运维边界:

    • 只有 aria2 引擎支持 BT;内置引擎不实现 BT 协议。
    • 文档需要说明 BT 出站连接、DHT、tracker、上传行为由 aria2 daemon 控制,AsterDrive 的 HTTP URL 私网地址防护不等价于 BT 网络隔离。
    • 配置文档需要提示生产环境要在 aria2 层限制网络、下载目录和 RPC 访问。
    • 需要考虑是否新增 BT 开关,避免管理员只想用 aria2 HTTP 下载时无意启用 BT。

Alternatives considered

  • 直接把 magnet: 当作普通 URL 允许,然后沿用当前单文件路径:不可取。BT 可能产出多文件 / 目录,当前结果模型和导入接口无法正确表达。
  • 一次性实现 .torrent、Magnet、多文件目录导入:可行但范围较大,会同时影响后端任务模型、存储导入、前端任务详情和文档,建议拆阶段。
  • 只支持 aria2 下载到临时目录但不导入 workspace:不符合 AsterDrive “链接导入” 的用户预期,也会留下临时文件清理和权限语义问题。

Category

File management

Contribution

  • I am willing to help implement this feature
  • I can help test and provide feedback

Checklist

  • I have searched existing issues for similar requests

Metadata

Metadata

Assignees

Labels

DocumentationImprovements or additions to documentationEnhancementNew feature or requestPriority: LowLow priority issueRustPull requests that update Rust codeTypeScriptPull requests that update JavaScript code

Type

No type

Fields

No fields configured for issues without a type.

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions