Takeout JSON
RU

Что за JSON-файлы в Google Takeout и можно ли их удалить?

В каждом файле .json лежат настоящая дата, место и подпись одного фото. Удаляйте их только после того, как эти данные записаны в сами фотографии.

JSON-файлы в Google Takeout хранят то, что Google Фото знал о каждом снимке: дату съемки, место, подпись и исходное имя файла. Такой файл лежит почти рядом с каждым фото и видео и называется примерно так: IMG_3391.HEIC.supplemental-metadata.json. Удалить их можно, но только после того, как даты и места из них записаны в сами фотографии. Если удалить их раньше, фото останутся с датой скачивания.

Вы распаковали экспорт из Google Фото, а половина файлов оказалась вовсе не фотографиями. Вы их не просили, большинство программ их не открывает, и их тысячи. Это не мусор. В них лежат даты и места, которые Google не записал в ваши снимки.

Зачем Google их добавляет

Google Фото хранит все, что знает о снимке, в своей базе данных: когда он сделан, где, в каком альбоме лежит, отмечен ли он как избранный, и какую дату или место вы исправили вручную. Сам файл изображения может хранить эти сведения в блоке EXIF, а может и не хранить. У скриншотов и картинок из мессенджеров их обычно нет. Правки, которые вы сделали в Google Фото, в файл не попадают никогда.

При экспорте Google отдает файл изображения примерно в том виде, в каком он был загружен. Данные из базы обратно в файл он не записывает. Вместо этого он кладет запись из базы в маленький текстовый файл рядом с изображением. Такой файл называют сопроводительным файлом (sidecar) (на английском), а JSON — это просто формат, в котором он записан.

Что внутри

Откройте любой такой файл в Блокноте, TextEdit или редакторе кода. Типичный файл, немного сокращенный, выглядит так:

{
  "title": "IMG_3391.HEIC",
  "description": "",
  "imageViews": "12",
  "creationTime": {
    "timestamp": "1690120442",
    "formatted": "Jul 23, 2023, 2:34:02 PM UTC"
  },
  "photoTakenTime": {
    "timestamp": "1689929130",
    "formatted": "Jul 21, 2023, 9:25:30 AM UTC"
  },
  "geoData": {
    "latitude": 48.8583,
    "longitude": 2.2945,
    "altitude": 35.0,
    "latitudeSpan": 0.0,
    "longitudeSpan": 0.0
  },
  "geoDataExif": {
    "latitude": 48.8583,
    "longitude": 2.2945,
    "altitude": 35.0
  },
  "url": "https://photos.google.com/photo/...",
  "googlePhotosOrigin": {
    "mobileUpload": {
      "deviceType": "IOS_PHONE"
    }
  }
}

О двух датах, photoTakenTime и creationTime, речь пойдет в отдельном разделе ниже. Остальные важные поля:

geoData — место, каким его знал Google Фото, включая место, которое вы указали вручную. geoDataExif — место, которое было в EXIF самого файла при загрузке. Если у фото нет места, в обоих полях нули: 0.0, 0.0, это точка в Атлантическом океане. Считайте одни нули значением «неизвестно», а не настоящим местом. Подробнее — в статье о восстановлении GPS из Takeout (на английском).

description — подпись, если вы ее вводили. people — список отмеченных людей, если он есть. favorited равно true у избранных фото. title — исходное имя файла. Это полезно, потому что Takeout иногда укорачивает настоящее имя файла.

Какая дата правильная?

Берите photoTakenTime. Это дата съемки в том виде, в каком ее показывал Google Фото. Если вы исправляли дату внутри Google Фото, в этом поле будет ваше исправление.

creationTime — это время загрузки файла в Google. У фото, снятого и сохраненного в облако в один день, обе даты совпадают. У скана отпечатка 1985 года, загруженного в 2021 году, между ними десятилетия.

Обе даты записаны как timestamp, то есть число секунд с 1 января 1970 года по UTC. Строка formatted показывает тот же момент в читаемом виде, тоже по UTC.

Файлы альбомов

В каждой папке альбома есть еще один файл metadata.json. Он описывает сам альбом, а не отдельное фото. В нем название альбома, иногда дата и отметка общего альбома. Он маленький и безвредный. Его читают программы, которые импортируют альбомы, например immich-go. Как устроены папки, объясняет статья что происходит с альбомами в Google Takeout (на английском).

Почему они называются supplemental-metadata.json

