Commit Graph

2078 Commits

Author SHA1 Message Date
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
d0e357a603 feat(4.0-P2.5): WebUI 管理多个下载器实例,规则与订阅可选下载器,种子列表标注实例
- 下载器设置列出所有实例:添加、编辑、删除、设为默认,类型下拉框含插件下载器
- 规则编辑与添加订阅新增下载器选择(留空跟随默认实例,只有一个实例时不显示)
- 下载器页与种子列表在多实例时标出种子所在实例,批量暂停 / 恢复 / 删除按实例分别请求
- 插件卡片保存后只刷新 plugins.enabled / options,不再覆盖未保存的实例与 slots 修改
- 添加订阅时保存 downloader_id
2026-10-08 12:37:06 +02:00
Estrella Pan
dd505d67ae feat(4.0-P2.5): 下载操作按实例路由,重命名逐实例运行,不可用实例跳过并通知
- DownloadClient(instance_id) 按实例缓存客户端,凭据闩锁按实例隔离;DownloaderPool 在一次操作内惰性进入多个实例
- 新种子投递到规则的实例,规则未指定时用订阅的,再退回默认实例;种子行记录实际实例
- 规则 / 订阅 / 电影的 downloader_id 为空表示跟随默认实例(修改未发布的迁移 v26)
- rename_all 逐实例重命名,事件带真实 downloader_id;版本替换事务按实例过滤;不可用实例只在首次不可用时发 DownloaderUnavailableEvent
- 删除规则按种子所在的各实例删除;规则换实例时旧种子留在原位置
- /downloader/torrents 汇总所有实例并标注实例,暂停 / 恢复 / 删除 / 打标按 downloader_id 路由,新增 /downloader/instances
2026-10-08 12:29: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
e442d35c76 feat(4.0-P2.5): 下载器改为 plugins.instances 实例,slots 选择 Provider,新增 3.3 配置迁移器
- 运行时模型移除 downloader 配置节:下载器是 plugins.instances 中的实例(id / point / provider / options),plugins.slots.downloader 指向默认实例;Config.downloader 改为只读视图
- 重命名方式、文件分类、版本冲突策略按 plugins.slots 选择,未登记时退回 none / default / hold;冲突策略改为 core 的 hold / replace 两个 Provider,ConflictRequest 删除 configured,ab_sdk 升至 0.5.0
- module/update/v4.py:迁移 downloader、rename_method(normal 改为 none)、revision_conflict_policy;先备份为 config.json.v3.bak,失败时恢复备份并拒绝启动;在 Settings 读写配置前运行
- module.update 包初始化不再 import 子模块,避免 module.conf 引用迁移器时循环 import
- AB_DOWNLOADER_* 等环境变量与设置向导写入默认实例
- 数据库迁移 v26:bangumi / movie / rssitem / torrent 增加 downloader_id,存量行为 default
- WebUI:下载器设置编辑默认实例,重命名方式与版本冲突策略绑定 plugins.slots
2026-10-08 12:07:53 +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
d51e77c37f feat(4.0-P4): 内置插件 media-server-refresh 在整理完成后刷新 Jellyfin / Emby / Plex 媒体库
订阅 torrent.organized(含重命名方式为 none 的种子),等待 delay 秒把期间的
事件合并成一次刷新请求。未填写服务器地址或 API Key 时不做任何事,因此与
另一份 P4 实现相同,内置默认启用。
2026-10-08 11:32:38 +02:00
Estrella Pan
2b505e07bd refactor(4.0-P4): 删除无生产调用方的 renamer / 数据库方法与未使用的 season_offset 参数
- Renamer.rename_file / _rename_media_file、_lookup_offsets / _normalize_path:
  生产路径只走 rename() 与 _batch_lookup_offsets,相关测试改为经它们驱动
- BangumiDatabase.match_by_save_path、TorrentDatabase.search_by_qb_hash、
  RenameOperationDatabase.release_replacement_lease:无调用方;租约随
  set_state_claimed 的同一条 UPDATE 释放,已在其文档说明
- season_offset 在重命名链路中逐层传递却从未使用(季度偏移已体现在
  保存路径的 Season 文件夹),从 gen_path 起整条链路与偏移查询结果中移除
- vulture 白名单移除上述待处理项,补登 rename / hardlink 内置插件入口
  (此前 CI 的 vulture 检查会失败)
