Google Takeout mit exiftool korrigieren: die ehrliche Anleitung
Der exiftool-Befehl, der Datum und GPS aus den Takeout-JSON-Dateien in Ihre Fotos kopiert, wo er scheitert und wann eine App die bessere Wahl ist.
exiftool ist kostenlos, läuft überall und kann einen Google-Takeout-Export reparieren. Die meisten Anleitungen geben Ihnen einen Befehl und hören auf. Dieser Befehl funktioniert bei etwa vier von fünf Fotos. Diese Anleitung sagt Ihnen, was mit dem fünften passiert.
Installation
Auf dem Mac: brew install exiftool. Unter Debian oder Ubuntu: sudo apt install libimage-exiftool-perl. Unter Fedora: sudo dnf install perl-Image-ExifTool. Unter Windows laden Sie die ZIP-Datei von exiftool.org, entpacken sie und benennen exiftool(-k).exe in exiftool.exe um. Dann öffnen Sie ein Terminal in dem Ordner, der Ihren entpackten Takeout-Ordner enthält.
Arbeiten Sie beim ersten Mal an einer Kopie. exiftool schreibt in Ihre Dateien.
Der Befehl
Neben jedem Foto liegt eine JSON-Datei, IMG_2034.JPG.supplemental-metadata.json bei Exporten seit 2024, IMG_2034.JPG.json bei älteren. Ihr Feld photoTakenTime.timestamp ist das echte Datum, in Sekunden seit 1970. Dieser Befehl kopiert es ins 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 Fotos"
Stück für Stück: -r geht durch Unterordner. -d %s sagt exiftool, dass das gelesene Datum eine Epochenzahl ist. -tagsfromfile benennt die JSON-Datei über %d (Ordner des Fotos) und %F (Dateiname mit Endung). Die drei Zeilen mit < kopieren den Zeitstempel ins EXIF-Aufnahmedatum, ins EXIF-Erstelldatum und ins Änderungsdatum der Datei. -overwrite_original verhindert, dass exiftool von jeder Datei eine _original-Kopie zurücklässt.
Für einen älteren Export lassen Sie den Befehl noch einmal mit "%d/%F.json" laufen. Dateien, die beim ersten Mal schon ein Datum bekommen haben, werden einfach mit demselben Wert neu geschrieben.
GPS nehmen Sie mit vier weiteren Zeilen im selben Durchlauf mit, wenn Sie möchten:
"-GPSLatitude<GeoDataLatitude" "-GPSLatitudeRef<GeoDataLatitude" \
"-GPSLongitude<GeoDataLongitude" "-GPSLongitudeRef<GeoDataLongitude" \
Google schreibt 0.0 für Fotos ohne Standort. Schützen Sie das mit -if '$GeoDataLatitude ne 0', sonst setzen Sie einige hundert Fotos in den Atlantik. Mehr dazu in Google Takeout: Standort fehlt.
Am Ende meldet exiftool, wie viele Dateien aktualisiert und wie viele übersprungen wurden. Mit den übersprungenen geht der Abend drauf.
Wo es scheitert
Gekürzte JSON-Namen. Google schneidet lange JSON-Namen bei etwa 46 Zeichen ab. PXL_20230812_193044123.RAW-01.COVER.jpg bekommt eine JSON-Datei namens PXL_20230812_193044123.RAW-01.COVER.supplemen.json oder kürzer. Das Muster %F passt nie. Lange Kameranamen, WhatsApp-Namen und alles mit einer Beschreibung im Dateinamen trifft das. Sie müssen die Reste auflisten und von Hand oder per Skript zuordnen.
Duplikate mit (1). Haben Sie denselben Namen zweimal hochgeladen, heißt das Foto IMG_1234(1).jpg, die JSON-Datei aber IMG_1234.jpg(1).json. Die Klammer ist gewandert. Ein Umbenennungslauf über die JSON-Dateien vor dem Hauptbefehl behebt das:
for j in "Takeout/Google Fotos"/*/*"("*").json"; do
mv "$j" "$(echo "$j" | sed -E 's/\.([a-zA-Z0-9]+)\(([0-9]+)\)(\.supplemental-metadata)?\.json$/(\2).\1\3.json/')"
done
Bearbeitete Kopien. IMG_1234-edited.jpg hat keine eigene JSON-Datei. Sie teilt sich die des Originals. Sind die Originale fertig, kopieren Sie von ihnen:
for f in "Takeout/Google Fotos"/*/*-edited.*; do
exiftool -tagsfromfile "${f/-edited/}" -AllDates -GPS:all -overwrite_original "$f"
done
Videos. MP4- und MOV-Dateien nutzen kein EXIF. Sie speichern ihre Daten im QuickTime-Container, in anderen Tags, und diese Tags werden als UTC gelesen:
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 Fotos"
Die Videoclips von Live Photos haben gar keine JSON-Datei und bleiben danach ohne Datum. Eine Schleife dafür steht im englischen Artikel zu den Live-Photo-Paaren.
Die Zeitzonen-Falle
Der JSON-Zeitstempel ist ein exakter Zeitpunkt in UTC. Das EXIF-Feld DateTimeOriginal ist eine Uhrzeit ohne Zone. exiftool überbrückt das mit der aktuellen Zeitzone Ihres Computers. Ein Foto um 11:05 Uhr in Hamburg kommt als 11:05 heraus, wenn der Rechner auf Berlin steht, und als 05:05, wenn er auf New York steht.
Setzen Sie die Zone vor dem Lauf, für den Ort, an dem die meisten Fotos entstanden sind:
TZ=Europe/Berlin exiftool ...
Urlaubsfotos aus anderen Zonen bleiben trotzdem ein paar Stunden daneben. Aus der JSON-Datei allein lässt sich das nicht lösen. Nur das EXIF der Kamera, wenn es überlebt hat, kennt die Ortszeit. Korrigieren Sie deshalb keine Fotos, die schon ein gutes EXIF-Datum haben. Mit -if 'not $DateTimeOriginal' lassen Sie sie in Ruhe.
Lohnt sich der Abend?
Für einen sauberen Export mit ein paar tausend Kamerafotos braucht exiftool eine Stunde, das Lesen dieser Anleitung eingeschlossen. Für eine echte Bibliothek mit WhatsApp-Bildern, Screenshots, (1)-Duplikaten, HEIC, Videos und Live Photos planen Sie einen Abend ein, und rechnen Sie damit, exiftool -r -if 'not $DateTimeOriginal' -filename mehrmals laufen zu lassen, um zu sehen, was noch ohne Datum ist.
Wenn Sie zusätzlich Dateien nach Datum umbenennen, in Jahres- und Monatsordner sortieren, HEIC in JPG umwandeln und Live-Photo-Paare zusammenhalten wollen, hängen Sie vier weitere Befehle und eine Schleife an. Das ist in Ordnung, wenn es Ihnen Spaß macht. GooglePhotosTakeoutHelper ist ein kostenloses Skript, das die Namensprobleme übernimmt, ein guter Mittelweg für alle, die mit dem Terminal vertraut sind, aber das sed nicht selbst schreiben wollen.
Die App
Takeout JSON Metadata Fixer erledigt die ganze Liste in einem Durchlauf, mit Probelauf vorab, auf Windows, Linux und Mac.
Die App ordnet jedem Foto seine JSON-Datei zu, einschließlich der gekürzten Namen, der (1)-Duplikate und der -edited-Kopien, und schreibt photoTakenTime und GPS in die Datei. Videos bekommen die QuickTime-Tags. Live-Photo-Clips übernehmen das Datum des Fotos. Fotos ohne JSON-Datei behalten ihr EXIF-Datum, Fotos ohne beides bekommen das Dateidatum. Kein Foto bleibt ohne Datum.
Umbenennen und Ordnervorlagen sind optional. "Namen behalten" und "Meine Ordner behalten" macht nur die Daten. Die App prüft vor dem Start den freien Speicherplatz und läuft komplett offline, mit deutscher Oberfläche. Die ersten 1000 Fotos sind kostenlos. Unbegrenzt kostet einmalig 19,99 US-Dollar, weniger als ein Abend.
Häufige Fragen
exiftool meldet "Warning: No writable tags set from" einer JSON-Datei. Was heißt das?
Die JSON-Datei existiert, hat aber kein photoTakenTime, oder das Namensmuster hat die falsche Datei erwischt. Öffnen Sie die .json und schauen Sie nach. Die metadata.json der Alben löst diese Warnung ebenfalls aus und kann ignoriert werden.
Kann ich exiftool direkt auf die ZIPs loslassen?
Nein. exiftool braucht die Dateien auf der Festplatte. Entpacken Sie zuerst alle Teile in einen Ordner.
Verändert das EXIF-Schreiben das Bild?
Nein. exiftool schreibt den Metadaten-Block neu und lässt die Bilddaten unangetastet. Die Datei kann um einige hundert Byte wachsen.
Welches Datum soll ich kopieren, photoTakenTime oder creationTime?
photoTakenTime. creationTime ist der Zeitpunkt des Uploads zu Google, oft Jahre später.