В старых экспортах такой файл назывался IMG_3391.HEIC.json. С 2024 года имя стало IMG_3391.HEIC.supplemental-metadata.json. Кроме того, Google обрезает длинные имена сопроводительных файлов до 46 символов, и у фото с Pixel появляется пара с именем PXL_20230721_092530123.jpg.supplemental-m.json. Когда у двух фото одинаковое имя, счетчик в имени JSON-файла стоит в другом месте: IMG_3391(1).HEIC идет в паре с IMG_3391.HEIC.supplemental-metadata(1).json. Подробности — в статье что такое supplemental-metadata.json.

Можно ли удалить JSON-файлы из Google Takeout?

Да, но только после того, как вы их использовали. Если удалить их сначала, даты и места из них пропадут. Фото навсегда останутся с датой скачивания, и вернуть эти сведения можно только новым экспортом через Takeout.

Если у всех ваших фото уже есть хороший EXIF, JSON-файлы добавляют мало. Проверить это можно через exiftool: команда exiftool -r -if 'not $DateTimeOriginal' -filename . выводит каждое фото без даты в EXIF. Если список пуст, файлы можно удалить.

У большинства медиатек список не пуст. Безопасный порядок такой: перенести данные из JSON в фото, проверить несколько снимков, затем удалить файлы .json. Immich, PhotoPrism и некоторые другие программы на собственном сервере умеют читать JSON-файлы Takeout прямо при импорте. Если вы переезжаете туда, храните файлы, пока импорт не закончится. Короткий ответ — в статье можно ли удалить JSON-файлы Google Takeout.

Какие программы их читают?

Apple Фото, приложение «Фотографии» в Windows, Проводник, Finder и галереи телефонов их не читают. Они ищут дату внутри файла изображения, не находят ее и берут дату файла, то есть день, когда вы распаковали экспорт. Поэтому у всех фото из Takeout неправильная дата.

Сам Google Фото их тоже не читает. Immich и PhotoPrism умеют читать их при импорте, см. PhotoPrism и JSON-файлы (на английском) и из Google Фото в Immich (на английском).

Почему у некоторых фото нет JSON-файла?

Такой файл есть не у каждого фото. У видеочасти Live Photo его часто нет. У некоторых очень старых загрузок его тоже нет. Такие фото сохраняют ту дату, которая записана в самом файле. Статья почему у некоторых фото нет JSON-файла (на английском) перечисляет эти случаи и объясняет, что с такими фото происходит.

Как вернуть данные в фотографии

Этот шаг называют объединением. Его можно сделать через exiftool: он читает JSON-файл и записывает теги EXIF. Команда и ее подводные камни описаны в статье как перенести метаданные из JSON в фото. Бесплатные скрипты вроде GooglePhotosTakeoutHelper работают по той же идее.

Takeout JSON Metadata Fixer делает это как программа для компьютера на macOS, Windows и Linux.

Программа читает каждый JSON-файл, записывает photoTakenTime в EXIF фото, выставляет такие же даты у файла и записывает координаты GPS, если они настоящие, а не нули. Она знает оба варианта имен, обрезанные имена и счетчики (1), поэтому не пропускает файлы, которые упустил бы простой шаблон имени. По желанию она переименовывает фото и раскладывает их по папкам, а также может записать рядом с результатом новые файлы .json для Immich или PhotoPrism. Все работает на вашем компьютере. Первые 1000 фото — бесплатно.

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

На каждое фото приходится один JSON-файл?

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

Как открыть JSON-файл из Google Takeout?

Любым текстовым редактором: Блокнотом в Windows, TextEdit на Mac или редактором кода. Это обычный текст. Если его открыть, ничего не изменится.

Может ли сам Google Фото прочитать их обратно?

Нет. Если загрузить папку обратно в Google Фото, он проигнорирует JSON-файлы и возьмет EXIF из самих файлов. Поэтому даты теряют и те, кто переносит фото между двумя аккаунтами Google. См. перенос Google Фото между аккаунтами (на английском).

Время указано в моем часовом поясе?

Нет. Это моменты времени по UTC. Программа переводит их в местное время, когда записывает EXIF, и берет для этого часовой пояс вашего компьютера. Проверьте, что на компьютере выбран тот пояс, где сделана большая часть фото.

Много ли места занимают JSON-файлы?

От нескольких сотен байт до пары килобайт каждый. Десять тысяч таких файлов — примерно 10 МБ. Место — не причина их удалять. Причина — беспорядок.