自动转移做种客户端:把种子从一个下载器(qBittorrent / Transmission)迁移到另一个,本地数据不重新下载,只重新挂种。
自 IYUUPlus 的「自动转移」功能抽离的纯本地版。
本工具唯一的外部网络流量 = 你自己配置的下载器 API 请求。
- 不含 IYUU 官网 API、辅种、站点交互、WebSocket、通知推送等任何外联功能
- 不引入
iyuu/*、ledc/*任何代码,HTTP 层为项目内自写的 ~200 行 curl 封装 - 唯一 composer 依赖
rhilip/bencode(纯 bencode 编解码,无网络行为) - 逐行裁剪移植,可直接审查:
src/+bin/全部源码约 1700 行
- 源/目标支持 qBittorrent 与 Transmission 任意组合(跨客户端、跨机器)
- 路径过滤器 / 选择器(前缀匹配,过滤掉不想迁移的目录)
- 路径转换(
replace替换前缀 /add加前缀 /sub去前缀 /eq原样) - 可选:跳校验(
skip_check)、暂停入种(paused)、转移成功后删除源做种(delete_torrent,不删文件) - 转移后给种子打分类/标签(
marker,默认不打标) - SQLite 去重缓存:增量转移,已处理过的种子(含失败)自动跳过
- 保留 IYUU 多年踩坑逻辑:qB ≥4.4 的 v2 种子按
infohash_v1定位种子文件、种子缺 tracker 时从.fastresume补、Tr 种子文件路径缺失时用 BT_backup 兜底
git clone https://github.com/doc2page/myuu.git myuu && cd myuu
docker compose up -d --build首次启动会自动在 config/ 下生成 config.json(内置示例),编辑下载器地址与路径映射后重启容器即可。
日志:docker logs -f myuu
试运行(不推送、不写缓存):
docker compose run --rm myuu --dry-run转移需要读取源下载器的种子文件(.torrent),必须把源下载器的种子目录挂载进本容器(只读):
| 源下载器 | 挂载的宿主路径 | 对应配置字段 |
|---|---|---|
| qBittorrent | <qB配置目录>/BT_backup |
from.torrent_path(容器内路径) |
| Transmission | <tr配置目录>/torrents |
from.torrent_path(容器内路径) |
在 docker-compose.yml 的 volumes 里加(示例):
- /volume1/docker/qbittorrent/BT_backup:/bt_backup/qbittorrent:ro并将任务配置的 from.torrent_path 设为 /bt_backup/qbittorrent。
目标下载器无需挂载(种子经 Web API 推送过去),但目标机器上必须已存在对应数据文件(路径由 path_convert_rule 映射)。
config/config.json:
| 字段 | 说明 |
|---|---|
interval |
常驻模式轮询间隔(秒,默认 3600,最小 60) |
data_path |
SQLite 缓存路径(默认 /app/data/transfer.sqlite) |
tasks[].name |
任务名(唯一,用于缓存隔离与命令行指定) |
tasks[].from / to |
下载器:type(qbit/transmission)、url、username、password;from 另需 torrent_path;to 可选 root_folder(qB)、speed_limit_up / speed_limit_down(kB/s,0 或缺省不限速;添加成功后对单个种子设置) |
tasks[].path_filter |
路径过滤器(前缀,命中即跳过,优先级高) |
tasks[].path_selector |
路径选择器(前缀,命中才转移;与 filter 同时设置时先 filter 后 selector) |
tasks[].path_convert_type |
eq(默认)/ add / sub / replace |
tasks[].path_convert_rule |
[{ "from": "源前缀", "to": "目标前缀" }] |
tasks[].skip_check |
转移后跳校验(默认 false) |
tasks[].paused |
以暂停状态添加(默认 false) |
tasks[].delete_torrent |
转移成功后删除源做种,不删数据文件(默认 false) |
tasks[].marker |
{ "type": "none|category|tag|labels", "name": "..." }:转移后打的分类/标签;qB 支持 category/tag,Tr 为 labels;默认 none |
路径转换语义(前缀匹配第一个命中生效):
replace:from前缀替换为to(最常用,跨机器路径映射)add:路径前直接拼接tosub:去掉from前缀(转相对路径)eq:原样
| 命令 | 说明 |
|---|---|
docker compose up -d |
常驻模式 |
docker compose run --rm myuu --once |
执行一轮退出 |
docker compose run --rm myuu --dry-run |
试运行(只打印将要转移什么,不推送不写缓存) |
docker compose run --rm myuu --task <name> |
只跑指定任务 |
docker compose run --rm myuu --reset <name> |
清空任务缓存(改了转换规则想重跑时用) |
- 与 IYUU 一致:失败的种子也会进缓存,不会反复重试;修正配置(如路径映射)后用
--reset <name>清缓存重跑 - 只迁移「正常做种状态」的种子(qB:uploading/stalledUP/pausedUP 等;Tr:status=6)
delete_torrent只删源下载器里的种子任务,不删任何数据文件
- 核心转移逻辑自 ledccn/iyuuplus-dev(MIT)的
app/admin/services/transfer/TransferServices.php与composer/bittorrent-client/裁剪移植 - 本项目 MIT,见 LICENSE