Google Takeout-datum herstellen met exiftool: opdracht en valkuilen
De exiftool-opdracht die datum en GPS uit de .json-bestanden van Takeout in je foto's zet, en de drie gevallen die hij stilletjes overslaat.
exiftool is gratis, werkt overal en kan een export uit Google Takeout herstellen. De meeste handleidingen geven je één opdracht en stoppen dan. Die opdracht werkt bij ongeveer vier van de vijf foto's. Hier lees je wat er met de vijfde gebeurt.
Installeren
Op een Mac: brew install exiftool. Op Debian of Ubuntu: sudo apt install libimage-exiftool-perl. Op Fedora: sudo dnf install perl-Image-ExifTool. Op Windows download je de zip van exiftool.org, pak je hem uit en hernoem je exiftool(-k).exe naar exiftool.exe. Open daarna een terminal in de map waarin je uitgepakte map Takeout staat.
Werk de eerste keer op een kopie. exiftool schrijft in je bestanden.
De opdracht
Naast elke foto staat een sidecarbestand: IMG_2034.JPG.supplemental-metadata.json in exports vanaf 2024, IMG_2034.JPG.json in oudere. De waarde photoTakenTime.timestamp in het sidecarbestand is de echte datum, in seconden sinds 1970. Dit kopieert hem naar de foto:
exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" \
"-DateTimeOriginal<PhotoTakenTimeTimestamp" \
"-CreateDate<PhotoTakenTimeTimestamp" \
"-FileModifyDate<PhotoTakenTimeTimestamp" \
-ext jpg -ext jpeg -ext png -ext heic -ext gif \
-overwrite_original -progress "Takeout/Google Photos"
Stukje voor stukje: -r loopt door de submappen. -d %s vertelt exiftool dat de datum die hij leest een epoch-getal is. -tagsfromfile geeft de naam van het sidecarbestand met %d (de map van de foto) en %F (de bestandsnaam met extensie). De drie regels met < kopiëren de timestamp naar de EXIF-datum, de EXIF-aanmaakdatum en de wijzigingsdatum van het bestand. -overwrite_original zorgt dat exiftool niet van elk bestand een kopie _original achterlaat.
Bij een oudere export voer je hem nog een keer uit met "%d/%F.json". Bestanden die de eerste keer al een datum kregen, worden gewoon opnieuw met dezelfde waarde geschreven.
Wil je de GPS er in dezelfde ronde bij, voeg dan vier regels toe:
"-GPSLatitude<GeoDataLatitude" "-GPSLatitudeRef<GeoDataLatitude" \
"-GPSLongitude<GeoDataLongitude" "-GPSLongitudeRef<GeoDataLongitude" \
Google schrijft 0.0 bij foto's zonder plaats, dus zet dat in -if '$GeoDataLatitude ne 0', anders belanden een paar honderd foto's in de Atlantische Oceaan. Meer hierover in GPS terugzetten uit Takeout (Engels).
Als hij klaar is, meldt exiftool hoeveel bestanden hij heeft bijgewerkt en hoeveel hij heeft overgeslagen. Aan die overgeslagen bestanden gaat je avond op.
Waar het misgaat
Afgekapte namen van sidecarbestanden. Google kapt lange namen van sidecarbestanden af op ongeveer 46 tekens. PXL_20230812_193044123.RAW-01.COVER.jpg krijgt een sidecarbestand met de naam PXL_20230812_193044123.RAW-01.COVER.supplemen.json of korter. Het patroon %F past dan nooit. Lange cameranamen, WhatsApp-namen en alles met een beschrijving in de bestandsnaam lopen hiertegenaan. Je moet de restjes opsommen en ze met de hand of met een script koppelen.
Duplicaten met (1). Heb je dezelfde naam twee keer geüpload, dan heet de foto IMG_1234(1).jpg maar het sidecarbestand IMG_1234.jpg(1).json. Het haakje is verschoven. Een hernoemronde over de sidecarbestanden lost dat op, voordat je de hoofdopdracht uitvoert:
for j in "Takeout/Google Photos"/*/*"("*").json"; do
mv "$j" "$(echo "$j" | sed -E 's/\.([a-zA-Z0-9]+)\(([0-9]+)\)(\.supplemental-metadata)?\.json$/(\2).\1\3.json/')"
done
Bewerkte kopieën. IMG_1234-edited.jpg heeft geen eigen sidecarbestand. Hij deelt dat van het origineel. Zijn de originelen klaar, kopieer dan vanuit die:
for f in "Takeout/Google Photos"/*/*-edited.*; do
exiftool -tagsfromfile "${f/-edited/}" -AllDates -GPS:all -overwrite_original "$f"
done
Video's. MP4- en MOV-bestanden gebruiken geen EXIF. Ze bewaren hun datums in de QuickTime-container, in andere tags, en die tags worden als UTC gelezen:
exiftool -r -d %s -api QuickTimeUTC -tagsfromfile "%d/%F.supplemental-metadata.json" \
"-CreateDate<PhotoTakenTimeTimestamp" "-ModifyDate<PhotoTakenTimeTimestamp" \
"-TrackCreateDate<PhotoTakenTimeTimestamp" "-MediaCreateDate<PhotoTakenTimeTimestamp" \
"-FileModifyDate<PhotoTakenTimeTimestamp" \
-ext mp4 -ext mov -overwrite_original "Takeout/Google Photos"
Clips van Live Photos hebben helemaal geen sidecarbestand, dus die blijven hierna zonder datum. Het artikel over Live Photo-paren (Engels) heeft er een lus voor.
De tijdzonevalkuil
De timestamp in het sidecarbestand is een exact moment in UTC. EXIF DateTimeOriginal is een kloktijd zonder tijdzone. exiftool overbrugt dat met de huidige tijdzone van je computer. Een foto die om 11:05 in Parijs is gemaakt, komt eruit als 11:05 als je computer op Parijs staat, en als 05:05 als hij op New York staat.
Stel de tijdzone in voordat je begint, op de plek waar de meeste foto's zijn gemaakt:
TZ=Europe/Paris exiftool ...
Vakantiefoto's uit andere tijdzones zitten er dan nog steeds een paar uur naast. Met alleen het sidecarbestand is daar niets aan te doen; de eigen EXIF van de camera, als die bewaard is gebleven, is de enige bron van de lokale tijd. "Herstel" geen foto's die al een goede EXIF-datum hebben. Voeg -if 'not $DateTimeOriginal' toe om die met rust te laten.
Is die avond het waard?
Bij een schone export van een paar duizend camerafoto's kost exiftool je een uur, dit artikel lezen meegerekend. Voor een echte bibliotheek met WhatsApp-foto's, schermafbeeldingen, duplicaten met (1), HEIC, video's en Live Photos reken je op een avond, en voer je exiftool -r -if 'not $DateTimeOriginal' -filename een paar keer uit om te zien wat nog geen datum heeft.
Wil je de bestanden ook op datum laten hernoemen, in mappen per jaar en maand laten ordenen, HEIC naar JPG laten omzetten en Live Photo-paren bij elkaar houden, dan rijg je er nog vier opdrachten en een lus aan. Prima als je dat leuk vindt. GooglePhotosTakeoutHelper is een gratis script dat de naamproblemen voor je oplost. Dat is een goede tussenstap als je met een terminal overweg kunt maar de sed niet zelf wilt schrijven.
De app
Takeout JSON Metadata Fixer doet het hele lijstje in één keer, met eerst een proefrun, op macOS, Windows en Linux.
De app koppelt elke foto aan zijn sidecarbestand, ook de afgekapte namen, de duplicaten met (1) en de kopieën met -edited, en schrijft photoTakenTime en de GPS in het bestand. Video's krijgen de QuickTime-tags. Clips van Live Photos krijgen de datum van de bijbehorende foto. Foto's zonder sidecarbestand houden hun EXIF-datum, en foto's zonder allebei krijgen de bestandsdatum, dus niets komt eruit zonder datum.
Sjablonen voor namen en mappen zijn optioneel; met "Namen houden" en "Mijn mappen houden" worden alleen de datums hersteld. De app controleert de schijfruimte voordat hij begint en werkt volledig offline. De eerste 1000 foto's zijn gratis. Onbeperkt kost eenmalig $ 19,99, en dat is minder dan een avond.
Veelgestelde vragen
exiftool zegt "Warning: No writable tags set from" bij een sidecarbestand. Wat betekent dat?
Het sidecarbestand bestaat, maar heeft geen photoTakenTime, of het naampatroon paste op het verkeerde bestand. Open het .json-bestand en kijk. Album-bestanden metadata.json geven deze melding ook; die kun je negeren.
Kan ik het op de zips uitvoeren zonder uit te pakken?
Nee. exiftool heeft de bestanden op schijf nodig. Pak eerst alle delen uit in één map, zoals beschreven in meerdere zip-bestanden van Google Takeout.
Verandert het schrijven van EXIF de foto?
Nee. exiftool schrijft het metadatablok opnieuw en laat de beeldgegevens met rust. Het bestand kan een paar honderd bytes groter worden.
Welke datum moet ik kopiëren, photoTakenTime of creationTime?
photoTakenTime. creationTime is het moment waarop het bestand naar Google is geüpload, en dat is vaak jaren later.