# Б-роллы и вставки с YouTube

```bash
# поиск — ничего не скачивает
python scripts/youtube_source.py "neural network training visualization" --count 12

# забрать только нужные секунды
python scripts/youtube_source.py "neural network training visualization" \
  --ids uFeP49E_k2s --section 8-14 --out project/assets/youtube
```

## Лицензия — это фильтр, а не сноска

YouTube помечает загрузку либо стандартной лицензией, либо Creative Commons
Attribution. Право на повторное использование и переработку даёт **только
вторая**. Поэтому:

- поиск идёт через собственный CC-фильтр YouTube (`sp=EgIwAUABGAE%3D`), а не
  фильтрует выдачу постфактум — иначе придётся листать сотни результатов ради
  единиц пригодных;
- у каждого результата в отчёте стоит поле лицензии, как его вернул экстрактор;
- всё, что не Creative Commons, **отказывается** скачиваться.

Экстрактор возвращает формулировку самого YouTube — `Creative Commons
Attribution license (reuse allowed)`, а не голое название. Проверка идёт по
семейству лицензии; это по-прежнему белый список, просто не ломающийся о
точную строку.

Если права есть у тебя — свой канал, письменное разрешение, общественное
достояние — есть `--i-hold-the-rights`. Флаг записывает в манифест, что права
**заявлены оператором, а не проверены здесь**. Это осознанно: вставка, чью
лицензию никто не может назвать, — это заявка на страйк, и каналу она обойдётся
дороже, чем стоил кадр.

## CC BY требует титра

Скрипт печатает готовые строки атрибуции:

```
3d visualisation of neural networks — ML Explained
(https://www.youtube.com/watch?v=uFeP49E_k2s), CC BY
```

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

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

`--section 41-49` тянет этот диапазон, а не двадцатидвухминутный оригинал. С
`--force-keyframes-at-cuts` точки реза перекодируются, и клип начинается на
запрошенном кадре, а не на предыдущем ключевом — тот может быть на секунды
раньше. Это быстрее, меньше по объёму и делает манифест честным относительно
того, что реально взято.

## Провенанс

Каждая загрузка пишет в накопительный `manifest.json` — тот же файл, что и
стоковые скрипты: ссылка, id, автор, канал, дата загрузки, лицензия, точный
диапазон, SHA-256, размер и результат `ffprobe`. Размеры кадра берутся из
`display_width`/`display_height`, а не из `stored_*`: клип с матрицей поворота
хранится «на боку», и шортлист, сообщающий «1920x1080» про вертикальное видео с
телефона, хуже, чем отсутствие шортлиста.

## Что вставлять

Б-ролл сильнее зума, потому что это новая информация, а не новый ракурс — см.
`RETENTION.md`. Окна для вставок даёт `plan_retention.py` с ключом
`kind: "broll"`: он помечает моменты, где в транскрипте названо то, что можно
показать. Дальше — обычный `render_broll_overlay.py`, звук вставки глушится,
речь продолжается снизу.

Держи покрытие вставками ниже ~40% хронометража: дальше спикер перестаёт быть
предметом ролика.
