Pacix Labs

Фото

Як об'єднати JSON-файли Google Takeout із фото (і виправити неправильні дати)

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

· 6 хв читання

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

Ви завантажили свою бібліотеку Google Фото через Google Takeout. Тепер у вас тисячі фотографій поруч із тисячами файлів .json, а переглядач стверджує, що знімок 2019 року зроблено вчора. Щоб це виправити, треба об'єднати кожен 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).

Чотири безкоштовні програми і дата, яку виправляє кожна

Фотографія має два види дати. Дата 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. Без додаткових програм: клацніть фото правою кнопкою і виберіть «Отримати інфо» на Mac або «Властивості» у Windows. Після вдалого об'єднання ви маєте побачити правильну дату зйомки, 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-архіви?

Так, доки об'єднану бібліотеку не перевірено і у вас немає ще однієї резервної копії. Деякі програми переміщують файли, а не копіюють, і архіви — єдиний спосіб почати спочатку.

Джерела