---
name: video-eyes
description: >
  Анализ видео (YouTube, Instagram Reels, TikTok, Shorts, Loom) кадр за кадром
  с синхронизацией картинки и речи по таймкодам. Заточен под русскоязычный контент.
  Используй этот навык всегда, когда пользователь просит: «посмотри это видео»,
  «разбери этот рилс», «проанализируй ролик», «что в этом видео», «разбери хук»,
  «почему это видео залетело», «сделай разбор структуры» — и даёт ссылку на видео
  или файл. Claude не видит видео нативно, поэтому навык превращает видео
  в кадры + транскрипцию с таймкодами и анализирует их вместе.
---

# video-eyes — глаза для Claude

Claude не умеет смотреть видео. Этот навык решает проблему так:
видео → кадры (картинки) + речь (текст с таймкодами) → синхронный анализ.

Всё работает локально. Ноль затрат на API — платишь только токенами Claude
за чтение кадров.

## Зависимости

Проверь перед началом (`which yt-dlp ffmpeg whisper-cli`):

- **yt-dlp** — скачивание видео и субтитров
- **FFmpeg** — кадры и аудио
- **whisper.cpp** (`whisper-cli`) — локальная транскрипция
- Модель: `~/.claude/models/ggml-small.bin` — **мультиязычная**, берёт русский.
  НЕ используй `ggml-base.en.bin` — она только для английского.

Если чего-то нет — установи (см. README.md рядом с этим файлом) или скажи
пользователю, что нужно поставить.

## Рабочая директория

Создай временную папку и работай в ней:

```bash
mkdir -p watch_tmp/hook watch_tmp/body && cd watch_tmp
```

## Шаг 1. Скачай видео

```bash
yt-dlp -o video.mp4 -f "mp4" "<URL>"
```

Если пользователь дал локальный файл — просто скопируй его как `video.mp4`.

### Если скачать не получилось

yt-dlp может упасть: Instagram часто требует логин, YouTube иногда просит
«подтвердите, что вы не бот». Не долби повторными попытками — после 1–2
неудач попроси пользователя скачать видео самому и прислать файл:

> Не могу скачать видео по ссылке — платформа блокирует. Скачай его сам
> и пришли мне файл. Проще всего через сайт https://ru.savefrom.net —
> вставляешь ссылку, жмёшь скачать. Для рилсов также работают
> https://snapinsta.to и https://sssinstagram.com, для TikTok —
> https://ssstik.io.

Получив файл, переименуй его в `video.mp4` и продолжай со шага 2б
(готовых субтитров у локального файла нет).

Узнай длительность (понадобится дальше):

```bash
ffprobe -v error -show_entries format=duration -of csv=p=0 video.mp4
```

## Шаг 2. Транскрипция с таймкодами

### 2а. Сначала попробуй готовые субтитры (только YouTube)

Быстрее и часто точнее whisper:

```bash
yt-dlp --skip-download --write-subs --write-auto-subs \
  --sub-langs "ru,ru-orig,en" --sub-format "vtt" -o subs "<URL>"
```

Если появился файл `subs.ru.vtt` (или похожий) — читай его, таймкоды уже внутри.
Переходи к шагу 3.

### 2б. Если субтитров нет (Reels, TikTok, локальные файлы) — whisper

```bash
# аудио в формат для whisper: 16 кГц, моно
ffmpeg -y -i video.mp4 -ar 16000 -ac 1 -c:a pcm_s16le audio.wav

# транскрипция с таймкодами (srt), язык определяется автоматически
whisper-cli -m ~/.claude/models/ggml-small.bin -l auto -f audio.wav \
  -osrt -of transcript
```

Результат — `transcript.srt` с таймкодами. Прочитай его целиком.

## Шаг 3. Кадры — двухуровневая нарезка

### 3а. Хук: первые 15 секунд, покадрово

15 fps, склейка в контактные листы 5×9 (45 кадров = 3 секунды на лист):

```bash
ffmpeg -y -t 15 -i video.mp4 \
  -vf "fps=15,scale=200:-1,tile=5x9" hook/sheet_%02d.jpg
```

Получится ~5 листов. Лист N покрывает секунды (N-1)*3 … N*3.
Внутри листа кадры идут слева направо, сверху вниз, шаг 1/15 сек.

### 3б. Тело ролика: по смене сцен, а не по таймеру

Кадр берётся, когда картинка реально поменялась (порог 0.3) ИЛИ прошло
10 секунд с прошлого кадра (страховка для статичных «говорящих голов»):

```bash
ffmpeg -y -ss 15 -i video.mp4 \
  -vf "select='isnan(prev_selected_t)+gt(scene,0.3)+gte(t-prev_selected_t,10)',scale=640:-1,showinfo" \
  -vsync vfr body/f_%03d.jpg 2> body_frames.log
```

Ширина 640px — чтобы текст на экране (плашки, титры) остался читаемым.

**Таймкоды кадров** вытащи из лога showinfo:

```bash
grep -o "pts_time:[0-9.]*" body_frames.log
```

К каждому таймкоду прибавь 15 (мы начали с `-ss 15`). Запиши соответствие
«файл кадра → секунда в видео» — без этого не сшить кадры с транскрипцией.

**Контроль объёма.** Посчитай кадры (`ls body/ | wc -l`):
- Больше 60 кадров (длинный ролик) — подними порог сцены до 0.4
  или собери кадры тела тоже в контактные листы `tile=4x4,scale=320:-1`.
- Меньше 5 кадров на видео длиннее 2 минут — понизь порог до 0.2.

## Шаг 4. Просмотр и анализ

1. Прочитай (Read) все листы хука по порядку, затем кадры тела по порядку.
2. Держи рядом транскрипцию: для каждого кадра ты знаешь его секунду,
   для каждой реплики — её таймкод. Сшивай: «на 0:12 говорит X,
   на экране в этот момент Y».
3. Выдай разбор в структуре:

- **Хук (0–3 сек):** что на экране в первый кадр, первая фраза, за счёт чего
  останавливает скролл (паттерн-брейк, вопрос, движение, текст на экране).
- **Сцены:** таблица таймкод → что на экране → что говорится → приём.
- **Структура/фреймворк:** хук → удержание → развитие → CTA; петли,
  открытые вопросы, смены планов, темп монтажа (кадров/мин из шага 3б).
- **Механика:** почему это работает (или нет) и что можно забрать себе.

Если пользователь просил что-то конкретное (только хук, только CTA,
транскрипцию) — дай только это, без полного разбора.

## Шаг 5. Уборка

Спроси или удали сразу: `rm -rf watch_tmp` (видео и кадры весят много).

## Ограничения

- Видео длиннее ~20 минут: не читай все кадры подряд — сначала транскрипцию,
  потом выборочно кадры интересных мест.
- Музыка без речи: whisper вернёт мусор или пустоту — это нормально,
  анализируй только видеоряд.
- Приватные/закрытые видео yt-dlp не скачает — попроси у пользователя файл.
