Back

不明1281本を潰し、あの動画に3秒でたどり着く環境を作る【後編】

フォルダパス判定の追加、辞書強化、リンクビューの生成で、MMD動画カタログの精度を劇的に改善した記録

この記事は、筆者の指示・監修のもと、Claude(Anthropic)が執筆しています。

前編のおさらい

前編では、Claude Codeの助けを借りてMMD動画管理システムを構築した。profile.yaml(趣味嗜好辞書)、catalog.yaml(動画データベース)、manager.py(管理スクリプト)の3ファイル構成で、2676本の動画をスキャンしてカタログ化するところまでたどり着いた。

だが、初回スキャンの統計は正直微妙だった:

1
2
3
4
5
総動画数:  2676
R-18:      286 (10%)    ← 嘘だろ
全年齢:    2390 (89%)
キャラ不明: 1281本       ← 半分近く
作品不明:   1216本       ← ほぼ同じ

R-18が10%のわけがない。不明が半分近いのも辛い。後編はここから精度を上げていく話だ。

なぜ不明が多いのか

Claudeに不明ファイルのサンプルを50件出してもらった。原因はすぐに分かった。

ファイル名に情報がないケース:

1
2
3
278808f4_sbrWip.mp4
33e3ae71_通常.mp4
1585769559_4ZNNpTpbr1FyA6vDe_Source.mp4

Fantiaなどからダウンロードした動画は、ハッシュ値+適当なラベルがファイル名になっていて、キャラ名も作品名も含まれていない。

フォルダ名には情報があるケース:

1
2
PATH: (MMDフォルダ)/MMDer_haffman [エボシ式]/【MMD艦これ】皐月と文月でmagnet.mp4
PATH: (MMDフォルダ)/★_MMDer_すごくねむい/全裸差分/2024.1/なにか.mp4

フォルダ名を見れば「艦これ」「皐月」「文月」とわかるし、「全裸差分」というフォルダにあるなら当然R-18だ。だが初期のmanager.pyは ファイル名だけ を見て判定していたから、これらの情報を全く活用できていなかった。

改良1:フォルダパスからの判定を追加

Claudeに改良を依頼した。変更点は2つ。

ファイル名で判定できなかったら、フルパスからも検索する

1
2
3
4
5
6
7
8
9
# ファイル名で解析
series, character = _analyze_text(filename, keyword_map)
# 見つからなければフォルダパスからも探す
if not series or not character:
    s2, c2 = _analyze_text(full_path, keyword_map)
    if not series:
        series = s2
    if not character:
        character = c2

R-18判定をフォルダパスにも適用する

profile.yamlに nsfw_path_keywords というセクションを追加した:

1
2
3
4
5
6
7
nsfw_path_keywords:
  - "全裸差分"
  - "ヌード差分"
  - "紳士向け"
  - "R18"
  - "おまけ"
  - "差分"

「全裸差分」フォルダの中にあるファイルは問答無用でR-18判定。「おまけ」「差分」も、この界隈ではほぼ紳士向けコンテンツの意味なのでR-18に含めた。

改良2:辞書の大幅強化

不明ファイルのサンプルを見ると、辞書に登録されていないキャラが多数いた。profile.yamlに追加したものの一部:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
  艦これ:
    characters:
      皐月:
        aliases: ["さつき"]
      文月:
        aliases: ["ふみづき"]
      :
        aliases: ["ひびき"]

  東方:
    aliases: ["Touhou", "東方Project"]
    characters:
      レミリア:
        aliases: ["レミリア・スカーレット"]

  アークナイツ:
    aliases: ["Arknights", "アークナイツMMD"]
    characters:
      グム:
        aliases: ["グムちゃん", "Gummy"]
      トミミ:
        aliases: ["Tomimi"]

NSFWキーワードも追加した:

1
2
3
4
5
6
7
8
nsfw_keywords:
  - "紳士枠"
  - "縞パン"
  - "NTR"
  - "No Skirt"
  - "ローション"
  - "拘束"
  # ...

ここで便利だったのが、Claudeに追加してもらった rescan コマンドだ。これは既存の2676件のメタデータを、更新した辞書で再解析してくれる。ファイルを再スキャンする必要はない:

1
2
PS> python manager.py rescan
   1265 件を更新しました

1265件。 半分近くのエントリが改善された。

改良の成果

rescan後の統計を見た瞬間、思わず声が出た:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
📊 MMD倉庫 統計
========================================
総動画数:  2676
R-18:      1257 (46%)
全年齢:    1419 (53%)

📌 キャラ別 TOP10:
   不明           1029本 ███████
   初音ミク         852本 ██████
   鏡音リン         250本 █
   結月ゆかり        114本
   (VTuber A)      96本
   (艦これキャラ)    81本
   ...

📌 作品別:
   VOCALOID         1254本
   不明               929本
   艦これ              236本
   ホロライブ            197本
   東方                 7本

比較するとこうなる:

改善前改善後
R-18286 (10%)1257 (46%)
キャラ不明12811029 (-252)
作品不明1216929 (-287)
ホロライブ103197 (ほぼ倍)

R-18が10%→46%。 フォルダパスからの判定が劇的に効いた。体感的にはもう少し多い気もするが、ファイル名にもフォルダパスにも手がかりがないものは全年齢に倒れるので、これが現実的な限界だろう。

キャラ不明もまだ1029本残っているが、これらの大半はハッシュ値だけのファイル名や曲名だけのファイル名で、辞書による自動判定は難しい。必要に応じてcatalog.yamlを手動で編集すればいい。

