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 のメディア認識システム向けにカスタム識別子ルールを生成します。カスタム識別子は、認識エンジンの実行前に torrent/ファイル名を前処理し、誤認識の原因となる命名上の問題を修正します。
前提条件
次の moviepilot_api 操作を使用します。
config.identifiers.get- 既存のカスタム識別子ルールをすべて照会しますconfig.identifiers.update- 更新した識別子リストを保存します(リスト全体を置き換えます)media.recognize- torrent タイトルまたはファイルパスの認識をテストします(任意)
対応するルール形式
4 種類の形式があります。演算子の両側にはスペースが必要です。
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 つの文字列につき 1 つのルール:識別子リストの各要素が 1 つのルールです。
- EP プレースホルダー:エピソードオフセット式では、
EPは元のエピソード番号を表します。一般的なパターンは次のとおりです。EP-12は 12 を引くことを意味しますEP+5は 5 を足すことを意味しますEP*2は 2 を掛けることを意味します
- 中国語の数字への対応:エピソードオフセットでは、中国語の数字(一二三四五六七八九十)を処理できます。
- 空の置換:
=>の後に何も指定しない場合、ブロックワードと同じ扱いになります。
グローバル適用範囲のガードレール
カスタム識別子はグローバルです。新しいルールは、ユーザーが提示したサンプルだけでなく、今後のすべての torrent/ファイル認識に影響します。
新しいルールを生成するときは、ユーザーのサンプルを修正できる範囲で最も限定的な正規表現をデフォルトとして使用してください。
- まず、サンプル固有の手がかりを抽出します。誤ったタイトルの別名、年、シーズン/エピソードのマーカー、グループタグ、ソース、解像度、リリースタグ、ファイル拡張子、その他の特徴的な断片などです。
- 一致対象には通常、意味のある手がかりを少なくとも 2 つ含めます。そのうち 1 つは通常、タイトルの別名、またはユーザーが提示したサンプルに含まれる別の非常に固有な識別子にします。
- 短く一般的な部分文字列ではなく、サンプルに含まれる誤った別名全体または安定した固有の断片に一致させる方法を優先します。
- ユーザーが明示的に全体に適用するクリーンアップルールを求めている場合を除き、
1080p、WEB-DL、中字、国配、REPACK、S01E01、数字のみといった汎用的なグローバルルールは避けてください。 - 1 つの特定の命名パターンだけを修正する場合は、単独のブロックワードではなく、キャプチャグループ/後方参照を使った文脈依存の置換を優先してください。
- エピソードオフセットルールでは、オフセットが意図した命名パターンにだけ適用されるよう、
前定位词と后定位词にサンプル固有のコンテキストを使用してください。 - メディアを直接紐付ける場合は、他のメディアにも一致する可能性がある広範なシーズン/エピソードのパターンではなく、ユーザーの固有の誤った別名または命名パターンに左辺を一致させてください。
狭い例と広い例
悪い例(グローバルルールとして広すぎます):
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:既存の識別子を取得する
operation_id=config.identifiers.get を使って moviepilot_api を呼び出し、現在のルールをすべて取得します。
{"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] です。これは第 2 シーズン第 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 は第 2 シーズン第 1 話であるべきです」
解決策:置換とエピソード番号の補正を組み合わせます。
# OldTitle替换为NewTitle并偏移集数
OldTitle => NewTitle && \[Baha\] <> \[1080P\] >> EP-12
1 つのタイトルに複数のエピソード番号がある場合
ユーザー:「トレント名は [Group] Title - 13-14 [1080P] です。第 1~2 話であるべきです」
解決策:エピソード番号を補正します(区切り文字の間にある複数の番号に対応します)。
# Title 集数偏移
\[Group\] <> \[1080P\] >> EP-12
WordsMatcher の処理ロジックに関するリファレンス
app/domain/meta/words.py にある WordsMatcher.prepare() メソッドは、各ルールを順番に処理します。
- 空行と
#で始まる行をスキップします - 演算子の有無を確認して形式を判定します:
=>、&&、>>、<>をすべて含む場合 → 複合形式(4)=>を含む場合 → 置換形式(2)>>と<>を含む場合 → エピソードオフセット形式(3)- それ以外の場合 → ブロックワード形式(1)
- 複合形式では置換を先に実行し、置換に成功した場合にのみエピソードオフセットを実行します
- 変更後のタイトルと、実際に適用されたルールのリストを返します
- 優先順位:サブスクライブごとの
custom_wordsパラメーターは、グローバルなCustomIdentifiersより優先されます
安全に関する注意事項
- 更新する前に、必ず既存のルールを確認してください
- ユーザーから明示的な依頼がない限り、既存のルールを削除しないでください
- 保守性を高めるため、新しいルールの前にコメント行を追加してください
- 新しいルールはグローバルに適用されます。範囲が広すぎるように見える場合は、保存前にサンプル固有の目印をさらに含めるよう書き換えてください
- 適切な方法が不明な場合は、複数の選択肢を提示し、ユーザーに選んでもらってください