fix(music): 尾部规格段剥离与书名号结构归因修复

- 新增 _strip_spec_segments 尾部纯规格段整段剥离,避免规格后缀把
  艺术家/曲名拆分点推到连字符上(许茹芸 - 等得到 ... ALAC-HHWEB)
- 段定位限定段内禁连字符,匹配落在最尾片段;发布组标签仅在
  紧跟格式词的无空格形态或段内含规格词时剥离,保护单词曲名
- APE+CUE 联合写法的加号纳入规格段判定与悬空分隔符修剪
- 含书名号的括号注释(电影《xxx》主题曲)在结构解析前提取并拼回曲名,
  单层括号消歧后缀(电影版)保留
- 书名号分支支持「曲名-歌手」艺术家段反向拆分与尾部碟号/年份提取
- MusicBrainz 候选弱匹配扩展冒号副标题与首段连字符,检索式剥离尾部年份
- 补充规格段/书名号/VA/场景点分等真实种子测试案例
This commit is contained in:
jxxghp
2026-08-11 08:57:43 +08:00
parent ef73c79078
commit 779e10c6ae
4 changed files with 228 additions and 29 deletions
+10
View File
@@ -177,6 +177,12 @@ class MusicBrainzModule(_ModuleBase):
text = re.split(r"\s*[:]\s*", str(value or ""), maxsplit=1)[0]
return cls._normalize_text(text)
@classmethod
def _head_title(cls, value: Optional[str]) -> str:
"""提取候选「曲名-歌手」「曲名《巡演名》…」命名的首段曲名。"""
text = re.split(r"\s*[-–—−-::]\s*|\s*《", str(value or ""), maxsplit=1)[0]
return cls._normalize_text(text)
def _search_albums(self, meta: MetaMusic, limit: int) -> list[MusicInfo]:
"""按标题和可选艺术家搜索 Release Group 专辑候选,检索式同样逐级放宽。"""
for query in self._album_queries(meta):
@@ -591,6 +597,8 @@ class MusicBrainzModule(_ModuleBase):
cls._same_text(bare_title, cls._strip_parenthetical(candidate.title))
# 条目「天國的情人:鄧麗君逝世十周年…」这类冒号副标题,主标题一致视为弱匹配
or cls._same_text(bare_title, cls._main_title(candidate.title))
# 条目「为你盛开-许巍《无尽光芒》…」这类连字符前置命名,首段曲名一致视为弱匹配
or cls._same_text(bare_title, cls._head_title(candidate.title))
)
):
score += 2
@@ -645,6 +653,8 @@ class MusicBrainzModule(_ModuleBase):
cls._same_text(bare_title, cls._strip_parenthetical(album_title))
# 条目「天國的情人:鄧麗君逝世十周年…」这类冒号副标题,主标题一致视为弱匹配
or cls._same_text(bare_title, cls._main_title(album_title))
# 条目「为你盛开-许巍《无尽光芒》…」这类连字符前置命名,首段曲名一致视为弱匹配
or cls._same_text(bare_title, cls._head_title(album_title))
)
):
# 「我爱夜 (新歌+精选)」对位条目「我爱夜」这类注释差异