Pacix Labs

Фото

Google Takeout: как объединить JSON с фото и исправить неправильные даты

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

· 6 мин чтения

Также доступно на: العربيةবাংলাDeutschespañolfrançaisગુજરાતીहिन्दीIndonesiaitaliano日本語ಕನ್ನಡ한국어EnglishमराठीpolskiportuguêsKiswahiliதமிழ்తెలుగుไทยTürkçeукраїнськаاردوTiếng Việt中文

Вы скачали свою библиотеку Google Фото через Google Takeout. Теперь у вас тысячи фотографий рядом с тысячами файлов .json, а просмотрщик утверждает, что снимок 2019 года сделан вчера. Чтобы это исправить, нужно перенести данные из Google Takeout JSON в фото: объединить каждый JSON-файл с его снимком. Программа читает дату съёмки из JSON-файла и записывает её в фотографию, и все приложения снова показывают правильную дату.

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

Почему фото приходят вместе с JSON-файлами

Для каждого снимка Takeout выдаёт два файла: само изображение, например IMG_1234.jpg, и JSON-файл с исходной датой, GPS-координатами, описанием и списком альбомов. Одно руководство по экспорту описывает типичное первое впечатление: у фото 2019 года стояла дата «вчера», не было ни места, ни альбома, хотя ничего не потерялось. Все сведения были в JSON-файле (PixelUnion). Illinois Tech так же объясняет, почему в экспорте больше файлов, чем фотографий в вашей библиотеке (Illinois Tech).

Файл фотографии может расходиться с JSON-файлом. Автор google-photos-exif заметил, что если изменить дату в Google Фото, метаданные внутри изображения не обновляются: новая дата есть только в JSON-файле. В некоторых изображениях, часто в тех, которыми с вами поделились, даты внутри нет вообще (google-photos-exif). README gphotos-takeout-repair показывает вторую половину проблемы: в распакованном экспорте у фото, его отредактированной версии и JSON-файла датой создания значится дата экспорта Takeout (gphotos-takeout-repair).

Поэтому приложение, которое читает только файл фотографии, видит либо пустую дату, либо день экспорта. Правильная дата лежит в JSON-файле, и объединение возвращает её на место.

Три вещи, которые мешают объединению

Любая программа объединения должна найти правильный JSON-файл для каждого снимка. Три особенности Takeout усложняют эту задачу.

  1. Фото и его JSON-файл могут оказаться в разных zip-архивах. В FAQ Ente о переносе приводится пример: flower.jpeg в одном архиве, а flower.json в другом, и сопоставить их уже нельзя (Ente). README Porte называет тот же случай известным ограничением: программа не находит файлы метаданных, лежащие в другом архиве, чем их изображение (Porte).
  2. Имена JSON-файлов непоследовательны. Для IMG123.jpg вы можете получить IMG123.jpg.json или просто IMG123.json, а в некоторых папках встречаются JSON-файлы без соответствующего изображения (google-photos-exif).
  3. Отредактированные фото выгружаются дважды. Takeout экспортирует оригинал и отредактированную копию как отдельные файлы с разными хешами, поэтому поиск дубликатов по хешу их не находит (Ente). У отредактированного файла есть суффикс -edited, например IMG_0001-edited.jpg рядом с IMG_0001.jpg (gphotos-takeout-repair).

Решение первой проблемы одинаково для всех программ: скачайте все архивы, затем распакуйте их все в одну общую папку, сохранив вложенные папки как есть (Ente). Если в двух архивах есть папка с одинаковым именем, объедините содержимое папок, а не заменяйте одну другой (google-photos-exif).

Совет Illinois Tech по скачиванию: держите окно Takeout на переднем плане. Если свернуть его или работать в другом окне, загрузки обрываются через 15 минут, потому что Google просит войти в аккаунт заново (Illinois Tech).

Четыре бесплатные программы для переноса Google Takeout JSON в фото и дата, которую исправляет каждая

У фотографии есть два вида даты. Дата EXIF (DateTimeOriginal) хранится внутри изображения и переходит вместе с ним в любое приложение или сервис. Дата файла (изменения или создания) принадлежит файловой системе. Её легко потерять: README gpth предупреждает, что перемещение файлов на Android-телефоне обычно её сбрасывает (gpth). Прежде чем выбирать программу, проверьте, какую из двух дат она записывает.

Во всех командах ниже первая папка — ваш распакованный Takeout, вторая — новая пустая папка для результата.

Porte: записывает дату и место в фото

Porte копирует отметку времени и геолокацию из соответствующего JSON-файла в EXIF-данные изображения, не пережимая его. Если дата не найдена, программа пробует извлечь её из имени файла и берёт самую раннюю из найденных дат, чтобы дата изменения файла не была принята за дату съёмки. Она копирует файлы в выходную папку, а не меняет их на месте, складывает неудачные файлы в отдельную папку и сохраняет журнал. Данные об альбомах она не сохраняет. Готовую программу можно скачать на странице релизов проекта (Porte):

porte srcpath destpath

google-photos-exif: заполняет недостающую дату EXIF

