Google Takeout: у всех фото неправильная дата? Вот почему
Почему после выгрузки из Google Takeout у каждого фото стоит дата скачивания, где спрятаны настоящие даты съемки и как вернуть их в файлы.
Вы скачали свою медиатеку из Google Фото, распаковали архив и открыли папку. Там десять лет снимков, и у каждого написано, что он сделан в прошлый вторник. Сортировка по дате ставит поездку на море 2012 года рядом со вчерашними скриншотами.
Ничего не потеряно. Даты на месте, просто не там, где их ищет ваш компьютер.
Куда делась дата
Фото может хранить дату в трех местах. Камера записывает одну дату в сам файл, в блок EXIF, в поле "DateTimeOriginal". Операционная система хранит еще две даты снаружи файла: дату создания и дату изменения. Finder, Проводник и большинство галерей сначала читают EXIF, а если его нет, берут даты файла.
Takeout ломает эту схему дважды. Во-первых, когда Google упаковывает ваши файлы в архив .zip, даты файла становятся моментом создания архива или моментом, когда вы его распаковали. Само по себе это не страшно, если EXIF в порядке.
Во-вторых, у большой части фото дата в EXIF отсутствует или неверна. У скриншотов ее никогда не было. WhatsApp и другие мессенджеры удаляют метаданные при сжатии. У сканов стоит дата сканирования, а не день, когда был напечатан снимок. А если вы когда-то исправляли дату в Google Фото, это исправление сохранилось в базе данных Google, а не в файле. Правильные сведения Google кладет в отдельный файл .json рядом с каждым фото, а не записывает их обратно в снимок.
Ваш компьютер эти файлы .json полностью игнорирует. Поэтому он показывает единственную дату, которую может найти: дату скачивания.
Сначала оцените масштаб
Прежде чем что-то исправлять, узнайте, сколько файлов это действительно нужно. У фото, снятых камерой телефона, обычно сохраняется правильная дата в EXIF. Если таких у вас большинство, исправлять придется только часть.
Если у вас установлен exiftool, эта команда выведет все файлы без даты в EXIF:
exiftool -r -if 'not $DateTimeOriginal' -filename "Takeout/Google Photos"
В одной реальной части Takeout на 991 фото, которую мы проверили, JSON-файлы были единственным источником правильной даты примерно для каждого пятого снимка. У вас соотношение будет другим. Медиатеки, где много скриншотов, картинок из чатов и старых сканов, гораздо сильнее зависят от JSON-файлов.
Откройте JSON-файл и посмотрите
У каждого фото есть файл-пара, например IMG_2034.JPG.supplemental-metadata.json (в старых выгрузках IMG_2034.JPG.json). Откройте его в любом текстовом редакторе. Важная часть выглядит так:
"photoTakenTime": {
"timestamp": "1563102330",
"formatted": "Jul 14, 2019, 11:05:30 AM UTC"
}
Это и есть настоящая дата: число секунд с 1970 года, по UTC. Там есть еще creationTime, это время загрузки файла в Google. Если вам нужна дата съемки, берите photoTakenTime. Весь файл мы разбираем в статье что за JSON-файлы в Google Takeout.
Исправить вручную
Если фото немного, дату можно поставить руками. На Mac откройте снимок в Просмотре или в Фото и измените дату. В Windows щелкните файл правой кнопкой, выберите "Свойства", затем "Подробно", и измените "Дата съемки". После пятидесяти фото вам захочется способ получше.
Для всей медиатеки обычно берут exiftool. Одна команда копирует метку времени из каждого JSON-файла в фото и в даты файла:
exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" \
"-DateTimeOriginal<PhotoTakenTimeTimestamp" \
"-FileCreateDate<PhotoTakenTimeTimestamp" \
"-FileModifyDate<PhotoTakenTimeTimestamp" \
-ext jpg -ext jpeg -overwrite_original "Takeout/Google Photos"
Это работает, но с оговорками. Google обрезает длинные имена JSON-файлов до 46 символов, и шаблон выше часть из них не находит. У дубликатов (1) стоит в имени JSON-файла в другом месте, чем в имени фото. Для видео нужны другие теги. HEIC и PNG требуют отдельных проходов. Все это мы разбираем в руководстве по exiftool. Есть и бесплатные скрипты от сообщества, например GooglePhotosTakeoutHelper, которые сами справляются с особенностями имен, если вы уверенно работаете в терминале.
Приложение
Если не хочется тратить вечер на командную строку, Takeout JSON Metadata Fixer делает то же самое как программа для macOS, Windows и Linux.
Вы указываете архивы Takeout или уже распакованную папку. Программа находит для каждого фото его JSON-файл, в том числе с именами supplemental-metadata образца 2024 года, обрезанными именами и дубликатами (1). Затем она записывает photoTakenTime в EXIF фото и выставляет даты создания и изменения файла. Фото без JSON-файла сохраняют дату из EXIF, если она есть, а если нет, получают дату файла, так что без даты ничего не остается.
Видео тоже получают свою дату, она записывается в MP4 или MOV туда, где ее ищут плееры. Координаты GPS возвращаются в фото, если в JSON-файле они настоящие. Можно также переименовать файлы по реальной дате и разложить их по папкам по годам и месяцам, но это необязательно. Если вам нужны только правильные даты, выберите "Keep names" и "Keep my folders".
Есть пробный прогон, который показывает, что изменится, ничего не записывая. Первые 1000 фото бесплатно, разовая покупка за 19,99 $ снимает ограничение. Все работает на вашем компьютере, фото никуда не загружаются.
Когда даты записаны в сами файлы, они остаются правильными, куда бы фото ни попали дальше: в Apple Фото, на NAS, в Immich, на флешку или на новый телефон.
Частые вопросы
Будут ли даты в правильном часовом поясе?
JSON-файл хранит точный момент времени по UTC. При записи в EXIF программы переводят его в местное время вашего компьютера, потому что EXIF по умолчанию не хранит часовой пояс. Снимок, сделанный в 11:05 в Париже, получит 11:05, если на компьютере стоит парижское время, и 05:05, если стоит время Нью-Йорка. Перед исправлением выставьте на компьютере пояс, в котором снята большая часть фото, или смиритесь с разницей в несколько часов на отпускных снимках.
Что-то теряется при записи в EXIF?
Запись даты меняет только блок метаданных. Пиксели изображения не затрагиваются. Храните исходные архивы .zip, пока не убедитесь в результате, это в любом случае хорошая привычка.
Почему неправильная дата только у части фото?
Потому что только у части фото изначально не было даты в EXIF. У снимков с камеры она обычно есть. Скриншоты, картинки из чатов, сканы и все, чью дату вы меняли в Google Фото, зависят от JSON-файла.
Можно ли удалить JSON-файлы после исправления дат?
Да. Когда дата и GPS записаны в фото, JSON-файлы свою работу сделали. Оставьте их, пока не проверите несколько фото в новой медиатеке, а потом удаляйте.