{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Лайвлупинг, медиапродакшн и все эти ваши компьютеры: заметки с тегом Linux",
    "_rss_description": "Алексей Батищев. Заметки обо всём, что происходит со мной и окружающим миром",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/batishchev.ru\/blog\/tags\/linux\/",
    "feed_url": "https:\/\/batishchev.ru\/blog\/tags\/linux\/json\/",
    "icon": "https:\/\/batishchev.ru\/blog\/pictures\/userpic\/userpic@2x.jpg?1604346823",
    "authors": [
        {
            "name": "Алексей Батищев",
            "url": "https:\/\/batishchev.ru\/blog\/",
            "avatar": "https:\/\/batishchev.ru\/blog\/pictures\/userpic\/userpic@2x.jpg?1604346823"
        }
    ],
    "items": [
        {
            "id": "76",
            "url": "https:\/\/batishchev.ru\/blog\/all\/kenk-iz-icloud-na-yandeks-disk\/",
            "title": "КЭНК: выгрузка фото из iCloud на Яндекс диск",
            "content_html": "<p>Технологии предоставляют людям всё больше готовых результатов, скрывая под капотом внутреннюю сложность и логику. Это здорово, потому что мы получаем кучу услуг и сервисов, не прилагая к этому усилий. Это плохо, потому что мы не управляем этими услугами, можем лишиться их в любой момент и, если не предпринимать дополнительных мер, не сможем ничего тут исправить.<\/p>\n<p>Например, иг — попробуйте штатными средствами, положенными по закону, выгрузить свои данные — и через боль и неудобства вы сможете сохранить жалкое подобие архива, а как красиво всё смотрится пока работает. Увели у вас аккаунт, заблокировали по какой-то уважительной для роботов причине — вы абсолютно беззащитны перед произволом обстоятельств и желаниями компании.<\/p>\n<p>Сегодняшний рассказ — о сервисе, который достался «забесплатно», но потом перестал работать, и о том как я добился получения привычного результата уже своими силами.<\/p>\n<h2>Что случилось и кто виноват<\/h2>\n<p>В мире победившей вычислительной фотографии я уже много лет снимаю на телефон и веду архив фото на телефоне. Это удобно, и всё связанное с повседневным фото завязано у меня на экосистему Apple. Однако, было бы глупо полагаться только на одного вендора, да и вручную выдёргивать фото из Apple для резервной копии не самый удобный вариант, поэтому как только Яндекс запустил фичу автоматической синхронизации фотографий на Яндекс.Диск, я сразу же начал ей пользоваться.<\/p>\n<p>Вышло удобно:<\/p>\n<ul>\n<li>фотографирую на телефон или планшет, имею синхронизированные фотки на всех личных устройствах и ноуте (на разных платформах приложение называется по разному, буду дальше использовать термин Айклауд как синоним определения «ну где там у эпплов всё лежит и красиво синхронизируется и показывается на всех девайсах»).<\/li>\n<li>Сразу после съемки или по напоминанию отмечаю в Айклауде сердечком лучшие фото и удаляю откровенный брак и шлак, на телефоне остаются материалы лучшие и «пусть просто для архива»<\/li>\n<li>Всё это время полное зеркало всех фото и видео с телефона автоматически синхронизируется с папкой Фотокамера в Яндекс диске (а она уже в свою очередь бэкапится как надо на NAS)<\/li>\n<li>раз в 2-3 месяца провожу чистку:<\/li>\n<\/ul>\n<ol>\n<li>захожу в айклауд через приложение на ноуте или телефоне,<\/li>\n<li>скрываю все избранные (Library — альбом Favourites —  ⌘A — hide items),<\/li>\n<li>стираю все оставшиеся нескрытые (и не лайканые) фотки (Library — альбом photos — ⌘A — delete items),<\/li>\n<li>возвращаю все скрытые обратно (Library — альбом Hidden — ⌘A — unhide items)<\/li>\n<\/ol>\n<ul>\n<li>переношу все фотки из папки Фотокамера Яндекс диска в долговременный архив, Яндекс на телефоне сам синхронизируется и обратно заливает в фотокамеру только избранные фотографии<\/li>\n<\/ul>\n<p>Таким образом я всегда имею две копии актуальных фоток (избранные + недавно сделанные) на яндексе и в айклауде, а также легко регулярно очищаю хранилище на устройствах от ненужных данных, оставляя только лучшие. Также благодаря этому умные алгоритмы Apple и Яндекса генерят мне истории и ролики-воспоминания на основе лучших фото и видео из поездок, с важных событий и тому подобное.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/batishchev.ru\/blog\/pictures\/2020-12-27-11.42.18.jpg\" width=\"722\" height=\"554\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Красиво переименованные и уложенные яндексдиском файлы<\/div>\n<\/div>\n<p>Схема удобная, и работала она несколько лет, пока не случилась та самая упомянутая ранее потеря сервиса. В какой-то момент Яндекс поменял логику работы мобильного приложения — весной при очередной чистке я обнаружил, что он больше не перезакачивает в папку Фотокамера файлы, которые ранее в ней были, и после были мной удалены. Похоже что у себя они хранят хэши всех файлов, так как отредактированные после фотки в диск при такой схеме перезаливаются. Но неизменные — нет, а значит я больше не мог проводить синхронизацию лучших фото при регулярной чистке.<\/p>\n<p>В принципе, потеря небольшая, просто весь 2020-й Яндекс диск скидывал мне напоминания о событиях 19-го. Тем не менее, это натолкнуло меня на мысль о том, что случись что — у меня есть полный архив всех фото включая самые свежие, но архива лучших нет! На отбор их потрачено время, и теперь сведения этого отбора не защищены от потери.<\/p>\n<p>Казалось бы, чего тут сложного? Берём штатный способ выгрузки из Айклауда, сохраняем в папку избранные данные за нужный период — вуаля. Но тут вскрывается второй упомянутый ранее аспект — скрытая под капотом сложность.<\/p>\n<p>Айклауд (как и Яндекс) красиво показывает в ленте фото по датам и местам, умеет на основе этой метаинформации собирать истории и альбомы. При этом на уровне файлов творится дикая дичь — в зависимости от источника (фото сделано на телефон, сохранено из мессенджера, проявлено в Лайтруме на компе и прислано по почте, это скриншот экрана или сохранёнка с веб страницы), а также от типа файла (разные форматы видео и графики), метаданные о времени съемки, локации и другом хранятся в разных полях по разной логике. И вот выгруженные штатными средствами файлы именуются непонятно как, имеют странные даты съемки (ещё и отображаемые по-разному в зависимости от программы просмотра) — в общем никакой красоты, удобства и единообразия тут нет.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/batishchev.ru\/blog\/pictures\/2020-12-27-11.48.08.jpg\" width=\"1217.598097503\" height=\"800\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Выгрузка из Айклауда. Ад и мешанина в именах, атрибутах и метаданных файлов. Дата съемки видео якобы неизвестна (но она есть, просто зашита глубоко)<\/div>\n<\/div>\n<p>В логику работы Айклауда все эти тонкости зашиты. В логику работы яндекса тоже — мобильное приложение при синхронизации переименовывает файлы по дате правильно, сохраняет геолокацию и всё прочее. Но теперь-то воспользоваться этой логикой яндекса мы не можем.<\/p>\n<h2>Что делать<\/h2>\n<p>Проводим НИР, применяем для решения задачи великий и могучий ExifTool. Общая схема такая:<\/p>\n<ul>\n<li>экспортируем данные из macOS Photo в оригинальном качестве и с записью дополнительных файлов xmp<\/li>\n<li>пробиваем с помощью ExifTool метаданные из xmp в медиафайлы<\/li>\n<li>проходимся по файлам набором команд ExifTool с разными параметрами в зависимости от типа файла и сохранённых в нём данных, чтобы переименовать их по дате<\/li>\n<li>раскладываем полученные файлы по каталогам дат (для удобства)<\/li>\n<\/ul>\n<p>Собственно, на понимание того, в каких случаях как может храниться дата съемки, и экспериментальный подбор команд для третьего пункта, и ушло несколько часов этой субботы<\/p>\n<p>Зато теперь есть способ выгрузить лучшие материалы из Айклауда и разложить их красиво с сохранением метаданных, в том числе и положить в Яндекс диск для бэкапа и красивостей. Вторичная выгода — прокачка скилла и овладение инструментом ExifTool и скриптования на bash под macOS, теперь эти ваши экзифы и переименования файлов можем делать с закрытыми глазами и одной левой<\/p>\n<h2>Итог<\/h2>\n<p>Итоговый скрипт достаточно специфичен, чтобы его публиковать и отчуждать, но для истории сохраню здесь.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\"># экспортируем фотки из macOS Photo в оригинальном качестве и с записью xmp, открываем терминал в этот каталог\n\n# далее пробиваем параметры из xmp в графические файлы\nfind . -maxdepth 1  -not -iname &quot;*.xmp&quot; -exec bash -c 'file=&quot;{}&quot;; xmpname=${file%.*}.xmp; echo &quot;$xmpname&quot;; echo &quot;$file&quot;; exiftool -tagsfromfile &quot;$xmpname&quot; -xmp &quot;$file&quot; -overwrite_original' \\;\n\n# пробиваем атрибуты и переименовываем файлы по дате в зависимости от типа и содержимого\n\nexiftool '-FileModifyDate&lt;TrackCreateDate' '-FileName&lt;TrackCreateDate' -d &quot;%Y-%m-%d %H-%M-%S.%%f.%%e&quot; *.mov -directory=out\nexiftool '-FileModifyDate&lt;TrackCreateDate' '-FileName&lt;TrackCreateDate' -d &quot;%Y-%m-%d %H-%M-%S.%%f.%%e&quot; *.mp4 -directory=out\n\nexiftool -v '-Filename&lt;${datetimeoriginal}.%f.%e' -d &quot;%Y-%m-%d %H-%M-%S&quot; *.jpg -directory=out -if '($datetimeoriginal and (not ($datetimeoriginal eq &quot;0000:00:00 00:00:00&quot;))) and ($filetype eq &quot;JPEG&quot;)' \nexiftool -v '-Filename&lt;${datetimeoriginal}.%f.%e' -d &quot;%Y-%m-%d %H-%M-%S&quot; *.jpeg -directory=out -if '($datetimeoriginal and (not ($datetimeoriginal eq &quot;0000:00:00 00:00:00&quot;))) and ($filetype eq &quot;JPEG&quot;)' \nexiftool -v '-Filename&lt;${DateCreated}.%f.%e' -d &quot;%Y-%m-%d %H-%M-%S&quot; *.jpeg -directory=out -if '($DateCreated and (not ($DateCreated eq &quot;0000:00:00 00:00:00&quot;))) and ($filetype eq &quot;JPEG&quot;)'\nexiftool -v '-Filename&lt;${DateCreated}.%f.%e' -d &quot;%Y-%m-%d %H-%M-%S&quot; *.jpg -directory=out -if '($DateCreated and (not ($DateCreated eq &quot;0000:00:00 00:00:00&quot;))) and ($filetype eq &quot;JPEG&quot;)'\n\n\nexiftool -v '-Filename&lt;${datetimeoriginal}.%f.%e' -d &quot;%Y-%m-%d %H-%M-%S&quot; *.heic -directory=out -if '($datetimeoriginal and (not ($datetimeoriginal eq &quot;0000:00:00 00:00:00&quot;)))'\n\nexiftool -v '-Filename&lt;${datetimeoriginal}.%f.%e' -d &quot;%Y-%m-%d %H-%M-%S&quot; *.png -directory=out -if '($datetimeoriginal and (not ($datetimeoriginal eq &quot;0000:00:00 00:00:00&quot;)))'\nexiftool -v '-Filename&lt;${DateCreated}.%f.%e' -d &quot;%Y-%m-%d %H-%M-%S&quot; *.png -directory=out -if '($DateCreated and (not ($DateCreated eq &quot;0000:00:00 00:00:00&quot;)))'\n\nexiftool -v '-Filename&lt;${datetimeoriginal}.%f.%e' -d &quot;%Y-%m-%d %H-%M-%S&quot; *.gif -directory=out -if '($datetimeoriginal and (not ($datetimeoriginal eq &quot;0000:00:00 00:00:00&quot;))) and ($filetype eq &quot;GIF&quot;)' \nexiftool -v '-Filename&lt;${DateCreated}.%f.%e' -d &quot;%Y-%m-%d %H-%M-%S&quot; *.gif -directory=out -if '($DateCreated and (not ($DateCreated eq &quot;0000:00:00 00:00:00&quot;))) and ($filetype eq &quot;GIF&quot;)'\n\n# Чистим xmp\nrm -f .\/*.xmp\n\n# перекладываем файлы в папки YYYY\/YYYY-MM\/\ncd out\nfind . -maxdepth 1  -type f -exec bash -c 'file=$(basename &quot;{}&quot;); yearname=${file:0:4}; monthname=${file:5:2}; pathname=&quot;$yearname\/$yearname-$monthname&quot;; mkdir -p &quot;$pathname&quot;; echo &quot;$pathname&quot;; mv &quot;$file&quot; &quot;$pathname&quot;\/ ' \\;<\/code><\/pre><p>Полезные ссылки по теме<\/p>\n<ul>\n<li><a href=\"https:\/\/exiftool.org\/metafiles.html\">https:\/\/exiftool.org\/metafiles.html<\/a><\/li>\n<li><a href=\"https:\/\/gist.github.com\/rjames86\/33b9af12548adf091a26\">https:\/\/gist.github.com\/rjames86\/33b9af12548adf091a26<\/a><\/li>\n<li><a href=\"https:\/\/ninedegreesbelow.com\/photography\/exiftool-commands.html\">https:\/\/ninedegreesbelow.com\/photography\/exiftool-commands.html<\/a><\/li>\n<li><a href=\"https:\/\/www.polaine.com\/2015\/01\/fixing-photo-and-video-file-metadata-with-exiftool\/\">https:\/\/www.polaine.com\/2015\/01\/fixing-photo-and-video-file-metadata-with-exiftool\/<\/a><\/li>\n<\/ul>\n<p>КЭНК!<br \/>\nСлава роботам!<\/p>\n",
            "date_published": "2020-12-27T12:13:08+03:00",
            "date_modified": "2022-10-11T23:18:52+03:00",
            "tags": [
                "Linux",
                "КЭНК",
                "Яндекс.Диск"
            ],
            "image": "https:\/\/batishchev.ru\/blog\/pictures\/2020-12-27-11.42.18.jpg",
            "_date_published_rfc2822": "Sun, 27 Dec 2020 12:13:08 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "76",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/batishchev.ru\/blog\/pictures\/2020-12-27-11.42.18.jpg",
                    "https:\/\/batishchev.ru\/blog\/pictures\/2020-12-27-11.48.08.jpg"
                ]
            }
        },
        {
            "id": "70",
            "url": "https:\/\/batishchev.ru\/blog\/all\/cockpit-v-centos-8\/",
            "title": "Cockpit в CentOS 8",
            "content_html": "<p>Будучи Ветераном Этих Ваших Комплюктеров, всегда забивал на приветственные «знаете ли вы» различных программ и систем. Ну во-первых, камон, чему меня человека может научить какая-то там софтина. А во-вторых, мне надо будет — сам в документации посмотрю.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/batishchev.ru\/blog\/pictures\/photo_2020-12-10-22.44.15@2x.jpg\" width=\"640\" height=\"431\" alt=\"\" \/>\n<\/div>\n<p>А сегодня вот логинясь по совершенно другим делам в свежий тестовый CentOS 8, зацепился глазом за совет сделать вкл какому-то там «cockpit.socket», загуглил обо что это всё, попробовал — и открылась мне, всезнающему, целая новая непривычная парадигма управления линукс серверами через веб консоль, да ещё и встроенная вот так вот в минимальный дистрибутив.<\/p>\n<p>Век живи, век учись, и тому у кого и как учиться — тоже учись.<\/p>\n",
            "date_published": "2020-12-12T15:32:30+03:00",
            "date_modified": "2025-04-14T12:23:18+03:00",
            "tags": [
                "Linux",
                "безопационная информасность",
                "все эти ваши компьютеры"
            ],
            "image": "https:\/\/batishchev.ru\/blog\/pictures\/photo_2020-12-10-22.44.15@2x.jpg",
            "_date_published_rfc2822": "Sat, 12 Dec 2020 15:32:30 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "70",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/batishchev.ru\/blog\/pictures\/photo_2020-12-10-22.44.15@2x.jpg"
                ]
            }
        },
        {
            "id": "2793",
            "url": "https:\/\/batishchev.ru\/blog\/all\/2013-04-05-15-50-19\/",
            "title": "Админский феншуй",
            "content_html": "<p>📍 Location: <a href=\"https:\/\/maps.google.com\/maps?q=57.7654783691,40.931469501&amp;ll=57.7654783691,40.931469501\" target=\"_blank\">Kostroma<\/a><\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/batishchev.ru\/blog\/pictures\/260070279_427337480635966374_2013-04-05_11-50-19.jpg\" width=\"612\" height=\"612\" alt=\"\" \/>\n<\/div>\n<p>Админский феншуй #root #linux #russia #sysgod #васяездитпопланете #васяездитпоруси<\/p>\n",
            "date_published": "2013-04-05T14:50:19+03:00",
            "date_modified": "2025-07-10T17:16:54+03:00",
            "tags": [
                "ig",
                "Linux",
                "russia",
                "васяездитпопланете",
                "васяездитпоруси",
                "посты из иг"
            ],
            "image": "https:\/\/batishchev.ru\/blog\/pictures\/260070279_427337480635966374_2013-04-05_11-50-19.jpg",
            "_date_published_rfc2822": "Fri, 05 Apr 2013 14:50:19 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2793",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/batishchev.ru\/blog\/pictures\/260070279_427337480635966374_2013-04-05_11-50-19.jpg"
                ]
            }
        }
    ],
    "_e2_version": 4171,
    "_e2_ua_string": "Aegea 11.4 (v4171)"
}