2026-10-08 11:30:27 +02:00
Estrella Pan
e1e6c0c849 fix(4.0-P4): 插件配置的 field_validator 报错返回 422 而不是 500
ValidationError.errors() 的 ctx 里带 ValueError 对象,无法 JSON 序列化,
保存配置时校验失败(如 hardlink 的路径必须为绝对路径)会变成 500。
2026-10-08 11:26:42 +02:00
Estrella Pan
422def2bf9 fix(4.0-P4): hardlink 认领未记录的自有文件、不覆盖用户替换的文件、并发放置互不干扰
KV 记录改为 [源文件身份, 目标身份]:目标是源的链接或 copy2 副本时视为已完成并补写记录;版本升级只替换目标身份与记录一致的文件。临时文件名每次不同,失败时删除。
2026-10-08 11:14:50 +02:00
Estrella Pan
8c12cd30dd fix(4.0-P4): 一轮重命名只解析一次策略,轮中停用插件不再给未改名的种子打 ab:renamed
rename() 把解析出的 ProviderEntry 传给 gen_path / rename_subtitles / rename_collection,打标签与生成文件名始终来自同一个策略。
2026-10-08 11:14:49 +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
Estrella Pan
41e578d1c8 feat(4.0-P4): 内置插件 hardlink 把整理好的文件链接到媒体库
- 订阅 torrent.organized,按 path_map(最长前缀、按下载器)把下载器路径换成本地路径,链接到 library_root 下的同一相对路径
- 跨文件系统时按 cross_device 复制 / 软链接 / 跳过并通知
- 目标被占用且非本插件创建时跳过并通知(每个种子一条);本插件为同一集创建过的链接在版本升级后原子替换;重复投递不重复操作
- POST /api/v1/plugins/hardlink/backfill 按需补链已有文件并返回计数
- 默认停用;删除种子不会删除媒体库中的链接
2026-10-08 10:53:02 +02:00
Estrella Pan
595d3746eb feat(4.0-P4): 插件可通知事件进入通知中心,@subscribe 支持超时,清单增加 default_enabled
- PluginBus 收到插件发布的 SystemEvent 时经 NotificationManager.send_event 投递(通知中心 → 事件总线 → 外部渠道)
- @subscribe(kind, timeout=...) 覆盖总线默认 30 秒的处理超时
- plugin.toml 的 default_enabled = false 让内置插件默认停用
2026-10-08 10:51:33 +02:00
Estrella Pan
d645f1c8f6 fix(4.0-P4): 未设置 runner 时插件重命名策略抛异常不再触发 UnboundLocalError 2026-10-08 10:41:53 +02:00
Estrella Pan
a0ebfff0e1 feat(4.0-P4): 内置插件 rename 提供 pn / advance / template 重命名方式
- pn / advance 从 core 移入内置插件 rename(默认启用),输出与 3.x 逐字节一致;
  宿主只保留 none,插件停用时按 none 处理。
- template:Jinja2 沙箱模板(StrictUndefined + pad 过滤器)渲染文件名主体,
  字幕自动追加语言与扩展名。保存配置时编译并试渲染示例,不合法返回 422;
  运行时渲染失败、结果为空或含路径分隔符时抛出 RenameSkipped,文件保留原名并
  通知,绝不退回 pn。
- 设置页重命名方式下拉框并入插件提供的方式;通知中心支持 rename_skipped。
- 测试环境默认登记内置 rename 插件,与生产默认启用一致。
2026-10-08 10:37:58 +02:00
Estrella Pan
e0b8939ec5 feat(4.0-P4): 重命名经 rename_strategy 解析,media_files / conflict_policy 改为 core Provider,发布整理事件
- 重命名方式按 rename_method 从注册表解析;未登记时记录一次日志并按 none 处理,
  不再给未改名的种子打 ab:renamed 标签。字幕改用 RenameInput.kind,不再拼 subtitle_*。
- 插件策略经 runner 同步调用(异常与无效返回值计入熔断);策略抛出 RenameSkipped
  或失败时文件保留原名、种子不打标签,每个种子同一原因只发一条 rename_skipped 通知。
- check_files 经 media_files 分类;版本冲突经 conflict_policy 判定,core 实现与
  3.x 的原因文案一致。