Эта программа на Node.js читает photoTakenTime из каждого JSON-файла. Она устанавливает дату изменения файла и заполняет DateTimeOriginal, только если у фото этой даты ещё нет. Файлы, которые не удалось обработать, попадают в папку ошибок (google-photos-exif). Автор PixelUnion пользовался ею и пишет, что вся библиотека была обработана примерно за двадцать минут (PixelUnion).

yarn start --inputDir ~/takeout --outputDir ~/output --errorDir ~/error

gpth: раскладывает в одну папку или по месяцам, затем ставит дату файла

Google Photos Takeout Helper работает в диалоговом режиме: вы запускаете его и отвечаете на вопросы. Он собирает все фото в одну папку или, с параметром --divide-to-dates, в папки по месяцам и устанавливает дату последнего изменения файла. Запись данных из JSON обратно в EXIF пока только в его планах, поэтому в README дана дополнительная команда exiftool, которая копирует дату файла в даты EXIF для фото, у которых их нет. Выполните эту команду до того, как снова трогать файлы. Учтите, что gpth по умолчанию перемещает файлы, так что сохраните исходные архивы (gpth).

exiftool -overwrite_original -r -if 'not defined DateTimeOriginal' -P "-AllDates<FileModifyDate" "your/output/folder/ALL_PHOTOS/"

gphotos-takeout-repair: убирает JSON-файлы и отредактированные дубликаты

Эта программа копирует фото в новую папку, сохраняет структуру папок и задаёт дату создания каждого файла по photoTakenTime из JSON-файла. Если есть копия -edited, она оставляет эту версию (обычно лучшую) и пропускает оригинал, так что в результате нет ни JSON-файлов, ни отредактированных дубликатов (gphotos-takeout-repair). Установите её командой npm install -g gphotos-takeout-repair, затем:

gphotos-takeout-repair --src ./unzipped-takeout-dir --dest ./output-dir

Если вам нужна дата внутри изображения у каждого фото, Porte записывает её напрямую. С остальными тремя потом проверьте дату EXIF, как показано ниже.

Проверьте, что даты действительно попали в фото

Не доверяйте столбцу «Дата изменения» в файловом менеджере. Проверяйте сами метаданные.

  1. Без дополнительных программ: щёлкните по фото правой кнопкой и выберите «Свойства» (так этот пункт называется и в Windows, и на Mac). После удачного объединения вы должны увидеть правильную дату съёмки, GPS-координаты, если они были у снимка, и модель камеры, если она известна (PixelUnion).
  2. Для целой папки: ExifTool может вывести тег DateTimeOriginal для каждого JPG в папке. Эта строка основана на примере из его документации (ExifTool):
exiftool -DateTimeOriginal -S -s -ext jpg .

Пустая строка или дата из недели экспорта означает, что это фото не было объединено. Тогда загляните в папку ошибок или неудачных файлов программы и проверьте, не пришёл ли соответствующий JSON-файл из другого архива.

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

Альтернатива в один клик

Если вы не хотите работать с командной строкой, ту же задачу может выполнить настольное приложение. PHOTOK — продукт Pacix Labs. Согласно его странице, он читает файлы .json, которые Google разбрасывает по папкам, и возвращает настоящие даты и места, затем раскладывает фото по папкам Год / Месяц / Место и откладывает в сторону точные дубликаты. Он работает в Windows 10 и 11 и на Mac с чипом Apple, ничего не загружает в сеть и никогда не удаляет файлы. Предпросмотр бесплатный, полная версия стоит €49 разовым платежом (PHOTOK).

Какой бы путь вы ни выбрали, бесплатные программы выше или приложение, правила одни и те же: работайте с копией, проверяйте выборку и сохраняйте архивы.

Чек-лист

  • Скачайте все архивы и сохраните копию на втором диске.
  • Распакуйте все архивы в одну общую папку, сохраните вложенные папки, объедините папки с одинаковыми именами.
  • Выберите программу и выясните, какую дату она записывает: дату EXIF, дату файла или обе.
  • Запустите её на копии, с выводом в новую папку.
  • Проверьте DateTimeOriginal на выборке снимков разных лет и загляните в папку ошибок.
  • Решите, что делать с копиями -edited.
  • Удаляйте JSON-файлы и архивы только после проверки и второй резервной копии.

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

Почему Google Takeout выдаёт вместе с фото JSON-файлы?

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

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

Только после того, как даты и места окажутся внутри фотографий и вы проверите часть снимков. До этого JSON-файл — единственное место, где хранятся дата и местоположение снимка, известные Google.

Какую дату исправляет программа объединения?

Зависит от программы. Одни записывают дату в EXIF-метаданные фото (DateTimeOriginal), которые остаются с файлом. Другие меняют только дату изменения или создания файла, а её некоторые способы копирования сбрасывают. Прочитайте README программы, прежде чем выбирать.

Почему после объединения у некоторых фото дата всё ещё неправильная?

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

Нужно ли хранить исходные zip-архивы?

Да, пока объединённая библиотека не проверена и у вас нет ещё одной резервной копии. Некоторые программы перемещают файлы, а не копируют, и архивы — единственный способ начать заново.

Источники