← на главную
2 заметки с тегом

Яндекс.Диск

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

В прошлой серии велосипедостроения на тему переноса фоток в Яндекс.Диск была успешно решена проблема выгрузки и переименовывания файлов из iCloud в соответствии с датой. Однако, опыт эксплуатации процедуры показал её недостаток: перенесенные таким образом файлы *.heic Ядиском не располагались по альбомам в соответствии с датой, а сваливались в одну кучу дня импортирования.

Пара вечеров была потрачена на анализ и сравнение *.heic файлов, импортированных яндексом с телефона самостоятельно, и обработанных мной вручную. К сожалению, никакого способа поправить теги даты так, чтобы яндекс их воспринял, не нашлось: изменения внесенные exiftool или гуевыми программами типа XnView или FastStone результата не давали. Я заморочился, сравнил файлы преобразованные яндексом и свои, добился полного совпадения полей в выгрузке exiftool — и всё равно роботы яндекса делать красоту отказывались. Поэтому с *.heic файлами придуман обходной путь — конвертировать их в jpeg (те же теги, пробитые в jpeg, срабатывали отлично)

Заодно кстати выяснилось, что яндексу важны метаданные в поле DateTimeOriginal: файлы с корректно заполненными DateCreated но не заполненными DateTimeOriginal он также датировал неправильно.

Так вот, конвертация из heic в jpeg. Тут мне открылся неведомый мир цветовых профилей и прочих тонкостей. Оказалось что эппле пишет heic со своим чудо-профилем, который мало кто понимает и корректно показывает. Все распространённые свободные конверторы в джипег на выходе дают гораздо более бледные и светлые картинки, при этом встроенный просмотрщик macOS эти файлы показывает в исходном красивом цвете, а вот в других программах и на других платформах случается «ой». Перелопачена уйма форумов, нужное колдунство найдено — нужно не просто конвертировать heic в jpeg, но ещё и заменять цветовой профиль, а также корректировать гамму (значение корректировки я подобрал на глаз более-менее похожим, возможно тут будут нюансы на фотках разных насыщенностей)

Вот что выходит с разными конвертациями и (что важно) при разных программах просмотра:

оригинальный heic в Preview macOS, конверченный ImageMagick jpeg без коррекции цвета в Preview macOS, он же в XnView, jpeg с коррекцией цвета в Preview macOS и в XnView

Хорош рассусоливать, что вышло-то?

Итоговая на текущий момент процедура конвертации такова:

  • перегнать все heic в jpeg при помощи ImageMagick, заменяя цветовой профиль на sRGB.icc и цветовое пространство на sRGB и корректируя гамму, стереть оригиналы
  • пробить во все экспортированные файлы (и в том числе в джипеги, конвертированные из heic) метаданные из *.xmp
  • видосикам пробить FileModifyDate из TrackCreateDate и переименовать
  • там где у картинок DateTimeOriginal задан — переименовать файлы в соответствии с датой
  • там где у картинок DateTimeOriginal не задан — пробить его из DateCreated и переименовать файлы в соответствии с датой

Обработанные таким образом медиаматериалы корректно раскладываются яндекс диском в альбомы по времени и геолокации. Косяки и нюансы

  • не раскладываются по датам PNG (у меня это на 100% скриншоты) — ну да от них участия в генерации памятных сторис и прочей красоты не требуется.
  • heic с Live Photos внутри конвертируются в два файла: картинка с дефолтным кадром и микро-mp4 с полной анимацией. Не парит опять же.

В полном соответствии с методологией КЭНК и принципами Hobby-as-Code процедура собрана в shell скрипт, ознакомиться с которым можно на github (уберите от консоли беременных детей и женщин): https://github.com/alexbatishchev/kenk-yadisk-photomaster

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

 Нет комментариев    27   5 мес   bash   все эти ваши компьютеры   КЭНК   Яндекс.Диск

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

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

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

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

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

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

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

  • фотографирую на телефон или планшет, имею синхронизированные фотки на всех личных устройствах и ноуте (на разных платформах приложение называется по разному, буду дальше использовать термин Айклауд как синоним определения «ну где там у эпплов всё лежит и красиво синхронизируется и показывается на всех девайсах»).
  • Сразу после съемки или по напоминанию отмечаю в Айклауде сердечком лучшие фото и удаляю откровенный брак и шлак, на телефоне остаются материалы лучшие и «пусть просто для архива»
  • Всё это время полное зеркало всех фото и видео с телефона автоматически синхронизируется с папкой Фотокамера в Яндекс диске (а она уже в свою очередь бэкапится как надо на NAS)
  • раз в 2-3 месяца провожу чистку:
  1. захожу в айклауд через приложение на ноуте или телефоне,

2. скрываю все избранные (Library — альбом Favourites — ⌘A — hide items),

  1. стираю все оставшиеся нескрытые (и не лайканые) фотки (Library — альбом photos — ⌘A — delete items),
  2. возвращаю все скрытые обратно (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"/ ' \;

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

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

 Нет комментариев    27   7 мес   Linux   КЭНК   Яндекс.Диск