Skip to main content

Auto Remove Torrents (H&R Version)

这是一个支持 H&R 检查的自动删种程序,基于 autoremove-torrents 修改,在此感谢原作者jerrymakesjelly。

新增功能

v2.1.0

  • 新增删除专项日志 autoremove.deleted.YYYY-MM-DD.log,单独记录每条种子的删除结果、触发删除的策略与条件名称,以及失败原因

v2.0.0

  • 整体重构,可以根据 H&R 状态码灵活配置删除条件
  • 支持多个策略组合使用
  • 支持检查种子的做种时间、上传速度等条件
  • 增加种子状态本地缓存,减少 API 请求次数

v1.6.1

  • 支持通过 API 检查种子的 H&R 状态来删除种子

环境准备

本说明使用 uv 管理 Python 与依赖。若尚未安装,请参考官方文档安装 uv。

安装

全局或当前环境中安装(与 pip install 等价,由 uv 加速解析与下载):

uv pip install autoremove-torrents-hnr

仅需要命令行工具、希望隔离依赖时,可使用工具安装(可执行文件由 uv 管理):

uv tool install autoremove-torrents-hnr

更新

uv pip install autoremove-torrents-hnr --upgrade
# 或固定版本
uv pip install autoremove-torrents-hnr==具体版本号

使用 uv tool install 安装的,可执行:

uv tool upgrade autoremove-torrents-hnr

卸载

uv pip uninstall autoremove-torrents-hnr

使用 uv tool install 安装的:

uv tool uninstall autoremove-torrents-hnr

配置示例

my_task:
  client: qbittorrent
  host: http://127.0.0.1:7474
  username: admin
  password: password
  
  strategies:
    # 删除未触发考核的种子
    remove_untriggered_hnr:
      categories:  # 种子分类(可选)
        - TJUPT
      hnr:
        host: https://tjupt.org/api/v1/hnr.php
        api_token: your_api_token
        target_codes: 0  # 未触发考核的种子
        min_seed_time: 86400  # 做种时间大于1天将被删除
        min_upload_speed: 51200  # 上传速度小于50KB/s将被删除

    # 删除已通过考核的种子
    remove_completed_hnr:
      categories:
        - TJUPT
      hnr:
        host: https://tjupt.org/api/v1/hnr.php
        api_token: your_api_token
        target_codes: [20, 21]  # 已通过考核的种子
        last_activity: 172800  # 2天没有活动的种子将被删除
        min_upload_speed: 10240  # 上传速度小于10KB/s将被删除
        min_ratio: 1.0  # 分享率大于1.0将被删除

    # 删除考核被取消的种子
    remove_cancelled_hnr:
      categories:
        - TJUPT
      hnr:
        host: https://tjupt.org/api/v1/hnr.php
        api_token: your_api_token
        target_codes: [40, 41, 42]  # 考核被取消的种子

  delete_data: true  # 是否在删除种子的同时也删除数据

其他条件配置请参考原项目 autoremove-torrents 的文档。

hnr 配置说明

H&R API 接口文档:hnr_api.md

在策略配置中添加 hnr 部分:

必需参数

  • host: H&R API 地址
  • api_token: API 访问令牌
  • target_codes: 目标状态码,可以是单个状态码或状态码列表,具体见H&R API 接口文档:hnr_api.md

可选参数

  • last_activity: 种子不活跃时间限制,单位为秒
  • min_seed_time: 最小做种时间,单位为秒
  • min_upload_speed: 最小上传速度,单位为字节/秒
  • min_ratio: 最小分享率

条件组合说明

  1. 首先检查种子的 HNR 状态码是否匹配 target_codes
  2. 如果状态码匹配,则继续检查其他配置的条件(如 last_activitymin_seed_time 等)
  3. 只有当所有配置的条件都满足时,种子才会被删除
  4. 未配置的条件会被跳过,不参与判断

使用方法

参考原项目 autoremove-torrents 的运行说明

# 预览模式(不会真正删除)
autoremove-torrents --view --conf=config.yml

# 正常运行
autoremove-torrents --conf=config.yml

不事先安装包、临时运行一次(由 uv 拉取依赖并执行;包名与可执行名不同,需指定 --from):

uvx --from autoremove-torrents-hnr autoremove-torrents --view --conf=config.yml
uvx --from autoremove-torrents-hnr autoremove-torrents --conf=config.yml

从本仓库源码安装并开发调试:

cd /path/to/autoremove-torrents
uv venv
source .venv/bin/activate   # Windows: .venv\Scripts\activate
uv pip install -e .
autoremove-torrents --conf=config.yml

日志

--log 表示日志所在目录(不是单个日志文件路径);程序会在该目录下按日期生成两个日志文件:

文件 内容
autoremove.YYYY-MM-DD.log 完整运行日志(连接、过滤、条件判断等所有流程)
autoremove.deleted.YYYY-MM-DD.log 删除专项日志,每条记录包含种子名称、所属任务、触发删除的策略与条件,失败时附带错误原因

删除日志格式示例:

Wed, 15 Apr 2026 01:00:34 INFO  REMOVED | 某种子名称 | Task: my_task | Reason: my_strategy > seeding_time
Wed, 15 Apr 2026 01:00:35 ERROR FAILED  | 某种子名称 | Task: my_task | Reason: my_strategy > ratio | Error: torrent not found
Wed, 15 Apr 2026 01:00:35 INFO  SUMMARY | Task: my_task | Removed: 5 | Failed: 1

使用前请确保目录已存在,例如 mkdir -p logs

autoremove-torrents --conf=config.yml --log=logs --debug

使用 uvx 时同样追加参数即可,例如:

uvx --from autoremove-torrents-hnr autoremove-torrents --conf=config.yml --log=logs --debug

定时自动运行

定时任务里的环境通常没有你在终端里配置的 PATH(例如 uv tool 会把可执行文件放在 ~/.local/bin)。请尽量使用配置文件与日志的绝对路径,并对 autoremove-torrents 使用 which autoremove-torrents(或 ~/.local/bin/autoremove-torrents 得到的绝对路径;若用虚拟环境,则用 /path/to/.venv/bin/autoremove-torrents。首次上线建议仍用 --view 在终端确认行为,再改为正式删除。

Linux / macOS:cron

编辑当前用户的 crontab:

crontab -e

示例:每 20 分钟执行一次(请把路径改成你机器上的真实路径):

*/20 * * * * /home/you/.local/bin/autoremove-torrents --conf=/home/you/autoremove/config.yml --log=/home/you/autoremove/logs >> /home/you/autoremove/logs/cron.log 2>&1

cron 表达式从左到右依次为:分、时、日、月、星期。*/20 表示从 0 分起每隔 20 分钟触发一次。若需其他周期可自行改写前两个字段(例如每天 03:15 一次为 15 3 * * *)。

macOS:launchd(推荐)

cron 更易被系统唤醒、日志与权限行为更一致。新建 ~/Library/LaunchAgents/org.tjupt.autoremove-torrents.plist(标签与文件名可自定)。下方示例用 StartInterval1200(即 20×60 秒)实现约每 20 分钟触发一次:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>org.tjupt.autoremove-torrents</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Users/you/.local/bin/autoremove-torrents</string>
    <string>--conf</string>
    <string>/Users/you/autoremove/config.yml</string>
    <string>--log</string>
    <string>/Users/you/autoremove/logs</string>
  </array>
  <key>StartInterval</key>
  <integer>1200</integer>
  <key>StandardOutPath</key>
  <string>/Users/you/autoremove/logs/launchd.out.log</string>
  <key>StandardErrorPath</key>
  <string>/Users/you/autoremove/logs/launchd.err.log</string>
</dict>
</plist>

加载与卸载:

launchctl load ~/Library/LaunchAgents/org.tjupt.autoremove-torrents.plist
launchctl unload ~/Library/LaunchAgents/org.tjupt.autoremove-torrents.plist

修改 plist 后需 unloadload 才会生效。

StartInterval 表示上次任务成功结束后再等待的秒数,与 cron 按钟表对齐到每小时的 0、20、40 分略有不同;若必须与钟表对齐,可优先使用上文 cron 或 Debian 上的 systemd timer

Debian / Ubuntu:systemd 定时器(示例:每 20 分钟)

适合长期跑在 Linux 服务器、需要与 journalctl / systemctl 统一管理的场景。以下文件需 root 创建或修改。示例假定以 root 执行 uv tool install autoremove-torrents-hnr,默认可执行文件为 /root/.local/bin/autoremove-torrents;若改过 UV_TOOL_DIR / XDG_*,在 root 下用 uv tool dir --binreadlink -f "$(command -v autoremove-torrents)" 核对后再写入 ExecStart--conf 为配置文件绝对路径;--log日志目录绝对路径(见上文「日志」)。长期以 root 跑删种权限较大,生产环境更稳妥的做法是改为普通用户安装工具并在 [Service] 里设置 User= 指向该用户。

1) /etc/systemd/system/autoremove-torrents.service

[Unit]
Description=Auto remove torrents (HNR)
Wants=network-online.target
After=network-online.target