- 每轮结束发布 file.renamed;种子整理完成(含 none)发布 torrent.organized。
- pn / advance 暂以 core 登记,下一步移入内置插件 rename。
2026-10-08 10:32:15 +02:00
Estrella Pan
cf8135874d feat(4.0-P4): ab_sdk 增加 organize 契约与整理事件
ab_sdk.rename:RenameStrategy / RenameInput(kind 区分正片与字幕)/ RenameSkipped、
MediaFiles、ConflictPolicy 及其冻结快照,pad 补零格式化;points 增加
rename_strategy / media_files / conflict_policy;ab_sdk.events 增加 FileRenamed、
TorrentOrganized 与 RenameSkippedEvent。SDK 升至 0.4.0。
2026-10-08 10:23:31 +02:00
Estrella Pan
659d0e0501 refactor(4.0-P4): 拆分 renamer —— 命名策略移出 gen_path,revision 替换事务移入 revision_saga
纯搬移,不改行为:pn / advance / subtitle_* 命名移到 manager/rename_strategies.py,
普通重命名的一次性执行与 V1 → V2 替换 saga 移到 manager/revision_saga.py
(RevisionSaga,由 Renamer 继承)。
2026-10-08 10:21:04 +02:00
Estrella Pan
285bf151ba Merge branch 'refactor/4.0-p3-ingest' into refactor/4.0-p5-events-api 2026-10-08 09:20:28 +02:00
Estrella Pan
582a3894ee Merge branch 'refactor/4.0-p2-extension-points' into refactor/4.0-p3-ingest
# Conflicts:
#	backend/src/module/plugin/host.py
2026-10-08 09:19:13 +02:00
Estrella Pan
58ed9a36b6 fix(4.0-P2): 校验插件定时任务间隔与搜索站点/LLM 适配器返回值
- 定时任务的 interval/initial_delay 在受保护的 run() 中读取并校验,插件出错计入熔断,不再打断调度循环
- provider_impls 增加契约校验,搜索站点与 LLM 适配器返回值不合契约时跳过
2026-10-08 09:19:03 +02:00
Estrella Pan
f1b8dc61f7 fix(4.0-P5): 修复评审发现的插件 MCP 资源与通知模板隔离问题
- MCP read_resource 把 AnyUrl 转成字符串再交给 handle_resource,插件资源按 AnyUrl 规范化后的 URI 索引(含空格/非 ASCII 的 id 也能读取)
- 插件 McpTool/McpResource 字段不合法时在 _resolve 内跳过并计入熔断,不再拖垮 tools/list 与 resources/list
- 插件资源处理函数沿用工具默认超时(DEFAULT_TOOL_TIMEOUT),超时计入熔断
- render_event 以 expect=RenderedMessage 调用 transform,错误返回值计入出错插件的熔断,不再传给后续钩子
2026-10-08 09:11:51 +02:00
Estrella Pan
a4df845934 Merge branch 'refactor/4.0-p3-ingest' into refactor/4.0-p5-events-api 2026-10-08 09:08:39 +02:00
Estrella Pan
8f9ddd6eec fix(4.0-P3): 修复评审发现的插件过滤与返回值校验问题
- 手动收集整季与 eps_complete 补全(collect_season)同样经过 torrent.filter 钩子
- torrent.filter 收到的解析结果先经 title.parsed 钩子修正,与建规则时一致
- HookRunner 新增 check 校验:返回值校验在记成功之前,无效结果计入熔断
- torrent.adding 校验 save_path/category/tags 类型,无效时沿用原请求
- http.request 校验请求头为 str → str 映射,无效时沿用默认请求头
- metadata_provider 校验标题非空、季度为整数等字段,无效时不改写规则
2026-10-08 09:07:08 +02:00
Estrella Pan
58f3b40599 Merge branch 'refactor/4.0-p2-extension-points' into refactor/4.0-p3-ingest
# Conflicts:
#	backend/src/module/plugin/host.py
#	webui/src/hooks/usePluginProviders.ts
2026-10-08 09:00:59 +02:00
Estrella Pan
0c5563f8c8 fix(4.0-P2): 修复评审发现的插件隔离与掩码问题
- 插件清单拒绝保留 id "core",避免插件与宿主内置 Provider 共享归属
- 新增 host.provider_impls():搜索站点与 LLM 扩展适配器逐个调用工厂,出错的跳过并记录
- 插件代码未加载(无 schema)时,掩码/还原把全部配置项按秘密处理
- 定时任务桥接:ScheduledTask 字段读取纳入异常保护并计入熔断;enabled 每轮读取,异常计入熔断
- 通知渠道先按原样匹配 type,再按小写兼容,支持含大写的插件渠道 id
- WebUI:插件启停/保存后刷新插件 Provider 候选列表
2026-10-08 08:55:34 +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
8ccacb6060 refactor(4.0-P0): 清理死代码与 3.x 兼容层
- 4.0 只支持从 3.3.x 升级:version_check 改为完整 semver 比较,数据低于 3.3
  或残留 2.x data.json 时抛 UnsupportedUpgradeError 中止启动;删除 3.0→3.2
  跨版本迁移、data.json 迁移和 Database.migrate()
