Estrella Pan
|
c11be99aa8
|
fix(downloader): qB 文件列表请求失败时返回空列表,不再让整轮重命名失败
任务在 torrents/info 与 torrents/files 两次请求之间被删除时,qB 返回 404 纯文本,
resp.json() 抛错导致所有任务都不重命名;返回错误对象时(如 fake-qb 的 501)又被当成
文件列表遍历。现在非 2xx 记一条警告并返回 [],重命名器按“无媒体文件”跳过该任务。
|
2026-10-22 09:10:54 +02:00 |
|
Estrella Pan
|
f2d93993f4
|
fix(plugins): apprise 的 urls 改为单个字符串秘密字段,回退 secret_field 的 default_factory
宿主只按位置还原列表型秘密的掩码,删除首个 URL 会保留错误的值;
插件注册表 CI 用基线分支的 ab_sdk 校验,插件不能依赖同一 PR 中的 SDK 改动。
|
2026-10-21 11:28:07 +02:00 |
|
Estrella Pan
|
667f769a2d
|
fix(plugins): 处理 Codex 审查的六个问题
- apprise:urls 含令牌,改为 secret_field;secret_field 支持 default_factory,可声明列表 / 字典秘密字段
- run-command:stderr 改为自建管道边读边丢,只保留最后 2000 字节;完成仍只看 proc.wait(),结束后给读取 0.5 秒再关闭管道
- run-command:{files} 按原始路径列表展开,含换行的路径不再拆成两个参数
- 通知:插件渠道 extra 里的已声明字段与内置渠道一样展开 $VAR
- slack:只在 HTTP 400 invalid_blocks 时退回纯文字重试,其它失败不重发
- onebot:先发文字,再单独发海报;结果只看文字,去掉重试
- strm-writer:media_root 为 "/" 时正确映射完整路径
|
2026-10-21 11:26:23 +02:00 |
|
Estrella Pan
|
81bbf9c71d
|
fix(plugins): 审查修复——示例插件与通知渠道的若干问题
- run-command:等待进程退出而不是等 stderr 关闭(后台子进程不再导致误判超时),
stderr 写临时文件取末尾;只替换整项为 {字段} 的参数,{files} 展开为每个文件
一个参数,夹带的占位符原样保留;不把宿主自己的 AB_* 环境变量传给命令;README
说明脚本从 AB_* 环境变量读取事件数据
- strm-writer:路径规范化后为媒体根目录本身(. / ..)时跳过,不再写出 STRM 目录之外的文件
- slack-notifier / onebot-notifier:带海报发送失败时去掉图片只发文字重试一次
- wpush-notifier / onebot-notifier:非 2xx 时报告 HTTP 状态,响应不是 JSON 时不再报解析异常
- 插件通知渠道的 extra 包含已填写的已声明字段(group、icon 等),不只是 model_extra
- 新增通知渠道时切换类型会清掉上一类型的字段,避免 Bark 带上残留的 Webhook URL
|
2026-10-21 11:05:59 +02:00 |
|
Estrella Pan
|
4b739bcfc3
|
Merge remote-tracking branch 'origin/4.0-dev' into feat/notifier-plugins
|
2026-10-21 10:46:28 +02:00 |
|
Estrella Pan
|
b592d6cb0d
|
fix(backend): 连载番剧只超出集数时照常标记并只通知一次,此类标记不随复扫清除 (#1072)
- offset_scanner: 去掉“建议偏移全为 0 且未完结不标记”的跳过;已标记番剧复扫无不匹配时,只清除建议偏移非 0 的标记,只超出集数的标记由用户忽略或应用(与 3.3 一致)
- 测试:连载番剧首扫标记并通知、复扫不再通知、TMDB 跟上后只超出集数的标记保留而季度不匹配的标记清除;复扫测试的旧标记改为真实不匹配
|
2026-10-21 10:29:25 +02:00 |
|
Estrella Pan
|
1dda39f2d5
|
fix: 审查修复——启动时一次性去掉旧搜索订阅关键词里的集号 (#1138)、回退到 none 的轮次不为路径未变的文件建记录、路径未变的完成记录在任务从下载器删除后清理 (#1082)
- migrations:Migration 新增 data_step,在同一 SAVEPOINT 内执行一次性数据修复;v28 按番剧 season_raw 改写搜索源 URL 的关键词参数,并同步番剧 rss_link
- revision_saga:选定策略未登记时,路径未变的文件不建操作记录也不通知,策略恢复后的那一轮再记录并通知
- rename_operation:prune_done 按本实例当前任务清理路径未变的过期 done 记录,任务列表为空时不清理
|
2026-10-21 09:53:47 +02:00 |
|
Estrella Pan
|
81cbc549b0
|
fix: 审查修复——连载番剧只超出集数不再每周误报、仍不匹配时更新原因、未完结剧集 TMDB 缓存 24 小时过期、无法滚动时不判触底、路径未变的完成通知按本轮实际策略发送、season_raw 只存季的写法、已归档番剧不列入待检查、复制令牌按真实结果提示
- offset_scanner: 建议偏移全为 0 且剧集未完结时不标记不通知;已标记仍不匹配时更新原因与建议偏移(不再通知)
- tmdb_parser: 除 Ended/Canceled 外的状态都按 24 小时过期
- renamer: 路径未变时的通知改由本轮解析出的策略是否为选定策略决定,不再读 NO_RENAME 设置
- tokenizer: season_raw 只记 S03 / Season 2;搜索端保留正则处理旧数据并补上 EPs 写法 (#1138)
- bangumi: get_needs_review 排除已归档番剧
- webui: isAtBottom 移入 scroll-spy 并要求容器可滚动;搜索确认弹窗复制启用 legacy;新增 copyText,令牌复制失败时报错
- 删除只断言 SQL 语句形态的测试
|
2026-10-21 09:16:01 +02:00 |
|
Estrella Pan
|
415154be3d
|
Merge branch 'feat/more-plugins' into feat/notifier-plugins
# Conflicts:
# backend/src/test/test_plugin_examples.py
# docs/dev/plugins/examples.md
|
2026-10-21 09:13:47 +02:00 |
|
Estrella Pan
|
f1dd439fbe
|
feat(notification): Bark 支持铃声、分组、中断级别、图标与点击地址;插件权限新增「运行外部命令」
- Bark 渠道新增可选字段 sound、group、level、icon,并复用 url 作为点击打开的地址;
只发送已设置的项,旧配置的请求体不变;配置了 icon 时优先于海报地址(#792)
- 测试接口 /notification/test-config 透传新字段;通知设置表单加上对应输入框
与 level 下拉框,并更新三语言的通知配置文档
- 插件权限标签新增 subprocess(运行外部命令),仅用于展示
|
2026-10-21 09:09:43 +02:00 |
|
Estrella Pan
|
8312f47769
|
feat(plugins): 新增 run-command、strm-writer、synology-chat-notifier、slack-notifier 示例插件
- run-command:torrent.organized / file.renamed 后运行外部命令,参数列表直接 exec,
事件字段以 AB_* 环境变量与 {占位符} 传入,超时终止(#897、#668)
- strm-writer:按媒体目录结构写 .strm,内容为地址前缀加相对路径(#428)
- synology-chat-notifier:Synology Chat 传入 Webhook,payload= 表单 JSON(#887)
- slack-notifier:Slack Incoming Webhook,带海报时附图片块(#277)
|
2026-10-21 09:08:56 +02:00 |
|
Estrella Pan
|
403cf94572
|
feat(plugins): 新增 WPUSH、OneBot、Apprise 官方通知插件示例
- wpush-notifier:POST JSON 到 WPUSH 接口,code == 0 才算成功
- onebot-notifier:OneBot v11 私聊 / 群消息,可附带 poster_url 海报
- apprise-notifier:调用 Apprise API 服务器,支持 URL 列表与配置键
- 宿主加载测试与示例文档登记三个新渠道
|
2026-10-21 08:53:28 +02:00 |
|
Estrella Pan
|
23a0c2e968
|
fix(backend): 搜索订阅关键词去掉集号 (#1138)、不重命名时完成通知只发一次 (#1082)、偏移误报在复扫无偏移时自动清除并让连载番剧的 TMDB 缓存 24 小时过期 (#1072)、按番剧批量删除种子 (#1113)、/posters 改用严格的目录包含判断
|
2026-10-21 08:47:35 +02:00 |
|
Estrella Pan
|
3a491348bf
|
fix: 审查修复——订阅改 URL 后已匹配种子仍追加 rss_link、SSE 帧后到达的旧 HTTP 种子列表丢弃、空日志推 log_clear
|
2026-10-20 18:20:41 +02:00 |
|
Estrella Pan
|
34b6217041
|
fix(backend): 审查修复——孤儿种子每轮重新分析、TMDB 请求失败不缓存、SPA 路由 no-cache、清空日志后推全量、去重查询失败只标记单个订阅
|
2026-10-20 18:13:01 +02:00 |
|
Estrella Pan
|
fbc08949e4
|
perf(startup): MCP 与 webauthn 延迟导入,首个 /mcp 请求才构建子应用
- main 只导入 module.mcp.security;访问控制套在 /mcp 路由外层,被拒请求不加载 mcp 库
- _LazyMcpApp 在首个放行请求时构建子应用(加锁,并发只构建一次),会话管理器跑在 lifespan 持有的任务组里,关停时随之取消
- module.mcp 改为 PEP 562 __getattr__ 延迟导入 mcp / create_mcp_app
- passkey 在构造 WebAuthnService 时才导入 webauthn
启动 import main 0.49 s -> 0.30 s,冷启动到首个响应 0.56 s -> 0.39 s,RSS 148 MB -> 115 MB
|
2026-10-20 17:48:53 +02:00 |
|
Estrella Pan
|
3fcf487030
|
perf(sse): 下载器列表共享 5s 缓存且只推变化,日志改为首帧全量 + log_append 增量
- 所有 SSE 连接共用一份种子列表缓存(锁内单次查询,5s TTL);每个连接仅在
负载与上次推送不同时才发 downloader 帧
- log 帧只在连接建立、日志轮转(inode 变化)、截断或 mtime 回退时发送整段
尾部;其余发送新增的完整行 log_append,没有新增不发
- _read_file_tail/_read_log_tail 额外返回读到的末尾偏移,作为增量起点
|
2026-10-20 17:31:14 +02:00 |
|
Estrella Pan
|
48e4ec94cb
|
perf(rss): 每轮每个订阅只拉取一次,聚合分析按 (url, rss_id) 跳过已知种子,偏好去重按候选加载
- 聚合订阅分析改在 RSSEngine.refresh_rss 内进行,复用按主机排队拉取的结果(保留 2 s 间隔,#1026),不再二次请求
- 分析前按 (url, rss_id) 过滤本订阅已记录的种子;其他订阅已知的种子仍参与匹配,以追加 rss_link(#1053)
- 每轮只加载一次番剧列表,生成新规则后才重新加载
- 偏好去重:批次中没有偏好候选时直接返回,只为有候选的番剧加载已下载版本
- 删除不再使用的 pull_rss 与 search_aggregate
|
2026-10-20 17:11:24 +02:00 |
|
Estrella Pan
|
843a014928
|
perf(backend): 日志修复、gzip、静态缓存头、部分索引命中、TMDB 负缓存与 LRU、镜像预编译
- 日志:basicConfig 加 force=True,避免 mcp 先导入后日志文件为空
- GZipMiddleware(minimum_size=1000),SSE 默认排除
- SPA 依赖为 /assets/ 加 immutable,入口 HTML 加 no-cache
- rename_operation 活动过滤改为 NOT IN,命中 ux_rename_operation_active_target
- TMDB 缓存:否定与回退结果 6 小时 TTL,命中时 move_to_end
- Dockerfile 构建阶段预编译字节码
|
2026-10-20 16:54:54 +02:00 |
|
Estrella Pan
|
014358ff6a
|
fix: 修复 Codex 审查发现的两处回归
- Bangumi / BangumiUpdate 的 9 个可空字段恢复为必填(default=...),只传部分字段的更新与订阅请求重新返回 422,不再用占位值改写规则和保存路径
- ab-menu 补上 role=menu、打开时把焦点移到菜单、aria-activedescendant 指向高亮项,关闭后焦点回到触发器
|
2026-10-20 13:13:00 +02:00 |
|
Estrella Pan
|
124b156b7a
|
fix: 修复 4.0 工具链升级审查问题
- ab-plugin new 与示例插件的 requires-python 改为 >=3.14,与 SDK 0.6.0 一致
- 示例插件 ntfy-notifier / webhook-on-event 改用 httpx2
- openai / anthropic / google-genai 下限改为实际需要的大版本
- 插件 MCP 工具的 input_schema 无效时计入熔断
- 复制 RSS 链接在 HTTP 部署下回退到 execCommand(useClipboard legacy)
- CI 步骤名、PLAYWRIGHT_VERSION、README 徽章与 e2e 指南改为 Python 3.14 / Playwright 1.64.1
|
2026-10-20 12:12:58 +02:00 |
|
Estrella Pan
|
a7a3143683
|
Merge branch 'feat/4.0-toolchain-webui' into feat/4.0-toolchain
|
2026-10-20 11:49:15 +02:00 |
|
Estrella Pan
|
e63b42af48
|
style(backend): 改用 ruff format 统一格式
|
2026-10-20 11:41:14 +02:00 |
|
Estrella Pan
|
73fbca985b
|
refactor(mcp): 升级 mcp 2.3,改用 MCPServer 与 Streamable HTTP(端点 /mcp)
- 内置工具与资源改为 AutoBangumiMCP(MCPServer 子类)上的 @mcp.tool() /
@mcp.resource(),参数 schema 由类型注解生成,工具名、描述与参数名不变;
结果仍是一段 JSON 文本,异常返回 is_error 结果
- 插件工具与资源在子类的 list / call / read 中追加与分发,熔断与超时逻辑
不变;mcp 2 不再校验参数,插件工具按 input_schema 用 jsonschema 校验,
不合法的参数不计入熔断
- 传输只保留 Streamable HTTP,以路由挂载在 /mcp(mount 会把 /mcp 重定向到
/mcp/),删除 /mcp/sse 与 /mcp/messages/;会话管理器在应用 lifespan 中运行;
关闭 DNS rebinding 防护,访问控制仍由 IP 白名单与令牌负责
- 更新 MCP 文档、e2e 用例与 4.0 更新日志的破坏性变更
|
2026-10-20 11:40:32 +02:00 |
|
Estrella Pan
|
7013d476ac
|
chore(deps): 升级 FastAPI 0.150 / Starlette 1.9 / uvicorn 0.54,SSE 与前端托管改用 FastAPI 原生实现
- fastapi 0.150.0、starlette 1.9.0、uvicorn 0.54.0、python-multipart 0.0.32,
抬高 pyproject 下限;删除直接依赖 sse-starlette(mcp 仍间接依赖)
- events/search 两个 SSE 端点改用 fastapi.sse 的 EventSourceResponse +
ServerSentEvent(raw_data=...);搜索无关键词时返回空的 200 事件流
- uvicorn.run 设 timeout_graceful_shutdown=5:原生 SSE 没有关停监听,
常开的事件流不再拖住退出与在线更新重启
- mount_webui 改用 APIRouter.frontend 托管 dist,CSP 由路由依赖加在前端
文件上;未知 /api 路径返回 404,只有浏览器导航才回落 index.html;
去掉 Jinja2Templates 与三个 StaticFiles 挂载
- 插件路由合并后不再统计 router.routes(0.137 起为内部树结构)
|
2026-10-20 11:10:48 +02:00 |
|
Estrella Pan
|
ca7fcdf058
|
chore(deps): httpx 全面迁移到 httpx2,SOCKS5 改用原生代理,升级 LLM SDK 大版本
- 依赖 httpx[socks] 换为 httpx2[socks]>=2.15,移除 httpx-socks / python-socks 及其 mypy 覆盖
- backend/src、ab_sdk、e2e 与单元测试统一使用 httpx2(异常类与 httpx 不通用)
- request_url 与 LLM 客户端工厂合并为 proxy_url(),SOCKS5 走 httpx2 原生代理(主机名由代理解析)
- 保留 #1104 过期连接池替换:httpcore2 2.15.1 的 start_tls 失败路径仍会泄漏隧道
- 日志同时压低 httpx2 与 httpx(google-genai、mcp 仍依赖旧 httpx)
- openai 3.35.1 / anthropic 1.15.0 / google-genai 2.31.0;结构化解析改用 chat.completions.parse
- ab_sdk 升到 0.6.0,客户端类型改为 httpx2.AsyncClient,同步插件文档
|
2026-10-20 10:56:32 +02:00 |
|
Estrella Pan
|
2ea56c50c6
|
chore(deps): 升级 sqlmodel 0.0.48 / SQLAlchemy 2.1.5 / pydantic 2.14.1
- Field 位置参数改为 default=,Optional 字段补 default=None
- 测试中 Torrent(bangumi_id=) 改用别名 refer_id,字典解包补类型标注,移除不存在的 Bangumi(offset=)
- 依赖改为 sqlalchemy[aiosqlite],移除独立的 aiosqlite
|
2026-10-20 10:46:20 +02:00 |
|
Estrella Pan
|
0f2af080af
|
chore(deps): 后端工具链升级到 Python 3.14,路由统一鉴权并清理 black/urllib3/dict 垫片
|
2026-10-20 10:43:24 +02:00 |
|
Estrella Pan
|
02e0c3ea63
|
chore(deps): CI 运行时升级到 Node 24 / pnpm 12,并移除未用依赖
- Node 24、pnpm 12.14.0、pnpm/action-setup@v6,@types/node ^24
- .npmrc 的 public-hoist-pattern 迁入 pnpm-workspace.yaml,新增 allowBuilds
- docs 同步迁移 pnpm 12
- 删除 @vueuse/components、radash、generate-pwa-assets 脚本、失效的 coverage 配置、app AutoImport 的 vitest 预设与 Components dirs
|
2026-10-20 10:41:07 +02:00 |
|
Estrella Pan
|
87e23eea2d
|
fix(plugins): 处理 Codex 对插件市场的审查意见
- 安装请求带上用户确认的版本,目录已换版本时后端拒绝
- 目录刷新换了条目时关闭确认栏,重新确认权限
- 是否有更新由后端按 PEP 440 判断(update_available)
- 插件改动后的同步失败不再算作操作失败
- KeepAlive 再次进入时重新加载失败,下次进入会再试
- 手机详情页的返回只在上一条历史是列表时后退
|
2026-10-09 15:39:17 +02:00 |
|
Estrella Pan
|
1fc10b16eb
|
Merge branch 'fix/4.0-builtin-plugin-i18n' into feat/4.0-plugin-market-ui
# Conflicts:
# webui/src/i18n/en.json
# webui/src/i18n/zh-CN.json
# webui/src/utils/id-label.ts
|
2026-10-09 13:37:41 +02:00 |
|
Estrella Pan
|
56ac06db2a
|
feat(webui): 插件市场页面
- 新增 /market 与 /market/:id:列表 + 详情双栏,手机上点行进入整屏详情,
主操作固定在底部;侧栏与手机导航加入口
- 按扩展点归类的分类标签、安装状态筛选与搜索;签名目录获取成功后缓存,
目录不可达时显示上次的目录并禁用安装/更新
- 安装/更新前的确认步骤:来源与审查、权限声明、前端、同进程警告;
更新显示版本与权限差异,权限变多须勾选确认
- README 用安全的 Markdown 子集渲染(先转义 HTML,链接只允许 http(s))
- 设置页的插件目录区换成「打开插件市场」入口
- 后端 CatalogEntry 补上 sdk 与 path 字段
|
2026-10-09 13:34:38 +02:00 |
|
Estrella Pan
|
49a499d417
|
fix(webui): 内置插件的名称、描述与配置字段支持英文
内置插件的清单与 config_model 只有中文,英文界面里直接显示中文。前端在
builtin_plugins.<id> 下为 4 个内置插件配齐中英文案,按插件 id 查找,查不到
(第三方插件)时仍显示后端文字。插件的停用原因改为代码(not_enabled、
unsigned_blocked),由前端翻译;“未启用”不再重复显示为提示框。
|
2026-10-09 13:14:33 +02:00 |
|
Estrella Pan
|
5fc7f749d7
|
Merge remote-tracking branch 'origin/4.0-dev' into feat/4.0-plugin-market
|
2026-10-09 13:00:21 +02:00 |
|
Estrella Pan
|
ee3ee0a6ab
|
fix(webui): 4.0 界面审查第二轮修复
- 通知渠道列表测试:已保存且未改动的行按下标测试后端保存的配置(掩码密钥
不再导致失败,插件渠道的自带字段得以保留),未保存的行按当前配置测试;
后端下标改为对应完整渠道列表(含停用项)
- 插件配置表单:草稿深拷贝 options,编辑嵌套行后保存按钮可用
- 插件配置表单:数字字段清空后保持空白,Optional 字段清空为 null
- 标签输入:失焦(focusout)时添加未确认的输入;输入法组字时的回车不添加标签
- 下载器:切回已保存的类型时恢复保存的配置,不再清空凭据
- 插件挂载点加载失败时改为刷新页面,提示文案同步
- 移动端导航:同一插件只显示一个入口,导航项不收缩、可横向滚动
- 插件页面无匹配挂载点时标题回退为插件 id
|
2026-10-09 12:11:30 +02:00 |
|
Estrella Pan
|
2ed46695a2
|
feat(plugins): 条目以 sha256 绑定审查过的 zip
PR 检查打出的 zip 的 sha256 写进条目。合并后在独立 job 中重新打包的 zip、
签名 job 汇总的 zip(含复用的旧 zip)都必须与它一致才签名,构建在 PR 与
合并后产出不同字节时发布失败,不会签下未审查的内容。条目缺少或写错 sha256
时,PR 检查在摘要中给出应填的值。
|
2026-10-09 12:02:02 +02:00 |
|
Estrella Pan
|
d664122af8
|
fix(plugins): 按 Codex 审查加固插件市场流水线
- 拒绝符号链接形式的条目;PR 检查纳入类型变更(T)
- PR 头部先解析为固定 SHA,作者代码不能借 FETCH_HEAD 换掉被检查的 commit
- 使用已发布的 catalog 前先验签,篡改的 release 资源不会被重新签名
- 全部下架时签发空目录
|
2026-10-09 10:31:55 +02:00 |
|
Estrella Pan
|
5e15c5cf17
|
fix(webui): 4.0 界面审查修复
按 4.0 UI 审查确认的问题修复(设计规范、状态与流程、无障碍与手机端、文案):
- 插件卡片:加载失败可重试、未保存标记、开关与保存分开忙碌状态、停用或卸载
仍在使用的插件前确认、扩展点与权限显示为译名、tags 字段改用 ab-tags-input
- 插件表单:必填与范围校验、删除非空行前确认、清空数字恢复默认值、稳定的行 key
- 插件页面与挂载点:加载骨架、失败原因与重试;手机底栏可进入插件页面
- 下载器:按类型显示字段、切换类型重置选项、id 规则提示、类型名称
- 通知:测试结果按列表 / 对话框分开、插件渠道提示、rename_skipped 显示方法名
- 规则编辑与添加 RSS:高级区改用 ab-field / ab-select,补充可访问名称
|
2026-10-09 10:23:16 +02:00 |
|
Estrella Pan
|
c77f437fc7
|
fix(plugins): 插件市场流水线按审查意见加固
- 插件公钥移入 module/plugin/,随在线更新包分发,旧镜像更新后也能验签目录
- 合并后每个插件在独立的 job 中构建;签名 job 自己下载复用的 zip 并校验
sha256,逐个核对新 zip 的 id 与来源,单个插件的构建篡改不到别的插件
- 发布只从 4.0-dev 运行;PR 检查使用 base 分支的脚本与 ab_sdk
- 复用判断加入 path,手动触发可全部重新打包
- 打包前拒绝符号链接;摘要转义作者控制的输出;单个条目出错不影响整份摘要
- 已上架版本以已发布的 catalog 为准,不再拉取旧 commit
- 修复 git diff 把提交范围当作路径的问题
|
2026-10-09 10:22:55 +02:00 |
|
Estrella Pan
|
eb1598c21e
|
feat(plugins): 插件市场索引与签名发布流水线
- plugins/registry/<id>.toml 指向作者仓库的固定 commit(repo、commit、path)
- scripts/plugin_registry.py:check 在 PR 上校验改动的条目、运行作者测试、
从 web-src/ 构建前端并写审查摘要;build 在合并后增量打包(commit 未变的
条目复用已发布的 zip)
- plugin-registry.yml:check / build 不读 secret,sign 只用 PLUGIN_SIGNING_KEY
签名,不运行作者代码;发布到 release plugins 并删除下架的资源
- 插件目录改用独立的插件公钥 ab_plugin_pubkey.pem,与在线更新密钥分开
- catalog 条目新增 authors、permissions、has_web、repo、commit、readme
- 6 个示例插件上架;上架文档(中 / 英 / 日)、PR 模板与 CODEOWNERS
|
2026-10-09 10:13:30 +02:00 |
|
Estrella Pan
|
f3359b17fd
|
feat(examples): manual-pick 前端改由 web-src/ 构建,补充测试
插件市场要求带前端的插件以 web-src/ 源码提交、至少有 1 个测试。ab-plugin pack
不再打包 web-src/,运行时只需要构建出的 web/。
|
2026-10-09 10:07:37 +02:00 |
|
Estrella Pan
|
d1953fae34
|
test(4.0): 端到端测试改为断言删除失败时保留规则
|
2026-10-08 17:46:39 +02:00 |
|
Estrella Pan
|
73ab8a2a9a
|
fix(4.0): 4.x 另写版本记录并备份 3.x 数据库,回退 3.3 不再误跑 3.0 迁移
|
2026-10-08 17:44:49 +02:00 |
|
Estrella Pan
|
6439577b2b
|
refactor(4.0): 改正描述旧行为的注释与文档字符串
- ab_sdk 的扩展点与下载器说明仍写 downloader.type,P2.5 起改为下载器实例的 provider
- ab_sdk 与示例插件中的阶段编号(P3 / P4 / P5 / P6)对插件作者没有意义,去掉
- EventBus.drain 只有测试调用;hardlink 注释中的 slots 已实施
|
2026-10-08 17:24:14 +02:00 |
|
Estrella Pan
|
67f16ad372
|
refactor(4.0): ab-plugin 命令行复用 ab_sdk.manifest 的插件 id 正则
cli.py 自带一份与 manifest.ID_RE 完全相同的私有正则,改为直接导入。
|
2026-10-08 17:21:00 +02:00 |
|
Estrella Pan
|
64c8a92fc1
|
fix(4.0): /config/get 掩码插件通知渠道的自定义字段,保存时按身份还原
插件渠道的配置存为 notification.providers[] 的额外字段,没有 schema,
原先只按键名掩码,webhook / sendkey 等以明文返回。模型未声明的字段
现在与无 schema 的插件选项一样全部按秘密处理;保存时对通知渠道列表
用同一判定做身份匹配与还原,删除或调换渠道不会串用或丢失密钥。
|
2026-10-08 16:56:59 +02:00 |
|
Estrella Pan
|
47d136b68e
|
fix(4.0): 秘密字段标记写在 anyOf / $ref 外层或容器上时也掩码
secret_field() 用于可选字段时,Pydantic 把 secret 标记写在 anyOf 外层;
_branches 展开分支时丢弃了外层节点,GET /plugins 与 /config/get 返回明文。
容器(list / dict / 嵌套对象)上的秘密标记也不再传给其中的元素。
|
2026-10-08 16:54:17 +02:00 |
|
Estrella Pan
|
34526246b7
|
fix(4.0): 媒体库刷新在硬链接放好文件后再刷新一次,刷新期间的事件不再丢失
media-server-refresh 只按第一个 torrent.organized 起算 delay,不等待
同一事件的 hardlink 订阅者:跨盘复制慢于 delay 时刷新早于文件到位。
hardlink 新放入文件后发布 hardlink.linked(普通事件,不是通知),
media-server-refresh 同时订阅它。刷新请求发出后到达的事件原先被忽略,
现在这次刷新之后再排一次。
|
2026-10-08 16:46:13 +02:00 |
|
Estrella Pan
|
045bdbd407
|
fix(4.0): 已打 ab:renamed 的种子在本进程未发布过时补发 torrent.organized
标签在发布之前打上,之后的轮次不再检查该种子:订阅者处理中被取消
(重启、插件重载)的事件永远不会再投递,硬链接漏掉这一集。现在每个
进程按当前文件名为已打标签的种子补发一次,丢失的事件在下次启动时
重新投递,投递恢复为至少一次;没有事件总线时不查询文件。
test_renamed_tag_skips_before_file_and_offset_queries 改为在已发布的
稳态下断言。文档与 TorrentOrganized 说明同步更新。
|
2026-10-08 16:42:42 +02:00 |
|
Estrella Pan
|
93520e5b03
|
fix(4.0): 重命名策略未登记而按 none 处理时不发布 torrent.organized
重载窗口、熔断或模板失效期间,种子按原名发布 torrent.organized;
策略恢复后改名再发布一次,硬链接在媒体库留下两份。原名不是最终
文件名,此时不再发布。test_rename_unregistered_method_keeps_names_without_tag
的期望随之改为不发布。
|
2026-10-08 16:36:26 +02:00 |
|