supplemental-metadata.json dans Google Takeout, expliqué
Pourquoi Google a renommé les JSON de Takeout en 2024, pourquoi certains noms sont coupés, comment les doublons (1) s'apparient et pourquoi les scripts ratent.
Vous avez lancé un script qui corrigeait très bien les exports Takeout, et cette fois il a sauté la moitié des photos. Ou vous avez regardé dans le dossier et vu IMG_5512.HEIC.supplemental-metadata.json à côté d'une photo et PXL_20240311_183022711.jpg.supplemental-m.json à côté d'une autre, en vous demandant si le second était cassé.
Aucun des deux n'est cassé. Google a changé la façon de nommer les fichiers JSON, et la plupart des guides écrits avant 2024 ne le savent pas.
Le renommage de 2024
Pendant des années, le JSON de IMG_5512.HEIC s'appelait IMG_5512.HEIC.json. Le nom de la photo, puis .json. Simple, et tous les scripts s'y fiaient.
Courant 2024, Google est passé à IMG_5512.HEIC.supplemental-metadata.json. Même contenu, mêmes champs, nom plus long. L'idée semble être que supplemental-metadata décrit ce qu'est le fichier, plutôt que de laisser un simple .json qui pourrait passer pour les données de la photo elle-même. Les exports faits depuis utilisent le nouveau nom. Si vous avez un vieil export quelque part sur un disque, il utilise l'ancien, et un dossier mélangé peut contenir les deux.
Tout ce qui cherche <photo>.json ne trouve désormais rien et passe au suivant. Certains outils signalent « aucun sidecar trouvé » pour chaque fichier. D'autres se rabattent en silence sur la date du fichier, c'est-à-dire la date du téléchargement, et les photos ressortent fausses sans aucune erreur. Cet échec silencieux est à l'origine de beaucoup de messages « la correction n'a pas marché » sur les forums.
La coupe à 46 caractères
Le second changement est plus ancien, mais le renommage l'a rendu bien plus gênant. Google tronque le nom complet du fichier JSON à 46 caractères. Avec l'ancien suffixe court, cela arrivait rarement. Avec .supplemental-metadata.json en plus, tout nom de photo de plus de 19 caractères environ perd une partie de son suffixe.
Une photo de Pixel nommée PXL_20240311_183022711.jpg fait 26 caractères. Ajoutez .supplemental-metadata.json et vous arrivez à 53. Google coupe à 46 : PXL_20240311_183022711.jpg.supplemental-m.json. Un 20240311_183022.jpg de Samsung reçoit 20240311_183022.jpg.supplemental-metada.json. Chaque marque d'appareil produit une troncature légèrement différente, donc il n'y a pas un suffixe unique à chercher.
La règle fiable est la suivante : le nom du JSON est un préfixe de <nom de la photo>.supplemental-metadata.json. Un script doit vérifier cela, pas comparer une chaîne fixe. Les noms d'origine très longs, comme ceux que vous avez tapés vous-même, peuvent être coupés dans le nom de la photo aussi, et c'est pour cela que le champ title à l'intérieur du JSON vaut la peine d'être lu.
Où va le (1)
Google Photos accepte deux fichiers du même nom, et Takeout doit les mettre dans un seul dossier. Il ajoute un compteur au second : IMG_5512.HEIC et IMG_5512(1).HEIC.
On s'attendrait à des JSON nommés IMG_5512.HEIC.supplemental-metadata.json et IMG_5512(1).HEIC.supplemental-metadata.json. Ce n'est pas le cas. Le compteur se déplace à la fin du nom du JSON, juste avant .json : IMG_5512.HEIC.supplemental-metadata(1).json. Avec l'ancien style, c'était IMG_5512.HEIC(1).json.
Un outil doit donc prendre le nom de la photo, retirer le (1), construire le nom du JSON, puis remettre le (1) juste avant .json. Combinez cela avec la troncature et vous obtenez des noms comme PXL_20240311_183022711.jpg.supplemental-(1).json. Les exports réels en contiennent.
Les doublons avec compteur sont plus fréquents qu'on ne le pense. La même photo enregistrée dans deux albums, une photo que vous avez retouchée et dont Google a gardé les deux versions, ou deux téléphones qui ont tous les deux nommé un fichier IMG_0001.JPG en produisent.
Les copies modifiées
Les photos retouchées dans Google Photos ressortent en deux fichiers : IMG_5512.HEIC et IMG_5512-modifié.HEIC (ou -edited selon la langue du compte). Il y a en général un seul JSON, rattaché au nom d'origine. La copie modifiée n'a pas de JSON à elle, donc un outil naïf la laisse sans date. Un outil soigneux retire le suffixe et réutilise le JSON de l'original.
Apparier à la main
Si vous utilisez exiftool, lancez-le deux fois, une fois par suffixe :
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 .
Puis listez ce qui reste sans date avec exiftool -r -if 'not $DateTimeOriginal' -filename .. Ce qui reste, ce sont les noms tronqués et les (1). La solution la plus simple est de renommer ces JSON avec le nom complet attendu à l'aide d'un petit script, puis de relancer exiftool. GooglePhotosTakeoutHelper, un outil communautaire gratuit, intègre cet appariement et reste la recommandation habituelle si vous êtes à l'aise dans un terminal. Ses versions ont parfois du retard sur les changements de Google, donc consultez son suivi de bugs si une exécution saute des fichiers.
L'application
Takeout JSON Metadata Fixer gère tous ces cas sans réglage, sur Windows, Mac et Linux.
Pour chaque photo, elle essaie le nom de 2024, l'ancien nom, le compteur (1) déplacé, puis n'importe quel .json du dossier dont le nom est un préfixe du nom complet attendu. Les copies modifiées empruntent le JSON de l'original. Ensuite elle écrit la date et le GPS dans le fichier. Elle indique combien de photos ont trouvé un JSON et combien se sont rabattues sur l'EXIF ou la date du fichier, pour que vous voyiez si l'appariement a fonctionné avant de supprimer quoi que ce soit. Une simulation montre le plan sans rien écrire. Les 1000 premières photos sont gratuites.
Questions fréquentes
Le contenu de supplemental-metadata.json diffère-t-il de l'ancien .json ?
Non. Les champs sont les mêmes : title, photoTakenTime, creationTime, geoData, geoDataExif et ainsi de suite. Seul le nom de fichier a changé.
Ma photo n'a aucun JSON. Pourquoi ?
Les clips de Live Photos n'en ont souvent pas. Certains envois très anciens n'en ont pas. Et si un JSON est tronqué ou porte un compteur déplacé, votre outil peut le déclarer manquant alors qu'il est là. Regardez vous-même dans le dossier.
Puis-je renommer les JSON dans l'ancien style ?
Oui, et cela fait remarcher les anciens scripts. Un renommage qui retire .supplemental-metadata et remet le (1) sur la partie photo du nom suffit. Faites-le d'abord sur une copie.
Google changera-t-il encore le nom ?
C'est possible. L'approche sûre pour n'importe quel outil est d'apparier par préfixe et par le champ title, pas par un suffixe exact.