Takeout JSON

Google 相册迁移到 Immich:日期、JSON 文件和相册怎么处理

怎样把 Google Takeout 导出的照片以正确的日期导入 Immich。讲 immich-go、为什么直接上传日期会错,以及先修好文件的办法。

你搭好了 Immich,把 Takeout 文件夹传了上去,时间线上所有照片都挤在同一天。或者你用了 immich-go,还是有几千张照片没有日期,日志里说几百个 JSON 文件缺失。

Immich 是个好去处。关键是把日期变成它能读的形式。

Immich 怎么决定一张照片的日期

Immich 从图片读 EXIF 的 DateTimeOriginal,从视频读容器里的创建时间。两者都没有,就用文件的修改时间。它也读 .xmp 附属文件。但通过网页、手机 App 或命令行上传时,它不读 Google 的 .json 附属文件。这些文件就是不支持,Immich 会对每一个记一条错误。

Takeout 解压之后,文件修改时间就是你解压的那一刻。所以任何没有 EXIF 日期的照片都会落到那一天。截图、微信保存的图片、扫描件,还有你在 Google 相册里改过日期的照片,是常见的受害者。EXIF 完好的相机照片没事。

路线一:immich-go

immich-go 是专门为这件事写的免费命令行工具。它直接读 Takeout 的 zip,把每张照片和附属文件配对,用 photoTakenTime 作为日期,按相册文件夹重建相册,然后上传到你的服务器。这是 Immich 社区推荐的路线,效果不错。

基本用法:

immich-go upload from-google-photos --server http://your-server:2283 --api-key YOURKEY ~/Downloads/takeout-*.zip

几点值得知道。较新的版本能处理 2024 年的 supplemental-metadata 命名和截断的文件名;如果看到大量 "JSON missing",先更新。它原样上传文件,把附属文件里的日期单独发给服务器,所以日期存在 Immich 的数据库里,不写进照片。以后你要是从 Immich 导出,或者用别的工具指向同一批文件,文件本身还是没有日期。先用 --dry-run 跑一遍看数量。

大相册里缺几百个 JSON 是正常的。通常是实况照片的视频片段、编辑过的副本和很早上传的、本来就没有附属文件的文件。immich-go 对它们退回用文件时间。

路线二:先修好文件,再用任何方式上传

另一条路是把附属文件的数据先写进文件,再让它们进 Immich。这样每种上传方式都行,以后离开 Immich 日期也跟着文件走,外部库指向这个文件夹也能正确索引。

用 exiftool:

exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" \
  "-DateTimeOriginal<PhotoTakenTimeTimestamp" \
  "-GPSLatitude<GeoDataLatitude" "-GPSLatitudeRef<GeoDataLatitude" \
  "-GPSLongitude<GeoDataLongitude" "-GPSLongitudeRef<GeoDataLongitude" \
  -ext jpg -ext heic -ext png -overwrite_original .

视频要用 QuickTime 标签,截断的和带 (1) 的附属文件名要另外跑几遍。完整步骤见 exiftool 修复指南

Takeout JSON Metadata Fixer 把这件事做成了桌面软件,支持 Windows、Linux 和 Mac,也可以直接装在跑 Immich 的那台机器上。

指向 Takeout 的 zip。它把真正的日期和 GPS 写进每张照片和视频,把文件时间改成一致,需要的话按年/月整理进文件夹。对 Immich 来说有两个选项要注意。实况照片保持「视频片段放在照片旁边」,这样 Immich 上传时能把静态照片和视频配成一对。如果打算之后用 immich-go,打开「写入 .json 附属文件」,它会按 Google 的格式为每个文件生成一个干净的附属文件,带真实日期和坐标,immich-go 就不用猜了。

结果是一个普通的、带日期的照片文件夹。用网页、命令行或 immich-go 上传都行。或者把它加为外部库,让 Immich 就地索引。前 1000 张照片免费。

相册

Takeout 把一个相册表示成一个文件夹,里面是照片的副本,加一个写着相册名的 metadata.json。immich-go 会把它们变成 Immich 里的相册。走先修文件的路线,你要么连相册文件夹一起上传,产生重复,Immich 再按哈希去重;要么只上传 Photos from YYYY 文件夹,手动重建相册。

Immich 上传时会对字节完全相同的副本去重。日期写进文件之后,同一张照片的两个副本彼此仍然相同,去重照样有效。

检查结果

上传完,打开时间线,滚到某个早年份。点开一张照片看信息面板,日期应该和 Google 相册里显示的一致。打开地图,有真实 GPS 的照片应该出现在地图上。附属文件里是 0.0, 0.0 的照片不应该出现在海里;如果出现了,说明合并那一步把零写进去了,需要对受影响的文件跑 exiftool -gps:all= 清掉。

某一批还是错的话,Immich 允许在网页里选中多张照片批量改日期。

常见问题

该用 immich-go 还是先修文件?

都行。immich-go 更快,还能重建相册。先修文件意味着日期存在照片里,用外部库或以后再搬家时有用。有人两样都做:先修文件,再用 immich-go 上传,为了相册。

为什么 Immich 显示的时间差了几个小时?

附属文件的时间戳是 UTC。写进 EXIF 时按你电脑的时区变成本地时间,不记录时区。Immich 就照原样显示。合并前把电脑时区设成和照片一致,或者事后在 Immich 里调整。

Immich 对每个 .json 都报 "Unsupported file",有问题吗?

没有。它只是告诉你忽略了这些文件。上传前删掉附属文件,或者用会读它们的 immich-go。

需要把 HEIC 转成 JPG 吗?

不需要。Immich 能读 HEIC 并自己生成预览图。保留原件。