refactor(chain): chain 与 module 仅经 run_module 契约互联,实现模块内容封闭

- mTorrent 字幕链接解析下沉为 IndexerModule.site_subtitle_links,subtitle 模块自行跳过 API 站点
- TMDB/MusicBrainz 识别缓存管理改为模块方法(tmdb_cache_*/music_cache_*)经 run_module 分发
- WechatClawBot 客户端查找/临时客户端/缓存迁移内聚为 wechatclawbot_* 模块方法,
  chain 移除 WechatClawBot 类与 ModuleManager 内省
- LISTENBRAINZ_* 常量迁至 schemas/types.py,模块与链层再导入保持兼容
- TMDbException 升为 schemas/exception.py 跨层契约,vendored 异常保持类身份一致
- 架构守护测试新增 test_chain_does_not_import_module_internals(共 18 项)
- 文档同步:chain->module 仅允许 run_module 分发,直接导入禁止
This commit is contained in:
jxxghp
2026-08-16 05:25:28 +08:00
parent 02f0dd0b9a
commit 4345fcfa22
21 changed files with 241 additions and 131 deletions
+9
View File
@@ -45,3 +45,12 @@ class StorageQueryError(Exception):
调用方不应把该状态当作文件不存在处理。
"""
pass
class TMDbException(Exception):
"""
用于表示TheMovieDB数据源请求失败的跨层异常契约。
具体实现由TMDB模块内的异常子类继承本类,链层与API层只捕获本基类,
不依赖模块内部实现路径。
"""
pass
+22
View File
@@ -22,6 +22,28 @@ MUSIC_SUBSCRIBABLE_TYPES = frozenset({
MUSIC_ENTITY_ALBUM,
})
# ListenBrainz 音乐探索能力的参数取值域契约,供入口层校验、链层与模块实现共用
# ListenBrainz 全站统计支持的周期,取值与官方统计页面完全一致
LISTENBRAINZ_CHART_RANGES = (
"this_week",
"this_month",
"this_year",
"week",
"month",
"quarter",
"half_yearly",
"year",
"all_time",
)
# ListenBrainz 官方新发行页面支持的排序方式
LISTENBRAINZ_FRESH_SORTS = (
"release_date",
"artist_credit_name",
"release_name",
)
# ListenBrainz 新发行页面允许回溯或预告的最大天数
LISTENBRAINZ_FRESH_MAX_DAYS = 90
# 媒体类型
class MediaType(Enum):