← на главную

Алексей Батищев. Заметки обо всём, что происходит со мной и окружающим миром

Избранное в блоге: мои фото- и видеоработы, забрать своё из облаков, КЭНК

КЭНК: выгрузка фото из iCloud на Яндекс диск

Технологии предоставляют людям всё больше готовых результатов, скрывая под капотом внутреннюю сложность и логику. Это здорово, потому что мы получаем кучу услуг и сервисов, не прилагая к этому усилий. Это плохо, потому что мы не управляем этими услугами, можем лишиться их в любой момент и, если не предпринимать дополнительных мер, не сможем ничего тут исправить.

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

Сегодняшний рассказ — о сервисе, который достался «забесплатно», но потом перестал работать, и о том как я добился получения привычного результата уже своими силами.

Что случилось и кто виноват

В мире победившей вычислительной фотографии я уже много лет снимаю на телефон и веду архив фото на телефоне. Это удобно, и всё связанное с повседневным фото завязано у меня на экосистему Apple. Однако, было бы глупо полагаться только на одного вендора, да и вручную выдёргивать фото из Apple для резервной копии не самый удобный вариант, поэтому как только Яндекс запустил фичу автоматической синхронизации фотографий на Яндекс.Диск, я сразу же начал ей пользоваться.

Вышло удобно:

  • фотографирую на телефон или планшет, имею синхронизированные фотки на всех личных устройствах и ноуте (на разных платформах приложение называется по разному, буду дальше использовать термин Айклауд как синоним определения «ну где там у эпплов всё лежит и красиво синхронизируется и показывается на всех девайсах»).
  • Сразу после съемки или по напоминанию отмечаю в Айклауде сердечком лучшие фото и удаляю откровенный брак и шлак, на телефоне остаются материалы лучшие и «пусть просто для архива»
  • Всё это время полное зеркало всех фото и видео с телефона автоматически синхронизируется с папкой Фотокамера в Яндекс диске (а она уже в свою очередь бэкапится как надо на NAS)
  • раз в 2-3 месяца провожу чистку:
  1. захожу в айклауд через приложение на ноуте или телефоне,
  2. скрываю все избранные (Library — альбом Favourites — ⌘A — hide items),
  3. стираю все оставшиеся нескрытые (и не лайканые) фотки (Library — альбом photos — ⌘A — delete items),
  4. возвращаю все скрытые обратно (Library — альбом Hidden — ⌘A — unhide items)
  • переношу все фотки из папки Фотокамера Яндекс диска в долговременный архив, Яндекс на телефоне сам синхронизируется и обратно заливает в фотокамеру только избранные фотографии

Таким образом я всегда имею две копии актуальных фоток (избранные + недавно сделанные) на яндексе и в айклауде, а также легко регулярно очищаю хранилище на устройствах от ненужных данных, оставляя только лучшие. Также благодаря этому умные алгоритмы Apple и Яндекса генерят мне истории и ролики-воспоминания на основе лучших фото и видео из поездок, с важных событий и тому подобное.

Красиво переименованные и уложенные яндексдиском файлы

Схема удобная, и работала она несколько лет, пока не случилась та самая упомянутая ранее потеря сервиса. В какой-то момент Яндекс поменял логику работы мобильного приложения — весной при очередной чистке я обнаружил, что он больше не перезакачивает в папку Фотокамера файлы, которые ранее в ней были, и после были мной удалены. Похоже что у себя они хранят хэши всех файлов, так как отредактированные после фотки в диск при такой схеме перезаливаются. Но неизменные — нет, а значит я больше не мог проводить синхронизацию лучших фото при регулярной чистке.

В принципе, потеря небольшая, просто весь 2020-й Яндекс диск скидывал мне напоминания о событиях 19-го. Тем не менее, это натолкнуло меня на мысль о том, что случись что — у меня есть полный архив всех фото включая самые свежие, но архива лучших нет! На отбор их потрачено время, и теперь сведения этого отбора не защищены от потери.

Казалось бы, чего тут сложного? Берём штатный способ выгрузки из Айклауда, сохраняем в папку избранные данные за нужный период — вуаля. Но тут вскрывается второй упомянутый ранее аспект — скрытая под капотом сложность.

Айклауд (как и Яндекс) красиво показывает в ленте фото по датам и местам, умеет на основе этой метаинформации собирать истории и альбомы. При этом на уровне файлов творится дикая дичь — в зависимости от источника (фото сделано на телефон, сохранено из мессенджера, проявлено в Лайтруме на компе и прислано по почте, это скриншот экрана или сохранёнка с веб страницы), а также от типа файла (разные форматы видео и графики), метаданные о времени съемки, локации и другом хранятся в разных полях по разной логике. И вот выгруженные штатными средствами файлы именуются непонятно как, имеют странные даты съемки (ещё и отображаемые по-разному в зависимости от программы просмотра) — в общем никакой красоты, удобства и единообразия тут нет.

