Takeout JSON
RU

Как перенести метаданные из JSON Google Takeout в фото

Пошагово: как записать дату и GPS из JSON-файлов Google Takeout в сами фото с помощью exiftool или программы для компьютера.

У вас есть папка с фото, а рядом с каждым лежит файл .json с настоящей датой и местом съемки. Сами фото показывают неправильную дату. Вы хотите записать данные из .json в фото, чтобы выбросить JSON-файлы и получить обычную папку со снимками.

Эта задача давно решена. Ниже показано, как сделать это вручную и как сделать это одним нажатием.

Что на самом деле значит "перенести"

В JPEG, HEIC или PNG есть блок метаданных EXIF. Камеры записывают туда дату съемки, в тег DateTimeOriginal, а координаты GPS в теги GPSLatitude и GPSLongitude. Фотоприложения на всех платформах читают эти теги.

В JSON-файле Takeout та же информация, только в другом контейнере. Перенести значит прочитать photoTakenTime и geoData из JSON-файла и записать их в теги EXIF. Заодно стоит выставить даты создания и изменения файла, чтобы Finder и Проводник правильно сортировали даже в режимах, которые EXIF не читают.

У видео нет EXIF. Их дата хранится внутри контейнера MP4 или MOV, в тегах вроде CreateDate. Идея та же, только теги называются иначе.

Шаг 1. Распакуйте все в одно место

Takeout делит большие выгрузки на несколько архивов .zip. Распакуйте их все в одну родительскую папку, чтобы папки альбомов объединились. Если альбом попал в два архива, в каждом может оказаться половина его фото и половина JSON-файлов, а в итоге они должны лежать рядом. Если архивов много, прочитайте статью Google Takeout: несколько архивов .zip.

Шаг 2. Как фото находит свой JSON-файл

Имя JSON-файла состоит из имени фото и суффикса. IMG_0042.JPG идет в паре с IMG_0042.JPG.supplemental-metadata.json в выгрузках с 2024 года или с IMG_0042.JPG.json в более старых. Два случая ломают это простое правило. Имена длиннее 46 символов обрезаются, и суффикс оказывается неполным. У дубликатов счетчик стоит в другом месте: IMG_0042(1).JPG идет в паре с IMG_0042.JPG.supplemental-metadata(1).json. Любой инструмент должен справляться с обоими случаями, иначе он молча пропустит эти файлы. Реальные примеры обоих случаев есть в статье что такое supplemental-metadata.json.

Шаг 3. Перенос с помощью exiftool

exiftool бесплатен и работает на всех платформах. Установите его, откройте терминал в папке Google Photos и выполните:

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 .

Что делает команда: для каждого изображения ищет в той же папке файл с тем же именем и суффиксом .supplemental-metadata.json и копирует перечисленные поля. -d %s сообщает exiftool, что метка времени задана в секундах с 1970 года. -overwrite_original не дает ему оставлять резервную копию каждого файла.

Запустите команду второй раз с "%d/%F.json" для JSON-файлов старого образца. Затем еще раз для видео:

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 .

Шаг 4. Разберитесь с тем, что exiftool пропустил

Посчитайте остатки:

exiftool -r -if 'not $DateTimeOriginal' -ext jpg -ext heic -ext png -filename .

В списке окажутся обрезанные имена, дубликаты (1) и фото, у которых JSON-файла не было вовсе. Обрезанные имена можно поймать коротким скриптом, который ищет .json, чье имя совпадает с началом ожидаемого. Дубликаты нужно переименовать, прежде чем шаблон сработает. Именно здесь десятиминутная работа превращается в целый вечер, и поэтому существуют скрипты от сообщества, например GooglePhotosTakeoutHelper. Они бесплатны и сами подбирают пары, но работают в терминале.

Еще одна ловушка: строки с GPS выше спокойно запишут 0.0, 0.0 в фото, у которых в JSON-файле место неизвестно. Добавьте -if '$GeoDataLatitude ne 0' или смиритесь с группой фото посреди Атлантики.

Шаг 5. Вместо этого программа

Takeout JSON Metadata Fixer выполняет шаги 1-4 за один запуск на macOS, Windows и Linux.

Выберите архивы Takeout или распакованную папку. Программа находит JSON-файл для каждого фото и видео, перебирая все варианты имен, которые использовал Google, включая обрезку до 46 символов и счетчик (1). Она записывает дату в EXIF для изображений и в контейнер для видео, выставляет даты файлов и записывает GPS, только если координаты настоящие. Фото без JSON-файла сохраняют свою дату из EXIF или дату файла, если в EXIF ее нет.

Можно остановиться на этом, выбрав "Keep names" и "Keep my folders", и получить ту же папку с правильными метаданными. А можно заодно переименовать файлы по дате и разложить их по папкам по годам и месяцам. Пробный прогон показывает план до того, как что-либо записано. Бесплатная версия охватывает 1000 фото, без ограничений стоит 19,99 $ один раз. Ничего никуда не загружается.

Шаг 6. Проверьте и удалите JSON-файлы

Откройте в своем фотоприложении несколько снимков разных лет и проверьте даты. Затем удалите файлы .json. На Mac или Linux выполните внутри папки find . -name "*.json" -delete. В Windows найдите в папке *.json, выделите все и удалите. Сохраните исходные архивы .zip где-нибудь на месяц на случай, если заметите проблему.

Частые вопросы

Меняется ли качество изображения при переносе?

Нет. Переписывается только блок метаданных. Сжатые данные изображения копируются байт в байт.

Что если у фото уже есть дата в EXIF, и она отличается от JSON-файла?

JSON-файл отражает то, что вам показывало Google Фото, включая ваши исправления. Чаще всего нужна именно эта дата. Если вы никогда не меняли даты в Google Фото, они все равно совпадут.

Почему время сдвигается на несколько часов?

Метка времени в JSON-файле задана по UTC. В EXIF нет часового пояса, поэтому инструменты переводят время в местный пояс вашего компьютера. Выставьте на компьютере пояс, в котором сняты фото, или смиритесь со сдвигом.

Можно перенести только дату, без GPS?

Да. Уберите строки с GPS из команды exiftool. В программе GPS записывается, если он есть; если вы не хотите видеть место в именах файлов, выберите шаблон имени без него.