关于 generate-identifiers
用于创建自定义识别规则的 MoviePilot 技能,可在媒体识别前调整种子和文件名。它强调为全局规则设置狭窄匹配范围,并在替换完整规则列表前检查现有规则。
主要功能
- 01创建屏蔽、替换和集数偏移规则
- 02支持正则表达式与直接绑定 ID
- 03将规则限制在独特命名模式内
- 04检查重复规则和冲突
- 05更新完整识别词列表
适用场景
- 01在识别前修正标题别名
- 02调整解析出的季数或集数
- 03将特定命名模式绑定到元数据 ID
- 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
注释
以 # 开头的行是注释,处理时会跳过。
编写识别词的重要规则
- 支持正则表达式:所有模式都支持正则表达式。匹配字面字符时,特殊字符(
. * + ? ^ $ { } [ ] ( ) | \)必须使用\转义。 - 空格很重要:运算符
=>、<>、>>、&&两侧都必须有空格。 - 每个字符串一条规则:识别词列表中的每个元素都是一条规则。
- EP 占位符:在集偏移表达式中,
EP表示原始集数。常见模式:EP-12表示减去 12EP+5表示加上 5EP*2表示乘以 2
- 支持中文数字:集偏移支持中文数字(一二三四五六七八九十)。
- 空替换:在
=>后不填写内容,效果等同于屏蔽词。
全局作用范围防护规则
自定义识别词会作用于全局。新规则会影响今后所有种子/文件的识别,而不仅仅是用户提供的示例。
生成新规则时,默认采用能够修正用户示例的最窄正则表达式:
- 先提取示例中的独特锚点:错误的标题别名、年份、季/集标记、制作组标签、来源、分辨率、发布标签、文件扩展名或其他显著片段。
- 匹配侧通常应包含至少两个有意义的锚点,其中一个通常应是标题别名或用户示例中的其他高度独特标识。
- 优先匹配示例中的完整错误别名或稳定的独特片段,不要使用简短的通用子字符串。
- 避免使用
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)会按顺序处理每条规则:
- 跳过空行和以
#开头的行 - 检查运算符是否存在,以判断格式:
- 包含
=>、&&、、>>和<> ` → 组合格式 (4) - 包含
=>→ 替换格式 (2) - 包含
>>和<>→ 分集偏移格式 (3) - 否则 → 屏蔽词格式 (1)
- 包含
- 对于组合格式,先执行替换;只有替换成功后才执行分集偏移
- 返回修改后的标题和实际应用的规则列表
- 优先级:订阅级
custom_words参数优先于全局CustomIdentifiers
安全注意事项
- 更新前,务必先查询现有规则
- 除非用户明确要求,否则绝不删除现有规则
- 在新规则前添加注释行,以便维护
- 请记住,新规则是全局规则。如果规则看起来范围过广,请在保存前为其补充更多针对特定样本的锚点。
- 不确定正确做法时,请提供多个选项供用户选择