Skip to content

About

No description, website, or topics provided.

Resources

Security policy

Stars

18 stars

Watchers

0 watching

Forks

Repository files navigation

Series Tracker

Умный медиа-сервер для автоматического отслеживания, загрузки, организации и нарезки сериалов с торрент-трекеров и 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 firefox

UI — 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)

About

No description, website, or topics provided.

Resources

Security policy

Stars

18 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages