Back

MMD動画2676本をAIに整理させる計画が始まった【前編】

作者別フォルダ管理の限界を感じ、Claude Code と YAML で動画カタログシステムを構築した記録

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

はじめに

私はMMD(MikuMikuDance)の動画を集めるのが好きだ。

気づけばコレクションは 2676本。VOCALOIDの初音ミクや鏡音リン、艦これキャラ、推しのVTuber、そしてもちろん紳士向け動画まで、長年にわたってせっせと保存してきた。

保存するのはいい。問題は 「あの動画が見たい」と思った時にすぐ出てこない ことだ。

現状の管理方法と限界

私のMMD倉庫はこんな感じで管理している:

1
2
3
4
5
6
(Gドライブ)\MMD\
├── MMDer_Siva1270\    ← 作者別
├── MMDer_GreenOrange\  ← 作者別
├── MMDer_すごくねむい\   ← 作者別
├── ★_MMDer_ngreeed\   ← 作者別
└── ...

作者別フォルダ管理。使っているキャラやモデルが違っても、同じ作者のものは同じフォルダに入れる。統一感も出るし、保存時にフォルダを迷わない。Fantia、Patreon、Iwara、ニコニコ……ダウンロード元もバラバラだが、とりあえず作者で分ければ管理は破綻しない。

しかし致命的な弱点がある。

「あのキャラのえっちなやつ、どこだっけ?」

こうなった時に、何十もの作者フォルダを片っ端から開けないといけない。3つのルートフォルダにまたがって散らばっているからなおさらだ。

Claude Code × YAML という発想

そこで考えた。Claude Codeに自分の趣味嗜好を学習させて、動画を自動分類できないか?

Claude Codeは、Anthropicが提供するCLIベースのAIコーディングツールだ。ターミナルからClaudeと対話しながらコードを書ける。最近は「vibe coding」——AIに意図を伝えて、細かい実装はおまかせするスタイル——でいろいろ試している。プログラミング初心者の自分には相性がいい。

Claudeに相談すると、こんなアプローチを提案してきた:

  1. YAML で「趣味嗜好辞書」を定義する(作品名、キャラ名、エイリアス、R-18キーワード)
  2. Pythonスクリプトでファイル名を解析し、辞書とマッチングして自動分類
  3. カタログ(データベース)もYAML で管理し、検索・統計・ビュー生成に使う

「学習」といっても機械学習のような大げさなものではない。ルールベース+Claudeの推論力 で分類を支援する、というのが正確なところだ。

まずはファイルリストを食わせる

最初の一歩は、手持ちの動画のファイル名をClaudeに渡すこと。PowerShellでファイルリストを取得する:

1
2
3
Get-ChildItem "(対象フォルダ)" -Recurse -File |
    Select-Object -ExpandProperty Name |
    Out-File -Encoding utf8 "filelist.txt"

ところがこのテキストファイル、アップロードできないほどデカい。250行ずつに分割してClaudeに渡した。

Claudeはファイル名を読み込むと、即座に分析を始めた:

全153ファイルから以下の傾向を検出しました:

  • VOCALOID:初音ミク ~30本、鏡音リン ~20本、GUMI ~4本
  • 艦これ:複数キャラ
  • ホロライブ:複数キャラ
  • R-18が全体の約7割

ファイル名だけでここまで読み取れるのかと驚いた。

3つのファイルが誕生する

Claudeが設計してくれたシステムは3ファイル構成:

1
2
3
4
mmd-manager/
├── profile.yaml    ← 趣味嗜好辞書(作品・キャラ・NSFWキーワード)
├── catalog.yaml    ← 全動画のメタデータ(唯一のデータベース)
└── manager.py      ← 管理スクリプト(検索・スキャン・リンク生成)

profile.yaml ——「好み」を定義するファイル

これが面白い。自分のコレクションの「好み」をYAMLで構造化する:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
series:
  VOCALOID:
    aliases: ["ボカロ", "VOCALOID"]
    rating: mixed
    characters:
      初音ミク:
        aliases: ["ミク", "Miku", "MIKU", "あぴミク", "REM式ミク",
                  "YYB式初音ミク", "Sour Miku", "つみ式ミク"]
      鏡音リン:
        aliases: ["リン", "Rin", "リンちゃん", "Kagamine Rin",
                  "Sour Rin", "YYB Rin"]

  艦これ:
    aliases: ["KanColle", "艦隊これくしょん", "MMD艦これ"]
    characters:
      # キャラごとにエイリアスを定義...

同じキャラでも「あぴミク」「REM式ミク」「Sour Miku」とモデル名が違うのがMMDの世界。それを全部aliasesとして登録することで、ファイル名のどんな表記にもマッチさせられる。

紳士向け判定のキーワードリストも強力だ:

1
2
3
4
5
6
7
nsfw_keywords:
  - "紳士"
  - "R-18"
  - "えっち"
  - "nude"
  - "topless"
  # ...50個以上のキーワード

これを見て「なんで俺はAIにエロい語彙を教えてるんだ」と思わなくもなかったが、Claudeは淡々と受け止めてくれた。後で聞いたら「既にあるファイルの整理ツール作成は、コンテンツの生成とは違う」とのこと。本棚の整理を手伝うようなもの、と言われて納得した。

catalog.yaml ——「真実の源泉」

全動画のメタデータを一元管理するファイル。scanコマンドで自動生成される:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
config:
  source_roots:
    - "(ルートフォルダ1)"
    - "(ルートフォルダ2)"
    - "(ルートフォルダ3)"
    # ...全16ルート
  view_root: "(ビュー出力先)"
  link_type: "hardlink"

videos: []   # ← ここにscanで全動画のデータが入る

source_roots を複数指定できるのがポイント。MMD動画があちこちに散らばっていても対応できる。

初回スキャン——2676件、一発成功

1
2
PS> cd "(mmd-managerフォルダ)"
PS> python manager.py scan

……と言いたいところだが、ここに至るまでに結構つまずいた。

YAMLのインデントエラー。 Claudeが出力したコードをコピペすると、インデントが崩れてパースエラーになる。結局PowerShellのヒアストリングで直接ファイル生成するか、メモ帳で手作業保存するのが確実だった。

source_rootsource_roots の更新漏れ。 最初は単一フォルダ前提のコードだったのを複数対応に変えたが、manager.pyの一部が古いコードのままで KeyError: 'source_root' と怒られた。こういうのはAIとの共同作業あるあるだ。

修正を重ねて、ついにスキャンが通った:

1
2
3
4
5
6
7
  📂 スキャン中: (ルートフォルダ1)
  📂 スキャン中: (ルートフォルダ2)
  ...
  + [全年齢] 初音ミク/【MMD】7【YYB式初音ミク改変】.mp4
  + [R-18] 鏡音リン/リンちゃんに見つめられながら.mp4
  ...
  ✅ 2676 件をcatalog.yamlに追加しました。

2676件。 全部がcatalog.yamlに格納された。初回の統計:

1
2
3
4
5
6
📊 MMD倉庫 統計
========================================
総動画数:  2676
R-18:      286 (10%)
全年齢:    2390 (89%)
キャラ別 TOP:  不明 1281本 / 初音ミク 757本 / 鏡音リン 245本

R-18が10%?絶対そんなわけがない。不明が1281本あるのも気になる。

だがシステムは動いた。ここから精度を上げていくのが後編の話だ。


後編では、フォルダパスからの判定強化、リンクビューの生成、そして「あの動画」にすぐアクセスできる環境が完成するまでを書きます。

Built with Hugo
Theme Stack designed by Jimmy