关于 moonlitlynx-food-run
moonlitlynx-food-run 是一项技能,用于根据 YAML 元数据分类指定 digiKam 相册中的媒体,并为食物相关文件添加标签。它会先报告拟添加的标签,待确认后再更新数据库。
主要功能
- 01查找未标记或未注明日期的媒体
- 02读取 YAML 元数据进行分类
- 03按食物线索匹配 digiKam 标签
- 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
详细介绍
此 Skill 的功能
在 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。
两个条件都必须满足(AND,而非 OR):
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——food 是所有食物内容的基础标签。
可能是食物 / 描述为空——如果 YAML 的 description 为空或为 null,但上传者用户名明显表示食物内容(例如 eatinghealthytoday、thesourdoughnerd、katrina.the.earthy.vegan、myhealthydish),则应用 food + noyamldesc。
无信号——如果 description 为空,且 uploader 没有提供食物信号(例如没有 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。
- 在应用任何标签前,先向用户展示结果。显示:shortcode、内容摘要、建议的标签。
- 确认后,在单个事务中应用标签。
- 通过检查
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 库中的
moonlitlynx progress.md。 - 提交进度记录。
进度记录
进度记录在 /Users/mtm/Documents/Obsidian Vault/moonlitlynx progress.md 中。
每次运行后,在 ## Food/recipe batch tag run 下添加带日期的部分,记录:
- 找到并标记的文件数量
- 新建的标签(如有)
- 应用的子标签明细
- 跳过的文件及原因