moonlitlynx-food-run について
moonlitlynx-food-run は、指定された digiKam コレクション内のメディアを YAML メタデータで分類し、食べ物関連のファイルにタグを付けるスキルです。適用前に候補タグを報告し、確認後にデータベースを更新します。
主な機能
- 01未タグ・日付なしのメディアを検索
- 02YAML メタデータで分類
- 03食べ物の手掛かりに応じたタグ付け
- 04データベースのバックアップと更新
- 05タグの検証と実行結果の記録
活用シーン
- 01指定コレクション内の料理動画の分類
- 02食べ物と該当するサブカテゴリーのタグ付け
- 03データベース変更前の候補タグ確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ gkwa/ volcanicviper --skill moonlitlynx-food-runインストール後、Claude Code で/moonlitlynx-food-runを入力して読み込まれたか確認します。
同梱ファイルREADME.mdtile.json
詳細
このスキルでできること
grouchygiraffe と shamblingshark のコレクション内で、digikam の保存済み検索「タグなし、または日付なし」に該当するメディアファイルを見つけ、YAML メタデータを読み取り、食品か食品以外かを分類して、適切な digikam タグを適用します。
タグを適用する前に、必ず見つかった内容を報告してください。
データベース
パス:~/Pictures/digikam4.db
実行するたびに、事前にバックアップしてください。
cp ~/Pictures/digikam4.db ~/Pictures/digikam4.db.bak.$(date +%Y%m%d_%H%M%S)
ファイルの検索
digikam の保存済み検索「タグなし、または日付なし」(id=42)は、次の SQL に相当します。
両方の条件を満たす必要があります(OR ではなく AND)。
SELECT i.name, ar.label
FROM Images i
JOIN Albums al ON al.id = i.album
JOIN AlbumRoots ar ON ar.id = al.albumRoot
LEFT JOIN ImageInformation ii ON ii.imageid = i.id
WHERE ar.label IN ('grouchygiraffe', 'shamblingshark')
AND i.id NOT IN (
SELECT imageid FROM ImageTags
WHERE tagid NOT IN (SELECT id FROM Tags WHERE name LIKE 'Color Label%')
)
AND (ii.creationDate IS NULL OR ii.creationDate < '1904-01-01T00:00:00')
ORDER BY ar.label, i.name;
Color Label% の除外は必須です。色ラベルタグだけが付いたファイルも、digikam の UI ではタグなしとして扱われます。
YAML ファイルの読み取り
grouchygiraffe のファイルの場合:/Users/mtm/pdev/taylormonacelli/grouchygiraffe/data/<shortcode>.yaml
拡張子を除いて shortcode を取得します(例:DZY_GI9tCs5.mp4 → DZY_GI9tCs5.yaml)。
/output 内の shamblingshark のファイルは UUID 名で、対応する YAML ファイルはありません。分類はスキップし、noyamldesc を適用してください。
各 YAML から uploader、title、description フィールドを読み取ります。
分類
食品 — food(id=109)と、該当するサブタグを適用します。
| キーワードパターン | サブタグ | digikam id |
|---|---|---|
| sourdough, levain, batard, boule, bulk ferment, crumb | sourdough | 113 |
| salsa, enchilada sauce, tomatillo, salsa verde, salsa roja | salsa | 115 |
| pepper, chile, jalapeño, chipotle, guajillo, cayenne | peppers | 151 |
| curry, masala, tikka, korma, biryani, desi, indian | indian | 114 |
| paneer | paneer | 123 |
| soup, stew, broth, ramen | soup | 153 |
| bean, lentil, chickpea | beans | 133 |
| tomato | tomato | 131 |
| coffee, espresso, barista | coffee | 130 |
| dumpling, potsticker, gyoza | dumpling | 233 |
| vegan, plant-based | vegan | 234 |
| pizza, pasta, focaccia, ciabatta, bread, loaf | pizza(pizza)または food のみ(bread) | 235 |
| mushroom | food のみ(該当するサブタグなし) | — |
| honey | honey | 156 |
小文字に変換した description フィールドと uploader フィールドを照合します。
サブタグが一致しない場合でも、すべての食品コンテンツの基本タグとして food を適用します。
食品の可能性あり/description が空 — YAML の description が空または null で、アップローダーのユーザー名から食品コンテンツであることが強く示される場合(例:eatinghealthytoday、thesourdoughnerd、katrina.the.earthy.vegan、myhealthydish)は、food と noyamldesc を適用します。
手がかりなし — description が空で、アップローダーから食品である手がかりが得られない場合(例:description のない stealth_health_life、一般的なライフスタイルアカウント)は、noyamldesc のみを適用します。
食品以外 — 完全にスキップします。タグは適用しないでください。例:フィットネス/モビリティ、ファッション、政治、医療、ユーモア、ライフスタイル。
特別なタグ:noyamldesc
noyamldesc(id=242、pid=0)は、YAML に有用な説明がなく、分類できないファイルを示します。
ユーザー名から食品コンテンツが示唆される場合は food と併せて適用し、コンテンツの手がかりがまったくない場合は単独で適用します。
必ず ai-tagged と併せて適用してください。
タグ ID クイックリファレンス
| タグ | id | pid |
|---|---|---|
| food | 109 | 0 |
| sourdough | 113 | 109 |
| salsa | 115 | 109 |
| indian | 114 | 109 |
| paneer | 123 | 109 |
| peppers | 151 | 109 |
| soup | 153 | 109 |
| tomato | 131 | 109 |
| beans | 133 | 109 |
| coffee | 130 | 0 |
| honey | 156 | 109 |
| dumpling | 233 | 109 |
| vegan | 234 | 109 |
| pizza | 235 | 109 |
| ai-tagged | 192 | 0 |
| noyamldesc | 242 | 0 |
タグの適用
INSERT OR IGNORE を使用します。ImageTags テーブルでは (imageid, tagid) に UNIQUE 制約があります。
適切なアルバムルートに限定して、ファイル名から画像 ID を検索します。
SELECT i.id FROM Images i
JOIN Albums al ON al.id = i.album
JOIN AlbumRoots ar ON ar.id = al.albumRoot
WHERE ar.label = 'grouchygiraffe' AND i.name = 'DZY_GI9tCs5.mp4';
または、サブクエリを使って単一のトランザクション内で名前ごとにまとめて処理できます。
BEGIN;
INSERT OR IGNORE INTO ImageTags (imageid, tagid)
SELECT i.id, 192 FROM Images i
JOIN Albums al ON al.id = i.album
JOIN AlbumRoots ar ON ar.id = al.albumRoot
WHERE ar.label IN ('grouchygiraffe', 'shamblingshark')
AND i.name IN ('DZY_GI9tCs5.mp4', ...);
COMMIT;
ar.label で挿入範囲を限定すると、他のコレクションにある同じファイル名の項目に誤ってタグを付けるのを防げます。
ワークフロー
- データベースをバックアップします。
- タグも日付もない項目を検索するクエリを実行し、ファイル数を報告します。
- 各ファイルの YAML を読み、food、probably-food、no-signal、non-food に分類します。
- タグを適用する前に、調査結果をユーザーに提示します。ショートコード、コンテンツの概要、提案するタグを示します。
- 確認後、1 つのトランザクションでタグを適用します。
SELECT t.name, COUNT(*) FROM ImageTags it JOIN Tags t ON t.id = it.tagid JOIN Images i ON i.id = it.imageid WHERE i.name IN (...) GROUP BY t.nameを確認し、件数を検証します。- Obsidian vault 内の
moonlitlynx progress.mdを実行概要で更新します。 - 進捗ノートをコミットします。
進捗ノート
進捗は /Users/mtm/Documents/Obsidian Vault/moonlitlynx progress.md で追跡します。
各実行後、## Food/recipe batch tag run の下に、日付を付けたセクションを追加して、次の内容を記録します。
- 検出およびタグ付けしたファイル数
- 新しく作成したタグ(該当する場合)
- 適用したサブタグの内訳
- スキップしたファイルとその理由