feat(offline-download): support torrent uploads for qBittorrent PT#2676
Open
ctaoist wants to merge 3 commits into
Open
feat(offline-download): support torrent uploads for qBittorrent PT#2676ctaoist wants to merge 3 commits into
ctaoist wants to merge 3 commits into
Conversation
- 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.
25 tasks
PIKACHUIM
reviewed
Jun 30, 2026
| } | ||
| meta := strings.ToLower(encoded[:comma]) | ||
| if !strings.Contains(meta, ";base64") { | ||
| return nil, "", fmt.Errorf("torrent data URL 必须使用 base64 编码") |
Contributor
There was a problem hiding this comment.
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_seedingand propagate adelete_after_timetimestamp 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 on lines
+20
to
+23
| addCalled = true | ||
| if err := r.ParseMultipartForm(1024 * 1024); err != nil { | ||
| t.Fatalf("ParseMultipartForm() error = %v", err) | ||
| } |
Comment on lines
+84
to
+87
| addCalled = true | ||
| if err := r.ParseMultipartForm(1024 * 1024); err != nil { | ||
| t.Fatalf("ParseMultipartForm() error = %v", err) | ||
| } |
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 ./...从不删除策略的任务Checklist / 检查清单
/ 我已阅读 CONTRIBUTING。
/ 我确认此贡献符合仓库许可证、贡献规范和行为准则。
gofmt,go fmt, orprettierwhere applicable./ 我已按适用情况使用
gofmt、go fmt或prettier格式化变更代码。/ 我已在适用情况下请求相关维护者或代码所有者审查。
AI Disclosure / AI 使用声明
/ 此 PR 包含 AI 辅助内容。
Tools used / 使用工具:
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-Byattribution./ 我已确保所有 AI 辅助提交都包含
Co-Authored-By归属信息。I can reproduce all AI-assisted content included in this PR without any AI tools.
/ 我可以在没有任何 AI 工具的情况下重现此 PR 中包含的所有 AI 辅助内容。