[Service]
# User=you
# Group=you
# 使用绝对路径;若在 venv 中安装则改为 /home/you/autoremove/.venv/bin/autoremove-torrents
# ExecStart=/home/you/.local/bin/autoremove-torrents --conf=/home/you/autoremove/config.yml --log=/home/you/autoremove/logs/run.log
Type=oneshot
Environment=HOME=/root
# 确保日志目录存在(--log 必须是目录,程序会写入 autoremove.YYYY-MM-DD.log)
ExecStartPre=/bin/mkdir -p /root/autoremove/logs
ExecStart=/root/.local/bin/autoremove-torrents --conf=/root/autoremove/config.yml --log=/root/autoremove/logs

2) /etc/systemd/system/autoremove-torrents.timer

[Unit]
Description=Run autoremove-torrents every 20 minutes

[Timer]
# 对齐到每小时的 0、20、40 分(与 cron */20 的常见语义一致)
OnCalendar=*-*-* *:00,20,40:00
Persistent=true

[Install]
WantedBy=timers.target

3) 加载并启用定时器:

sudo systemctl daemon-reload
sudo systemctl enable --now autoremove-torrents.timer
systemctl list-timers autoremove-torrents.timer
journalctl -u autoremove-torrents.service -n 50 --no-pager

停用:sudo systemctl disable --now autoremove-torrents.timer。若 systemd 版本较新且希望用步进写法,可将 OnCalendar= 改为 *-*-* *:0/20:00(与上面列表形式等价,视本机 systemd.time(7) 说明为准)。

Windows:任务计划程序

打开「任务计划程序」,新建任务:触发器选择「每天」后在「高级设置」中将任务配置为每 20 分钟重复一次(或新建「一次」触发器并设置重复间隔 20 分钟,按向导界面为准);操作选择「启动程序」,程序填 autoremove-torrents 的完整路径(或 cmd.exe / powershell.exe 配合参数),参数示例:--conf=C:\path\to\config.yml --log=C:\path\to\logs--log 为目录)。注意任务运行账户下的 PATH 是否包含该可执行文件所在目录。

项目结构

1 客户端模块 (client/)

  • hnr_api.py: H&R API 客户端,用于查询种子的 H&R 状态
  • 其他客户端适配器(如 qBittorrent, Transmission 等)

2 条件模块 (condition/)

  • base.py: 条件基类,定义了条件的基本接口
  • hnr.py: H&R 条件检查实现
  • 其他条件实现(如分享率、做种时间等)

3 核心功能文件

  • strategy.py: 策略执行器,负责:

  • 应用各种条件

  • 管理种子的保留和删除列表

  • 执行删除操作

  • conditionparser.py: 条件解析器,负责:

  • 解析配置文件中的条件

  • 创建对应的条件实例

  • 处理条件组合

工作流程

1 配置加载

  • 读取 config.yml
  • 解析任务和策略配置

2 客户端连接

  • 根据配置创建对应的客户端实例
  • 建立连接并验证

3 策略执行

  • 获取种子列表
  • 应用分类过滤
  • 执行条件检查
  • 确定删除列表

4 删除操作

  • 执行种子删除
  • 记录操作日志

许可证

MIT License

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

autoremove_torrents_hnr-2.1.0.tar.gz (39.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

autoremove_torrents_hnr-2.1.0-py3-none-any.whl (61.0 kB view details)

Uploaded Python 3

File details

Details for the file autoremove_torrents_hnr-2.1.0.tar.gz.

File metadata

  • Download URL: autoremove_torrents_hnr-2.1.0.tar.gz
  • Upload date:
  • Size: 39.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for autoremove_torrents_hnr-2.1.0.tar.gz
Algorithm Hash digest
SHA256 4df8eb7c4ed389437dbbe7f26e7658c89e268467d82cb816030ee3f2f8cfab90
MD5 374035211d0e1521757479435dfac50b
BLAKE2b-256 65fbb373f8698f86c2cc2cf58bb948e4121e7a505f344356ff65bbb0f2d5e4d4

See more details on using hashes here.

Provenance

The following attestation bundles were made for autoremove_torrents_hnr-2.1.0.tar.gz:

Publisher: publish.yml on tjupt/autoremove-torrents

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file autoremove_torrents_hnr-2.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for autoremove_torrents_hnr-2.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 907958493b6a8633644b45d1064f432411f7335239a528e585cd59635ad9224d
MD5 7e0e6773c93cc51c67dd914685baaa72
BLAKE2b-256 db92b645a6cdf4a01d8f952b8f5fd639f3221177d3a49387946efd31824953c9

See more details on using hashes here.

Provenance

The following attestation bundles were made for autoremove_torrents_hnr-2.1.0-py3-none-any.whl:

Publisher: publish.yml on tjupt/autoremove-torrents

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

2.1.0 This release

2 files

2.0.0

2 files

1.6.1

2 files

1.6.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page