mcpField
G
generate-identifiers

generate-identifiers

github.com/jxxghp其他12.0k105 次安装今天更新
代码仓库

关于 generate-identifiers

用于创建自定义识别规则的 MoviePilot 技能,可在媒体识别前调整种子和文件名。它强调为全局规则设置狭窄匹配范围,并在替换完整规则列表前检查现有规则。

主要功能

  1. 01创建屏蔽、替换和集数偏移规则
  2. 02支持正则表达式与直接绑定 ID
  3. 03将规则限制在独特命名模式内
  4. 04检查重复规则和冲突
  5. 05更新完整识别词列表

适用场景

  1. 01在识别前修正标题别名
  2. 02调整解析出的季数或集数
  3. 03将特定命名模式绑定到元数据 ID
  4. 04从限定的标题模式中移除无关文本

MCP 相关

使用 `moviepilot_api` 操作读取和更新识别规则,并可选用 `media.recognize` 测试识别效果。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/jxxghp/moviepilot --skill generate-identifiers

安装后在 Claude Code 中输入/generate-identifiers确认已加载。

详细介绍

生成自定义识别词

此技能用于为 MoviePilot 的媒体识别系统生成自定义识别规则。自定义识别词会在识别引擎运行前预处理种子/文件名,修正可能导致误识别的命名问题。

前提条件

使用以下 moviepilot_api 操作:

  • config.identifiers.get - 查询所有现有的自定义识别规则
  • config.identifiers.update - 保存更新后的识别词列表(会替换整个列表)
  • media.recognize - 测试对种子标题或文件路径的识别(可选)

支持的规则格式

共有 四种格式。运算符两侧都必须有空格。

1. 屏蔽词

从标题中删除匹配的文本。支持正则表达式。

SomeUniqueAlias

只有当词条本身在全局范围内足够具体,或用户明确要求全局清理规则时,才使用单独的屏蔽词。

2. 替换(被替换词 => 替换词)

正则替换。左侧是正则表达式,右侧是替换内容(支持反向引用)。

被替换词 => 替换词

用于直接指定 ID 的特殊替换:

被替换词 => {[tmdbid=xxx;type=movie/tv;s=xxx;e=xxx]}
被替换词 => {[doubanid=xxx;type=movie/tv;s=xxx;e=xxx]}

使用与目标元数据提供方匹配的特定字段: tmdbid、doubanid、bangumiid 或 anilistid。其中 s(季)和 e (集)为可选项。对于 TMDB 电视剧识别,可添加 g=xxx 指定剧集组:

被替换词 => {[tmdbid=xxx;type=tv;g=xxx;s=xxx;e=xxx]}
3. 集偏移

对前后定位词之间找到的集数进行偏移。EP 是原始集数的占位符。

前定位词 <> 后定位词 >> EP-12
4. 替换 + 集偏移组合

先执行替换;只有替换成功时才会执行集偏移。

被替换词 => 替换词 && 前定位词 <> 后定位词 >> EP-12
注释

以 # 开头的行是注释,处理时会跳过。

编写识别词的重要规则

  1. 支持正则表达式:所有模式都支持正则表达式。匹配字面字符时,特殊字符(. * + ? ^ $ { } [ ] ( ) | \)必须使用 \ 转义。
  2. 空格很重要:运算符 =>、<>、>>、&& 两侧都必须有空格。
  3. 每个字符串一条规则:识别词列表中的每个元素都是一条规则。
  4. EP 占位符:在集偏移表达式中,EP 表示原始集数。常见模式:
    • EP-12 表示减去 12
    • EP+5 表示加上 5
    • EP*2 表示乘以 2
  5. 支持中文数字:集偏移支持中文数字(一二三四五六七八九十)。
  6. 空替换:在 => 后不填写内容,效果等同于屏蔽词。

全局作用范围防护规则

自定义识别词会作用于全局。新规则会影响今后所有种子/文件的识别,而不仅仅是用户提供的示例。

生成新规则时,默认采用能够修正用户示例的最窄正则表达式:

  • 先提取示例中的独特锚点:错误的标题别名、年份、季/集标记、制作组标签、来源、分辨率、发布标签、文件扩展名或其他显著片段。
  • 匹配侧通常应包含至少两个有意义的锚点,其中一个通常应是标题别名或用户示例中的其他高度独特标识。
  • 优先匹配示例中的完整错误别名或稳定的独特片段,不要使用简短的通用子字符串。
  • 避免使用 1080p、WEB-DL、中字、国配、REPACK、S01E01 等通用全局规则或纯数字,除非用户明确要求全局清理规则。
  • 如果规则只需修正一种特定命名模式,优先使用带捕获组/反向引用的上下文替换,而不是单独的屏蔽词。
  • 对于集偏移规则,前定位词 和 后定位词 应使用示例中特定的上下文,确保偏移只应用于预期的命名模式。
  • 对于直接绑定媒体,左侧应匹配用户提供的特定错误别名或命名模式,而不是可能匹配其他媒体的宽泛季/集模式。
窄范围与宽泛示例

不佳(对全局规则而言过于宽泛):

REPACK
1080p
S01E01 => {[tmdbid=12345;type=tv;s=1;e=1]}

更佳(限定为用户提供的样例模式):

(\[SubGroup\].*?My\.Show.*?2024.*?)REPACK => \1
Some\.Weird\.Name(?:\.2024)?(?:\.S01E\d+)? => {[tmdbid=12345;type=tv;s=1]}
\[Baha\] <> \[1080P\] >> EP-12

保存前,请在脑中用以下情况测试规则:

  • 用户提供的样例:应当匹配
  • 带有常见发行标签的无关标题:通常不应匹配

工作流

步骤 1:分析问题

