exiftool ile Google Takeout tarihleri: komut ve takıldığı yerler
Takeout .json dosyalarındaki tarih ve GPS bilgisini fotoğraflara kopyalayan exiftool komutu, sessizce atladığı durumlar ve ne zaman bir uygulamaya geçmeli.
exiftool ücretsizdir, her sistemde çalışır ve bir Google Takeout dışa aktarımını düzeltebilir. Çoğu rehber size tek bir komut verir ve orada durur. O komut yaklaşık her beş fotoğraftan dördünde çalışır. Bu yazı beşinciye ne olduğunu anlatıyor.
Kurulum
Mac'te brew install exiftool. Debian veya Ubuntu'da sudo apt install libimage-exiftool-perl. Fedora'da sudo dnf install perl-Image-ExifTool. Windows'ta zip dosyasını exiftool.org adresinden indirin, açın ve exiftool(-k).exe dosyasının adını exiftool.exe olarak değiştirin. Sonra açılmış Takeout klasörünüzün bulunduğu klasörde bir terminal açın.
İlk seferde bir kopya üzerinde çalışın. exiftool doğrudan dosyalarınıza yazar.
Komut
Her fotoğrafın yanında bir .json dosyası vardır: 2024 ve sonrasındaki dışa aktarmalarda IMG_2034.JPG.supplemental-metadata.json, daha eskilerde IMG_2034.JPG.json. Bu dosyadaki photoTakenTime.timestamp alanı, 1970'ten bu yana geçen saniye olarak gerçek çekim tarihidir. Şu komut onu fotoğrafa kopyalar:
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"
Parça parça: -r alt klasörleri de dolaşır. -d %s, okunan tarihin bir epoch sayısı olduğunu söyler. -tagsfromfile, .json dosyasının adını %d (fotoğrafın klasörü) ve %F (uzantısıyla birlikte dosya adı) ile kurar. < içeren üç satır zaman damgasını EXIF çekim tarihine, EXIF oluşturma tarihine ve dosyanın değiştirme tarihine kopyalar. -overwrite_original, exiftool'un her dosyanın bir _original kopyasını bırakmasını önler.
Eski bir dışa aktarma için komutu "%d/%F.json" ile yeniden çalıştırın. İlk seferde tarih alan dosyalar yalnızca aynı değerle yeniden yazılır.
İsterseniz GPS'i de aynı geçişte dört satır daha ekleyerek yazın:
"-GPSLatitude<GeoDataLatitude" "-GPSLatitudeRef<GeoDataLatitude" \
"-GPSLongitude<GeoDataLongitude" "-GPSLongitudeRef<GeoDataLongitude" \
Google, konumu olmayan fotoğraflar için 0.0 yazar. Bu yüzden bunu -if '$GeoDataLatitude ne 0' ile sarın; yoksa birkaç yüz fotoğrafı Atlas Okyanusu'nun ortasına koyarsınız. Bu konuda daha fazlası: Takeout'tan GPS'i geri getirme (İngilizce).
İş bitince exiftool kaç dosyayı güncellediğini ve kaçını atladığını yazar. Asıl vakit, atlananlara gider.
Nerede takılır
Kısaltılmış .json adları. Google uzun .json adlarını yaklaşık 46 karakterde keser. PXL_20230812_193044123.RAW-01.COVER.jpg dosyasının .json dosyası PXL_20230812_193044123.RAW-01.COVER.supplemen.json ya da daha kısa bir ad alır. %F kalıbı bunu hiçbir zaman eşleştirmez. Uzun kamera adları, WhatsApp adları ve dosya adında açıklama olan her şey buna takılır. Kalanları listeleyip elle ya da bir betikle eşleştirmeniz gerekir.
(1) ile kopyalar. Aynı adı iki kez yüklediyseniz, fotoğraf IMG_1234(1).jpg olur ama .json dosyası IMG_1234.jpg(1).json olur. Parantez yer değiştirmiştir. Ana komuttan önce .json dosyalarını yeniden adlandıran bir geçiş bunu düzeltir:
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
Düzenlenmiş kopyalar. IMG_1234-edited.jpg dosyasının kendine ait bir .json dosyası yoktur, orijinalinkini paylaşır. Orijinaller bittikten sonra bilgileri onlardan kopyalayın:
for f in "Takeout/Google Photos"/*/*-edited.*; do
exiftool -tagsfromfile "${f/-edited/}" -AllDates -GPS:all -overwrite_original "$f"
done
Videolar. MP4 ve MOV dosyaları EXIF kullanmaz. Tarihlerini QuickTime kapsayıcısında, farklı etiketlerde tutarlar ve bu etiketler UTC olarak okunur:
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"
Live Photo klipleri hiç .json dosyası taşımaz, bu yüzden bu adımdan sonra da tarihsiz kalırlar. Live Photo çiftleri yazısında (İngilizce) onlar için bir döngü var.
Saat dilimi tuzağı
.json dosyasındaki zaman damgası, UTC olarak kesin bir andır. EXIF DateTimeOriginal ise saat dilimi olmayan bir duvar saati değeridir. exiftool bu farkı bilgisayarınızın o anki saat dilimiyle kapatır. Paris'te 11:05'te çekilen bir fotoğraf, bilgisayarınız Paris'e ayarlıysa 11:05, New York'a ayarlıysa 05:05 olarak çıkar.
Çalıştırmadan önce saat dilimini, fotoğraflarınızın çoğunun çekildiği yere ayarlayın:
TZ=Europe/Paris exiftool ...
Başka saat dilimlerinde çekilmiş tatil fotoğrafları yine birkaç saat kayık olur. Yalnızca .json dosyasıyla bunun bir çaresi yoktur; yerel saatin tek kaydı, korunmuşsa kameranın kendi EXIF bilgisidir. Zaten iyi bir EXIF tarihi olan fotoğrafları "düzeltmeyin". Onlara dokunmamak için -if 'not $DateTimeOriginal' ekleyin.
Bir akşama değer mi?
Birkaç bin kamera fotoğrafından oluşan temiz bir dışa aktarmada exiftool, bu yazıyı okumak dahil bir saat sürer. WhatsApp görselleri, ekran görüntüleri, (1) kopyaları, HEIC, videolar ve Live Photo'lar içeren gerçek bir kitaplık için bir akşam ayırın. Hâlâ neyin tarihsiz olduğunu görmek için exiftool -r -if 'not $DateTimeOriginal' -filename komutunu birkaç kez çalıştırmayı bekleyin.
Dosyaların tarihe göre yeniden adlandırılmasını, yıl ve ay klasörlerine ayrılmasını, HEIC dosyalarının JPG'ye dönüştürülmesini ve Live Photo çiftlerinin bir arada kalmasını da istiyorsanız, dört komut ve bir döngü daha zincirlersiniz. Bundan hoşlanıyorsanız sorun yok. GooglePhotosTakeoutHelper, ad tuhaflıklarını sizin yerinize çözen ücretsiz bir betiktir. Terminalle rahatsanız ama sed komutunu kendiniz yazmak istemiyorsanız iyi bir ara adımdır.
Uygulama
Takeout JSON Metadata Fixer bu listenin tamamını tek çalıştırmada, önce bir deneme çalıştırmasıyla, macOS, Windows ve Linux'ta yapar.
Kısaltılmış adlar, (1) kopyaları ve -edited kopyaları dahil her fotoğrafı kendi .json dosyasıyla eşleştirir ve photoTakenTime ile GPS bilgisini dosyaya yazar. Videolar QuickTime etiketlerini alır. Live Photo klipleri fotoğrafın tarihini devralır. .json dosyası olmayan fotoğraflar EXIF tarihini korur, ikisi de olmayanlar dosya tarihini alır; böylece hiçbir şey tarihsiz kalmaz.
Adlandırma ve klasör şablonları isteğe bağlıdır; "Adları koru" ve "Klasörlerimi koru" seçenekleriyle yalnızca tarihler düzeltilir. Uygulama başlamadan önce disk alanını denetler ve tamamen çevrimdışı çalışır. İlk 1000 fotoğraf ücretsizdir. Sınırsız kullanım bir kereye mahsus 19,99 USD'dir; bir akşamdan daha ucuz.
Sık sorulan sorular
exiftool bir .json dosyası için "Warning: No writable tags set from" diyor. Bu ne demek?
.json dosyası var ama içinde photoTakenTime yok, ya da ad kalıbı yanlış dosyayla eşleşti. .json dosyasını açıp kontrol edin. Albümlerdeki metadata.json dosyaları da bu uyarıyı verir; bunları yok sayabilirsiniz.
Zip dosyalarını açmadan çalıştırabilir miyim?
Hayır. exiftool dosyaların diskte olmasını ister. Önce tüm parçaları tek bir klasöre açın; nasıl yapılacağı Google Takeout birden fazla zip dosyası yazısında anlatılıyor.
EXIF yazmak fotoğrafı değiştirir mi?
Hayır. exiftool meta veri bloğunu yeniden yazar, görüntü verisine dokunmaz. Dosya birkaç yüz bayt büyüyebilir.
Hangi tarihi kopyalamalıyım, photoTakenTime mı creationTime mı?
photoTakenTime. creationTime, dosyanın Google'a yüklendiği andır ve çoğu zaman yıllar sonrasıdır.