Fusionner les JSON Google Takeout dans les photos (EXIF)
Écrire la date et le GPS des fichiers .json de Google Takeout dans les photos, étape par étape : avec exiftool ou avec une application de bureau.
Vous avez un dossier de photos et, à côté de chacune, un fichier .json qui contient sa vraie date et son lieu. Les photos elles-mêmes affichent une mauvaise date. Vous voulez que les informations du .json soient écrites dans la photo, pour pouvoir jeter ces fichiers et garder un dossier d'images normal.
C'est un problème résolu. Voici comment le faire à la main, et comment le faire en un clic.
Ce que « fusionner » veut dire
Un JPEG, un HEIC ou un PNG contient un bloc de métadonnées appelé EXIF. Les appareils photo y écrivent la date de prise de vue, dans une balise nommée DateTimeOriginal, et les coordonnées GPS dans les balises GPSLatitude et GPSLongitude. Les applications photo de tous les systèmes lisent ces balises.
Le fichier .json de Takeout contient les mêmes informations dans un autre contenant. Fusionner, c'est lire photoTakenTime et geoData dans le JSON et les écrire dans les balises EXIF. Au passage, on règle aussi les dates de création et de modification du fichier, pour que le Finder et l'Explorateur trient correctement même dans les vues qui ignorent l'EXIF.
Les vidéos n'ont pas d'EXIF. Leur date se trouve dans le conteneur MP4 ou MOV, dans des balises comme CreateDate. Même idée, autres noms de balises.
Étape 1 : tout décompresser au même endroit
Takeout découpe les gros exports en plusieurs zip. Décompressez-les tous dans le même dossier parent pour que les dossiers d'album fusionnent. Si un album s'étale sur deux zip, la moitié de ses photos et la moitié de ses JSON peuvent se trouver dans chacun ; ils doivent finir côte à côte. Voir Google Takeout en plusieurs fichiers zip si vous en avez beaucoup.
Étape 2 : comprendre comment une photo trouve son JSON
Le nom du JSON est le nom de la photo plus un suffixe. IMG_0042.JPG va avec IMG_0042.JPG.supplemental-metadata.json dans les exports depuis 2024, ou avec IMG_0042.JPG.json dans les plus anciens. Deux choses cassent cette règle simple. Les noms de plus de 46 caractères sont coupés, donc le suffixe est tronqué. Les photos en double reçoivent leur compteur à un autre endroit : IMG_0042(1).JPG va avec IMG_0042.JPG.supplemental-metadata(1).json. Tout outil que vous utilisez doit gérer les deux cas, sinon il saute ces fichiers sans rien dire.
Étape 3 : fusionner avec exiftool
exiftool est gratuit et fonctionne sur tous les systèmes. Installez-le, ouvrez un terminal dans le dossier Google Photos et lancez :
exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" \
"-DateTimeOriginal<PhotoTakenTimeTimestamp" \
"-CreateDate<PhotoTakenTimeTimestamp" \
"-FileCreateDate<PhotoTakenTimeTimestamp" \
"-FileModifyDate<PhotoTakenTimeTimestamp" \
"-GPSLatitude<GeoDataLatitude" "-GPSLatitudeRef<GeoDataLatitude" \
"-GPSLongitude<GeoDataLongitude" "-GPSLongitudeRef<GeoDataLongitude" \
-ext jpg -ext jpeg -ext heic -ext png -overwrite_original .
Ce que fait la commande : pour chaque image, elle cherche dans le même dossier un fichier au même nom suivi de .supplemental-metadata.json, et elle recopie les champs listés. -d %s indique à exiftool que l'horodatage est en secondes depuis 1970. -overwrite_original l'empêche de laisser une copie de sauvegarde de chaque fichier.
Relancez-la une deuxième fois avec "%d/%F.json" pour les JSON à l'ancienne. Puis une fois de plus pour les vidéos :
exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" \
"-CreateDate<PhotoTakenTimeTimestamp" "-ModifyDate<PhotoTakenTimeTimestamp" \
"-TrackCreateDate<PhotoTakenTimeTimestamp" "-MediaCreateDate<PhotoTakenTimeTimestamp" \
"-FileModifyDate<PhotoTakenTimeTimestamp" \
-ext mp4 -ext mov -overwrite_original .
Étape 4 : rattraper ce qu'exiftool a manqué
Comptez les photos restantes :
exiftool -r -if 'not $DateTimeOriginal' -ext jpg -ext heic -ext png -filename .
La liste contient les noms tronqués, les doublons (1) et les photos qui n'ont jamais eu de JSON. Les noms tronqués se rattrapent avec un petit script qui cherche le .json dont le nom est le début du nom attendu. Les doublons doivent être renommés avant que le modèle fonctionne. C'est cette partie qui transforme un travail de dix minutes en une soirée, et c'est pour cela que des scripts communautaires comme GooglePhotosTakeoutHelper existent. Ils sont gratuits et font l'association pour vous, dans un terminal.
Un dernier piège : les lignes GPS ci-dessus écrivent sans broncher 0.0, 0.0 dans les photos dont le JSON dit « lieu inconnu ». Ajoutez -if '$GeoDataLatitude ne 0', ou acceptez un groupe de photos au milieu de l'Atlantique.
Étape 5 : l'application à la place
Takeout JSON Metadata Fixer fait les étapes 1 à 4 en une seule fois, sur Mac, Windows et Linux.
Sélectionnez les zip Takeout ou le dossier décompressé. L'application associe chaque photo et chaque vidéo à son JSON en essayant tous les styles de nom que Google a utilisés, y compris la coupure à 46 caractères et le compteur (1). Elle écrit la date dans l'EXIF pour les images et dans le conteneur pour les vidéos, règle les dates de fichier, et n'écrit le GPS que si les coordonnées sont réelles. Les photos sans JSON gardent leur propre date EXIF, ou la date du fichier s'il n'y en a pas.
Vous pouvez vous arrêter là, en gardant les noms et les dossiers, et récupérer le même dossier avec des métadonnées correctes. Ou vous pouvez faire renommer les fichiers par date et les classer par année et par mois en même temps. Un essai à blanc montre le plan avant que quoi que ce soit ne soit écrit. La version gratuite couvre 1000 photos ; l'illimité coûte 19,99 $ une seule fois, ou 49,99 $ pour cinq ordinateurs. Rien n'est envoyé nulle part.
Étape 6 : vérifier, puis supprimer les JSON
Ouvrez quelques photos de différentes années dans votre application photo et vérifiez les dates. Supprimez ensuite les fichiers .json. Sur Mac ou Linux : find . -name "*.json" -delete depuis l'intérieur du dossier. Sous Windows, cherchez *.json dans le dossier, sélectionnez tout, supprimez. Gardez les zip d'origine quelque part pendant un mois au cas où vous remarqueriez un problème. Supprimer les JSON de Google Takeout détaille la vérification à faire avant.
Questions fréquentes
La fusion change-t-elle la qualité de l'image ?
Non. Seul le bloc de métadonnées est réécrit. Les données compressées de l'image sont copiées octet pour octet.
Et si une photo a déjà une date EXIF différente de celle du JSON ?
Le JSON reflète ce que Google Photos vous affichait, y compris une correction que vous auriez faite. Dans la plupart des cas, c'est celle que vous voulez. Si vous n'avez jamais modifié de date dans Google Photos, les deux sont de toute façon identiques.
Pourquoi l'heure est-elle décalée de quelques heures ?
L'horodatage du JSON est en UTC. L'EXIF n'a pas de fuseau horaire, donc les outils convertissent vers le fuseau local de votre ordinateur. Réglez votre ordinateur sur le fuseau où les photos ont été prises, ou acceptez le décalage.
Peut-on fusionner seulement la date, sans le GPS ?
Oui. Retirez les lignes GPS de la commande exiftool. Dans l'application, le GPS est écrit quand il existe ; si vous ne voulez pas le lieu dans les noms de fichiers, choisissez un modèle de nom qui ne le contient pas.