Takeout JSON

supplemental-metadata.json en Google Takeout, explicado

Por qué Google renombró los JSON de Takeout en 2024, por qué algunos nombres van recortados, cómo se emparejan los duplicados (1) y por qué fallan los scripts.

Ejecutaste un script que antes arreglaba las exportaciones de Takeout sin problema, y esta vez se saltó la mitad de las fotos. O miraste en la carpeta y viste IMG_5512.HEIC.supplemental-metadata.json junto a una foto y PXL_20240311_183022711.jpg.supplemental-m.json junto a otra, y te preguntaste si el segundo está dañado.

Ninguno está dañado. Google cambió la forma de nombrar los JSON, y la mayoría de las guías escritas antes de 2024 no lo saben.

El cambio de nombre de 2024

Durante años, el JSON de IMG_5512.HEIC se llamaba IMG_5512.HEIC.json. Nombre de la foto y luego .json. Sencillo, y todos los scripts buscaban eso.

En algún momento de 2024 Google pasó a IMG_5512.HEIC.supplemental-metadata.json. Mismo contenido, mismos campos, nombre más largo. La idea parece ser que supplemental-metadata describe qué es el archivo, en lugar de dejar un .json a secas que parece contener los datos propios de la foto. Las exportaciones hechas desde entonces usan el nombre nuevo. Si tienes una exportación antigua guardada en algún disco, usa el viejo, y una carpeta mezclada puede contener ambos.

Todo lo que busca <foto>.json ahora no encuentra nada y sigue adelante. Algunas herramientas avisan de "no se encontró JSON" en cada archivo. Otras recurren en silencio a la fecha del archivo, que es la de la descarga, y las fotos salen mal sin ningún error. Ese fallo silencioso es el origen de muchos mensajes de foro del tipo "la corrección no funcionó".

El corte a 46 caracteres

El segundo cambio es más antiguo, pero el nuevo nombre lo hizo más frecuente. Google recorta el nombre completo del JSON a 46 caracteres. Con el sufijo corto de antes rara vez importaba. Con .supplemental-metadata.json añadido, cualquier nombre de foto de más de unos 19 caracteres pierde parte del sufijo.

Una foto de Pixel llamada PXL_20240311_183022711.jpg tiene 26 caracteres. Añade .supplemental-metadata.json y llegas a 53. Google la corta a 46: PXL_20240311_183022711.jpg.supplemental-m.json. Una de Samsung, 20240311_183022.jpg, recibe 20240311_183022.jpg.supplemental-metada.json. Cada marca de cámara produce un recorte ligeramente distinto, así que no hay un único sufijo que buscar.

La regla fiable es: el nombre del JSON es un prefijo de <nombre de la foto>.supplemental-metadata.json. Un script tiene que comprobar eso, no comparar una cadena fija. Los nombres originales largos, como los que escribiste tú mismo, pueden quedar recortados incluso en el nombre de la foto, y por eso conviene leer el campo title dentro del JSON.

Dónde va el (1)

Google Fotos permite dos archivos con el mismo nombre, y Takeout tiene que ponerlos en una misma carpeta. Añade un contador al segundo: IMG_5512.HEIC e IMG_5512(1).HEIC.

Esperarías que los JSON fueran IMG_5512.HEIC.supplemental-metadata.json e IMG_5512(1).HEIC.supplemental-metadata.json. No es así. El contador se mueve al final del nombre del JSON, justo antes de .json: IMG_5512.HEIC.supplemental-metadata(1).json. Con el estilo antiguo era IMG_5512.HEIC(1).json.

Así que una herramienta tiene que tomar el nombre de la foto, quitar el (1), construir el nombre del JSON y volver a poner el (1) justo antes de .json. Combina eso con el recorte y obtienes nombres como PXL_20240311_183022711.jpg.supplemental-(1).json. Las exportaciones reales los contienen.

Los duplicados con contador son más habituales de lo que parece. La misma foto guardada en dos álbumes, una foto que editaste y de la que Google conservó las dos versiones, o dos teléfonos que llamaron IMG_0001.JPG a un archivo los producen.

Las copias editadas

Las fotos editadas dentro de Google Fotos salen como dos archivos: IMG_5512.HEIC e IMG_5512-edited.HEIC. Suele haber un solo JSON, asociado al nombre original. La copia editada no tiene JSON propio, así que una herramienta ingenua la deja sin fecha. Una herramienta cuidadosa quita -edited y reutiliza el JSON del original.

Emparejar a mano

Si usas exiftool, ejecútalo dos veces, una por cada sufijo:

exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" "-DateTimeOriginal<PhotoTakenTimeTimestamp" -ext jpg -ext heic -overwrite_original .
exiftool -r -d %s -tagsfromfile "%d/%F.json" "-DateTimeOriginal<PhotoTakenTimeTimestamp" -ext jpg -ext heic -overwrite_original .

Después lista lo que sigue sin fecha con exiftool -r -if 'not $DateTimeOriginal' -filename .. Lo que queda es el conjunto de recortados y (1). La solución más simple es renombrar esos JSON al nombre completo esperado con un script corto antes de volver a ejecutar exiftool. GooglePhotosTakeoutHelper, una herramienta gratuita de la comunidad, tiene este emparejamiento incorporado y es la recomendación habitual si te sientes cómodo en una terminal. Sus versiones a veces van por detrás de los cambios de Google, así que revisa su lista de incidencias si una ejecución se salta archivos.

La aplicación

Takeout JSON Metadata Fixer resuelve todos estos casos sin configurar nada, en macOS, Windows y Linux.

Para cada foto prueba el nombre de 2024, el nombre antiguo, el contador (1) desplazado y, por último, cualquier .json de la carpeta cuyo nombre sea un prefijo del nombre completo esperado. Las copias editadas toman prestado el JSON del original. Después escribe la fecha y el GPS en el archivo. Informa de cuántas fotos se emparejaron con un JSON y cuántas recurrieron al EXIF o a la fecha del archivo, así puedes ver si el emparejamiento funcionó antes de borrar nada. Una simulación muestra el plan sin escribir. Las primeras 1000 fotos son gratis.

Preguntas frecuentes

¿El contenido de supplemental-metadata.json es distinto del .json antiguo?

No. Los campos son los mismos: title, photoTakenTime, creationTime, geoData, geoDataExif y demás. Solo cambió el nombre del archivo.

Mi foto no tiene ningún JSON. ¿Por qué?

Los clips de Live Photo a menudo no tienen. Algunas subidas muy antiguas tampoco. Y si un JSON está recortado o tiene el contador desplazado, tu herramienta puede estar diciendo que falta cuando en realidad está ahí. Mira en la carpeta tú mismo.

¿Puedo renombrar los JSON al estilo antiguo?

Sí, y así los scripts antiguos vuelven a funcionar. Basta con quitar .supplemental-metadata y devolver el (1) a la parte del nombre de la foto. Hazlo primero sobre una copia.

¿Google volverá a cambiar el nombre?

Es posible. Lo seguro para cualquier herramienta es emparejar por prefijo y por el campo title, no por un sufijo exacto.