Умный медиа-сервер для автоматического отслеживания, загрузки, организации и нарезки сериалов с торрент-трекеров и VK Video. Добавьте источник — приложение само проверяет новые серии, скачивает, переименовывает по шаблонам, нарезает видеокомпиляции на эпизоды и раскладывает в медиатеку (Plex / Jellyfin / Emby).
Это версия 2 — полное переписывание с нуля на модульно-шинной архитектуре (один asyncio-процесс, модули общаются через шину событий) и новом фронте на Vite + Vue 3. Старая монолитно-агентная версия заархивирована в теге
legacy/v1-final.
- Источники: торрент-трекеры Kinozal, RuTracker, Anilibria (API), Astar.bz, Anilibria.TV и VK Video. Для astar/anilibria_tv — браузерная доставка (пул Playwright/Firefox), для остальных — прямой HTTP/API.
- Движок правил: визуальный конструктор цепочек
ЕСЛИ … ТО …для извлечения сезона, эпизода, озвучки, качества из названий видео и файлов; профили правил переиспользуются между сериалами. - Конвейер торрентов: сверка с qBittorrent по инфохэшу (идентичность раздачи), пауза до конца переименования, нарезка по главам, восстановление после сбоев. БД — проекция qBittorrent (отказоустойчивость).
- VK Video: загрузка через
yt-dlp(две фазы: download → remux), атомарная публикация файла, усыновление уже лежащих на диске эпизодов без повторной загрузки. - Нарезка компиляций: автоматическое деление видео по главам через
ffmpeg(атомарно — битый кусок не принимается за готовый). - Интеграция TMDB: счётчик «скачано / всего», агрегирование числа серий по нескольким сезонам.
- Реактивный UI: статусы, прогресс, счётчики обновляются в реальном времени по SSE, без перезагрузки страницы.
Один asyncio-процесс. «Тупая» шина (core/bus.py, только publish/subscribe)
и модули (modules/*), общающиеся конвертами (event / command / query /
reply). Request/reply реализован поверх pub/sub в обвязке core/module.py —
сама шина о нём не знает.
┌──────────────────────── gateway (FastAPI) ────────────────────────┐
браузер ──┤ HTTP → query/command · событие шины → SSE (по таблице SSE_MAP) │
└───────────────────────────────┬───────────────────────────────────┘
шина (core/bus.py)
┌──────────┬──────────┬─────────┬────────┴────────┬──────────┬──────────┬──────────┐
catalog scan sources rules torrents downloads renaming slicing
(статусы) (оркестр.) (трекеры/ (движок (qBit- (yt-dlp) (формат (ffmpeg
расписание) VK API) правил) конвейер) имён) по главам)
library metadata settings trackerauth
(медиатека)(TMDB) (настройки)(сессии трекеров)
Правила модулей: модуль импортирует только core/* (импорт из чужого
модуля запрещён); БД — приватная память модуля, каждая таблица принадлежит
ровно одному модулю, чужие данные — только query через шину; «шина — сигнал,
БД — истина» (задача персистится до публикации события, при старте модуль
добирает незавершённое). Контракт модуля — в докстринге его module.py.
Конвейер данных: scan находит релизы через sources, применяет rules
и регистрирует их в torrents (qBit) или ставит VK-загрузки в downloads.
Готовый файл проходит slicing → renaming → library. catalog
агрегирует вклады статусов и публикует свёрнутый статус серии. gateway
транслирует события шины в SSE и HTTP — в queries/commands.
| Слой | Технологии |
|---|---|
| Бэкенд | Python 3.12, FastAPI + Uvicorn, httpx, SQLite + Alembic |
| Фронтенд | Vite, Vue 3, TypeScript, PrimeVue (web/) |
| Внешнее | qBittorrent (WebUI API), yt-dlp, ffmpeg, Playwright (Firefox), TMDB |
Карта топиков шины — contracts/bus_topics.md; решения по контракту —
contracts/revision.md; находки/грабли — contracts/findings.md.
Требуется Python 3.12, Node 20, ffmpeg, yt-dlp в PATH; для astar/anilibria_tv — Firefox для Playwright; для торрентов — доступный qBittorrent.
# 1. Бэкенд
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt -r requirements-dev.txt
.venv/bin/alembic upgrade head # миграции БД (app.db)
cp .env.example .env # вписать ST_QBIT_URL/USER/PASS
# 2. Фронтенд (собирается в web/dist, отдаётся бэкендом с корня /)
cd web && npm ci && npm run build && cd ..
# 3. Запуск (без ST_QBIT_URL модуль torrents не стартует)
.venv/bin/uvicorn run:app --host 0.0.0.0 --port 5000
# (для браузерной доставки astar/anilibria_tv)
.venv/bin/playwright install firefoxUI — http://<host>:5000/. Учётки трекеров, VK, TMDB вносятся через UI
(Настройки → авторизация) и хранятся в БД; секреты запуска (qBittorrent) — в
.env (вне git).
.venv/bin/python -m pytest -q # бэкенд
cd web && npm run test # фронтенд (vitest)Тесты с суффиксом *_match_production / *_diff и test_sources с реальными
дампами требуют golden-фикстур и прод-данных (в git не коммитятся) — вне их
окружения они красные намеренно, это не регрессии.
Пошаговый прод-ранбук (зависимости, systemd, обновление, откат) —
docs/deployment.md. Текущее состояние и журнал работ —
docs/STATUS.md.
core/ шина, конверт, BaseModule, раннер, БД, логирование
modules/<имя>/ модуль: module.py (контракт) · repository.py (SQL) · профильные файлы
web/ новый фронт (Vite + Vue 3 + TS); сборка → web/dist (в .gitignore)
alembic/ миграции схемы БД
contracts/ карта топиков, решения ревизии, находки
docs/ STATUS, план деплоя, прочие документы
legacy_frontend/ архив старого фронта (отдаётся по /legacy как аварийный откат)
run.py сборка процесса (порядок старта модулей, env)