Выгрузка из Айклауда. Ад и мешанина в именах, атрибутах и метаданных файлов. Дата съемки видео якобы неизвестна (но она есть, просто зашита глубоко)

В логику работы Айклауда все эти тонкости зашиты. В логику работы яндекса тоже — мобильное приложение при синхронизации переименовывает файлы по дате правильно, сохраняет геолокацию и всё прочее. Но теперь-то воспользоваться этой логикой яндекса мы не можем.

Что делать

Проводим НИР, применяем для решения задачи великий и могучий ExifTool. Общая схема такая:

  • экспортируем данные из macOS Photo в оригинальном качестве и с записью дополнительных файлов xmp
  • пробиваем с помощью ExifTool метаданные из xmp в медиафайлы
  • проходимся по файлам набором команд ExifTool с разными параметрами в зависимости от типа файла и сохранённых в нём данных, чтобы переименовать их по дате
  • раскладываем полученные файлы по каталогам дат (для удобства)

Собственно, на понимание того, в каких случаях как может храниться дата съемки, и экспериментальный подбор команд для третьего пункта, и ушло несколько часов этой субботы

Зато теперь есть способ выгрузить лучшие материалы из Айклауда и разложить их красиво с сохранением метаданных, в том числе и положить в Яндекс диск для бэкапа и красивостей. Вторичная выгода — прокачка скилла и овладение инструментом ExifTool и скриптования на bash под macOS, теперь эти ваши экзифы и переименования файлов можем делать с закрытыми глазами и одной левой

Итог

Итоговый скрипт достаточно специфичен, чтобы его публиковать и отчуждать, но для истории сохраню здесь.

# экспортируем фотки из macOS Photo в оригинальном качестве и с записью xmp, открываем терминал в этот каталог

# далее пробиваем параметры из xmp в графические файлы
find . -maxdepth 1  -not -iname "*.xmp" -exec bash -c 'file="{}"; xmpname=${file%.*}.xmp; echo "$xmpname"; echo "$file"; exiftool -tagsfromfile "$xmpname" -xmp "$file" -overwrite_original' \;

# пробиваем атрибуты и переименовываем файлы по дате в зависимости от типа и содержимого

exiftool '-FileModifyDate<TrackCreateDate' '-FileName<TrackCreateDate' -d "%Y-%m-%d %H-%M-%S.%%f.%%e" *.mov -directory=out
exiftool '-FileModifyDate<TrackCreateDate' '-FileName<TrackCreateDate' -d "%Y-%m-%d %H-%M-%S.%%f.%%e" *.mp4 -directory=out

exiftool -v '-Filename<${datetimeoriginal}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.jpg -directory=out -if '($datetimeoriginal and (not ($datetimeoriginal eq "0000:00:00 00:00:00"))) and ($filetype eq "JPEG")' 
exiftool -v '-Filename<${datetimeoriginal}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.jpeg -directory=out -if '($datetimeoriginal and (not ($datetimeoriginal eq "0000:00:00 00:00:00"))) and ($filetype eq "JPEG")' 
exiftool -v '-Filename<${DateCreated}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.jpeg -directory=out -if '($DateCreated and (not ($DateCreated eq "0000:00:00 00:00:00"))) and ($filetype eq "JPEG")'
exiftool -v '-Filename<${DateCreated}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.jpg -directory=out -if '($DateCreated and (not ($DateCreated eq "0000:00:00 00:00:00"))) and ($filetype eq "JPEG")'


exiftool -v '-Filename<${datetimeoriginal}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.heic -directory=out -if '($datetimeoriginal and (not ($datetimeoriginal eq "0000:00:00 00:00:00")))'

exiftool -v '-Filename<${datetimeoriginal}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.png -directory=out -if '($datetimeoriginal and (not ($datetimeoriginal eq "0000:00:00 00:00:00")))'
exiftool -v '-Filename<${DateCreated}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.png -directory=out -if '($DateCreated and (not ($DateCreated eq "0000:00:00 00:00:00")))'

exiftool -v '-Filename<${datetimeoriginal}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.gif -directory=out -if '($datetimeoriginal and (not ($datetimeoriginal eq "0000:00:00 00:00:00"))) and ($filetype eq "GIF")' 
exiftool -v '-Filename<${DateCreated}.%f.%e' -d "%Y-%m-%d %H-%M-%S" *.gif -directory=out -if '($DateCreated and (not ($DateCreated eq "0000:00:00 00:00:00"))) and ($filetype eq "GIF")'

# Чистим xmp
rm -f ./*.xmp

# перекладываем файлы в папки YYYY/YYYY-MM/
cd out
find . -maxdepth 1  -type f -exec bash -c 'file=$(basename "{}"); yearname=${file:0:4}; monthname=${file:5:2}; pathname="$yearname/$yearname-$monthname"; mkdir -p "$pathname"; echo "$pathname"; mv "$file" "$pathname"/ ' \;

Полезные ссылки по теме

КЭНК!
Слава роботам!