WINDER

图库格式

一座 Winder 图库就是一个不打开应用也能读懂的普通文件夹。没有数据库,没有私有封包,也不需要「导出」按钮——因为从来没有什么被关进去过。

这一章是参考手册。Winder 写下的每一个文件都记录在此,所以你可以用脚本读一座图库、手动修一座图库,或者写一个说同样格式的工具。

目录树

Winder Library/
  library.json                ← 格式标记
  settings.json               ← 扫描尺寸、输出质量、上次器材
  albums.json                 ← 相册标签
  WDR-260504-0009-F.jpg       ← 不属于任何胶卷、散落在根目录的一帧
  WDR-260504-0009-F.json      ← 它的边车文件
  Rome, May '26/              ← 一卷;文件夹名即胶卷名
    roll.json                 ← id、创建日期、胶片、相机、扫描信息
    WDR-260504-0001-A.jpg     ← 扫描件 0001 的左半
    WDR-260504-0001-A.json    ← 这一帧的边车文件
    WDR-260504-0001-B.jpg     ← 右半
    WDR-260504-0001-B.json
  Roll 260806/                ← 没人起名的一卷:以日期命名的文件夹
    roll.json                 ← …里面写着 { "name": "" }
  .trash/                     ← 所有删除都落在这里

根目录下住着四样东西,其余的要么是胶卷文件夹,要么是散落的照片。

文件是什么
library.json格式标记。有它,这个文件夹才是一座图库
settings.json扫描尺寸、输出质量、记住的器材
albums.json相册定义——id、名称、创建日期
roll.json每个胶卷文件夹一份:身份、胶片、相机、扫描信息
<帧>.json每张照片一份,就在它旁边

照片文件名

WDR-260504-0001-A.jpg
    │      │    └── 哪一半:A = 左,B = 右,F = 整格
    │      └─────── 当天的序号,补零到四位
    └────────────── 归档日期,yyMMdd

在任何文件浏览器里都按时间排序——这正是「文件优先」的意义。边车文件同名,扩展名换成 .json

识别的图片扩展名:.jpg.jpeg.png.webp.bmp.tif.tiff。Winder 写出 JPEG,但会读取并归档其余格式。

library.json

{
  "version": 2,
  "app": "winder",
  "createdAt": "2026-05-04T10:22:31.004"
}

含有这个文件的文件夹就是一座 Winder 图库;把应用指向它会原样接管,而不会在里面再套一层。

格式版本

版本形态
1每个相册一个文件夹,里面的 album.json 携带封面
2文件夹是胶卷roll.json);相册是 albums.json 里的标签

版本 1 的图库会在第一次扫描时迁移:每个含有 album.json 的文件夹被当作胶卷读入并改写为 roll.json,id 与创建日期一并带过,cover 被丢弃。随后那个已被取代的 album.json 会被删除——留着它,只会让此后每一次扫描都去读一个不再描述任何东西的文件——最后 library.json 升到版本 2。

Winder 为自己立下的规矩

以下是另一个读写这个文件夹的工具可以依赖的保证。

写入是原子的。 每个 JSON 都先写成 <名字>.tmp 再改名就位,同步客户端永远看不到半个文件。照片的 EXIF 重写走同一套动作。

没有硬删除。 删除一帧或一卷,只是把它改名移进 .trash/,胶卷还会附上时间戳。什么时候清空由用户决定。删除相册是那个证明规则存在的例外:相册不拥有任何文件,所以它删掉的永远只是一个词。

文件夹才是真相,每次回到前台都重读。 应用每次回前台都会重新扫描目录树,因为另一台设备可能已经改过它。跨启动不缓存任何东西。

一个坏文件绝不该赔上一张照片。 损坏的边车文件、解析不了的 albums.json、被手改坏的 settings.json——每一个都退回默认值,照片照常加载。缺失的 id 会被重新生成并写回。

未知字段会活下来。 Winder 读它认识的字段,其余用默认值。边车文件里指向本图库并不存在的相册 id 会被原样保留:它们匹配不到任何东西,所以毫无代价;而一次把定义同步回来的操作,也会把成员关系一并带回来。

路径从不落盘。 一帧照片在磁盘上的位置、它属于哪一卷,都是从文件实际所在之处读出来的。把 .jpg 和它的 .json 一起移进另一卷的文件夹,这一帧就换了胶卷。

图库里没有什么

任何关于应用而非照片的东西都留在设备上:主题、语言、应用图标、这块屏幕上图库流的列数,以及那个记着图库在哪的书签。同读一座图库的手机和 Mac,各自保留自己的那一份。

更新于 2026-08-06