- элемент плейлиста повторяется до 3 раз с паузой 30 с (разовые 403/429 от YouTube) - yt-dlp: retries/fragment_retries/extractor_retries - уже обработанные URL пропускаются — повторная постановка плейлиста доделывает только упавшее Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
LLM-infa
Пайплайн: YouTube → скачивание видео → текст речи → LLM-выжимка → Postgres.
Скачивает видео (yt-dlp), достаёт текст из субтитров (или распознаёт речь через Vosk, если субтитров нет), сокращает текст до краткой выжимки (через любой OpenAI-совместимый LLM API или встроенный экстрактивный алгоритм) и складывает всё в базу: пути к видео, полному тексту и выжимке.
Состав
| Сервис | Порт | Что делает |
|---|---|---|
api |
8000 | FastAPI: пайплайн, каталог видео, проверка LLM |
web |
8550 | Flet UI: запуск пайплайна и библиотека результатов |
db |
5433→5432 | Postgres 15, таблица videos |
Файлы складываются в data/videos/ (mp4) и data/text/ (<uuid>.txt — полный
текст, <uuid>_summary.txt — выжимка); в БД хранятся пути и метаданные.
Запуск
# 1. Модель Vosk для распознавания без субтитров (однократно, ~90 МБ)
mkdir -p models && cd models
curl -LO https://alphacephei.com/vosk/models/vosk-model-small-ru-0.22.zip
unzip vosk-model-small-ru-0.22.zip && rm vosk-model-small-ru-0.22.zip && cd ..
# 2. Поднять стек
docker compose up -d --build
UI: http://localhost:8550 · API-доки: http://localhost:8000/docs
LLM для выжимки
LLM не разворачивается в контейнере — указывается любой внешний OpenAI-совместимый эндпоинт. Два способа:
- В
.env(используется по умолчанию для всех запросов):LLM_BASE_URL=https://openrouter.ai/api/v1 LLM_API_KEY=sk-... LLM_MODEL=anthropic/claude-haiku-4.5 - Через UI / поле
llmв запросе — на каждый запрос отдельно.
Если LLM не настроена, работает встроенная экстрактивная суммаризация (выбор ключевых предложений, без нейросети).
Плейлисты и длинные лекции
Обработка идёт через фоновые задачи: POST /jobs сразу возвращает id, элементы
плейлиста обрабатываются по очереди, прогресс виден в UI (скачивание %,
минуты распознанного аудио, номер видео в плейлисте). Если в настройках
выключено «Сохранять видео», для лекций качается только аудиодорожка —
в разы быстрее и легче.
Настройки (ключ LLM, модель, длина выжимки, хранение видео) сохраняются в Postgres — переживают перезапуск контейнеров и перезагрузку страницы. Вкладка «Настройки» в UI.
API
# фоновая задача: видео или плейлист
curl -X POST localhost:8000/jobs/ \
-H 'Content-Type: application/json' \
-d '{"url": "https://www.youtube.com/playlist?list=..."}'
curl localhost:8000/jobs/ # статусы и прогресс
# синхронно, одно видео (для коротких роликов)
curl -X POST localhost:8000/pipeline/process \
-H 'Content-Type: application/json' \
-d '{"url": "https://youtu.be/...", "summary_max_sentences": 10}'
# каталог обработанных видео (фильтры: ?q=, ?section_id=, ?method=)
curl localhost:8000/videos/
# настройки
curl -X PUT localhost:8000/settings/ -H 'Content-Type: application/json' \
-d '{"llm_base_url": "https://openrouter.ai/api/v1", "llm_api_key": "sk-...", "llm_model": "..."}'
Заметки
- Старый код (users/subscriptions/media-convert) лежит в
api_legacy/и в сборку не входит. - Если Docker Desktop не тянет образы (TLS timeout к registry), использовать
системный демон:
docker context use default.