Skip to content

feat(offline-download): support torrent uploads for qBittorrent PT#2676

Open
ctaoist wants to merge 3 commits into
OpenListTeam:mainfrom
ctaoist:pt
Open

feat(offline-download): support torrent uploads for qBittorrent PT#2676
ctaoist wants to merge 3 commits into
OpenListTeam:mainfrom
ctaoist:pt

Conversation

@ctaoist

@ctaoist ctaoist commented Jun 29, 2026

Copy link
Copy Markdown

Summary / 摘要

离线下载时,直接传递种子文件到qBittorrent,以支持PT下载。

  • 在上传种子页面添加删除策略:delete_after_seeding,即等待做种结束再删除

  • 修改删除策略:从不删除,改完后,后端针对从不删除策略,不再在 qbittorrent 中删除对应的任务,更符合PT场景。

  • This PR has breaking changes.
    / 此 PR 包含破坏性变更。

  • This PR changes public API, config, storage format, or migration behavior.
    / 此 PR 修改了公开 API、配置、存储格式或迁移行为。

  • This PR requires corresponding changes in related repositories.
    / 此 PR 需要关联仓库同步修改。

Related repository PRs / 关联仓库 PR:

Testing / 测试

  • go test ./...
  • Manual test / 手动测试:
    • 编译前端和后端
    • 上传PT种子可以正常下载
    • 做种时间到时删除临时下载文件和对应的任务
    • 后端不再删除从不删除策略的任务

Checklist / 检查清单

  • I have read CONTRIBUTING.
    / 我已阅读 CONTRIBUTING
  • I confirm this contribution follows the repository license, contribution policy, and code of conduct.
    / 我确认此贡献符合仓库许可证、贡献规范和行为准则。
  • I have formatted the changed code with gofmt, go fmt, or prettier where applicable.
    / 我已按适用情况使用 gofmtgo fmtprettier 格式化变更代码。
  • I have requested review from relevant maintainers or code owners where applicable.
    / 我已在适用情况下请求相关维护者或代码所有者审查。

AI Disclosure / AI 使用声明

  • This PR includes AI-assisted content.
    / 此 PR 包含 AI 辅助内容。

Tools used / 使用工具:

  • ChatGPT
  • Codex
  • GitHub Copilot
  • Claude
  • Gemini
  • Other (please specify) / 其他(请注明):

Usage scope / 使用范围:

  • Code generation / 代码生成

  • Refactoring / 重构

  • Documentation / 文档

  • Tests / 测试

  • Translation / 翻译

  • Review assistance / 审查辅助

  • I have reviewed and validated all AI-assisted content included in this PR.
    / 我已审核并验证此 PR 中的所有 AI 辅助内容。

  • I have ensured that all AI-assisted commits include Co-Authored-By attribution.
    / 我已确保所有 AI 辅助提交都包含 Co-Authored-By 归属信息。

  • I can reproduce all AI-assisted content included in this PR without any AI tools.
    / 我可以在没有任何 AI 工具的情况下重现此 PR 中包含的所有 AI 辅助内容。

ctaoist added 2 commits June 29, 2026 20:28
- Accept torrent_data in offline download requests and validate uploaded torrent payloads.
- Route uploaded torrent data and detected HTTP torrent files through qBittorrent's torrent upload API.
- Add delete_after_seeding handling for seeding-capable offline download tools.
- Improve qBittorrent add-task response handling for 2xx and non-2xx responses.
- Add qBittorrent client tests for torrent uploads, link adds, and error reporting.
- Skip seeding task removal when the delete policy is set to delete_never.
- Reuse the delete-policy guard for qBittorrent and Transmission seeding cleanup.
Comment thread server/handles/offline_download.go Outdated
}
meta := strings.ToLower(encoded[:comma])
if !strings.Contains(meta, ";base64") {
return nil, "", fmt.Errorf("torrent data URL 必须使用 base64 编码")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

请使用英文输出便于LQA翻译

@ctaoist ctaoist Jul 1, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已修改,dfad1fa

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the offline download pipeline to support uploading .torrent files to qBittorrent (to better support PT scenarios), and adds a new deletion policy that defers cleanup until seeding is complete.

Changes:

  • Accept torrent_data (base64 / data URL) in the offline download request and pass decoded torrent bytes into the offline-download tool layer.
  • Extend the qBittorrent client/tool to add tasks from uploaded torrent data (and improve add-task error reporting / status progress handling).
  • Introduce delete_after_seeding and propagate a delete_after_time timestamp through download/transfer tasks to defer temp cleanup until seeding finishes.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
server/handles/offline_download.go Adds torrent_data request parsing + torrent base64 decoding/validation and task creation using uploaded torrent bytes.
pkg/qbittorrent/client.go Adds AddFromTorrent, refactors “add torrent” request building, and improves non-2xx error reporting.
pkg/qbittorrent/client_test.go Adds tests for link vs torrent upload behavior and non-2xx error handling.
internal/offline_download/tool/add.go Adds DeleteAfterSeeding, threads TorrentData through AddURL, and gates torrent upload to qBittorrent.
internal/offline_download/tool/base.go Extends AddUrlArgs to include TorrentData.
internal/offline_download/tool/download.go Propagates torrent data to tools; adds seeding-time deletion scheduling via DeleteAfterTime.
internal/offline_download/tool/transfer.go Adds DeleteAfterTime and defers temp cleanup when policy is delete_after_seeding.
internal/offline_download/qbit/qbit.go Implements torrent-upload support in qBittorrent tool (upload bytes or fetch+upload http(s) torrent), and fixes progress calculation for size==0.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread pkg/qbittorrent/client_test.go Outdated
Comment on lines +20 to +23
addCalled = true
if err := r.ParseMultipartForm(1024 * 1024); err != nil {
t.Fatalf("ParseMultipartForm() error = %v", err)
}
Comment thread pkg/qbittorrent/client_test.go Outdated
Comment on lines +84 to +87
addCalled = true
if err := r.ParseMultipartForm(1024 * 1024); err != nil {
t.Fatalf("ParseMultipartForm() error = %v", err)
}
Comment thread pkg/qbittorrent/client_test.go Outdated
Comment on lines +122 to +124
default:
t.Fatalf("unexpected path %s", r.URL.Path)
}
Comment on lines 119 to 123
t.Status = "offline download completed, maybe transferring"
// hack for qBittorrent
if t.tool.Name() == "qBittorrent" {
seedTime := setting.GetInt(conf.QbittorrentSeedtime, 0)
if seedTime >= 0 {
if seedDuration, ok := t.seedingDuration(); ok {
t.Status = "offline download completed, waiting for seeding"
- Replace Chinese torrent data validation errors with English messages.
- Remove the accidentally committed qBittorrent client test from Git tracking.
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.

3 participants