Files

3.4 KiB

Дорожная карта

Черновик плана реализации. Ориентир, не обязательство; по ходу уточняется. Что реализовано и как устроено — в docs/specs.

Фазы

  • Ф0 — каркас. go.mod, раскладка пакетов, загрузка TOML-конфига, SQLite + миграции, slog-логи, Dockerfile (минимальный рантайм-образ, копирует готовый бинарь), golangci-lint, lefthook. Документация (этот этап — частично готов).
  • Ф1 — ingest + tracking (без LLM). Ingest() + добавление в qBittorrent (источник отдаём ему, категория jellybit, ключ идемпотентности по infohash) + worker-поллинг завершения (savepath=/srv/media/downloads, путь из API) + машина состояний. Наружу: HTTP API, список в веб-UI, jellybit add.
  • Ф2 — распознавание. go-ptn + LLM (structured output) → план + оценка уверенности. Без записи на диск.
  • Ф3 — раскладка + минимальный review. Хардлинки по конвенциям Jellyfin (санитизация пути, never-overwrite), субтитры, идемпотентность, undo. Авто только при матче в базе и чистой валидации; иначе → review (htmx): подсказка + перераспознавание, из ручного — тип, выбор кандидата базы, пометка «игнор». Полный редактор маппинга — Ф5. См. review-ux.md.
  • Ф4 — метаданные. TMDB/TVDB опционально (с HTTP-прокси на клиента), provider-id в именах, валидация распознавания против числа серий.
  • Ф5 — Telegram + UX. Бот-адаптер + парсер сообщений торрент-бота, подтверждение в боте (карточка + кнопки + reply-подсказка, эскалация в веб), полный редактор маппинга «файл → серия», триггер скана Jellyfin, нотификации.
  • Ф6 — деплой. Сборка статического бинаря здесь; доставка бинаря + Dockerfile на сервер, docker build и запуск на месте; оркестрация — playbook-jellybit.yml в umbar: общая docker-сеть, user 1000:1000, mount /srv/media + data-том /srv/applications/jellybit/data, healthcheck. Сопутствующие правки qBit (том /srv/media, savepath/temp под /srv/media, WebUI\ServerDomains=*).

Заметки по порядку

  • Минимальный review-экран нужен уже в Ф3 (как только появляется режим «спросить при сомнении»), полноценный UX — в Ф5.
  • Jellyfin в umbar ещё не развёрнут — раскладку файлов это не блокирует, тестируется без него; триггер скана подключаем, когда Jellyfin поднят.