Takeout JSON

Exportar Google Fotos a Immich: fechas, JSON y álbumes

Cómo llevar una exportación de Google Takeout a Immich con las fechas correctas: immich-go, por qué fallan las fechas al subir y cómo preparar los archivos.

Montaste Immich, subiste tu carpeta de Takeout y la línea de tiempo muestra todo en un mismo día. O usaste immich-go y unos miles de fotos siguen sin fecha, y el registro dice que faltan cientos de archivos JSON.

Immich es un buen sitio donde aterrizar. El truco está en poner las fechas en una forma que Immich lea.

Cómo decide Immich la fecha de una foto

Immich lee el DateTimeOriginal del EXIF en las imágenes y la fecha de creación del contenedor en los videos. Si no existe ninguna, usa la fecha de modificación del archivo. También lee archivos .xmp. Lo que no lee son los .json de Google cuando subes por la interfaz web, la app móvil o la CLI. Esos archivos simplemente no están soportados e Immich registra un error por cada uno.

Tras descomprimir un Takeout, la fecha de modificación del archivo es el momento en que lo descomprimiste. Así que cualquier foto sin fecha EXIF cae en ese día. Capturas de pantalla, imágenes de chats, escaneos y todo lo que cambiaste de fecha en Google Fotos son las víctimas habituales. Las fotos de cámara con EXIF intacto están bien.

Ruta 1: immich-go

immich-go es una herramienta gratuita de línea de comandos hecha justo para esto. Lee los zips de Takeout directamente, empareja cada foto con su JSON, usa photoTakenTime como fecha, recrea los álbumes a partir de las carpetas de álbum y sube todo a tu servidor. Es la ruta que recomienda la comunidad de Immich, y funciona bien.

Una ejecución básica:

immich-go upload from-google-photos --server http://tu-servidor:2283 --api-key TUCLAVE ~/Descargas/takeout-*.zip

Cosas que conviene saber. Las versiones actuales manejan los nombres supplemental-metadata de 2024 y los nombres recortados; si ves "JSON missing" en muchos archivos, actualiza primero. Sube el archivo tal cual y envía la fecha del JSON por separado, así que la fecha queda en la base de datos de Immich, no escrita en la foto. Si más adelante exportas desde Immich o apuntas otra herramienta a los mismos archivos, el archivo sigue sin fecha. Ejecútalo con --dry-run primero para ver los recuentos.

Un recuento de JSON faltantes de unos cientos en una biblioteca grande es normal. Suelen ser clips de Live Photo, copias editadas y archivos de subidas antiguas que nunca tuvieron JSON. immich-go usa la fecha del archivo para ellos.

Ruta 2: arregla los archivos y sube como quieras

La alternativa es escribir los datos del JSON dentro de los archivos antes de que lleguen a Immich. Así funciona cualquier vía de subida, las fechas viajan con los archivos si algún día dejas Immich, y una biblioteca externa apuntada a la carpeta se indexa correctamente.

Con 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 .

Los videos necesitan las etiquetas QuickTime, y los nombres recortados o con (1) necesitan pasadas extra. La guía de exiftool lo recorre paso a paso.

Takeout JSON Metadata Fixer lo hace como aplicación de escritorio en macOS, Windows y Linux, también en la máquina que aloja Immich.

Apúntala a los zips de Takeout. Escribe la fecha real y el GPS en cada foto y video, ajusta las fechas de archivo para que coincidan y ordena la salida en carpetas por año y mes si quieres. Dos opciones importan para Immich. Deja las Live Photos en "Mantener el clip junto a la foto" para que Immich empareje foto y clip al subir. Y activa "Escribir sidecars .json" si piensas usar immich-go después; escribe un JSON limpio por archivo en el formato de Google, con la fecha y las coordenadas reales, para que immich-go no tenga nada que adivinar.

El resultado es una carpeta normal de fotos con fecha. Súbela con la interfaz web, la CLI o immich-go. O añádela como biblioteca externa y deja que Immich la indexe en su sitio. Las primeras 1000 fotos son gratis.

Álbumes

Takeout representa un álbum como una carpeta con copias de sus fotos más un metadata.json con el nombre del álbum. immich-go los convierte en álbumes de Immich. Si vas por la ruta de arreglar los archivos, o subes también las carpetas de álbum, lo que crea duplicados que Immich luego elimina por hash, o subes las carpetas Photos from AAAA y reconstruyes los álbumes a mano.

Immich elimina las copias exactas byte a byte al subir. Una vez escritas las fechas en los archivos, dos copias de la misma foto siguen siendo idénticas entre sí, así que la deduplicación sigue funcionando.

Comprobar el resultado

Tras la subida, abre la línea de tiempo y ve a un año antiguo. Abre una foto y mira el panel de información; la fecha debe coincidir con la que mostraba Google Fotos. Abre el mapa. Las fotos con GPS real deben aparecer. Las fotos que tenían 0.0, 0.0 en el JSON no deben aparecer en el océano; si lo hacen, tu paso de fusión escribió ceros y tienes que quitarlos con exiftool -gps:all= en los archivos afectados.

Si un lote sigue mal, Immich permite seleccionar fotos y editar la fecha en bloque desde la interfaz web.

Preguntas frecuentes

¿Uso immich-go o arreglo los archivos primero?

Ambas funcionan. immich-go es más rápido y reconstruye los álbumes. Arreglar los archivos primero significa que las fechas viven en las fotos, lo que importa si usas bibliotecas externas o puede que vuelvas a mudarte. Hay quien hace las dos cosas: arregla los archivos y luego sube con immich-go por los álbumes.

¿Por qué Immich muestra una hora desplazada unas horas?

La marca de tiempo del JSON está en UTC. Al escribirla en el EXIF se convierte a la hora local de la zona de tu ordenador, sin registrar la zona. Immich la muestra tal cual. Pon la zona de tu ordenador acorde con las fotos antes de fusionar, o ajústalo en Immich después.

Immich dice "Unsupported file" por cada .json. ¿Es un problema?

No. Te está diciendo que los ignoró. Borra los JSON antes de subir o usa immich-go, que los consume.

¿Tengo que convertir los HEIC?

No. Immich lee HEIC y genera sus propias vistas previas. Conserva los originales.