# Паспорт проекта

Зачем это и для кого. [architecture.md](architecture.md) отвечает «как
устроено», [tasks/ROADMAP.md](../tasks/ROADMAP.md) — «что уже умеет», паспорт —
«зачем и для кого».

## Цель

Сократить путь «нашёл раздачу → смотрю на телевизоре» до одного действия:
кинуть торрент с парой слов контекста и получить фильм или сериал в библиотеке
Jellyfin, без ручного переименования и без каталога индексаторов.

**Потребители** — список закрытый: он определяет, что считать нужным, а что
интересным.

| Кто | Что ему нужно от нас |
| --- | --- |
| Владелец медиасервера (единственный оператор) | одна точка входа для magnet/`.torrent` + контекста; когда система не уверена — чтобы позвали, а не замяли молча; чтобы ошибку можно было откатить |
| Домашние зрители (через Jellyfin, о jellybit не знают) | правильные названия, годы, сезоны и серии — иначе Jellyfin подтянет чужие метаданные |
| Jellyfin | файлы, разложенные по его конвенциям имён, и сигнал пересканировать библиотеку, когда они изменились |

Цель достигнута, когда:

- русский контент и аниме раскладываются так же буднично, как англоязычные —
  это ровно то, на чём разваливается arr-стек;
- типовое добавление не требует ни одного ручного действия после отправки
  торрента, а нетиповое требует ровно одного — подтверждения в ревью;
- ошибочная раскладка откатывается одной кнопкой, не задев раздачу.

## Что целью не является

Граница домена. По ней архитектурный проход судит, не перенесено ли понятие
через границу.

- **Не индексатор и не поисковик по трекерам** (роль prowlarr). Раздачу находит
  человек и приносит сам — вместе с контекстом, который он и так видит глазами.
- **Не менеджер качества релизов** (правила radarr/sonarr). Версии, репаки и
  апгрейд 1080p → 2160p не отслеживаем; коллизия уходит в ревью, а не в
  политику качества.
- **Не подписка на выходящие серии.** Никакого monitoring: система не ищет
  ничего сама и не добавляет загрузок по своей инициативе.
- **Не торрент-клиент.** Качает qBittorrent, мы им управляем и не подменяем его
  функциональность.
- **Не медиасервер.** Обложки, метаданные, учёт просмотренного и сам просмотр —
  забота Jellyfin. Мы отвечаем только за то, чтобы файл лежал там, где Jellyfin
  его правильно опознает.
- **Не хранилище медиа.** Данные живут в раздаче, мы создаём хардлинки и не
  дублируем контент намеренно. Два исключения хранилищем нас не делают, но байты
  у нас появляются: copy-fallback, когда хардлинк невозможен
  ([file-layout](../openspec/specs/file-layout/spec.md)), и состояние
  `orphaned`, где библиотечная ссылка осталась последней копией
  ([state-reconciliation](../openspec/specs/state-reconciliation/spec.md)).
  Сохранность мы и в этих случаях на себя не берём — резервных копий медиа у нас
  нет.
- **Не мультипользовательский сервис.** Контур один, оператор один; разграничение
  доступа сводится к allowlist Telegram (см. [security.md](security.md)).

## Типовые сценарии

1. **Фильм через Telegram.** Переслать боту сообщение торрент-бота → magnet и
   текст сообщения становятся источником и контекстом → загрузка → распознавание
   → при подтверждённом матче в метабазе авто-раскладка → пинг «готово».
2. **Сезон сериала.** То же, но файлов много; они раскладываются сериями, а
   второй сезон ложится в **ту же** папку тайтла, что и первый.
3. **Русский фильм, которого нет в базе.** Уходит в ревью: подсказка текстом и
   перераспознавание, выбор источника совпадения из списка, ручной ввод id или
   URL записи, предпросмотр целевых путей, «Применить».
4. **Ошиблись с привязкой.** Undo снимает наши ссылки (раздача цела) →
   «Привязать заново» → правка в ревью → повторное применение.
5. **Раздачу или файлы удалили руками.** Фоновая сверка констатирует рассинхрон
   (`target_missing`/`orphaned`/`deleted`), не теряя последнюю копию данных, и
   лечится сама, если реальность вернулась.

## Референсы

Где смотреть prior art, когда упёрлись.

- [Jellyfin: Movies](https://jellyfin.org/docs/general/server/media/movies) и
  [Shows](https://jellyfin.org/docs/general/server/media/shows) — целевые
  конвенции имён, источник истины по формату, в который раскладываем.
- **arr-стек** (radarr/sonarr/prowlarr) — прежде всего как каталог того, чего мы
  намеренно **не** берём; полезен по крайним случаям именования.
- **umbar** (`/home/av/projects/private/umbar`) — соседний проект того же
  хозяйства: форма деплоя, раскладка `/srv`, стиль «минимум компонентов».
