Estrella Pan
75eefc9ce1
docs(4.0): 记录收尾阶段的调整并更新变更日志
2026-10-08 17:29:56 +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
Estrella Pan
1d764b0974
fix(4.0): conflict_policy 与 media_files 插件经熔断器调用,失败时退回宿主实现
...
两者原先直接调用插件实现:抛出异常或返回值无效会中断整轮重命名,
且不计入熔断。新增 plugin_host.call_sync(重命名策略同样改用它),
conflict_policy 失败按 hold 处理,media_files 失败按扩展名分类。
2026-10-08 16:34:20 +02:00
Estrella Pan
04beea02c8
fix(4.0): hardlink 不再重建用户从媒体库删除的文件
...
插件放置过、之后被删除的目标,KV 记录中的源身份与当前源相同:
torrent.organized 重复投递时不再放回,只有用户主动补链时重建。
2026-10-08 16:30:24 +02:00
Estrella Pan
ee5704eef0
feat(4.0): 设置页新增签名插件目录的浏览、安装、更新与卸载
...
- 插件卡片下方新增「插件目录」区:点击后才请求 GET /plugins/catalog(silent),失败时在区内显示后端原因并可刷新
- 条目按已装版本显示安装 / 更新 / 已安装;安装成功后刷新卡片、Provider 下拉与前端挂载点
- 卸载只对来源为 catalog 的插件开放,经危险确认框;与后端卸载前提为同一条件,LLM 插件不受影响
- 卡片标出已签名 / 未签名
- 修复前端缺少 catalog 来源类型与 source_catalog 文案
- 同步签名与分发文档(中 / 英 / 日)、设计文档第 0 节与 CHANGELOG
2026-10-08 15:38:52 +02:00
Estrella Pan
f01e1e1358
fix(4.0): aria2 的 gid 映射按下载器实例区分
...
两个 aria2 实例可能分配到相同的 gid,原先 aria2_gid 以 gid 为主键,
番剧关联、改名记录与按 dedup_key 判重会在实例间互相覆盖。
- v27 迁移重建 aria2_gid,主键改为 (downloader_id, gid),存量行归属 default。
- Aria2GidDatabase 构造时绑定实例 id,经 Database.aria2(downloader_id) 取得。
- DownloaderConnection 新增 instance_id(默认 "default"),工厂把它传给 Aria2Downloader。
2026-10-08 15:25:09 +02:00
Estrella Pan
b763c62fe3
fix(4.0): 删除规则时下载器不可用则保留规则与种子行以便重试
...
delete_rule 原先先删种子行与番剧,再逐实例删种子;某个实例不可用时,
该实例上的种子失去记录,之后无法再删。现在删除文件时先逐实例删种子,
全部成功才删种子行与番剧;有失败时两者都保留并返回 500。
2026-10-08 15:18:50 +02:00
Estrella Pan
88950d30a8
fix(4.0): 在线更新包带上 ab_sdk 并要求 4.0 镜像
...
- build.yml:bundle 打入 backend/src/ab_sdk,min_image_version 设为 4.0.0-beta.1。
已发布的 3.3 镜像在 beta 通道会选中最新预发布,靠该下限拒绝 4.x bundle。
- boot_overlay:已验签 bundle 必须同时带 module 与 ab_sdk,先换 /app/ab_sdk 再换 /app/module。
- 测试:覆盖层替换 ab_sdk、缺 ab_sdk 时不应用;3.3.6 镜像拒绝 min_image_version
为 4.0.0-beta.1 的 bundle 且不留存 bundle;build.yml 的 bundle 步骤。
2026-10-08 15:16:33 +02:00
Estrella Pan
da77f94f0f
fix(4.0-P7): 评审修复:插件扫描跳过工具链目录、v3 迁移忽略空旧字段、通用与 LLM 插件互不干扰
2026-10-08 15:02:56 +02:00
Estrella Pan
3258fcca4b
docs(4.0-P7): 插件开发文档拆分为总览加每个扩展点一页,补齐中英日三语
...
- docs/dev/plugins.md 改为总览与导航,旧内容拆入 docs/dev/plugins/
- 新增核心概念、配置表单、事件、前端挂载点、命令行、签名与分发、内置插件、示例页
- 每个扩展点一页,侧边栏由页面表生成
- 改正旧文档中下载器配置、hardlink path_map 与补链按钮的过时描述
2026-10-08 14:51:00 +02:00
Estrella Pan
e0fc4c4eb6
docs(4.0-P7): 记录 install / catalog 路径对插件路由的占用
2026-10-08 14:27:26 +02:00
Estrella Pan
ce98409950
docs(4.0-P7): 记录 P7 第一部分的实施调整,更新 CHANGELOG
2026-10-08 14:23:12 +02:00
Estrella Pan
34d51dd711
fix(4.0-P6): 嵌套秘密字段掩码、未启用插件 schema 刷新、custom element 归属校验
2026-10-08 14:05:56 +02:00
Estrella Pan
91e01f716f
feat(4.0-P6): WebUI 插件挂载点、AbHost 宿主实现与示例插件「手动选种」
...
- PluginSlot:导入插件模块并在 Shadow DOM 中挂载 custom element,host / context 先于插入设置;加载失败、元素未定义或运行时报错只让该插件的挂载点显示「插件组件加载失败」
- AbHost:api 限定在 /api/v1/plugins/<id>/ 与只读 GET 的宿主 API;i18n、主题、toast;events.on 订阅 SSE 新增的 bus 帧(后端把总线事件转发给前端)
- 五个挂载点:设置分区、番剧详情标签、卡片操作、侧边栏页面 /plugins/:id、首页小组件
- 未启用的内置 / 已允许的插件也能取得配置 schema,首次启用前即可填写配置
- Schema 表单支持对象数组(hardlink 的 path_map)
- hardlink 插件自带 settings.section 元素「链接已有文件」,调用补链路由并显示计数
- examples/plugins/manual-pick:详情页标签示例,含插件路由与事件订阅
- 设计文档第 0 节记录调整,第 10 节标记 P6 已完成
2026-10-08 13:50:46 +02:00
Estrella Pan
bf1c8db08c
feat(4.0-P6): 前端插件后端与 plugin-ui 工作区包
...
- 清单 [[plugin.ui]]:五个挂载点、ab-plugin- 元素名与 web/ 入口校验
- GET /plugins/ui 列出已启用插件的挂载点;GET /plugins/{id}/web/{path} 提供静态资源(防路径穿越、JS MIME、需登录)
- SPA 文档加 CSP script-src 'self',内联深色模式脚本移到 theme-init.js
- webui/packages/plugin-ui:AbHost 类型、--ab-* 主题变量、Vite 库模式模板
- 设计文档第 0 节记录第一部分的调整
2026-10-08 13:31:03 +02:00
Estrella Pan
a5defee676
fix(4.0-P2.5): 保存目录随投递实例重新生成,删除 / 补全 / 打标逐实例隔离,迁移不覆盖已有备份
...
- add_torrent 经 save_path_for:已存目录不在本实例下载目录之下时按本实例重新生成
(默认实例切换、规则的实例被删除、订阅指向别的实例)
- TorrentManager 按已存目录与本实例目录匹配种子;更新规则时在种子行记录的每个实例上移动
- delete_torrents 逐实例隔离,一个实例不可用时其它实例照常删除,最后报告失败的实例
- eps_complete 与自动打标跳过不可用实例
- 单实例时不按实例过滤进行中的版本替换事务,改主机地址后仍能恢复
- v4 迁移器已有 .v3.bak 时另存为 .v3.bak.1 等
2026-10-08 13:10:13 +02:00
Estrella Pan
75b42cfe24
docs(4.0-P2.5): 记录 P2.5 第二部分的实施调整并标记阶段完成,下载器文档补充多实例说明
...
- 设计文档第 0 节补充按实例路由、迁移 v26 取值修改、重命名逐实例运行与推迟项,第 10 节 P2.5 标记已完成
- 下载器文档(中 / 英 / 日)新增「多个下载器」,插件开发文档更新 downloader_id 与 instance_id
- 新增 qB 与 aria2 实例并存的进程内测试
2026-10-08 12:40:51 +02:00
Estrella Pan
e4a7fc8483
docs(4.0-P2.5): 记录 P2.5 第一部分的实施调整,下载器与番剧管理文档改为 plugins.instances / slots
2026-10-08 12:07:59 +02:00
Estrella Pan
78f0c0ab20
docs(4.0-P4): 番剧管理文档补充 template / hardlink / 媒体库刷新,记录两份 P4 实现的移植
...
- docs/{,en/,ja/}config/manager.md:template 模板变量与失败行为、hardlink
选项(path_map、cross_device)与 Docker 下硬链接不能跨文件系统的说明、
media-server-refresh 配置
- CHANGELOG.md 增加 P4 条目
- VitePress 不给行内代码加 v-pre,行内 Jinja2 示例在构建时报
_ctx.pad is not a function;改用 ::: v-pre 容器
- 设计文档第 0 节记录另一份 P4(refactor/4.0-p4-organize-cloud)与移植内容,
第 10 节 P4 行补充 media-server-refresh,第 11 节风险 2 标为已决
2026-10-08 11:38:12 +02:00
Estrella Pan
422def2bf9
fix(4.0-P4): hardlink 认领未记录的自有文件、不覆盖用户替换的文件、并发放置互不干扰
...
KV 记录改为 [源文件身份, 目标身份]:目标是源的链接或 copy2 副本时视为已完成并补写记录;版本升级只替换目标身份与记录一致的文件。临时文件名每次不同,失败时删除。
2026-10-08 11:14:50 +02:00
Estrella Pan
82ea8f098f
fix(4.0-P4): hardlink 复制中断不再在媒体库留下半个文件
...
所有放置先写到同目录临时文件再 os.replace 到目标;否则重试时残留文件会被当成非本插件创建的冲突。文档补充 path_map 需在 config.json 填写与首次启用流程。
2026-10-08 11:00:23 +02:00
Estrella Pan
9502f373fa
docs(4.0-P4): 插件文档补充整理扩展点、整理事件与 rename / hardlink 内置插件,设计文档记录 P4 调整
2026-10-08 10:55:09 +02:00
Claude
0b6de31593
Merge refactor/4.0-p3-ingest into refactor/4.0-p5-events-api
...
- 合并 P3 与 P5 共同追加的扩展点列表(ab_sdk/points.py、plugin/host.py POINTS)
- host.py 中两边各自实现的 set_runner / get_runner 去重,保留 P5 的
get_bus / set_bus / publish;AppContext 统一设置 bus 与 runner
- CHANGELOG、设计文档第 0 节、插件开发文档按 P3 → P5 顺序合并
- 修复 MCP /sse 端点在 SSE 结束后重复发送响应头导致的 AssertionError
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01EoBUPFw7Ty1epuPESdELs1
2026-10-08 06:44:43 +00:00
Claude
93f6d794c5
feat(4.0-P5): 系统事件上总线、通知中心 SSE 改为事件推送、插件路由 / MCP / 通知模板
...
- 系统事件类移入 ab_sdk.events(SystemEvent 基类,新增 i18n()),
NotificationManager.send_event 写入通知中心后发布到插件事件总线
- module.plugin.host 新增 get_bus/set_bus、get_runner/set_runner、publish,
由 AppContext 构造时设置
- SSE notification 帧改为订阅 inbox.changed 即时推送,线格式不变
- 新扩展点 api_router(/api/v1/plugins/<id>/ 分发路由,强制鉴权)、
mcp_tool / mcp_resource(<plugin-id>__<id> 命名)、message_template
- ExtensionPoint.scoped:Provider id 只需在插件内唯一
- ab_sdk 0.3.0;插件开发文档、设计文档、CHANGELOG 更新
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01EoBUPFw7Ty1epuPESdELs1
2026-10-08 06:34:43 +00:00
Claude
9b7ef00c2e
feat(4.0-P3): ingest 流水线扩展点与内置种子过滤插件
...
- 钩子:torrent.filter(排除过滤之后,fail-open)、title.parsed(准入判定前)、
torrent.adding(save_path / category / tags,ab:<id> 标签强制保留)、
http.request(GET 请求头)
- Provider:metadata_provider,mikan / tmdb 以 core 登记,按 RSSItem.parser 选择,
行为与 3.x 一致;插件元数据源走超时与熔断
- SDK 0.3.0:新增 ab_sdk.ingest(冻结快照 TorrentInfo / BangumiInfo / AddRequest /
HttpRequest / Metadata)
- host.get_runner()/hook_runner():AppContext 构建时设置 runner,无钩子时零开销
- 内置插件 ingest-filters:全局包含过滤,默认启用、留空不生效
- WebUI:添加订阅的解析器下拉框并入插件元数据源
- 文档:插件开发指南新增各扩展点;设计文档 P3 调整
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01EoBUPFw7Ty1epuPESdELs1
2026-10-08 06:31:23 +00:00
Claude
332fb451c4
feat(4.0-P2): 下载器/通知/LLM/搜索/定时任务扩展点与插件管理界面
...
- ab_sdk 0.2:新增 points、downloader(自 module/downloader/base.py 迁入)、
llm(自 providers/base.py 迁入)、notify、search、tasks 契约与
secret_field();原路径保留重新导出
- module/plugin/host:进程级扩展注册表,内置 qB/aria2/mock 与各通知渠道以
core 身份登记;DownloadClient、NotificationManager、LLM 注册表、搜索站点
均改为按 id 从注册表解析
- 插件定时任务随插件加载/重载/停用同步进调度器,失败计入熔断
- 插件变更后重建通知渠道、清理 LLM 解析器缓存;下载器客户端缓存键包含
Provider 登记项,插件重载后自动换新
- /api/v1/plugins:总览(schema + 掩码配置)、启停、配置(按模型校验)、
allow_unsigned、Provider 列表;/config 读写同样掩码/还原插件秘密字段
- WebUI:设置页「插件」卡片与 JSON Schema 表单;下载器与通知下拉框并入插件
Provider;插件保存后刷新 config store 的 plugins 段,避免全局保存覆盖
- 修复:/search/provider 读取导入时的站点快照,新站点需重启才出现
- 文档:开发者指南 → 插件开发
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01EoBUPFw7Ty1epuPESdELs1
2026-10-08 05:59:07 +00:00
Claude
94da8fa741
feat(4.0-P1): 插件运行时与 SDK 骨架
...
- ab_sdk:Plugin[ConfigT] 基类、@hook / @provider / @subscribe、只读的
PluginContext 协议、事件基类,以及插件单测辅助 ab_sdk.testing;SDK 不依赖
module.*(有边界测试)
- module/plugin:plugin.toml 清单校验(含 sdk 版本范围),内置 / 本地目录 /
pip entry point 三种来源的发现与加载(ab_plugin_<id> 包名、支持相对导入、
vendor 纯 Python 依赖、拒绝原生扩展)
- 扩展点注册表;HookRunner 负责 filter / transform 钩子的优先级与 hook_order
排序、超时、fail-open / fail-closed,以及按插件熔断
- EventBus:每个订阅者独立的有序队列,失败与超时隔离,计入熔断
- PluginManager:失败时回滚注册;配置变更只重载受影响的插件;失败插件在其
配置变化后才重试;熔断后自动禁用并发布 PluginDisabled
- 插件私有 KV 存储(plugin_kv 表,迁移 v25)、plugins 配置段、
GET /api/v1/plugins
- 插件随进程 lifespan 启停,reload_settings 时重新应用插件配置
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01EoBUPFw7Ty1epuPESdELs1
2026-10-08 04:37:57 +00:00
Claude
b742148054
docs: 修正章节编号
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01EoBUPFw7Ty1epuPESdELs1
2026-10-08 03:48:06 +00:00
Claude
fd75652ab2
docs: 记录 4.0 插件化核心决策,补充多下载器与前端插件设计
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01EoBUPFw7Ty1epuPESdELs1
2026-10-08 03:47:57 +00:00
Claude
c2f1784497
docs: 4.0 插件化重构与死代码清理设计草案
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01EoBUPFw7Ty1epuPESdELs1
2026-10-08 03:41:50 +00:00
Estrella Pan
9d5b1c3998
fix(renamer): safely replace higher revisions ( #1078 )
2026-07-13 01:36:17 +02:00
Estrella Pan
00b78dfa64
docs(renamer): design revision replacement for #1078
2026-07-13 00:31:34 +02:00
Estrella Pan
060b602aaf
docs(parser): design classic and preview engine switch
2026-07-12 21:07:33 +02:00
Estrella Pan
8ceec47174
perf(parser): add reproducible tokenizer benchmark
2026-07-12 21:07:33 +02:00
Estrella Pan
56ce4dbe21
docs(parser): record resolved tokenizer architecture
2026-07-12 21:07:33 +02:00
Estrella Pan
5748892c41
docs(parser): design candidate resolver migration
2026-07-12 21:07:33 +02:00
Estrella Pan
5cc5f57e91
docs: design beta tokenizer lineage integration
2026-07-12 20:44:31 +02:00
Estrella Pan
6a8eafc9c9
docs: design architecture and auth modernization
2026-07-10 00:32:47 +02:00
Estrella Pan
a0bf878b7e
feat(calendar): add drag-and-drop to assign unknown bangumi to weekdays
...
Allow users to drag bangumi cards from the "Unknown" section into weekday
columns in the calendar view. Manual assignments are locked so calendar
refresh from Bangumi.tv doesn't overwrite them. A reset button lets users
unlock and send cards back to Unknown.
Backend:
- Add weekday_locked field to Bangumi model (migration v9)
- Add PATCH /api/v1/bangumi/{id}/weekday endpoint
- Skip locked items in refresh_calendar()
Frontend:
- Add vuedraggable for smooth drag-and-drop
- Pin indicator and unpin button on manually-assigned cards
- Drop zone highlighting during drag
- i18n strings for drag/pin/unpin
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-23 14:21:00 +01:00
Estrella Pan
362c7b81ca
feat(ui): redesign search panel with modal and filter system
...
- Replace dropdown search results with full-screen modal
- Add 4-tier filter chips: subtitle group, resolution, subtitle type, season
- Auto-extract filter options from search results
- Add confirmation modal before subscribing
- Support toggle close (click search input, Escape, or X button)
- Responsive grid layout: 1-4 columns based on viewport
- SSE streaming with fade-in card animations
- Add i18n translations for search filters and confirmation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-25 11:48:32 +01:00