WINDER

roll.json

胶卷就是文件夹。roll.json 躺在里面,只承载文件夹无法表达的东西:身份,以及摄影者对这卷胶片的了解。

{
  "version": 1,
  "id": "5f1c2b8e-1a4d-4c77-9e0b-3a6f1d2c8e11",
  "createdAt": "2026-05-04T10:22:31.004",
  "brand": "Kodak",
  "model": "Gold 200",
  "camera": "Pentax 17",
  "lens": "HD Pentax 25mm f/3.5",
  "scanner": "Noritsu HS-1800",
  "scannedAt": "2026-05-02T00:00:00.000",
  "color": "#F2A33C"
}

字段

字段类型说明
versionint恒为 1
idstringUUID v4。缺失时重新生成并写回
createdAtstringISO 8601。缺失时退回文件夹的修改时间
namestring仅在为空时出现。 见下文
brandstring胶片品牌,永远是拉丁字母:Kodak,而不是柯达
modelstring胶片型号——Gold 200Superia X-TRA 400
camerastring机身。每卷一台
lensstring由相机档案填入,或手动输入
scannerstring冲扫店、Plustek,或举着手机对着看片灯
scannedAtstringISO 8601。底片遇上扫描仪的时刻
colorstring#RRGGBB。读取时也接受 RRGGBB#AARRGGBB

version 外全部可选。缺失的字段会从文件夹重建,而不是让整卷加载失败。空字符串视同缺失,不会被写出。

name 字段

起过名的胶卷根本没有 name 字段。文件夹就是答案——这正是在访达里重命名它就等于重命名胶卷的原因。

没起名的胶卷带着 "name": ""。这是文件夹唯一无法表达的东西:它总得有个名字好让文件浏览器显示,于是拿到一个像 Roll 260806 的日期名,而那个空的 name 记下了「没人为它取过名」。Winder 随后会在任何需要一个词的地方顶上胶片的名字,并且不在货架上贴便签。

{ "version": 1, "id": "…", "createdAt": "…", "name": "" }

为什么品牌从不翻译

brand 永远存拉丁名。应用在渲染时才翻译——柯达、富士、乐凯——所以切换界面语言绝不会改写图库,胶片匹配照常工作,文件夹在访达里也依然读得通顺。

只有品牌被翻译。乳剂名是产品名,照印刷原样保留。

胶片与相机的匹配

Winder 用 brand + model 反查胶片目录,用 camera 反查机身目录,忽略大小写、空格与标点,并支持每个条目的别名(中文名与旧产品名)。

于是手动输入的 kodak / gold-200 能白捡到正确的盒子照片;而某款胶片若在后续版本中下架,失去的只是照片,绝不会是名字。匹配结果不会被存储——它每次都从这两个词重新算出来。

器材的继承

胶卷上的相机、镜头与胶片,就是这一卷每一帧对外报告的内容。若某一帧的边车文件写明了自己的器材,则以它为准——那要么是在器材迁移到胶卷之前归档的,要么是有人手动写下的,两种情况都轮不到 Winder 去推翻。

改动其中任意一项,都会重写这一卷上每一帧的 EXIF。

更新于 2026-08-06