supplemental-metadata.json в Google Takeout: что это за файл
В этом файле Google Takeout хранит дату съемки, место и подпись каждого фото; с 2024 года так называется обычный .json, и удалять его пока рано.
supplemental-metadata.json — это небольшой текстовый файл, который Google Takeout кладет рядом с каждым фото и видео. В нем записано то, что Google Фото знал об этом файле: дата съемки, GPS-координаты, подпись и исходное имя файла. С 2024 года так называется файл-спутник, который в старых экспортах выглядел как IMG_5512.HEIC.json. Содержимое у них одинаковое.
Не удаляйте его, пока дата и место не записаны в само фото. Большинство программ для фото этот файл не читают, поэтому без этого шага ваши снимки показывают дату скачивания.
Возможно, вы здесь потому, что скрипт, который раньше исправлял экспорт Takeout, теперь пропускает половину фото. Или вы увидели IMG_5512.HEIC.supplemental-metadata.json рядом с одним снимком и PXL_20240311_183022711.jpg.supplemental-m.json рядом с другим и решили, что второй файл испорчен. Ни один из них не испорчен. Ниже мы разберем имена, поля и то, что с этими файлами делать.
Что значит «supplemental metadata»
Метаданные — это информация о фото: когда, где, какой камерой. «Supplemental» значит «дополнительные». Это данные, которые Google Фото хранил в своей базе, а не внутри файла изображения.
У многих фото дата уже есть внутри, в данных EXIF. А вот у скриншотов, картинок из мессенджеров, сканов и любых фото, у которых вы исправляли дату или место в Google Фото, ее нет. Для них файл supplemental metadata — единственная запись о том, когда и где сделан снимок. Подробнее об этом — в статье что за JSON-файлы в Google Takeout.
Что внутри файла
Откройте его в Блокноте, TextEdit или любом редакторе кода. Это обычный текст. Важные поля:
title: исходное имя файла. Пригодится, если Takeout сократил настоящее имя.photoTakenTime: дата съемки в том виде, в каком ее показывал Google Фото. Сюда входит и дата, которую вы исправили вручную. Именно эту дату и нужно использовать.creationTime: когда файл загрузили в Google. Для скана старой бумажной фотографии это может быть на десятки лет позже настоящей даты.geoData: место съемки, как его знал Google Фото, включая место, которое вы указали вручную.geoDataExif: координаты, которые были в EXIF самого файла на момент загрузки.description: ваша подпись, если вы ее добавляли.peopleиfavorited: отмеченные люди и избранные фото, если они есть.
Время записано в секундах с 1 января 1970 года, в UTC. У фото без места съемки и широта, и долгота равны 0.0. Считайте это отсутствием координат, а не реальной точкой на карте. См. восстановление GPS из Takeout (на английском).
Почему в 2024 году изменилось имя
Много лет файл-спутник для IMG_5512.HEIC назывался IMG_5512.HEIC.json: имя фото, затем .json. Все скрипты искали именно такое имя.
В 2024 году Google перешел на IMG_5512.HEIC.supplemental-metadata.json. Содержимое и поля те же, имя длиннее. Новое имя говорит, что это за файл, а голое .json можно было принять за данные самого фото. Экспорты, сделанные с тех пор, используют новое имя. Старый экспорт где-нибудь на диске использует старое, а в папке, где смешаны оба экспорта, есть и те, и другие.
Все, что ищет <фото>.json, теперь ничего не находит и идет дальше. Одни программы пишут «no sidecar found» для каждого файла. Другие молча берут дату файла, то есть дату скачивания, и фото получают неправильную дату без всякой ошибки. Из-за этой тихой ошибки появляется много сообщений вида «исправление не сработало».
Почему некоторые имена обрезаны, например .supplemental-m.json
Google обрезает полное имя файла-спутника до 46 символов. С коротким старым окончанием .json это почти не мешало. С добавленным .supplemental-metadata.json любое имя фото длиннее примерно 19 символов теряет часть окончания.
Фото с Pixel с именем PXL_20240311_183022711.jpg — это 26 символов. Добавьте .supplemental-metadata.json, и получится 53. Google обрезает до 46: PXL_20240311_183022711.jpg.supplemental-m.json. Фото Samsung 20240311_183022.jpg получает 20240311_183022.jpg.supplemental-metada.json. У каждой марки камеры обрезка немного своя, поэтому одного окончания для поиска нет.
Файл не поврежден. Коротким стало только имя. Надежное правило такое: имя файла-спутника — это начало строки <имя фото>.supplemental-metadata.json. Скрипт должен проверять именно это, а не сравнивать с фиксированной строкой. Очень длинные исходные имена, например те, что вы набрали сами, могут обрезаться уже в части с именем фото. Поэтому поле title внутри файла стоит прочитать. Все правила имен собраны в статье почему у файлов Takeout странные имена (на английском).
Куда попадает (1)
Google Фото разрешает два файла с одинаковым именем, а Takeout должен положить их в одну папку. Ко второму он добавляет счетчик: IMG_5512.HEIC и IMG_5512(1).HEIC.
Логично ожидать файлы-спутники IMG_5512.HEIC.supplemental-metadata.json и IMG_5512(1).HEIC.supplemental-metadata.json. Но это не так. Счетчик переезжает в конец имени файла-спутника, перед .json: IMG_5512.HEIC.supplemental-metadata(1).json. В старом формате было IMG_5512.HEIC(1).json.
Значит, программа должна взять имя фото, убрать (1), собрать имя файла-спутника и вернуть (1) прямо перед .json. Добавьте к этому обрезку до 46 символов, и получатся имена вроде PXL_20240311_183022711.jpg.supplemental-(1).json. В настоящих экспортах такие есть.
Счетчики встречаются часто. Их дают одно и то же фото, сохраненное в два альбома, фото, которое вы отредактировали и Google сохранил обе версии, или два телефона, которые оба назвали файл IMG_0001.JPG.
У отредактированных копий нет своего файла-спутника
Фото, отредактированные в Google Фото, выходят двумя файлами: IMG_5512.HEIC и IMG_5512-edited.HEIC. Файл-спутник обычно один, и он привязан к исходному имени. Простая программа оставляет отредактированную копию без даты. Аккуратная программа убирает -edited и использует файл-спутник оригинала. Подробнее — в статье дубликаты и отредактированные версии в Takeout (на английском).
Можно ли удалить supplemental-metadata.json?
Да, но только после того, как дата и место попали внутрь фото. Если удалить файлы раньше, эта информация пропадет. Ваши фото останутся с датой скачивания, и вернуть данные можно будет только новым экспортом Takeout.
Безопасный порядок: перенести данные в фото, проверить несколько снимков, затем удалить файлы .json. Если вы импортируете фото в Immich или PhotoPrism, сохраните файлы до конца импорта, потому что эти программы умеют читать файлы-спутники. Короткий ответ — в статье можно ли удалить JSON-файлы Google Takeout.
Какие программы его читают?
Apple Фото, Windows и галереи на телефонах его не читают. Они смотрят только внутрь файла изображения. Google Фото тоже его не читает, если вы снова загрузите папку. Immich, PhotoPrism и некоторые другие программы для собственного сервера умеют читать файлы-спутники Takeout при импорте. Для всех остальных вариантов сначала запишите данные в фото.
Как вернуть данные в фото
Запись данных из файла-спутника в EXIF фото называют слиянием. С exiftool команду нужно запустить дважды, по разу для каждого окончания:
exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" "-DateTimeOriginal<PhotoTakenTimeTimestamp" -ext jpg -ext heic -overwrite_original .
exiftool -r -d %s -tagsfromfile "%d/%F.json" "-DateTimeOriginal<PhotoTakenTimeTimestamp" -ext jpg -ext heic -overwrite_original .
Затем выведите список фото, у которых даты все еще нет: exiftool -r -if 'not $DateTimeOriginal' -filename .. Оставшиеся — это обрезанные имена и файлы с (1). Проще всего короткой программой переименовать эти файлы-спутники в полное ожидаемое имя и снова запустить exiftool. Полная инструкция, с GPS и видео, — в статьях как перенести метаданные из JSON в фото и инструкция по exiftool.
GooglePhotosTakeoutHelper, бесплатная программа от сообщества, умеет находить такие пары сама. Ее обычно выбирают те, кому удобно работать в терминале. Ее новые версии иногда отстают от изменений Google, поэтому если программа пропускает файлы, загляните в ее список ошибок (issue tracker).
Приложение
Takeout JSON Metadata Fixer справляется со всеми этими случаями без настройки, на macOS, Windows и Linux.
Для каждого фото приложение пробует имя 2024 года, старое имя, перенесенный счетчик (1) и, наконец, любой .json в папке, имя которого совпадает с началом полного ожидаемого имени. Отредактированные копии берут файл-спутник оригинала. Затем приложение записывает в файл дату и GPS. Оно показывает, сколько фото нашли свой файл-спутник и сколько получили дату из EXIF или дату файла. Так вы видите, сработало ли сопоставление, еще до того, как что-то удалить. Пробный запуск показывает план и ничего не записывает. Первые 1000 фото бесплатно.
Частые вопросы
Отличается ли содержимое supplemental-metadata.json от старого .json?
Нет. Поля те же: title, photoTakenTime, creationTime, geoData, geoDataExif и так далее. Изменилось только имя файла.
У моего фото вообще нет файла-спутника. Почему?
У видеочасти Live Photo его часто нет. У некоторых очень старых загрузок его тоже нет. А если имя файла-спутника обрезано или счетчик в нем перенесен, программа может сообщить, что файла нет, хотя он на месте. Загляните в папку сами. Обычные причины перечислены в статье почему у некоторых фото нет JSON-файла (на английском).
Это вирус или шпионская программа?
Нет. Это обычный текстовый файл, который Google записывает в ваш собственный экспорт. Программного кода в нем нет.
Можно ли переименовать файлы-спутники в старый формат?
Да, и тогда старые скрипты снова заработают. Достаточно переименования, которое убирает .supplemental-metadata и возвращает (1) в часть имени с названием фото. Сначала сделайте это на копии.
Изменит ли Google имя снова?
Возможно. Надежный подход для любой программы — искать по началу имени и по полю title, а не по точному окончанию.