Как я превратил ChatGPT в разработчика утилиты для Mac и перестал искать конвертеры изображений
VLADISLAV KASATKIN
Как я превратил ChatGPT в разработчика утилиты для Mac и перестал искать конвертеры изображений
Automation

Как я превратил ChatGPT в разработчика утилиты для Mac и перестал искать конвертеры изображений

VK
Владислав Касаткин
AI Specialist
7 Июня, 20267 мин.

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

У меня такой задачей оказалась конвертация изображений в WebP.

Периодически для статей, сайтов или проектов мне нужно переводить JPEG, PNG и иногда даже RAW-файлы в WebP. Обычно сценарий выглядит одинаково: открыть какой-нибудь онлайн-конвертер, загрузить файлы, дождаться обработки, скачать результат. Иногда ещё посмотреть рекламу очередного сервиса, который обещает «революцию в работе с изображениями».

Работает. Но раздражает.

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

Раньше я бы открыл Google.

Нашёл бы несколько статей, потом документацию cwebp, потом обсуждение на Reddit или Stack Overflow, потом начал бы собирать решение по кускам. Ничего сложного, но времени это всегда съедает больше, чем кажется.

На этот раз я просто открыл ChatGPT.

От идеи до рабочего инструмента

Сначала задача выглядела максимально просто:

«Хочу выделять изображения в Finder и конвертировать их в WebP через Automator».

На этом этапе модель предложила несколько вариантов реализации. Часть из них оказалась неудобной. Один вариант вообще не заработал на моей конфигурации Mac.

Это нормально.

Именно тут мне нравится формат диалога. Не нужно возвращаться в поисковик и искать новую статью. Можно показать ошибку, объяснить ограничения и продолжить двигаться дальше.

Через несколько итераций появился рабочий скрипт.

Причём по дороге задача немного изменилась. Сначала речь шла только про JPEG, потом захотелось поддержку PNG, потом HEIC, а потом я подумал: если уж делать, то почему бы не добавить RAW-файлы с камеры.

Так обычно и выглядит разработка собственных инструментов.

Почему в основе оказался cwebp

Саму конвертацию выполняет утилита cwebp от Google.

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

Первое, что делает скрипт — пытается найти установленный cwebp в системе.

Check for cwebp path
bash
if [ -x "/opt/homebrew/bin/cwebp" ]; then
  CWEBP="/opt/homebrew/bin/cwebp"
elif [ -x "/usr/local/bin/cwebp" ]; then
  CWEBP="/usr/local/bin/cwebp"
else
  CWEBP="$(which cwebp 2>/dev/null)"
fi

Тут нет никакой магии.

На Apple Silicon Homebrew обычно ставит программы в /opt/homebrew/bin, на старых Intel Mac путь чаще выглядит как /usr/local/bin. Если ни один вариант не найден, скрипт пытается определить расположение через which.

Если cwebp отсутствует, работа просто прекращается.

Exit if not found
bash
if [ -z "$CWEBP" ] || [ ! -x "$CWEBP" ]; then
  exit 1
fi

Лучше остановиться сразу, чем получить десяток непонятных ошибок позже.

Самая интересная часть — работа с разными форматами

Дальше начинается логика обработки файлов.

Для JPEG и PNG всё довольно прямолинейно: берём изображение и передаём его в cwebp.

Но тут появилась проблема.

RAW-форматы вроде CR2, NEF, ARW или DNG напрямую конвертировать нельзя. То же касается HEIC и HEIF.

Поэтому для таких файлов я сначала создаю временный PNG через встроенную утилиту macOS sips, а уже потом отправляю его в cwebp.

Handle RAW and HEIC/HEIF
bash
if [[ "$ext" =~ ^(heic|heif|cr2|nef|arw|rw2|orf|dng)$ ]]; then
  TMPPNG="$(mktemp /tmp/XXXXXX.png)"
  sips -s format png "$file" --out "$TMPPNG"
  "$CWEBP" -q 80 "$TMPPNG" -o "$out"
  rm "$TMPPNG"
fi

Когда этот кусок заработал, я немного обрадовался.

Потому что из задачи «конвертировать JPEG» внезапно получился инструмент, который умеет работать почти со всеми изображениями, которые обычно встречаются у меня в работе.

Почему скрипт умеет обрабатывать папки

Следующая мысль возникла почти сразу.

Если уж запускать Automator, то почему бы не дать ему папку целиком.

Для этого скрипт проверяет, что именно ему передали: файл или директорию.

Если это папка, он рекурсивно проходит по содержимому через find.

Recursive folder search
bash
find "$input" -type f \( \
  -iname "*.jpg" -o -iname "*.jpeg" \
  -o -iname "*.png" \
  -o -iname "*.heic" \
  -o -iname "*.heif" \
  -o -iname "*.cr2" \
  -o -iname "*.nef" \
  -o -iname "*.arw" \
  -o -iname "*.rw2" \
  -o -iname "*.orf" \
  -o -iname "*.dng" \
\)

То есть можно бросить внутрь целую папку с фотографиями после съёмки и получить рядом набор готовых WebP-файлов.

Без ручной обработки каждого изображения.

Что получилось в итоге

В результате у меня появился обычный Quick Action в Automator.

Я выделяю один файл или целую папку в Finder, нажимаю правой кнопкой мыши и запускаю действие. Через несколько секунд рядом появляются готовые WebP-версии.

Никаких сайтов.

Никаких загрузок.

Никаких подписок на сервисы для выполнения операции длительностью примерно пять секунд.

Самое забавное, что итоговый инструмент получился полезнее, чем исходная задача.

Почему для меня это важнее самого скрипта

Если посмотреть на эту историю со стороны, речь вообще не про WebP.

И даже не про Automator.

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

Теперь между идеей и реализацией всё чаще появляется диалог.

Можно обсуждать варианты, уточнять требования, получать код, исправлять ошибки и постепенно превращать абстрактную задачу в работающий инструмент.

И мне кажется, это одна из самых недооценённых возможностей современных языковых моделей.

Не потому что они знают ответы на все вопросы.

А потому что они позволяют гораздо чаще проверять мысль: «Интересно, а можно ли сделать это по-другому?»

В эпоху ИИ любознательность начинает приносить всё больше дивидендов. Очень многие привычные действия всё ещё делаются по инерции — просто потому, что мы привыкли именно так. И чем чаще задаёшь себе вопрос про альтернативный способ решения задачи, тем чаще оказывается, что между «было бы удобно» и «уже работает» теперь расстояние всего в один разговор.