リンクビュー——「3秒でたどり着く」仕組み

さて、カタログが整ったところで本丸の機能を試す。リンクビュー だ。

1
2
PS> python manager.py links
   リンクビュー生成完了

これで何が起きるかというと、元のファイルを一切動かさずに、別のフォルダにキャラ別・R-18別の「ビュー」が自動生成される:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
MMD_ビュー\
├── キャラ別\
│   ├── 初音ミク\         ← 852本がここに
│   ├── 鏡音リン\         ← 250本がここに
│   ├── 結月ゆかり\       ← 114本
│   └── ...
├── R-18\
│   ├── 初音ミク\         ← ミクのR-18だけ
│   ├── 鏡音リン\         ← リンのR-18だけ
│   └── ...
├── 全年齢\
│   ├── 初音ミク\         ← ミクの全年齢だけ
│   └── ...
└── お気に入り\
    ├── ★5\
    └── ★4\

ポイントはこれが hardlink で作られていること。ファイルのコピーではなく、同じ実体への別の入口だ。ディスク容量はほぼ増えない。エクスプローラーでダブルクリックすればそのまま再生できる。

「あのキャラのR-18動画が見たい」MMD_ビュー\R-18\(キャラ名)\ を開くだけ。3秒。

元の作者別フォルダは一切触っていないから、従来の管理方法と完全に共存できる。

コマンドラインからの検索

リンクビューはエクスプローラー向けだが、より細かい検索はコマンドラインで:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# キャラ+R-18で絞り込み
PS> python manager.py search --char リン --r18

  🔍 42 件ヒット

    1. ☆☆☆☆☆ [R-18]
       リンちゃんに見つめられながら.mp4
       鏡音リン / VOCALOID
       📁 パス
    ...

# フリーワード検索
PS> python manager.py search -q "ダーリンダンス"

# 組み合わせ
PS> python manager.py search --char ミク --sfw --fav 4

Claude Codeと組み合わせると、自然言語で「ミクの全年齢でおすすめ出して」のように使えるのが最高に便利だ。

ランチャーを作る

毎回PowerShellでコマンドを打つのは面倒なので、batファイルでGUIっぽいランチャーも作った:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
╔══════════════════════════════════════╗
║      MMD倉庫マネージャー v1.0       ║
╚══════════════════════════════════════╝

 [1] 検索(キャラ・お気に入り等)
 [2] 新規ファイルスキャン
 [3] リンクビュー生成
 [4] 統計表示
 [5] お気に入り変更
 [6] Claude Code で対話的に管理
 [0] 終了

デスクトップにショートカットを置いて、ダブルクリックで起動できるようにした。「6」を選べばClaude Codeが立ち上がり、自然言語で管理できる。

右クリックメニューも追加

レジストリファイル(.reg)を使って、フォルダの右クリックメニューに「Claude Codeで開く」を追加した。どのフォルダからでも即座にClaude Codeを起動できるようになった。MMD管理に限らず、日常のあらゆる場面で重宝している。

AIの倫理はどこまで働くのか

作業中、ふと気になったことがある。Claudeは普段、R-18コンテンツの生成は断る。なのに今回、紳士向け動画の分類を淡々と手伝ってくれたのはなぜか。

聞いてみたところ、答えは明快だった:

  • 断るケース: R-18コンテンツを「生成」「描写」「作成」すること
  • 今回のケース: 既に手元にあるファイルを「整理・分類」する実務的なツール作成

本の中身がどうであれ、「この本は小説棚、この本はマンガ棚に置きましょう」と分類するのは問題ない——という整理だ。ただし「この動画の中身を詳しく説明して」と言えば断られるし、違法コンテンツの管理を頼めば当然拒否される。線引きは明確だった。

残された課題

完璧ではない。いくつか課題が残っている。

キャラ不明が1029本。 ファイル名にもフォルダパスにも手がかりがないものは自動判定できない。暇な時にcatalog.yamlを手動編集して埋めていくしかない。

お気に入り度がゼロ。 scanで追加されたエントリのfavoriteは全部0だ。2676本に★をつけていくのは気の遠くなる作業だが、好きな動画を見返すついでに少しずつ設定していけばいい。

新規動画の追加ワークフロー。 新しい動画をダウンロードしたら scanlinks を実行する必要がある。これは習慣にするしかない。

まとめ:2676本の動画と暮らす

最終的にできあがった環境はこうだ:

ファイル役割
profile.yaml作品・キャラ辞書(50以上のエイリアス)
catalog.yaml2676件の動画データベース
manager.py検索・スキャン・リンク生成・統計
mmd_launcher.batGUIランチャー
MMD_ビュー/キャラ別・R-18別のリンクビュー

日常のコマンド:

1
2
3
4
5
6
7
python manager.py search --char リン --r18   # 検索
python manager.py search -q "ダーリンダンス"   # フリーワード
python manager.py fav "(ファイル名の一部)"    # お気に入り設定
python manager.py scan                        # 新規動画追加時
python manager.py rescan                      # 辞書更新後
python manager.py links                       # ビュー再生成
python manager.py stats                       # 統計

プログラミングの知識はほぼゼロでも、Claudeと対話しながらここまでのシステムを構築できた。途中でYAMLのインデントエラーや変数名の不整合に悩まされたが、それも含めてvibe codingの醍醐味だろう。

コレクションは今日も増え続けている。だが、もう「あの動画どこだっけ」とは言わなくていい。

Built with Hugo
Theme Stack designed by Jimmy