28 Commits

Author SHA1 Message Date
InfinityPacer
24671f8f18 refactor(runtime): lazily activate host modules (#6331) 2026-08-16 16:07:38 +08:00
jxxghp
4345fcfa22 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 分发,直接导入禁止
2026-08-16 05:25:28 +08:00
jxxghp
78b0063d4c fix: 清理音乐刮削结果中 album_type 等字段的尾部空格 (#6327)
MusicBrainz 和 ListenBrainz 模块从 API 响应中提取 album_type、
secondary_types 时直接使用 dict.get() 取值,未做 strip() 处理,
导致部分结果带有尾部空格(如 'Album '、'Broadcast ')。

修复:
- MusicBrainz 新增 _stripped() 工具方法,3 处 album_type 赋值统一清理
- ListenBrainz 新增 _stripped() 工具方法,_fresh_release_to_info 中清理
- Pydantic schema 层增加 field_validator 作为兜底安全网
- 新增 9 个回归测试覆盖所有场景
2026-08-15 20:35:02 +08:00
jxxghp
369d7d6448 refactor: reorganize backend module boundaries 2026-08-14 19:53:33 +08:00
jxxghp
7b3444c366 refactor backend module architecture 2026-08-14 15:45:38 +08:00
jxxghp
ca32922a7f refactor(media): unify media identity and chain responsibilities 2026-08-12 18:31:09 +08:00
jxxghp
8bf2f601a6 refactor(media): unify source identity and music browsing 2026-08-12 12:56:40 +08:00
jxxghp
a1dd259143 feat(media): refine primary-source recognition 2026-08-12 08:33:10 +08:00
jxxghp
97dba2a8ae feat: unify media recognition and music lifecycle 2026-08-12 06:51:58 +08:00
jxxghp
3f1b0cdb05 feat(music): 支持多源识别与元数据刮削 2026-08-11 23:34:00 +08:00
jxxghp
d0edcfa7bb feat(music): 音乐订阅刷新与识别缓存 2026-08-11 11:39:08 +08:00
jxxghp
778d185c9d fix(music): 系列专辑弱匹配要求分卷一致避免跨卷误配
- 资源带卷号(Ibiza Lounge Moments, Vol. 1)时候选卷号为其他分卷
  直接排除,修复 Vol.1/Vol.2 被误配到 Vol.3 条目;
  候选无卷号(条目本体不含分卷标记)时仍允许弱匹配
- 补充分卷一致性测试案例
2026-08-11 11:22:57 +08:00
jxxghp
9ab326e056 fix(music): 原声带电影名本体检索与合辑前缀拆分修复零命中
- musicbrainz: 原声带描述词(Original Motion Picture Soundtrack)剔除后
  用电影名本体补充检索阶梯,候选比对支持本体与主标题弱匹配;
  后缀定界防止 Ghost 类词内 ost 误剥,本体过短时不作独立检索目标
- musicbrainz: 尾部年份反复剥离,修复场景命名重复携带年份
  (Live At Montreux 2011 2011)阻断精确匹配
- metamusic: Various Artists-Title 全拼合辑前缀拆分,未收录别名变体
  统一归一为 Various Artists
- 补充原声带/重复年份/合辑前缀测试案例
2026-08-11 11:05:36 +08:00
jxxghp
44487f4343 fix(music): 卷号后缀剥离下沉到候选比对修复系列专辑失配
- 检索侧已剥离的 Vol. N 卷号后缀在候选挑选侧同样剥离,
  「好歌茹芸, Vol. 3」本体名与条目「好歌, 茹芸」主标题弱匹配命中
- 检索词元切分补充 ASCII 逗号/分号,避免标点成为逐字检索词元
- 补充卷号弱匹配测试案例
2026-08-11 10:36:32 +08:00
jxxghp
ae393456bd fix(music): 缩写点号还原与包含/演出后缀弱匹配修复失配
- metamusic: 连续单字母空格序列还原为点号缩写(S H E -> S.H.E),
  在场景点分之后执行避免点号再被压平
- metamusic: 规格段残留判定收紧,发布组短词仅在格式词无空格连字符
  形态(FLAC-HHWEB)放行,修复自然语言曲名(Ashielf Alpen)被误剥
- musicbrainz: 专辑候选新增包含关系弱匹配(原声带条目带额外前缀)
  与演出后缀弱匹配(S.H.E十七音乐会 -> 条目「十七」)
- 补充 metamusic 缩写还原与 musicbrainz 弱匹配测试案例
2026-08-11 10:24:45 +08:00
jxxghp
19937b210b fix(music): 署名前缀剥离与候选首段弱匹配修复失配
- 曲名开头的艺术家署名前缀(许茹芸的爱情电影主题曲)是命名习惯,
  检索式与候选比对统一用剥离后的主体名,署名身份由艺术家要求保证
- 条目「主体名 补充说明」结构(愛情電影主題曲 雲且留住)首段一致视为弱匹配
- 采样率支持空格写法(44 1khz),合集/精选纳入发行形态标记剔除
- 规格剔除后仅剩悬空分隔符时仍拆出艺术家(周杰伦 - 合集 2000-2022)
- 修正合集修饰词正则中的杂空格
2026-08-11 09:55:22 +08:00
jxxghp
62019d3d23 fix(music): CJK 标题适配 Lucene 分词的逐字 OR 检索
- MusicBrainz 索引将连续 CJK 视为单一词元,短语检索对中文标题永远零命中,
  新增 _query_phrase 将 CJK 文本拆为逐字 OR 检索式(OR 组带括号避免 AND 优先级歧义),
  拉丁文本保持短语检索
- 逐字 OR 召回宽,候选挑选收紧:标题未命中的候选不能仅凭艺术家署名得分
- 汉字数字与阿拉伯数字写法差异归一比对(茹此精彩十三首/茹此精彩13首)
- 补充逐字 OR 检索式、数字归一、艺术家独占候选拒绝等测试案例
2026-08-11 09:28:40 +08:00
jxxghp
779e10c6ae fix(music): 尾部规格段剥离与书名号结构归因修复
- 新增 _strip_spec_segments 尾部纯规格段整段剥离,避免规格后缀把
  艺术家/曲名拆分点推到连字符上(许茹芸 - 等得到 ... ALAC-HHWEB)
- 段定位限定段内禁连字符,匹配落在最尾片段;发布组标签仅在
  紧跟格式词的无空格形态或段内含规格词时剥离,保护单词曲名
- APE+CUE 联合写法的加号纳入规格段判定与悬空分隔符修剪
- 含书名号的括号注释(电影《xxx》主题曲)在结构解析前提取并拼回曲名,
  单层括号消歧后缀(电影版)保留
- 书名号分支支持「曲名-歌手」艺术家段反向拆分与尾部碟号/年份提取
- MusicBrainz 候选弱匹配扩展冒号副标题与首段连字符,检索式剥离尾部年份
- 补充规格段/书名号/VA/场景点分等真实种子测试案例
2026-08-11 08:57:43 +08:00
jxxghp
f09f81df72 refactor(music): 音乐识别核心下沉 MetaMusic 并优化 MusicBrainz 检索
- 标题解析核心从 app/helper/music.py 迁移到 MetaMusic(apply_title),
  删除 music helper,metainfo/chain 调用点切换
- 解析增强:全角归一、场景点分命名、年份区间双模式、日期前缀、
  视频标记剔除、VA 合辑署名归一、尾部年份提取、CJK 连字符拆分
- MusicBrainz 性能:全局 Session keep-alive 复用(6.3s→0.35s/请求),
  无艺术家线索时跳过专辑回退检索
- 候选挑选支持冒号副标题弱匹配,检索式剥离尾部年份减少无效检索
- 测试:test_metamusic 32 案例、musicbrainz 弱匹配/检索式新用例
2026-08-11 08:18:27 +08:00
jxxghp
07ea99442e feat(music): 增强无标签音频识别,支持文件名/目录解析与专辑级匹配
- 新增 MusicNameParser:剥离曲序/碟号前缀、拆分歌手与曲名、解析专辑目录名(歌手/专辑/年份/音质)和 CD1 等碟片目录
- MetaInfoPath 与 MusicChain.read_path_meta 接入路径上下文,WAV 及标签不全的 FLAC/MP3 可补齐识别线索
- MusicBrainz 新增 match_music_album:按专辑名/歌手/曲名搜索候选发行版本,用曲目数、总时长、逐曲时长和曲名重合度打分对位
- MusicChain 新增 recognize_album_directory 目录级批量识别(按目录缓存),单曲识别未命中时自动兜底
- transfer 整理链路接入专辑匹配,命中后回填曲目身份用于重命名与刮削
2026-08-10 20:11:23 +08:00
jxxghp
1fc255b8a7 fix(music): complete subscription lifecycle 2026-08-10 07:21:06 +08:00
jxxghp
393a4ca4e2 feat(music): complete album subscription workflow 2026-08-09 20:43:33 +08:00
LLL001a
391f7880f4 feat: 支持配置音乐封面代理地址 (#6258)
* feat: 支持配置音乐封面代理地址

* fix: 规范化音乐封面代理地址,去除尾随斜杠
2026-08-09 12:42:20 +08:00
jxxghp
60aa762ca1 feat: 音乐识别与刮削统一入口整合
- 音乐识别统一走 recognize_media,移除 MusicChain.recognize/async_recognize 及 /music/search 独立端点
- 音乐刮削收拢到 MediaChain.scrape_music_metadata,消除 MusicChain 对 MediaChain 的嵌套引用
- MetaInfo/MetaInfoPath 增加 force_video 参数,影视附加音轨保留季集归属
- 整理、订阅、搜索、API 层音乐识别入口全部统一
2026-08-09 10:06:54 +08:00
jxxghp
7797d34c48 feat: 识别文件类型:音乐 2026-08-08 23:38:34 +08:00
jxxghp
4570a7b74a feat: 修复插件市场空白和API缓存 (#6253) 2026-08-08 21:40:06 +08:00
jxxghp
415ccda6a2 feat(v3): enhance music server integration with Navidrome support 2026-08-08 12:57:09 +08:00
jxxghp
05d15a04f5 feat(v3): add music automation workflow 2026-08-07 21:50:22 +08:00