Use this skill when a user provides a torrent name or file name and wants to fix recognition issues, or asks to add/manage custom identifiers (自定义识别词). This skill generates identifier rules based on the WordsMatcher preprocessing logic, checks for duplicates against existing rules, and saves them via MCP tools. Applicable scenarios include: 1) A torrent or file name is incorrectly recognized (wrong title, season, episode, etc.); 2) The user wants to block unwanted keywords from torrent names; 3) The user needs episode offset rules for series with non-standard numbering; 4) The user wants to force recognition of a specific media by TMDB/Douban ID.
This skill helps generate custom identifier rules for MoviePilot's media recognition system. Custom identifiers preprocess torrent/file names before the recognition engine runs, correcting naming issues that cause misidentification.
You need the following tools:
query_custom_identifiers - Query all existing custom identifier rulesupdate_custom_identifiers - Save the updated identifier list (replaces the full list)recognize_media - Test recognition of a torrent title or file path (optional, for verification)There are four formats. Operators must have spaces on both sides.
Removes matched text from the title. Supports regex.
REPACK
Regex substitution. The left side is a regex pattern, the right side is the replacement (supports backreferences).
被替换词 => 替换词
Special replacement for direct ID specification:
被替换词 => {[tmdbid=xxx;type=movie/tv;s=xxx;e=xxx]}
被替换词 => {[doubanid=xxx;type=movie/tv;s=xxx;e=xxx]}
Where s (season) and e (episode) are optional.
Shifts episode numbers found between the front and back delimiter words. EP is the placeholder for the original episode number.
前定位词 <> 后定位词 >> EP-12
First performs replacement; episode offset only runs if replacement succeeded.
被替换词 => 替换词 && 前定位词 <> 后定位词 >> EP-12
Lines starting with # are comments and will be skipped during processing.
. * + ? ^ $ { } [ ] ( ) | \) must be escaped with \ when matching literally.=>, <>, >>, && must have spaces on both sides.EP represents the original episode number. Common patterns:
EP-12 means subtract 12EP+5 means add 5EP*2 means multiply by 2=> is equivalent to a block word.Parse the torrent/file name provided by the user. Identify:
Write the rule using the appropriate format. Ensure:
#) above the rule to describe what it doesUse the query_custom_identifiers tool to get all current rules:
query_custom_identifiers(explanation="Checking existing identifiers before adding new rules to avoid duplicates")
Compare each new rule against the existing identifiers:
Merge new non-duplicate rules into the existing list, then use update_custom_identifiers to save the complete list:
update_custom_identifiers(
explanation="Adding new identifier rules for [description]",
identifiers=["existing rule 1", "existing rule 2", "# new comment", "new rule"]
)
CRITICAL: Always include ALL existing rules in the list. This tool replaces the entire list.
If the user wants to verify the rule works, use recognize_media to test:
recognize_media(explanation="Testing recognition after adding identifier", title="the torrent title to test")
Tell the user:
User: "种子名 [SubGroup] My Show - 13 [1080P],这是第二季第1集,但被识别成第13集"
Solution: Episode offset to subtract 12:
# My Show 第二季集数偏移(13->1)
\[SubGroup\] <> \[1080P\] >> EP-12
User: "种子名 My.Show.2024.REPACK.1080p.mkv,REPACK导致识别异常"
Solution: Block word:
# 屏蔽REPACK标记
REPACK
User: "文件名 [OldName] EP01.mkv,应该识别为 NewName"
Solution: Replacement:
# OldName替换为NewName
OldName => NewName
User: "种子名 Some.Weird.Name.S01E01.1080p.mkv,识别不到,TMDB ID是12345,是电视剧"
Solution: Direct ID specification:
# 强制识别Some.Weird.Name为TMDB ID 12345
Some\.Weird\.Name => {[tmdbid=12345;type=tv;s=1]}
User: "种子名 [Baha][OldTitle][13][1080P],标题应该是NewTitle,而且13应该是第二季第1集"
Solution: Combined replacement + episode offset:
# OldTitle替换为NewTitle并偏移集数
OldTitle => NewTitle && \[Baha\] <> \[1080P\] >> EP-12
User: "种子名 [Group] Title - 13-14 [1080P],应该是第1-2集"
Solution: Episode offset (handles multiple numbers between delimiters):
# Title 集数偏移
\[Group\] <> \[1080P\] >> EP-12
The WordsMatcher.prepare() method (in app/core/meta/words.py) processes each rule in order:
#=> AND && AND >> AND <> → Combined format (4)=> → Replacement format (2)>> AND <> → Episode offset format (3)custom_words parameter takes precedence over global CustomIdentifiers