Files
Auto_Bangumi/CHANGELOG.md
2026-10-08 17:55:01 +02:00

66 KiB
Raw Permalink Blame History

[4.0.0-beta.1] - 2026-10-08

4.0 是插件化重构的大版本(设计见 docs/plans/2026-10-08-plugin-architecture-4.0-design.md)。本节随各阶段合入持续更新。

  • 新增(插件运行时):新增插件 SDK ab_sdk,包括 Plugin 基类、@hook / @provider / @subscribe、PluginContext,以及供插件作者写单元测试的 ab_sdk.testing;新增宿主运行时 module/plugin,负责清单解析、内置 / 本地目录 / pip entry point 三种来源的发现与加载、扩展点注册表、钩子超时与熔断、事件总线和插件私有 KV 存储(数据库迁移 v25)。新增 plugins 配置段和 GET /api/v1/plugins。本地与 pip 插件未签名,需开启 plugins.allow_unsigned 才会加载
  • 新增(插件扩展点):插件可以提供下载器、通知渠道、LLM 解析提供商、搜索站点和定时任务(ab_sdk.points)。内置的 qB / aria2 和各通知渠道走同一套扩展注册表。设置页新增「插件」卡片,可查看状态、启停插件,并通过插件配置模型自动生成的表单修改配置;secret_field 声明的秘密字段在读取接口中一律掩码。下载器类型和通知渠道下拉框会列出插件提供的选项。新增插件开发文档(开发者指南 → 插件开发)
  • 新增(ingest 扩展点):RSS 下载流程开放 torrent.filter(种子过滤)、title.parsed(修正解析结果)、torrent.adding(修改保存路径 / 分类 / 标签)、http.request(为私有站点添加 Cookie 等请求头)四个钩子,以及 metadata_provider 元数据源扩展点:内置 mikan / tmdb 以 core 身份登记,插件可按 RSS 订阅的「解析器」取值提供新的元数据源,添加订阅时的解析器下拉框会列出插件选项。插件 SDK 升至 0.3.0,新增 ab_sdk.ingest。未安装插件时行为不变
  • 新增(种子过滤):新增默认启用的内置插件「种子过滤」(ingest-filters)。在 设置 → 插件 中填写「包含过滤」后,只下载名称匹配任一表达式的种子(对所有订阅生效);留空时不过滤
  • 新增(事件与外部接口):系统事件(RSS 订阅异常、种子添加失败、下载器不可用、新版本等)在写入通知中心后发布到插件事件总线,插件可用 @subscribe("rss_failure") 等订阅;事件类移入 ab_sdk.events(SystemEvent 基类,新增 i18n() 返回前端 i18n key 与参数)。插件可以提供 REST 路由(挂载于 /api/v1/plugins/<id>/,强制登录鉴权,随插件启停出现和消失)、MCP 工具(工具名 <插件 id>__<id>)与 MCP 资源(autobangumi://plugins/<插件 id>/<id>),并可通过 message_template 钩子按事件类型和渠道改写系统通知的标题与正文。ab_sdk 升至 0.3.0
  • 优化(通知中心推送):SSE 的 notification 帧改为订阅事件总线,通知中心有新消息、已读或删除时立即推送(原先每 3 秒比较一次修订号),推送格式不变
  • 修复(搜索):GET /api/v1/search/provider 读取的是导入时的站点快照,新保存的搜索站点要重启后才会出现在列表中;现在实时读取
  • 修复(MCP):MCP 客户端每次断开 SSE 连接后,日志都会出现 AssertionError: Unexpected message http.response.start(3.x 起存在)。原因是 /sse 端点在 SSE 响应结束后又返回了一个空 Response,现在改为裸 ASGI 端点
  • 新增(整理流水线):重命名方式改为 rename_strategy 扩展点:pn / advance / template 由默认启用的内置插件「重命名」(rename)提供,none 由宿主提供;pn / advance 的输出与此前逐字一致。字幕不再使用 subtitle_* 平行方式,同一方式按文件类型生成。template 用 Jinja2 沙箱模板自定义文件名(默认模板与 pn 相同),保存时试渲染、不合法直接拒绝;运行时渲染失败的文件保留原名并发送「文件未重命名」通知,不会退回 pn。文件分类(media_files)与版本冲突策略(conflict_policy)改为宿主 Provider。重命名后向事件总线发布 file.renamed / torrent.organized(ab_sdk.events)。ab_sdk 升至 0.4.0
  • 新增(硬链接):新增默认停用的内置插件「硬链接到媒体库」(hardlink):种子整理完成后把正片与字幕链接到媒体库目录,按下载器实例做路径映射(path_map),跨文件系统时默认复制;不覆盖不是它创建的文件,版本升级后替换自己创建的链接;已有文件经 POST /api/v1/plugins/hardlink/backfill 按需补链
  • 新增(媒体库刷新):新增内置插件「媒体库刷新」(media-server-refresh):配置 Jellyfin / Emby / Plex 地址与 API Key 后,合并一段时间内整理完成的种子,请求刷新媒体库;未配置时不做任何事
  • 重构(整理流水线):manager/renamer.py 拆为编排(renamer.py)与 revision 替换事务(revision_saga.py);删除仅测试使用的 Renamer.rename_file / _lookup_offsets、无调用方的 release_replacement_lease、match_by_save_path、search_by_qb_hash,以及在重命名链路中传递却从未使用的 season_offset 参数
  • 修复(插件配置):插件配置模型的校验器(field_validator)报错时,保存接口返回 500 而不是 422(错误详情中的异常对象无法序列化)
  • 破坏性变更(配置,多下载器):下载器改为 plugins.instances 中的实例,plugins.slots.downloader 指向默认实例;重命名方式与版本冲突策略移到 plugins.slots.rename_strategy / conflict_policy(另有 media_files),插件提供的实现也可以通过 slots 选用。升级后第一次启动时,3.3 的 downloader、bangumi_manage.rename_method、bangumi_manage.revision_conflict_policy 自动迁移,原文件备份为 config.json.v3.bak(已有备份时不覆盖,另存为 config.json.v3.bak.1 等);迁移失败时从备份恢复配置并拒绝启动,日志写明出错的字段。AB_DOWNLOADER_*、AB_DOWNLOAD_PATH、AB_METHOD、AB_REVISION_CONFLICT_POLICY 环境变量照常生效。番剧、电影、RSS 订阅与种子新增 downloader_id 列(数据库迁移 v26):存量种子归属 default,规则与订阅为空(跟随默认实例)。ab_sdk 升至 0.5.0:ConflictRequest 删除 configured,宿主的冲突策略改为 hold / replace 两个 Provider
  • 新增(多下载器):设置 → 下载器设置 可以添加多个下载器实例(qBittorrent、aria2 或插件提供的下载器)并指定默认实例。规则与 RSS 订阅可以选择下载器,留空时用默认实例;由订阅新建的规则继承订阅的选择。每个种子记录它所在的下载器,重命名、删除都在该下载器上进行,规则改用另一个下载器后已有种子留在原处,新种子保存到该下载器的下载目录(默认下载器切换或下载器被删除时也是如此)。重命名逐个下载器运行,连不上的下载器被跳过,并在第一次连不上时通知(DownloaderUnavailableEvent 新增 instance_id,按实例去重)。下载器页与种子列表标出种子所在的下载器;GET /api/v1/downloader/torrents 汇总所有实例,暂停 / 恢复 / 删除 / 打标接口新增 downloader_id,新增 GET /api/v1/downloader/instances
  • 新增(插件开发工具):ab_sdk 可单独打包为 autobangumi-sdk 轮子(uv build --wheel backend/sdk),带 ab-plugin 命令行:new 生成插件骨架与契约测试,validate 校验清单和 SDK 版本范围,pack 打包为可安装的 zip,dev 把插件目录链接到 config/plugins/local/ 并开启 plugins.dev_mode。开启 dev_mode 后,修改本地插件的文件会自动重新加载该插件(包括上次加载失败的)。ab_sdk.testing 新增 DownloaderContract、RenameStrategyContract、NotifierContract、SearchSiteContract 契约测试套件,内置的下载器、重命名方式、通知渠道和默认搜索站点都通过它们
  • 新增(签名插件目录):LLM 插件的安装器泛化为通用的签名目录安装器:GET /api/v1/plugins/catalog 列出目录(GitHub release plugins)中的插件,POST /api/v1/plugins/{id}/install 验签(目录、sha256、ed25519)后安装并启用,DELETE /api/v1/plugins/{id} 卸载。已安装的插件来源为 catalog,视为已签名。插件 id local 改为保留
  • 破坏性变更(通知渠道):Bark 不再读取旧字段 token(改用 device_key),WeCom 不再读取 chat_id(改用 webhook_url)。升级后第一次启动时自动把旧字段迁移到新字段,原文件备份为 config.json.v3.bak
  • 新增(插件文档与示例):插件开发文档拆为总览、核心概念、配置表单、事件、前端挂载点、命令行、签名与分发、内置插件、示例和每个扩展点一页(中 / 英 / 日)。examples/plugins/ 新增 webhook-on-event、custom-rss-site、template-rename、nfo-writer、ntfy-notifier,CI 逐个校验并运行它们的测试。新增插件作者 skill(skills/autobangumi-plugin/)
  • 新增(发布):beta 与稳定版的 GitHub Release 附带 autobangumi-sdk 轮子和 autobangumi-plugin-skill-<版本>.zip
  • 修复(插件开发工具):插件目录里的 .venv、node_modules 等工具链目录不再被当作原生扩展(ab-plugin validate / pack / dev 和宿主加载此前会报「含原生扩展」),dev_mode 也不再监听它们
  • 修复(配置迁移):配置里有 Bark 或 WeCom 渠道时,每次启动都会新增一份 config.json.v3.bak.N 并改写配置;现在只迁移带值的旧字段
  • 修复(在线更新):在线更新包带上 ab_sdk,4.0 镜像启动时与 module 一起替换;更新包要求镜像不低于 4.0.0-beta.1,已安装 3.3 的用户在 beta 通道不会应用 4.x 更新包(缺少 ab_sdk 与新依赖,应用后无法启动),需要拉取 4.0 镜像
  • 修复(多下载器):删除规则并删除文件时,若某个下载器不可用,规则与种子记录会保留并提示稍后重试;此前规则和种子记录已先删除,该下载器上的种子之后无法再删
  • 修复(多下载器):aria2 任务与番剧的关联按下载器实例区分,两个 aria2 实例分配到相同 gid 时不再互相覆盖,同一种子也可以分别加入两个实例;插件下载器的工厂参数 DownloaderConnection 新增 instance_id
  • 修复(回退 3.3):4.x 改把运行版本写入 config/version_v4.info,config/version.info 保留 3.x 的最后记录。此前 3.3 读到 4.0.0 只比较 minor,会当作 3.0 数据运行 3.0→3.1 迁移并重建数据库。首次以 4.x 启动 3.x 数据时还会把数据库备份为 data/data.db.v3.bak,回退时与 config.json.v3.bak 一起还原
  • 新增(插件目录界面):设置 → 插件 新增「插件目录」:浏览签名目录中的插件并安装、更新;目录安装的插件可在卡片上卸载(内置、本地、pip 与 LLM 提供商插件不提供卸载)。插件卡片标出已签名或未签名。目录不可达时在区内显示原因,不弹全局提示
  • 修复(插件设置):经签名目录安装的插件在插件卡片上的来源显示为未翻译的 config.plugins_set.source_catalog
  • 修复(插件安装):DELETE /api/v1/plugins/{id} 不再能卸载 LLM 提供商插件;安装通用插件后,LLM 插件列举不再反复输出 Skipping broken plugin 警告
  • 修复(插件安装):LLM 提供商插件的卸载也校验插件 id,并且只删除 LLM 安装器装入的目录:..、local 与目录安装的通用插件会被拒绝;卸载未安装的 id 现在返回「Plugin not installed」(400),此前返回成功。build_plugin_catalog.py 默认 min_ab_version 改为 4.0.0-beta.1,此前的 4.0.0 会让 beta 版拒绝安装目录中的插件
  • 修复(插件运行时):清单不是 UTF-8 或 pip 插件导入失败时,该插件显示为加载失败,不再中断全部插件的发现;setup() 抛错或超时后调用 teardown 释放已占用的资源;事件订阅者成功一次即清零熔断计数,只有连续失败才熔断;停用一个加载失败的插件后状态显示为「已停用」,重新启用时会再次尝试加载;插件重载后,旧实例的熔断不再停用新实例
  • 修复(设置向导):向导中填写的 Bark / WeCom 凭据写入渠道实际读取的 device_key / webhook_url,此前测试通知与保存后的渠道都拿不到凭据
  • 修复(升级路径):首次启动时也检查 2.x 的 data/data.json;没有 version.info 的 3.0 数据库会被识别并要求先升级到 3.1.x;拒绝启动的提示写明要先把 config.json.v3.bak 还原为 config.json 再启动旧版本。配置迁移失败时把备份移回原文件,反复重启不再堆积 config.json.v3.bak.N
  • 修复(多下载器):修改规则的保存路径时,若某个下载器不可用,不移动任何种子也不修改规则,提示稍后重试;此前可用实例上的种子已移动而规则路径未更新。下载器页的批量暂停 / 恢复 / 删除按实例分别执行并汇总失败,同一 hash 在两个实例上时只操作选中的那一个;只配置了插件下载器时下载器页不再显示为未配置
  • 修复(整理):插件提供的版本冲突策略或文件分类出错时退回宿主实现并计入熔断,不再中断整次重命名;重命名方式的插件未加载而按 none 处理时不发布 torrent.organized;已重命名的种子在每次启动后补发一次 torrent.organized,此前错过该事件的种子不会再被硬链接或触发媒体库刷新(开启硬链接时,重启后会对仍在下载器中的已整理种子补链一次)
  • 修复(硬链接):用户从媒体库删除的硬链接文件不再被重新创建(backfill 仍会恢复);媒体库刷新在硬链接放好文件后再刷新一次,刷新请求进行中到达的整理事件不再丢失
  • 修复(插件配置):秘密字段的标记写在 Optional / 嵌套模型引用外层或 list / dict 容器上时,读取接口此前返回明文,现在掩码;/config/get 掩码插件通知渠道的自定义字段,保存时按渠道还原
  • 修复(插件设置):在插件卡片上切换「允许未签名插件」后,点全局保存不再把它改回旧值;保存或启停一个插件不再清掉其他卡片未保存的输入;整数枚举的下拉框保存为数字而不是字符串
  • 破坏性变更(升级路径):只支持从 3.3.x 升级。检测到更早版本的数据(config/version.info 低于 3.3,或残留 2.x 的 data/data.json)时拒绝启动,并提示先升级到最新 3.3.x 启动一次完成迁移
  • 破坏性变更(API):移除 3.2 兼容的 GET 控制端点(/api/v1/restart、/start、/stop、/shutdown)和 GET /api/v1/auth/refresh_token,请改用 POST
  • 破坏性变更(配置):移除旧版 experimental_openai 配置节和通知的单 provider 旧字段(type / token / chat_id),3.3 已把它们迁移到 llm 与 notification.providers;移除废弃的 normal 重命名方式,已有配置自动改为语义相同的 none
  • 清理:删除 3.0→3.1、3.1→3.2 跨版本迁移、旧 JWT 与内存会话实现,以及约 70 处无调用方的函数、方法和模型;CI 新增 vulture 死代码检查
  • 修复(版本记录):version.info 原先只比较次版本号,跨主版本升级(如 3.3 → 4.0)不会被记录;现按完整语义化版本比较

[3.3.6] - 2026-09-19

3.3.6 是问题修复版本,修复 3.3.5 发布后报告的 RSS 匹配、网络、解析与部署问题。

  • 修复(#1103/#1114,RSS 匹配):解析器重组的 title_raw(剔除标题中间的集数、拼接 / 分隔的别名)不是种子名的子串,导致新剧集无法匹配、被归入孤儿种子;现在与种子自身重组出的标题完全相等也算命中,已有数据无需迁移
  • 修复(#1105,订阅):搜索类 RSS 同时返回多季资源时,订阅/收集整订阅下载会把其他季的种子按本季下载并重命名,互相覆盖;现在按季度/类型过滤,与 RSS 刷新的匹配规则一致
  • 修复(#1104,网络):HTTP 代理下 CONNECT 成功但 TLS 握手失败时,httpcore 泄漏隧道连接,连接池耗尽后持续 PoolTimeout 直至重启;现在遇到 PoolTimeout 时为后续请求换用新连接池,不中断进行中的请求
  • 修复(#1108,解析器):Unicode 罗马数字(Ⅱ 等)识别为季度,去除包裹中文标题的全角破折号,Clevatess Ⅱ-魔獸之王與虛假的勇者傳承- 解析为第 2 季并可匹配 TMDB
  • 修复(#1106,Docker):健康检查改为读取配置的 WebUI 端口,依次探测 IPv4 与 IPv6 回环地址,不再因 localhost 解析为 ::1 或修改端口而被标记为 unhealthy
  • 修复(#1117,日志):RSS/重命名间隔配置为 0 时后台循环空转刷屏,现在最小间隔为 1 秒;部署文档中的 docker-compose 与 docker run 示例增加容器日志大小上限(10 MB × 3)

[3.3.5] - 2026-07-26

3.3.5 是问题修复版本,包含五个订阅、通知与配置相关的修复。

  • 修复(#1095,RSS):删除番剧后重新订阅同一 RSS 时,自动重新启用被孤儿停用机制禁用的订阅,番剧不再静默断更
  • 修复(#1094,通知):Telegram 海报默认改为发送源 URL(由 Telegram 服务端拉图),失败时降级为本地上传、再降级为纯文本消息;下载完成通知不再因海报发送失败而整条丢失,服务端拒绝(4xx/5xx)与连接失败的日志分开记录并附带响应内容
  • 修复(#1092,解析器):classic 引擎与 Preview 准入策略对齐,接纳字幕组未标记特别篇/剧场版且无集数、但带发布证据(组名/分辨率/片源)的单发资源,按整理集处理;纯文字弱标题仍被拒绝
  • 修复(数据库):「重置所有规则」先清理种子记录与 aria2 映射的外键引用再删除番剧,不再因 FOREIGN KEY constraint failed 整体回滚;重置失败残留的去重记录导致番剧补全跳过已有集数的问题随之解决
  • 修复(配置):未设置的密码/密钥不再在界面上显示为 ******** 幻影掩码;自动清洗 3.2.3/3.2.4 版本窗口期间被字面写入配置的掩码哨兵(该窗口只掩码不恢复,导致代理/下载器认证失败),清洗时告警提示重新输入

[3.3.4] - 2026-07-13

3.3.4 正式版汇总 beta.1–beta.2。经典解析器仍为默认;通用解析器 Preview 与修订版自动替换均需手动启用。

  • 新增(#1074,认证):引入持久化多用户会话、首次管理员初始化、用户管理,以及按 api / mcp scope 隔离且仅展示一次明文的哈希令牌;密码变更、禁用用户和退出登录会撤销相关会话,浏览器刷新仅续期 HttpOnly Cookie
  • 新增(Parser Preview):解析设置可在稳定的经典解析器与通用解析器 Preview 间切换;Preview 支持剧集、OVA/特别篇、剧场版、范围和混合合集,两种模式不会自动互相回退
  • 修复(#1078):更高修订版与既有文件冲突时,默认 hold 记录并通知冲突;可选 replace 在严格匹配番剧、媒体类型、季集、字幕组和分辨率后,通过 qBittorrent/aria2 的可恢复三阶段流程替换旧版。自动替换首版仅处理双方均为单文件的任务
  • 修复(#1077):日历不再显示已归档番剧
  • 修复(#1072/#1075,解析):06v2 等修正版集数不再误触发 offset review;TMDB 电视与电影查询遵循配置语言;剧场版标题中的有效 Movie 和中日韩电影词不再被误删
  • CI/发布:新增隔离的运行时、Chromium/WebKit 与真实 qBittorrent E2E lanes;release 分类仅依据 event/ref/tag,正式版 tag 必须位于 main

[3.3.4-beta.2] - 2026-07-13

  • 修复(#1078):同一番剧、媒体类型、季集、字幕组和分辨率出现更高修订版时,不再因目标文件已存在而反复重命名;默认 hold 保留双方并记录冲突,可选 replace 安全替换旧版本
  • 新增(修订版替换):qBittorrent 与 aria2 使用可恢复的“暂存旧版 → 晋升新版 → 清理旧版”流程;异常重启、目标冲突和下载任务消失时可继续或回滚,首版只自动处理双方均为单文件的任务
  • 新增(管理与通知):设置页增加全局修订冲突策略,新增冲突查询/重试 API 和通知中心事件
  • 安全性:多文件合集、身份信息不完整、非严格升级或同一路径存在多个下载器 owner 时一律保持 hold,不会自动删除旧任务或文件
  • 测试:覆盖 V1/V2 严格身份匹配、并发抢占、断点恢复、合集保护、qBittorrent/aria2 冲突与数据库迁移

[3.3.4-beta.1] - 2026-07-10

  • 新增(#1074,认证):引入多用户会话认证——首次安装创建管理员,支持用户管理、独立浏览器会话,以及按 api / mcp scope 隔离且仅展示一次明文的哈希令牌;密码变更、禁用用户和退出登录都会可靠撤销既有会话
  • 修复(认证安全):刷新接口只续期 HttpOnly Cookie,不再向响应体或浏览器存储暴露令牌;一次性 API Token 在弹窗关闭、组件离开和延迟响应竞态下都会立即清除,移动端补齐 44px 可访问关闭按钮
  • 修复(#1075):TMDB 电视与电影搜索严格使用解析设置中的语言;切换语言或修剪输入空白后,会以对应 locale 重新查询且不复用错误缓存
  • 修复(#1072):06v2 等修正版集数与 CRC 后缀不再被误判为季/集偏移异常;真实超范围集数仍会进入 offset review
  • 修复(解析器):剧场版标题中的 Movie 等有效词不再被重复或误删,只移除末尾真正的发布类型标记
  • 修复(#1065,发布):release trigger 分类改为完全由 event/ref/tag 决定,PR 标题不再影响版本;稳定 tag 仍必须位于 main,beta tag 可在 dev/测试分支安全发布
  • 测试/CI:新增完全隔离的运行时、Chromium、WebKit 与真实 qBittorrent E2E lanes,覆盖认证、重启持久化、Windows 路径、TMDB 语言、offset review、移动端规则编辑、播放器本地设置,以及 RSS 下载→校验→重命名→删除全链路

[3.3.3] - 2026-07-09

  • 新增:AniBT 作为内置搜索源,默认使用 https://anibt.net/rss/magnets.xml?q=%s 并走 TMDB 解析;旧配置文件加载时会自动补齐新增的内置搜索源,同时保留用户已有搜索源的自定义 URL / 解析器
  • 修复(#1067):搜索结果预览会按“解析设置”中的 TMDB 语言重新取标题,不再在设置为日语等语言时回落到中文/英文标题;海报补全复用同一次 TMDB 预览请求并按语言缓存
  • 修复(#1068):删除/禁用番剧并选择 file=true 时,匹配 qBittorrent 种子的 save_path 会统一归一化路径分隔符,Windows qB 返回反斜杠路径时也能正确删除种子文件
  • 修复(#1069,WebUI):手机端编辑规则弹窗改为全屏底部面板,并关闭会把面板整体上推的软键盘补偿,避免作品名称输入框被悬浮栏/软键盘挤出可编辑区域
  • 修复(CI):稳定版发布只接受打在 main 上的语义化版本 tag,dev 分支仅允许 alpha/beta 预发布 tag,避免合并 PR 时误触发正式发布

[3.3.2] - 2026-07-07

  • 修复:qBittorrent ≤5.1 对 .torrent 文件上传回笼统的 200 "Fails." 时,用文件字节计算 infohash 到 qB 确认是否已存在——已存在归类为重复并标记已下载,不再每轮 RSS 刷新无限重试报错("Fails." … "no matching torrent found" 循环,常见于清空孤儿记录后种子仍在 qB 的场景)
  • 修复(WebUI):重复搜索时旧的搜索流未关闭——结果被重复追加(重复的条目/tag)、旧流无限自动重连导致输入框为空时仍持续转圈;现在开新搜索前先关旧流、追加结果按订阅链接去重、清空输入即停止搜索

[3.3.1] - 2026-07-07

  • 修复:搜索/订阅/收集添加的种子未关联番剧被记成孤儿,导致孤儿记录无法通过 track_orphans 关闭;重复订阅时正确解析已存在的规则(不覆盖用户调好的 offset/filter),重新订阅已禁用的规则时自动重新启用;收集失败不再留下幽灵订阅规则
  • 修复(#721):标题中的 Windows/qB 保留字符(< > : " / \ | ? *)会把保存路径拆成多级目录或丢字——生成保存路径时清洗(仅新订阅,不触碰既有做种库)
  • 修复(#667/#704):总集篇等半集(12.5)不再被取整成第 12 集覆盖原文件,重命名保留小数(S01E12.5),通知同步保留
  • 新增(#904):Server酱³ 推送支持——sctp 开头的 sendkey 自动走 push.ft07.com 端点
  • 新增(#147):重命名完成的种子在下载器中打 ab:renamed 标签,供外部脚本(filebot / hlink 等)过滤已处理任务
  • 新增(#975 / #1042):TMDB API Key 可自配(留空回退内置共享 key);设置页新增"网络设置"面板(TMDB / Bangumi API 地址与 Key)

[3.3.0] - 2026-07-07

3.3.0 正式版。主要变化(相对 3.2.x;逐项细节见下方 beta.1–beta.8 条目):

  • 全异步架构:数据库层全面迁移到 sqlite+aiosqlite(WAL),仓储/服务/周期任务全部 async;组合根 AppContext 统一持有生命周期
  • 下载器:aria2 成为一等公民(能力协议 + 门面降级);qBittorrent 4.x–5.2 全版本兼容
  • WebUI:Soft Ink 组件体系整体重构(22 个通用组件);种子管理页(孤儿/按番剧);PT 站(NexusPHP)搜索源预设;Passkey 登录与自动弹出
  • LLM:提供商插件框架(内置/预设/订阅/可下载分组),签名验证的插件安装管线;插件(GitHub Copilot / ChatGPT Codex)随 llm-plugins release 发布
  • 更新系统:ed25519 验签的在线更新与回滚
  • 安全:破坏性 GET 端点转 POST(CSRF)、路径穿越修复、JWT/Passkey 加固
  • 剧场版/特别篇支持、每集偏移建议、通知中心等

自 beta.8 起新增

  • 修复(#1052):批量抓取种子文件加节流,HTTP 429 时指数退避
  • 修复(#1053):删除番剧时清理其派生的每番剧 RSS 订阅;搜索站订阅时正确映射站点对应的解析器
  • 新增:track_orphans 设置——关闭后不再记录未匹配种子(孤儿记录),后补规则可立即接住仍在源里的旧集

[3.3.0-beta.8] - 2026-07-07

qBittorrent 5.x 全面兼容 + 种子管理页 + PT 站搜索源;日志不再"时有时无"。

Backend

Fixed

  • qBittorrent 5.x WebAPI 全面兼容(对照 qB 各发布 tag 源码逐端点核验):
    • qB 5.2 的 torrents/add 返回 JSON 计数(200/202)而非 "Ok.",此前每次成功投递都被记为失败并无限重试(beta.7 用户日志中的 rejected torrent add: HTTP 200 …success_count:1 与循环 409);现正确识别 200/202/JSON/409,部分成功与 pending(URL 异步抓取)均按成功处理,409 对文件上传视为重复、磁力链经 hash 确认,无法确认时抛出留待重试
    • qB 5.0 把 torrents/pause|resume 改名为 stop|start 且无别名:此前对全部 5.x 暂停/恢复是静默空操作;现先试新名、404 时回退旧名并记住
    • torrents/info?filter=paused 在 5.x 被静默当作 All(MCP list_downloads 会返回全部种子):paused/stopped 改为本地按 state 过滤
    • qB 5.2 空响应体统一回 204:torrents/delete 误报失败、torrents/renameFile 误判失败导致重命名每周期重试,均改为按 2xx 判定
    • torrents/add 同时发送 paused 与 stopped 参数(5.0 改名,双方各自忽略未知参数)
  • 日志时有时无:启动(容器重启/在线更新)时日志被整个删除,改为轮转进 log.txt.1-3 备份;轮转后 UI 只读 log.txt 导致历史瞬间清空,现预算内自动拼接备份尾部;轮转竞态不再可能炸掉 SSE 流;清空日志同时删除备份;总量上限约 8 MB
  • 孤儿种子持续累积无处清理(#818 / #885 / #1010,#1020 的 3.3 移植):新增孤儿种子与按番剧种子的查询/删除端点

Changed

  • Docker 镜像瘦身 208 MB → 160 MB(拉取体积 −24%):不再预编译字节码(root 属主 venv 下本就无法持久化);去掉未使用的 mcp[cli] 附加依赖(typer/rich 等约 14 MB)

Frontend

Added

  • 种子管理页:番剧网格新增"未匹配种子"卡片(计数徽标),孤儿种子与按番剧种子列表支持多选、批量删除、一键清空(Promise 确认框);规则编辑弹窗新增"查看种子"入口
  • PT 站(NexusPHP)搜索源预设:添加搜索源对话框新增 PT 站模式,填站点地址 + Passkey +(可选)分类 ID 即可生成 torrentrss.php 搜索模板(分类用 cat<ID>=1 逐分类开关形式,纯数字校验,预览遮蔽 Passkey);注意原生新版 NexusPHP 已停用 search 参数,请先在站点上确认 RSS 搜索可用
  • Passkey 自动弹出:本浏览器成功用过 Passkey 后,打开登录页自动弹出认证;取消则本浏览器解除自动弹出(下次 Passkey 登录成功后重新记住),主动登出后的一次跳转不弹,避免反射式指纹确认又把用户登回去

Fixed

  • 登录页密码框按回车不登录:登录按钮现在是表单的 submit 按钮(此前 type=button,双输入框表单无提交按钮时浏览器不做隐式提交)
  • 下载页种子状态适配 qB 5.0+ 的 stoppedDL/stoppedUP 命名(此前显示原始状态串)

[3.3.0-beta.7] - 2026-07-06

发版前 ship-readiness 审查(多代理评审 + 对抗验证)确认的 10 个缺陷全部修复;本版为 3.3.0 稳定版前的收尾修复版。

Backend

Fixed

  • 保存设置可能静默写坏通知渠道密钥:掩码密钥(********)按下标回填,删除/重排列表项后幸存项会错拿被删项的密钥且原值永久丢失。现按身份匹配回填(同下标同身份 → 全列表唯一身份 → 长度不变时按下标兜底),无法唯一定位来源时返回 400 提示重新输入密钥,绝不猜
  • 生产构建下自托管 Inter 字体 404:/fonts 未挂载静态目录,字体请求被 SPA 兜底路由回成 index.html,整站字体静默回退系统字体(开发模式由 Vite 直接服务 public/,故此前未暴露)
  • 受限 UMASK(如 077)下在线更新后崩溃循环:boot_overlay 以 root 解包/复制的文件是 600/700 root:root,以 ab 运行的应用读不了 /app/module。现每棵落地的树(module / dist / .venv,含 EXDEV 恢复路径)都交还应用用户,可读性与 UMASK 无关
  • EXDEV 就地替换非原子:中途失败(磁盘满/IO 错误)会留下"删光了但没灌满"的残缺 module 树,启动进入必然 ImportError 崩溃循环。现先快照旧树到 .ab_bak,失败时恢复旧树再放弃本次覆盖
  • 缺留存备份 bundle 时回滚会把 bundle.zip 换丢:boot_overlay 下次启动判定 legacy/unsigned 整体清除覆盖层,实际落在镜像版本却报告"已回滚到上一版本"。现该场景改走"回退镜像版本"路径并如实报告,同时清掉无法验签的孤儿 backup 树
  • qBittorrent 凭据错误仍会累积触发 WebUI IP ban:"不重试"只在单次 auth 内生效,每个周期 tick 仍各发一次失败登录,约 5 次即被 qB 封禁 IP。现凭据被拒后进程级闩锁(保存设置后解锁重试);auth 单飞化,并发等待者共享失败结论、不再补发 POST
  • 下载器设置变更的生命周期竞态:正在登录(尚未计入引用计数)的客户端不再被并发的设置变更块中途登出;连续两次改设置不再把第一个被撤下客户端顶掉导致连接池泄漏;__aenter__ 中途被取消不再泄漏引用计数
  • entrypoint 属主迁移 marker 先写后 chown:大海报缓存迁移中途被打断(停容器/崩溃/NAS 报错)会被记成"已完成"、之后每次启动跳过且永不自愈。现 chown -R 成功退出后才写 marker
  • aria2 下载列表在 WebUI 显示 undefined / NaNhNaNm:torrents_info 载荷缺少下载页无条件消费的字段。现补齐 num_seeds/num_leechs(numSeeders/connections)、eta(qB 的 8640000=未知约定)、added_on(gid 映射入库时间,用于排序),并把 aria2 状态映射为 qB 状态词汇(active→downloading/uploading 等)

Changed

  • 程序控制端点(/restart /start /stop /shutdown)恢复 GET 别名(标记 deprecated,计划下个大版本移除):3.2 及更早版本这些端点是 GET,外部自动化(cron / Home Assistant 等)升级后不应 405 静默失效

[3.3.0-beta.6] - 2026-07-06

Frontend

Changed

  • Soft Ink 组件体系重构:WebUI 的通用组件层整体重设计为"Soft Ink"语言——近单色的墨色文字 + 柔和填充控件,语义色只以小方块标记出现、不再承载文字(去掉粉彩胶囊标签、着色警告框、悬浮滑块分段器等模板化样式)
  • 新增 22 个通用组件(ab-button/ab-icon-button/ab-menu/ab-split-button/ab-modal/useConfirm()/ab-field/ab-input/ab-select/ab-switch/ab-segmented/ab-tag v2/ab-status v2/ab-badge/ab-progress/ab-alert/ab-empty/ab-skeleton/ab-list/ab-toolbar/ab-tooltip 等),全部带 vitest 测试与 Storybook story;页面全量迁移,不再直接使用裸 NButton/<button>/NPopconfirm
  • 弹窗统一为自适应 ab-modal(桌面居中对话框 / 移动端底部抽屉,焦点陷阱 + aria 语义 + 统一 footer 动作区);破坏性操作统一走 Promise 式确认框
  • 状态灯恢复"细线圆环 + 内部灯珠"形态并扩展为四态(运行/停止/暂停/降级)

Fixed

  • 触屏下按钮命中区统一保证 44px;键盘焦点环、屏幕阅读器标签(关闭/移除)等无障碍问题成批修复
  • 下载器/代理设置的密码输入恢复 autocomplete=off,避免浏览器误填登录密码
  • 深色主题下弹窗遮罩、通知徽标等硬编码颜色改走主题 token

Removed

  • 删除废弃组件:ab-popup、ab-adaptive-modal、ab-label、ab-data-list、ab-add、ab-button-multi、ab-image、ab-rule、ab-swipe-container,以及 ab-input UnoCSS 快捷类

[3.3.0-beta.5] - 2026-07-05

Backend

Fixed

  • 修复在线更新在 overlayfs/绑定挂载布局下"报告成功却停在旧版本"的问题:boot_overlay 用 os.rename 把 /app/module 换成新代码,而 /app/module 来自镜像的 overlayfs 下层,某些 overlay/内核组合拒绝跨挂载边界 rename 下层目录、抛 EXDEV(Errno 18),导致每次重启换码失败。现改为在遇到 EXDEV 时退回"就地替换目录内容"(逐文件触发 overlayfs copy-up),与挂载/overlay 拓扑无关;dist 树同理修复。注意 boot_overlay.py 不随在线更新替换,此修复需拉取新镜像后方对后续更新生效

Frontend

Changed

  • "软件更新"卡片从日志页移到设置页(作为设置分区导航的最后一项);日志页保留联系方式(About)卡片

[3.3.0-beta.4] - 2026-07-05

Backend

Added

  • GET /api/v1/update/check 新增 force 参数:用户主动点「检查更新」时绕过 15 分钟结果缓存重新拉取;进入设置页时的自动检查仍走缓存,避免频繁请求 GitHub API

Changed

  • 容器启动优化:LLM SDK(anthropic / openai / google-genai)由模块加载改为按需导入(仅在真正构造某提供商时才加载),把约 0.7s 移出启动路径——LLM 默认关闭时不再白付;实测 parser.analyser 包导入 782ms → 203ms
  • entrypoint 递归 chown /app/data /app/config 改为按需执行:仅在首次启动、PUID/PGID 变更或卷根属主不符时才遍历(marker 记录),避免大海报缓存在 NAS 上每次启动的 O(文件数) 开销

Frontend

Fixed

  • 修复登录成功后偶尔卡住不跳转(用户名/密码与 passkey 三种方式均受影响):passkey 登录成功后从不导航(漏了 router.replace);useAuth.login 未返回 promise 导致登录页无法 await 跳转;路由守卫在导航时 await setup 状态检查,初次检查失败后会阻塞之后的登录跳转——已登录时跳过该检查
  • 会话过期(401)现在跳回登录页,而非停留在已失效页面看过期数据(含后台静默轮询的 401);启动时的 token 刷新改为静默,过期不再在首屏闪错误提示

Changed

  • 「检查更新」给出主动反馈:已是最新/发现新版本各弹一条提示,并显示「上次检查 时间」(每次点击都刷新);检查失败时展示后端的具体原因(限流/无匹配 Release)而非泛化文案

[3.3.0-beta.3] - 2026-07-04

Backend

Added

  • LLM 模型列表接口 POST /api/v1/config/llm/models:按所选提供商(OpenAI 兼容端点 / Anthropic / Gemini)在线拉取可用模型,供前端下拉选择;表单密钥为掩码时回退到已保存密钥;无密钥返回 400、提供商报错返回 502(细节仅进日志,不回显)
  • 安装向导下载器连接测试支持 aria2:走 JSON-RPC aria2.getVersion 校验可达性与 RPC secret(此前只会探测 qBittorrent 登录接口,选 aria2 必然误报失败)

Changed

  • 日志去重:修复队列日志处理器沿用 Python 默认格式化、导致每行出现 INFO::module.x: 重复前缀的问题(显式声明为 模块名: 消息);移除源码中 245 处手写 [Tag] 前缀(模块名已在行内);去掉偏移扫描/日历刷新被上层重复记录的完成行;Config loaded 降为 DEBUG(每次保存/重启都会刷屏)
  • LLM 默认模型 gpt-4o-mini → gpt-5-mini(旧模型已下架);已保存配置不受影响

Frontend

Added

  • 设置页与安装向导支持 aria2 下载器(类型选择 + RPC secret 填写提示)
  • 编辑规则「高级设置」新增内容类型(剧集/剧场版/特别篇)、偏好字幕组、偏好分辨率——迁移 v10/v12 的既有后端能力此前无入口;剧场版/特别篇在规则信息标签中标出
  • LLM 面板:模型输入改为可搜索、可自由输入的下拉,展开时按需从提供商 API 拉取模型列表,切换提供商/密钥/地址后自动重拉;新增超时/缓存/并发/熔断调优项(收进折叠区)
  • 更新卡片新增「自动检查」开关;渠道与自动检查的改动即时持久化(直接写回配置,不触发重启)

Changed

  • 配置页重设计:左侧分区导航(搜索 + 未保存标记),单列分区取代原 4:7 双列布局;底部保存栏显示「N 处未保存修改 · 分区名」,命名「保存并重启」的后果,保存/放弃均二次确认,离开时若有未保存修改则拦截
  • 日志页重设计:顶部错误/警告健康摘要 +「跳到第一条」;统一工具栏(级别筹码带实时计数 + 文本搜索 + 操作按钮);行文本改中性色、仅按严重级别着色(修复暗色模式对比度 3.53:1 不达标);拆出模块名单列显示;overflow-wrap: anywhere 修复长串割裂;联系方式收进紧凑 About 卡片
  • 无障碍:配置项渲染真正的 <label for>,开关/下拉补 aria-label;日志级别筹码带 aria-pressed;移动端触控目标提升至 44px

Fixed

  • 统一确认弹窗:搜索源与 Passkey 删除由原生 confirm() 改为 NPopconfirm
  • 下载器/代理密码输入框由明文改为密码框;修正占位符与文案(间隔字段的 port 占位符、qBittorrent 默认端口 8080、播放器 type/url 标签大小写、admindmin 占位符笔误)

[3.3.0-beta.2] - 2026-07-03

Backend

Added

  • 应用内在线自动更新:从项目 GitHub Release 下载 update-bundle-<version>.zip(校验 sha256 与 ed25519 签名,未签名的 Release 会被拒绝),把 module 源码树 + 前端 dist 作为覆盖层落地到持久卷 config/updates/,容器重建后仍保留;启动时由 entrypoint 的 boot_overlay.py 重新校验签名后比较“镜像基线 vs 覆盖层”版本,取较新者生效(依赖在应用阶段以非 root 身份按 uv.lock uv sync);应用前自动快照数据库,回滚可恢复;新增鉴权保护端点 GET /api/v1/update/check、POST /api/v1/update/apply、POST /api/v1/update/rollback,进度经既有 SSE(/api/v1/events/stream)推送;新增 update 配置段(channel stable/beta、auto_check)。需容器以 restart: unless-stopped 运行——更新后进程自行退出,由 Docker 重启以应用覆盖层
  • LLM 解析器支持多提供商(OpenAI 兼容端点/Anthropic Claude/Google Gemini):experimental_openai 配置自动迁移到新的 llm 段(迁移用户默认 mode=primary,保持原有 LLM 优先语义);新增 mode 解析模式开关——fallback(默认,正则优先,LLM 仅兜底)与 primary(LLM 优先,失败时正则兜底,不丢标题);openai 提供商经 base_url 兼容 DeepSeek/Ollama/LM Studio/OpenRouter 等任意 OpenAI 格式端点

Fixed

  • 修复 qBittorrent 重命名校验在未看到新文件名时即报成功的问题(重试循环失效导致假阳性成功通知,#754 #749)
  • 架构评审修复:下载器失败结果不再被误标为“已下载”(qB/aria2 统一返回 AddResult);aria2 重命名后路径持久化、磁力 followedBy gid 迁移;生命周期状态切换加锁;安装向导完成后正确启动后台任务;LLM 调用增加超时/缓存/并发限制/熔断并走应用代理

Frontend

Added

  • 日志页新增“软件更新”卡片:显示当前/最新版本与可更新徽标、渲染 Release 说明、稳定/测试渠道切换、检查与一键更新(带确认弹窗)、按 SSE 实时进度条、以及有备份时的回滚入口;含 restart: unless-stopped 要求与“重启中/需手动重启”状态提示
  • 编辑规则新增「放送星期」选择器:移动端与键盘也能指定日历放送日(此前仅桌面拖拽可用)

Changed

  • 设置页 OpenAI 面板替换为 LLM 解析器面板:支持选择提供商(openai/anthropic/gemini)与解析模式,base_url 仅在 openai 提供商下显示
  • 自托管 Inter 字体,移除阻塞渲染的 Google Fonts 外链(大陆网络环境首屏不再受 fonts.googleapis.com 拖累);首页海报懒加载;日志页仅渲染最新 1000 行
  • 移动端体验:底部导航真正固定在屏幕底部(此前实际渲染在内容顶部);顶栏按钮、搜索筹码、弹窗关闭、偏移输入、设置向导等触控目标提升至 44px;RSS 订阅源错误信息在卡片内联显示(原为悬停提示)
  • 无障碍:搜索结果与筛选项可键盘操作并带焦点样式、Esc 可关闭添加/编辑弹窗、空格键可激活卡片、退出登录改为真实按钮、搜索弹窗新增可见关闭按钮
  • 设置向导:下载器连接测试不再强制通过才能继续(可先跳过测试稍后在设置页调整)、密码为空也可测试、用户名过短有内联提示、向导进度在页面刷新后保留(sessionStorage)
  • 新增亮/暗主题警示色 token 并替换组件内硬编码颜色;添加 RSS 与通知设置的自绘开关/原生下拉替换为 naive-ui 控件

Fixed

  • 修复删除规则确认框的按钮语义陷阱:此前「否」也会删除规则(仅保留本地文件)且没有真正的取消按钮;现为明确的说明文案 +「同时删除已下载的文件」勾选 + 取消/删除双按钮
  • RSS 订阅批量删除、下载器种子删除、清空日志、通知服务删除均增加确认弹窗
  • 后台轮询(状态/日志/下载器/Passkey 列表)失败不再触发全局错误提示;下载器轮询失败保留上次数据而非清空为“无种子”;首页首次加载失败显示错误与重试而非新手引导;搜索连接失败与“无结果”区分显示;设置向导提交失败时展示后端具体原因
  • 移动端 RSS 列表批量操作后勾选框与实际选中状态不再脱节

[3.3.0-beta.1] - 2026-07-03

Backend

Added

  • aria2 下载器升级为一等下载后端:真实的种子添加/查询/重命名/移动/删除支持(不再是仅返回占位结果的桩实现),新增 aria2_gid 表持久化 ab:<bangumi_id> 标签关联,供 Renamer 复用现有的按标签查偏移逻辑(迁移 v11)
  • 支持剧场版/OVA/SP 等非剧集番剧的识别与整理:解析器可识别 剧场版/劇場版/电影版/Movie 及 OVA/OAD/SP/Special 等关键词,新增 episode_type 字段(迁移 v12);剧场版按「标题 (年份)」平铺目录整理(不再嵌套 Season 子目录),特别篇归入第 0 季;TMDB 解析器在 search/tv 找不到匹配时回退查询 search/movie
  • 新增番剧偏好字幕组/分辨率设置 (preferred_group/preferred_resolution,迁移 v10):RSS 刷新时在同批次或与已下载种子比较,跳过明显更差的重复发布,未设置偏好的番剧行为不变
  • 新增 SSE 推送端点 GET /api/v1/events/stream(鉴权保护),按原轮询节奏推送状态/下载器/日志事件

Fixed

  • 修复 gen_save_path 季度守卫的一处预置 off-by-one 缺陷:合法的 season=0(特别篇)此前会被误判并回退为原值并打印多余警告
  • 收紧 gen_save_path 季度守卫:普通剧集在 season_offset 为负导致季号落到 0 时回退原季号(Season 0 会被 Plex/Jellyfin 当作特别篇),仅 special 类型允许合法落入第 0 季
  • 撤销 gen_path 在重命名文件名前追加 [字幕组] 前缀的改动(group_tag 恢复为仅影响 qBittorrent RSS 规则名):避免已开启 group_tag 的用户升级后整个做种媒体库被批量重命名,破坏 Plex/Jellyfin 索引与 cross-seed/硬链接
  • 修复多文件电影种子(正片 + 特典/花絮,BD 常见)所有文件生成相同目标文件名导致重命名互相冲突/覆盖的问题:体积最大的主文件使用「标题 (年份).ext」干净名,其余文件追加原始文件名词干作区分

Frontend

Changed

  • 拆分超大组件:ab-add-rss.vue/ab-edit-rule.vue 提取出共享的 useBangumiRuleForm composable 及预览/标签/RSS 链接/过滤器/偏移量子组件;calendar.vue 拆分为 calendar-board/calendar-day-column/calendar-card/calendar-mobile-list/calendar-rule-list-popup
  • 统一使用 naive-ui 原生组件(NButton/NSelect/NSwitch)替换自定义的 ab-button/ab-select/ab-switch/ab-checkbox 并删除后者
  • 状态/下载器/日志轮询改为优先通过 SSE(useEventStream)获取更新,仅在 SSE 不可用或页面隐藏时才回退到定时轮询

[3.3.0]

Backend — Architecture

后端进行了一次以现代化和健壮性为目标的架构重构(行为与 REST API 保持兼容):

Changed

  • 数据库层全面异步化:仓储层与 Database 迁移到 sqlite+aiosqlite(启用 WAL + busy_timeout),不再在事件循环上执行同步 DB 调用
  • 组合优于继承:Database 不再继承 Session;RSSEngine/TorrentManager/Renamer/SeasonCollector/SearchTorrent/RSSAnalyser 改为构造函数注入依赖
  • Program 上帝对象由 lifespan 组合根 AppContext + 通用 PeriodicTask/Scheduler 取代;启动流程改为 awaited(迁移失败会明确中止启动),下载器重试改为受监督的后台任务
  • 迁移系统改为表驱动(database/migrations.py,声明式 already_applied 守卫),取代按版本硬编码的 if 链;版本号与 SQL 不变,旧库照常升级
  • 下载器引入 Downloader Protocol + 能力标志;aria2 的部分支持如实声明(不再以 NotImplementedError 崩溃循环)
  • 配置变更统一经由 AppContext.reload_settings() 生效(恢复了 RSS 规则的重新应用)
  • 安全:会话存储加入过期清理,令牌比较改为常量时间比较

Added

  • qBittorrent 客户端会话复用:跨操作复用登录会话、401/403 自动重新认证,大幅减少重复登录 (#1039, #900)
  • 可配置 TMDB / bgm.tv API Base URL,便于被墙用户使用镜像 (#1040, #1042)

Fixed

  • 修复下载器认证失败时 httpx 连接池泄漏
  • 修复 OpenAI 解析阻塞事件循环(改用 AsyncOpenAI)
  • 修复 build_rss_rule 的 mustNotContain 把过滤字符串按字符拆分而非按项做正则或运算
  • 移除大量死代码(旧通知栈、SIGALRM 装饰器、空的 transmission 桩等)

[3.2.8] - 2026-07-02

Backend

Fixed

  • 修复 qBittorrent ≥ 5.2 登录失败:新版登录成功返回 HTTP 204 空响应体,旧代码要求 200 + "Ok." 导致认证失败 (#1044, #1034, #1043)
  • 修复删除番剧/种子时文件不被删除:hashes 列表未按 qB API 要求以 | 拼接且响应状态未校验,删除失败现在会正确上报到 WebUI (#1046)
  • 修复下载器认证失败时 httpx 连接池泄漏:连接失败后正确关闭客户端 (#1043)
  • 加固初始设置接口:/setup/test-downloader 增加 URL 协议校验,所有 setup 接口不再回显原始错误详情 (#1041)
  • 修复同一站点多个 RSS 并发请求触发 HTTP 429:按主机分组串行抓取并加入间隔,不同主机仍并行 (#1026)
  • 修复 OpenAI 解析阻塞事件循环:切换到 AsyncOpenAI 异步客户端
  • 修复番剧缓存的失效竞态:加锁并引入代数计数,防止过期快照覆盖较新的失效
  • 修复无 [字幕组] 前缀的标题被解析器破坏 (#1025)
  • 共享 httpx 客户端跟随 302 重定向(mikanime.tv 镜像域名) (#983)
  • 修复 Linux 主机解析 Windows qBittorrent 保存路径导致季度总被置为 01 (#1016)
  • 加固共享 httpx 客户端:缩短 keepalive 防止陈旧连接风暴 (#1018, #1028, #984)
  • 删除 RSS 订阅时级联删除其种子记录,侧边栏不再残留条目 (#1019)
  • 探测 qBittorrent 时遵循 SSL 设置 (#1014)

Maintenance

  • 发布包纳入 pyproject.toml / uv.lock / requirements.txt (#994, #1015)
  • 容器启动 chown 跳过 .venv,加快启动 (#1011)

[3.2.6] - 2026-03-01

Backend

Added

  • 新增 Security 配置模型,支持登录 IP 白名单、MCP IP 白名单和 Bearer Token 认证

  • 新增登录端点 IP 白名单检查中间件 (check_login_ip)

  • MCP 安全中间件升级为可配置模式:支持 CIDR 白名单 + Bearer Token 双重认证

  • 认证端点支持 Authorization: Bearer 令牌绕过 Cookie 登录

  • 配置 API _sanitize_dict 修复:仅对字符串值进行脱敏,避免误处理非字符串字段

  • 新增番剧放送日手动设置 API (PATCH /api/v1/bangumi/{id}/weekday),支持锁定放送日防止日历刷新覆盖

  • 数据库迁移 v9:bangumi 表新增 weekday_locked 列

Fixed

  • 修复 qBittorrent 下载器 SSL 连接问题:解耦 HTTPS 协议选择与证书验证,自签名证书不再导致连接失败 (#923)
  • 修复 torrents_rename_file 重命名验证循环中 continue 应为 break 的逻辑错误

Changed

  • 重构认证模块:提取 _issue_token 公共方法,消除 3 处重复的 JWT 签发逻辑
  • get_current_user 简化为三级认证(DEV 绕过 → Bearer Token → Cookie JWT)
  • LocalNetworkMiddleware 重命名为 McpAccessMiddleware,从硬编码 RFC 1918 改为读取配置

Tests

  • 新增 101 个单元测试覆盖安全、认证、配置、下载器和 MockDownloader 模块

Frontend

Added

  • 新增日历拖拽排列功能:可将「未知」番剧拖入星期列,自动设置放送日并锁定
    • 拖入后显示紫色图钉图标,鼠标悬停显示取消按钮
    • 锁定的番剧在日历刷新时不会被覆盖
    • 使用 vuedraggable 实现流畅拖拽动画
  • 新增安全设置组件 (config-security.vue),支持在 WebUI 中配置 IP 白名单和 Token
  • 前端 Security 类型定义和初始化配置

[3.2.3] - 2026-02-23

Backend

Added

  • 新增 MCP (Model Context Protocol) 服务器,支持通过 Claude Desktop 等 LLM 工具管理番剧订阅
    • SSE 传输层挂载在 /mcp/sse,支持 MCP 客户端连接
    • 10 个工具:list_anime、get_anime、search_anime、subscribe_anime、unsubscribe_anime、list_downloads、list_rss_feeds、get_program_status、refresh_feeds、update_anime
    • 4 个资源:anime/list、anime/{id}、status、rss/feeds
    • 本地网络 IP 白名单安全中间件(RFC 1918 + 回环地址),无需 JWT 认证
  • 新增通知系统重构,支持多通知渠道同时启用
    • 支持 Telegram、Bark、Server 酱、企业微信、Discord、Gotify、Pushover、Webhook 八种渠道
    • 新增通知管理 API:GET/PUT /api/notification/providers
  • 新增 E2E 集成测试套件,覆盖 RSS→下载→重命名全流程

Fixes

  • 修复第 0 集(SP/OVA)被错误重命名为第 1 集的问题 (#977)
    • Episode 0 现在免受集数偏移影响,不再覆盖正常集数文件
  • 修复 RSS 过滤器包含特殊字符(如 [字幕组)时导致程序崩溃的问题 (#974)
    • 无效正则表达式自动降级为字面量匹配
  • 修复聚合 RSS 解析时 title_raw 为空导致 TypeError 崩溃的问题 (#976)
  • 修复解析器处理无括号种子名称时 IndexError 崩溃的问题 (#973)
  • 修复删除番剧时未清理关联种子记录的问题
  • 修复认证路由、JWT 刷新和 WebAuthn 注册流程的多个安全问题
  • 修复程序生命周期管理和后台任务取消逻辑
  • 修复数据库迁移在部分场景下未正确执行的问题

Performance

  • 优化日志系统:RotatingFileHandler 轮转(5 MB × 3)、QueueHandler 异步写入、GET /api/log 限读 512 KB
  • 优化重命名器:批量数据库查询,并发获取种子文件列表
  • 所有 logger.debug(f"...") 转为惰性 %s 格式化(~80 处)

Tests

  • 新增 26 个回归测试覆盖 #974、#976、#977、#986
  • 扩展 raw_parser、torrent_parser、path_parser 测试覆盖率

Frontend

Fixes

  • 修复认证路由守卫和 i18n 初始化顺序问题
  • 修复通知设置组件与项目设计系统的对齐问题
  • 修复组件生命周期管理问题

Docs

  • README 移除未实现的 Aria2 和 Transmission 下载器 (#987)

[3.2.0-beta.13] - 2026-01-26

Frontend

Features

  • 重新设计搜索面板
    • 新增筛选区域,支持按字幕组、分辨率、字幕类型、季度分类筛选
    • 多选筛选器,智能禁用不兼容的选项(灰色显示)
    • 结果项标签改为非点击式彩色药丸样式
    • 统一标签样式(药丸形状、12px 字体)
    • 标签值标准化(分辨率:FHD/HD/4K,字幕:简/繁/双语)
    • 筛选分类和结果变体支持展开/收起
    • 海报高度自动匹配 4 行变体项(168px)
    • 点击弹窗外部自动关闭

[3.2.0-beta.12] - 2026-01-26

Backend

Features

  • 偏移检查面板新增建议值显示(解析的季度/集数和建议的偏移量)

Fixes

  • 修复季度偏移未应用到下载文件夹路径的问题
    • 设置季度偏移后,qBittorrent 保存路径会自动更新(如 Season 2 → Season 1)
    • RSS 规则的保存路径也会同步更新
  • 优化集数偏移建议逻辑
    • 简单季度不匹配时不再建议集数偏移(仅虚拟季度需要)
    • 改进提示信息,明确说明是否需要调整集数

[3.2.0-beta.11] - 2026-01-25

Backend

Features

  • 新增季度/集数偏移自动检测功能
    • 通过分析 TMDB 剧集播出日期检测「虚拟季度」(如芙莉莲第一季分两部分播出)
    • 当播出间隔超过6个月时自动识别为不同部分
    • 自动计算集数偏移量(如 RSS 显示 S2E1 → TMDB S1E29)
  • 新增后台扫描线程,自动检测已有订阅的偏移问题
  • 新增搜索源配置 API 端点:
    • GET /search/provider/config - 获取搜索源配置
    • PUT /search/provider/config - 更新搜索源配置
  • 新增 API 端点:
    • POST /bangumi/detect-offset - 检测季度/集数偏移
    • PATCH /bangumi/dismiss-review/{id} - 忽略偏移检查提醒
  • 数据库新增 needs_review 和 needs_review_reason 字段

Frontend

Features

  • 新增搜索源设置面板
    • 支持查看、添加、编辑、删除搜索源
    • 默认搜索源(mikan、nyaa、dmhy)不可删除
    • URL 模板验证,确保包含 %s 占位符
  • 新增 iOS 风格通知角标系统
    • 黄色角标 + 紫色边框显示需要检查的订阅
    • 支持组合显示(如 ! | 2 表示有警告且有多个规则)
    • 卡片黄色发光动画提示需要注意
  • 编辑弹窗新增警告横幅,支持一键自动检测和忽略
  • 规则选择弹窗高亮显示有警告的规则
  • 首页空状态新增「添加 RSS 订阅」按钮,引导新用户快速上手
  • 日历页面海报图片添加懒加载,提升性能
  • 日历页面「未知播出日」独立为单独区块,优化视觉节奏

Fixes

  • 修复移动端设置页面水平溢出问题
    • 输入框添加 max-width: 100% 防止超出容器
    • 折叠面板添加宽度约束和溢出隐藏
    • 设置栅格添加 min-width: 0 允许收缩
  • 修复移动端顶栏布局
    • 搜索按钮改为弹性布局,填充 Logo 和图标之间的空间
    • 减小图标按钮尺寸和间距,优化紧凑型布局
    • 添加「点击搜索」文字提示
  • 修复移动端搜索弹窗关闭按钮被截断问题
    • 减小弹窗头部内边距和元素尺寸
    • 搜索源选择按钮缩小至适配移动端
  • 修复设置页面保存/取消按钮缺少加载状态
  • 修复侧边栏展开动画抖动(rotateY → rotate)
  • 移动端底部导航标签字号从 10px 增至 11px,提升可读性
  • 登录页背景动画添加 will-change: transform 优化 GPU 性能

[3.2.0-beta.8] - 2026-01-25

Backend

Features

  • Passkey 登录支持无用户名模式(可发现凭证)

Fixes

  • 修复搜索和订阅流程中的多个问题
  • 改进种子获取可靠性和错误处理

Frontend

Features

  • Passkey 登录支持无用户名模式(可发现凭证)

[3.2.0-beta.7] - 2026-01-25

Backend

Features

  • 数据库迁移自动填充 NULL 值为模型默认值

Fixes

  • 修复下载器连接检查添加最大重试次数
  • 修复添加种子时的网络瞬态错误,添加重试逻辑

Frontend

Features

  • 重新设计搜索面板,新增模态框和过滤系统
  • 重新设计登录面板,采用现代毛玻璃风格
  • 日志页面新增日志级别过滤功能

Fixes

  • 修复日历页面未知列宽度问题
  • 统一下载器页面操作栏按钮尺寸

[3.2.0-beta.6] - 2026-01-25

Backend

Features

  • 新增番剧归档功能:支持手动归档/取消归档,已完结番剧自动归档

Fixes

  • 修复 add_all() 方法缺少去重检查导致重复添加番剧规则的问题
  • 去重逻辑基于 (title_raw, group_name) 组合,同时支持批量内部去重
  • 新增剧集偏移自动检测:根据 TMDB 季度集数自动计算偏移量(如 S02E18 → S02E05)
  • TMDB 解析器新增 series_status 和 season_episode_counts 字段提取
  • 新增数据库迁移 v4:为 bangumi 表添加 archived 字段
  • 新增 API 端点:
    • PATCH /bangumi/archive/{id} - 归档番剧
    • PATCH /bangumi/unarchive/{id} - 取消归档
    • GET /bangumi/refresh/metadata - 刷新元数据并自动归档已完结番剧
    • GET /bangumi/suggest-offset/{id} - 获取建议的剧集偏移量
  • 重命名模块支持从数据库查询偏移量并应用到文件名

Frontend

Features

  • 番剧列表页新增可折叠的「已归档」分区
  • 日历页新增番剧分组功能:相同番剧的多个规则合并显示,点击可选择具体规则
  • 番剧列表页新增骨架屏加载动画

Fixes

  • 修复弹窗 z-index 层级问题,新增 CSS 变量管理层级系统
  • 改善无障碍体验:按钮最小触摸区域 44px、焦点状态可见、添加 aria-label
  • 规则编辑弹窗新增归档/取消归档按钮
  • 规则编辑器新增剧集偏移字段和「自动检测」按钮
  • 新增 i18n 翻译(中文/英文)
  • 优化规则编辑弹窗布局:统一表单字段对齐、统一按钮高度、修复移动端底部弹窗 z-index 层级问题
  • 修复下载器页面仅显示季度文件夹名的问题,现在会显示「番剧名 / Season 1」格式

[3.2.0-beta.5] - 2026-01-24

Backend

Features

  • RSS 订阅源新增连接状态追踪:每次刷新后记录 connection_status(healthy/error)、last_checked_at 和 last_error
  • 新增数据库迁移 v2:为 rssitem 表添加连接状态相关字段

Performance

  • 新增共享 HTTP 客户端连接池,复用 TCP/SSL 连接,减少每次请求的握手开销
  • RSS 刷新改为并发拉取所有订阅源(asyncio.gather),多源场景下速度提升约 10 倍
  • 种子文件下载改为并发获取,下载多个种子时速度提升约 5 倍
  • 重命名模块并发获取所有种子文件列表,速度提升约 20 倍
  • 通知发送改为并发执行,移除 2 秒硬编码延迟
  • 新增 TMDB 和 Mikan 解析结果的内存缓存,避免重复 API 调用
  • 为 Torrent.url、Torrent.rss_id、Bangumi.title_raw、Bangumi.deleted、RSSItem.url 添加数据库索引
  • RSS 批量启用/禁用改为单次事务操作,替代逐条提交
  • 预编译正则表达式(种子名解析规则、过滤器匹配),避免运行时重复编译
  • SeasonCollector 在循环外创建,复用单次认证
  • check_first_run 缓存默认配置字典,避免每次创建新对象
  • 通知模块中的同步数据库调用改为 asyncio.to_thread,避免阻塞事件循环
  • RSS 解析去重从 O(n²) 列表查找改为 O(1) 集合查找
  • 文件后缀判断使用 frozenset 替代列表,提升查找效率
  • Episode/SeasonInfo 数据类添加 __slots__,减少内存占用
  • RSS XML 解析返回元组列表,替代三个独立列表再 zip 的模式
  • qBittorrent 规则设置改为并发执行

Frontend

Features

  • RSS 管理页面新增连接状态标签:健康时显示绿色「已连接」,错误时显示红色「错误」并通过 tooltip 显示错误详情

Performance

  • 下载器 store 使用 shallowRef 替代 ref,避免大数组的深层响应式代理
  • 表格列定义改为 computed,避免每次渲染重建
  • RSS 表格列与数据分离,数据变化时不重建列配置
  • 日历页移除重复的 getAll() 调用
  • ab-select 的 watchEffect 改为 watch,消除挂载时的无效 emit
  • useClipboard 提升到 store 顶层,避免每次 copy() 创建新实例
  • setInterval 替换为 useIntervalFn,自动生命周期管理,防止内存泄漏
  • 共享 ruleTemplate 对象改为浅拷贝,避免意外的引用共变
  • ab-add-rss 移除不必要的 setTimeout 延迟

Fixes

  • 修复 ab-image.vue 中 <style scope> 的拼写错误(应为 scoped)
  • 修复 ab-edit-rule.vue 中 String 类型应为 string
  • bangumi ref 初始化为 [] 而非 undefined,减少下游空值检查
  • ab-bangumi-card 模板类型安全:动态属性访问改为显式枚举
  • 启用 noImplicitAny: true 提升类型安全

Types

  • ab-button、ab-search 的 defineEmits 改为类型化声明
  • ab-data-list 使用明确的 DataItem 类型替代 any

[3.2.0-beta.4] - 2026-01-24

Backend

Bugfixes

  • 修复从 3.1.x 升级后数据库缺少 air_weekday 列导致服务器错误的问题 (#956)
  • 修复重命名模块中 'dict' object has no attribute 'files' 的错误
  • 新增 schema_version 表追踪数据库版本,确保迁移可靠执行
  • 修复 qBittorrent 下载器中缺少 torrents_files API 调用的问题

Changes

  • 数据库迁移机制重构:使用 schema_version 表替代仅依赖应用版本号的迁移策略
  • 启动时始终检查并执行未完成的迁移,防止迁移中断后无法恢复

Tests

  • 新增全面的测试套件,覆盖核心业务逻辑:
    • RSS 引擎测试:pull_rss、match_torrent、refresh_rss、add_rss 全流程
    • 下载客户端测试:init_downloader、set_rule、add_torrent(磁力/文件)、rename
    • 路径工具测试:save_path 生成、文件分类、is_ep 深度检查
    • 重命名器测试:gen_path 命名方法(pn/advance/none/subtitle)、单文件/集合重命名
    • 认证测试:JWT 创建/解码/验证、密码哈希、get_current_user
    • 通知测试:getClient 工厂、send_msg 成功/失败、poster 查询
    • 搜索测试:URL 构建、关键词清洗、special_url
    • 配置测试:默认值、序列化、迁移、环境变量覆盖
    • Bangumi API 测试:CRUD 端点 + 认证要求
    • RSS API 测试:CRUD/批量端点 + 刷新
    • 集成测试:RSS→下载全流程、重命名全流程、数据库一致性
  • 新增 pytest-mock 开发依赖
  • 新增共享测试 fixtures(conftest.py)和数据工厂(factories.py)

[3.1] - 2023-08

  • 合并了后端和前端仓库,优化了项目目录
  • 优化了版本发布流程。
  • Wiki 迁移至 Vitepress,地址:https://autobangumi.org

Backend

Features

  • 新增 RSS Engine 模块,从现在起,AB 可以自主对 RSS 进行更新支持 RSS 订阅并且发送种子给下载器。
    • 现在支持多个聚合 RSS 订阅源,可以通过 RSS Engine 模块进行管理。
    • 支持下载去重功能,重复的订阅的种子不会被下载。
    • 增加手动刷新 API,可以手动刷新 RSS 订阅。
    • 新增 RSS 订阅管理 API。
  • 新增 Search Engine模块,可以通过关键词搜索种子并解析成收集或者订阅任务。
    • 插件化的搜索引擎,可以通过插件的方式添加新的搜索目标,目前支持 mikan、dmhy 和 nyaa
  • 新增对字幕组的特异性规则,可以针对不同的字幕组进行单独设置。
  • 新增 IPv6 监听支持,需要在环境变量中设置 IPV6=1。
  • API 新增批量操作,可以批量管理规则和 RSS 订阅。

Changes

  • 数据库结构变更,更换为 sqlmodel 管理数据库。
  • 新增版本管理,可以无缝更新软件数据。
  • 调整 API 格式,更加统一。
  • 增加 API 返回语言选项。
  • 增加数据库 mock test。
  • 优化代码。

Bugfixes

  • 修复了一些小问题。
  • 增加了一些大问题。

Frontend

Features

  • 增加 i18n 支持,目前支持 zh-CN 和 en-US。
  • 增加 pwa 支持。
  • 增加 RSS 管理页面。
  • 增加搜索顶栏。

Changes

  • 调整一些 UI 细节。