解析用户提供的种子/文件名。确定:

  • 哪些内容被错误识别(标题、季、集、年份、画质等)
  • 正确的识别结果应该是什么
  • 哪种标识符格式可以解决问题
  • 提供的样例中有哪些片段足够独特,可以用作正则表达式锚点,避免规则意外影响无关标题
步骤 2:生成标识符规则

使用合适的格式编写规则。确保:

  • 正确转义正则表达式特殊字符
  • 在规则上方添加注释行(以 # 开头),说明规则的作用
  • 在脑中用提供的名称测试正则表达式,确认其正确性
  • 由于规则是全局的,应优先选择最具体且可行的匹配;如果单独使用屏蔽词过于宽泛,应将其改写为包含样例专属锚点的上下文替换规则
步骤 3:查询现有标识符

使用 moviepilot_api 和 operation_id=config.identifiers.get 获取所有现有规则:

{"operation_id": "config.identifiers.get"}
步骤 4:检查重复项

将每条新规则与现有标识符进行比较:

  • 完全重复:规则字符串与某条现有规则完全相同——跳过
  • 功能重复:规则不同,但对同一输入产生相同效果(例如,正则表达式模式相同,仅有无关紧要的空格差异)——提醒用户
  • 冲突:现有规则以不同方式修改相同文本——提醒用户并询问应保留哪条规则
步骤 5:保存更新后的标识符

将新的非重复规则合并到现有列表中,然后使用 operation_id=config.identifiers.update 保存完整列表:

{
  "operation_id": "config.identifiers.update",
  "body": {"identifiers": ["existing rule 1", "existing rule 2", "# new comment", "new rule"]}
}

重要:始终在列表中包含所有现有规则。此工具会替换整个列表。

步骤 6:验证(可选)

如果用户想验证规则是否有效,请使用 media.recognize 进行测试:

{"operation_id": "media.recognize", "query": {"title": "the torrent title to test"}}
步骤 7:报告

告知用户:

  • 添加了哪些规则
  • 这些规则会对标题产生什么影响
  • 是否发现了重复项或冲突

常见场景与示例

季/集解析错误

用户:“种子名 [SubGroup] My Show - 13 [1080P],这是第二季第 1 集,但被识别成第 13 集”

解决方案:集数偏移量减去 12:

# My Show 第二季集数偏移(13->1)
\[SubGroup\] <> \[1080P\] >> EP-12
不需要的文本导致识别错误

用户:“种子名 My.Show.2024.REPACK.1080p.mkv,REPACK 导致识别异常”

解决方案:使用上下文替换,限定为此标题模式:

# 仅在 My.Show.2024 命名中移除 REPACK
(My\.Show\.2024\.)REPACK(\.1080p) => \1\2
非标准命名

用户:“文件名 [OldName] EP01.mkv,应该识别为 NewName”

解决方案:将替换规则限定为错误别名:

# 将特定错误别名 OldName 替换为 NewName
\[OldName\] => [NewName]
强制识别 TMDB ID

用户:“种子名 Some.Weird.Name.S01E01.1080p.mkv,识别不到,TMDB ID 是 12345,是电视剧”

解决方案:使用专属样例别名模式直接指定 ID:

# 仅在 Some.Weird.Name 这一命名模式下强制绑定 TMDB ID 12345
Some\.Weird\.Name(?:\.S01E\d+)?(?:\.1080p)? => {[tmdbid=12345;type=tv;s=1]}
强制识别 TMDB 剧集组

用户:“种子名 Some.Weird.Name.S01E01.1080p.mkv,这是按 TMDB 剧集组 5ad0ec240e0a26303f00d84d 排序的电视剧”

解决方案:使用 g=... 直接指定 TMDB ID:

# 仅在 Some.Weird.Name 命名模式下绑定 TMDB ID 12345 并指定剧集组
Some\.Weird\.Name(?:\.S01E\d+)?(?:\.1080p)? => {[tmdbid=12345;type=tv;g=5ad0ec240e0a26303f00d84d;s=1]}
组合修复

用户:“种子名 [Baha][OldTitle][13][1080P],标题应该是 NewTitle,而且 13 应该是第二季第 1 集”

解决方案:组合使用替换与集数偏移:

# OldTitle替换为NewTitle并偏移集数
OldTitle => NewTitle && \[Baha\] <> \[1080P\] >> EP-12
单个标题中包含多个集数

用户:“种子名 [Group] Title - 13-14 [1080P],应该是第 1-2 集”

解决方案:使用集数偏移(可处理分隔符之间的多个数字):

# Title 集数偏移
\[Group\] <> \[1080P\] >> EP-12

WordsMatcher 处理逻辑参考

WordsMatcher.prepare() 方法(位于 app/domain/meta/words.py)会按顺序处理每条规则:

  1. 跳过空行和以 # 开头的行
  2. 检查运算符是否存在,以判断格式:
    • 包含 =>、&&、、 >> 和 <> ` → 组合格式 (4)
    • 包含 => → 替换格式 (2)
    • 包含 >> 和 <> → 分集偏移格式 (3)
    • 否则 → 屏蔽词格式 (1)
  3. 对于组合格式,先执行替换;只有替换成功后才执行分集偏移
  4. 返回修改后的标题和实际应用的规则列表
  5. 优先级:订阅级 custom_words 参数优先于全局 CustomIdentifiers

安全注意事项

  • 更新前,务必先查询现有规则
  • 除非用户明确要求,否则绝不删除现有规则
  • 在新规则前添加注释行,以便维护
  • 请记住,新规则是全局规则。如果规则看起来范围过广,请在保存前为其补充更多针对特定样本的锚点。
  • 不确定正确做法时,请提供多个选项供用户选择

评论

支持 Markdown