Takeout JSON
SV

Fixa Google Takeout-datum med exiftool: kommandot och fällorna

Kommandot i exiftool som kopierar datum och GPS från Takeouts .json-filer in i bilderna, de tre fall där det tyst hoppar över filer, och när en app är bättre.

exiftool är gratis, fungerar överallt och kan fixa en export från Google Takeout. De flesta guider ger dig ett kommando och slutar där. Det kommandot fungerar på ungefär fyra bilder av fem. Den här guiden berättar vad som händer med den femte.

Installera

På en Mac: brew install exiftool. På Debian eller Ubuntu: sudo apt install libimage-exiftool-perl. På Fedora: sudo dnf install perl-Image-ExifTool. I Windows laddar du ned zip-filen från exiftool.org, packar upp den och byter namn på exiftool(-k).exe till exiftool.exe. Öppna sedan en terminal i mappen som innehåller din uppackade Takeout-mapp.

Arbeta på en kopia första gången. exiftool skriver i dina filer.

Kommandot

Bredvid varje bild ligger en .json-fil: IMG_2034.JPG.supplemental-metadata.json i exporter från 2024 och framåt, IMG_2034.JPG.json i äldre. Fältet photoTakenTime.timestamp i filen är det riktiga datumet, i sekunder sedan 1970. Det här kommandot kopierar in det i bilden:

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"

Använd det mappnamn som faktiskt finns i din export i stället för Takeout/Google Photos, om det skiljer sig.

Del för del: -r går igenom undermappar. -d %s talar om för exiftool att datumet det läser är ett epoktal. -tagsfromfile pekar ut .json-filen med %d (bildens mapp) och %F (filnamnet med filändelse). De tre raderna med < kopierar tidsstämpeln till EXIF-datumet för tagning, till EXIF-datumet för skapande och till filens ändringsdatum. -overwrite_original gör att exiftool inte lämnar en _original-kopia av varje fil.

För en äldre export kör du kommandot igen med "%d/%F.json". Filer som redan fick ett datum första gången skrivs bara om med samma värde.

Vill du ha med GPS i samma körning lägger du till fyra rader:

  "-GPSLatitude<GeoDataLatitude" "-GPSLatitudeRef<GeoDataLatitude" \
  "-GPSLongitude<GeoDataLongitude" "-GPSLongitudeRef<GeoDataLongitude" \

Google skriver 0.0 för bilder utan plats, så lägg till -if '$GeoDataLatitude ne 0', annars hamnar några hundra bilder mitt i Atlanten. Mer om det finns i restoring GPS from Takeout (på engelska).

När exiftool är klart skriver det ut hur många filer det uppdaterade och hur många det hoppade över. Det är de överhoppade som tar kvällen.

Här går det sönder

Avkortade namn på .json-filerna. Google kortar av långa namn vid ungefär 46 tecken. PXL_20230812_193044123.RAW-01.COVER.jpg får en .json-fil som heter PXL_20230812_193044123.RAW-01.COVER.supplemen.json eller kortare. Mönstret %F matchar aldrig. Långa kameranamn, WhatsApp-namn och allt med en beskrivning i filnamnet drabbas. Du måste lista de som blir kvar och matcha dem för hand eller med ett skript. Reglerna förklaras i supplemental-metadata.json förklarat.

Dubbletter med (1). Om du laddade upp samma namn två gånger heter bilden IMG_1234(1).jpg, men .json-filen heter IMG_1234.jpg(1).json. Parentesen har flyttat. Ett varv som byter namn på .json-filerna löser det, innan du kör huvudkommandot:

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

Redigerade kopior. IMG_1234-edited.jpg har ingen egen .json-fil. Den delar originalets. När originalen är klara kopierar du från dem:

for f in "Takeout/Google Photos"/*/*-edited.*; do
  exiftool -tagsfromfile "${f/-edited/}" -AllDates -GPS:all -overwrite_original "$f"
done

Videor. MP4- och MOV-filer använder inte EXIF. De har sina datum i QuickTime-behållaren, i andra taggar, och de taggarna läses som UTC:

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"

Klippen till Live Photos har ingen .json-fil alls, så de förblir utan datum efter det här. The Live Photo pairs article (på engelska) har en loop för dem.

Fällan med tidszonen

Tidsstämpeln i .json-filen är ett exakt ögonblick i UTC. EXIF-fältet DateTimeOriginal är en klocktid utan tidszon. exiftool överbryggar skillnaden med datorns aktuella tidszon. En bild tagen klockan 11:05 i Paris blir 11:05 om datorn är inställd på Paris, och 05:05 om den är inställd på New York.

Ställ in tidszonen innan du kör, för platsen där de flesta av dina bilder togs:

TZ=Europe/Paris exiftool ...

För bilder tagna i Sverige skriver du TZ=Europe/Stockholm. Semesterbilder från andra tidszoner blir ändå fel med några timmar. Det går inte att komma runt med bara .json-filen; kamerans egen EXIF, om den finns kvar, är det enda som visar lokal tid. "Fixa" inte bilder som redan har ett bra EXIF-datum. Lägg till -if 'not $DateTimeOriginal' så lämnas de i fred.

Är kvällen värd det?

För en ren export med några tusen kamerabilder tar exiftool en timme, inklusive att läsa den här texten. Räkna med en hel kväll för ett riktigt bibliotek med WhatsApp-bilder, skärmbilder, (1)-dubbletter, HEIC, videor och Live Photos, och räkna med att köra exiftool -r -if 'not $DateTimeOriginal' -filename några gånger för att se vad som fortfarande saknar datum.

Om du också vill byta namn på filerna efter datum, sortera dem i mappar per år och månad, göra om HEIC till JPG och hålla ihop Live Photo-paren, då kedjar du ihop fyra kommandon till och en loop. Det går bra om du tycker det är roligt. GooglePhotosTakeoutHelper är ett gratis skript som sköter namnfällorna åt dig, och det är ett bra mellansteg om du är van vid terminalen men inte vill skriva sed-uttrycket själv. En jämförelse finns i alternativ till GooglePhotosTakeoutHelper.

Appen

Takeout JSON Metadata Fixer gör hela listan i en körning, med en testkörning först, på macOS, Windows och Linux.

Den matchar varje bild med sin .json-fil, även de avkortade namnen, (1)-dubbletterna och -edited-kopiorna, och skriver photoTakenTime och GPS in i filen. Videor får QuickTime-taggarna. Klippen till Live Photos får stillbildens datum. Bilder utan .json-fil behåller sitt EXIF-datum, och bilder som saknar båda får filens datum, så ingen bild blir utan datum.

Mallarna för namn och mappar är valfria; om du väljer att behålla namn och mappar fixas bara datumen. Appen kontrollerar diskutrymmet innan den börjar och körs helt offline. De första 1000 bilderna är gratis. Obegränsat kostar 19,99 USD en gång, vilket är mindre än en kväll.

Vanliga frågor

exiftool skriver "Warning: No writable tags set from" för en .json-fil. Vad betyder det?

.json-filen finns men saknar photoTakenTime, eller så matchade namnmönstret fel fil. Öppna .json-filen och kontrollera. Albumens metadata.json-filer ger också den varningen och kan ignoreras.

Kan jag köra det på zip-filerna utan att packa upp dem?

Nej. exiftool behöver filerna på disken. Packa först upp alla delar i samma mapp, som i Google Takeout med flera zip-filer.

Ändrar EXIF-skrivningen själva bilden?

Nej. exiftool skriver om metadatablocket och rör inte bilddatan. Filen kan bli några hundra byte större.

Vilket datum ska jag kopiera, photoTakenTime eller creationTime?

photoTakenTime. creationTime är när filen laddades upp till Google, vilket ofta är flera år senare.