- 删除 3.2 兼容的 GET 控制端点与 GET /auth/refresh_token
- 删除旧 JWT 与内存会话实现,密码哈希移到 security/password.py
- 删除 experimental_openai 配置节、通知单 provider 旧字段、3.1 配置字段改名迁移
  与 DEFAULT_SETTINGS;normal 重命名方式迁移为 none
- 删除约 70 处无调用方的函数、方法、模型及未使用的 qB API 封装
- CI 新增 vulture 死代码检查(配置见 pyproject.toml 与 vulture_whitelist.py)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EoBUPFw7Ty1epuPESdELs1
2026-10-08 04:19:53 +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
ccb3f8d257 Merge pull request #1118 from EstrellaXD/fix/3.3.5-issues
Release 3.3.6
3.3.6
2026-09-19 18:07:59 +02:00
Estrella Pan
aaa464193b chore(release): prepare 3.3.6
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KU9GqKzULrNb7MN5T9TYix
2026-09-19 17:58:18 +02:00
Estrella Pan
37fa6b4ea5 fix: RSS matching, proxy pool, parser, healthcheck and log issues (#1103 #1104 #1105 #1106 #1108 #1114 #1117)
- match_bangumi_in_list: also accept a torrent whose rebuilt title equals
  the stored title_raw (#1103, #1114)
- download_bangumi / collect_season: drop items whose season or type
  conflicts with the bangumi (#1105)
- request_url: swap in a fresh shared client on PoolTimeout without
  closing the old one (#1104)
- classic parser: Unicode Roman numeral season, strip fullwidth dash
  wrapper (#1108)
- Docker HEALTHCHECK: healthcheck.py reads the configured WebUI port and
  probes IPv4 then IPv6 loopback (#1106)
- scheduler: non-positive interval falls back to 1s; deploy docs cap
  container logs at 10 MB x 3 (#1117)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KU9GqKzULrNb7MN5T9TYix
2026-09-19 17:58:17 +02:00
Estrella Pan
fd798519fe chore: add GitHub Sponsors funding 2026-08-04 21:11:05 +02:00
Estrella Pan
2befeb4933 Merge pull request #1102 from EstrellaXD/3.3-dev
Release 3.3.5 (mypy fix)
3.3.5
2026-07-26 15:53:23 +02:00
Estrella Pan
5cc2fabc64 fix(types): correct type-ignore codes and narrow Optional in tests
CI mypy (not run locally before) flagged the is_not() ignores as
union-attr and the un-narrowed RSSItem | None in the re-enable test.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019WTfJZ3EzCpY8SLhzXT6Sf
2026-07-26 15:53:14 +02:00
Estrella Pan
3d7b4d8417 Merge pull request #1101 from EstrellaXD/3.3-dev
Release 3.3.5
2026-07-26 15:49:29 +02:00
Estrella Pan
f54df55754 chore(release): prepare 3.3.5
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019WTfJZ3EzCpY8SLhzXT6Sf
2026-07-26 15:49:06 +02:00
Estrella Pan
d33a43f201 Merge fix/config-mask-empty (#1100): stop masking empty secrets, scrub corrupted sentinels 2026-07-26 15:46:16 +02:00
Estrella Pan
8b8a15f322 Merge fix/reset-all-fk (#1099): clear FK references before bangumi reset-all 2026-07-26 15:46:16 +02:00
Estrella Pan
0916bf688a Merge fix/issue-1092-episodeless-special (#1098): admit unmarked episode-less releases 2026-07-26 15:45:48 +02:00
Estrella Pan
900328928e Merge fix/issue-1094-telegram-poster (#1097): Telegram poster via source URL with fallbacks 2026-07-26 15:45:48 +02:00
Estrella Pan
708b937108 Merge fix/issue-1095-rss-reenable (#1096): re-enable disabled RSS on re-subscribe 2026-07-26 15:45:48 +02:00