Фото
Google Takeout: как объединить JSON с фото и исправить неправильные даты
Google Takeout хранит даты ваших фото в отдельных JSON-файлах. Четыре бесплатные программы возвращают их в снимки: что исправляет каждая, точные команды и как проверить результат.
Также доступно на: العربيةবাংলা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 усложняют эту задачу.
- Фото и его JSON-файл могут оказаться в разных zip-архивах. В FAQ Ente о переносе приводится пример:
flower.jpegв одном архиве, аflower.jsonв другом, и сопоставить их уже нельзя (Ente). README Porte называет тот же случай известным ограничением: программа не находит файлы метаданных, лежащие в другом архиве, чем их изображение (Porte). - Имена JSON-файлов непоследовательны. Для
IMG123.jpgвы можете получитьIMG123.jpg.jsonили простоIMG123.json, а в некоторых папках встречаются JSON-файлы без соответствующего изображения (google-photos-exif). - Отредактированные фото выгружаются дважды. 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, как показано ниже.
Проверьте, что даты действительно попали в фото
Не доверяйте столбцу «Дата изменения» в файловом менеджере. Проверяйте сами метаданные.
- Без дополнительных программ: щёлкните по фото правой кнопкой и выберите «Свойства» (так этот пункт называется и в Windows, и на Mac). После удачного объединения вы должны увидеть правильную дату съёмки, GPS-координаты, если они были у снимка, и модель камеры, если она известна (PixelUnion).
- Для целой папки: ExifTool может вывести тег
DateTimeOriginalдля каждого JPG в папке. Эта строка основана на примере из его документации (ExifTool):
exiftool -DateTimeOriginal -S -s -ext jpg .
Пустая строка или дата из недели экспорта означает, что это фото не было объединено. Тогда загляните в папку ошибок или неудачных файлов программы и проверьте, не пришёл ли соответствующий JSON-файл из другого архива.
- Сравните количество. В выходной папке вместе с папкой ошибок должно быть примерно столько же фото и видео, сколько в распакованном 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-архивы?
Да, пока объединённая библиотека не проверена и у вас нет ещё одной резервной копии. Некоторые программы перемещают файлы, а не копируют, и архивы — единственный способ начать заново.
Источники
- Ente: Google Photos migration FAQ (split zips, wrong dates, duplicates)
- PixelUnion: how to export your Google Photos library without losing the metadata
- Illinois Tech: use Google Takeout to export Google Photos
- google-photos-exif (GitHub README)
- Porte: fixing and organizing a Google Takeout photos export (GitHub README)
- Google Photos Takeout Helper, gpth (GitHub README)
- gphotos-takeout-repair 1.4.2 (README)
- ExifTool documentation