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

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions