Files
jellybit/openspec/changes/add-qbt-display-name/proposal.md
T

63 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Why
При добавлении magnet-загрузки jellybit не передаёт в qBittorrent
человекочитаемое имя, поэтому в списке qBit задачи выглядят безлико:
`rutracker-topic-6514485`. Контекст загрузки (заголовок релиза от
торрент-бота) у нас уже есть — из него можно собрать аккуратное имя
(«Дюна: Часть вторая (2024)») и сразу класть его в qBittorrent. Небольшая
доработка с заметной отдачей в повседневной эксплуатации.
Это также первая capability, переносимая из `docs/specs` в OpenSpec
(пилот формата): change засевает capability `ingest` дельтой `ADDED`.
## What Changes
- `ingest` выводит из контекста загрузки **отображаемое имя** и передаёт
его в qBittorrent при добавлении.
- Имя строится LLM: из контекста извлекаются название, год, режиссёр и (для
сериала) номер сезона; название — на русском для российского контента,
иначе на английском. Результат — короткая читаемая строка, а не кусок
сырого контекста.
- LLM даётся до **трёх попыток**; при неудаче — **алгоритмический фолбек**
(первая содержательная строка контекста, очистка и обрезка по длине) без
сетевых запросов.
- Если ни LLM, ни фолбек не дали имени (контекст пуст/бесполезен) —
отображаемое имя не передаётся: qBittorrent оставляет своё (`dn`/имя из
торрента). Поведение при отсутствии контекста не меняется.
- `qbt.AddRequest` получает поле для отображаемого имени, пробрасываемое в
параметр `rename` API `/torrents/add`.
Не входит в объём (Non-goals):
- Переименование уже добавленных в qBittorrent задач.
- Изменение логики распознавания (`recognize`) и раскладки — отображаемое
имя нужно лишь для списка qBit и не влияет на пути на диске (jellybit
по-прежнему читает реальные пути из qBit API).
- Источники кроме magnet (`.torrent`/url) — отдельная задача.
## Capabilities
### New Capabilities
- `ingest`: приём загрузки (источник + контекст) — дедупликация по
infohash, заведение задачи и передача источника в qBittorrent. В рамках
этого change добавляется требование о выводе и передаче отображаемого
имени. Базовое поведение приёма фиксируется как контекст существующего
кода.
### Modified Capabilities
<!-- OpenSpec-спеки пусты; существующих capability нет. -->
## Impact
- **Код:** `internal/ingest` (вывод имени, новая зависимость на LLM-провайдер
и алгоритмический фолбек), `internal/qbt` (поле `Rename` в `AddRequest`,
form-field `rename`). Возможен небольшой хелпер вывода имени (в `ingest`
или соседнем пакете).
- **Конфиг:** возможен бюджет попыток LLM (переиспользовать существующий
`llm.max_retries` либо отдельный параметр) — уточняется в design.
- **Внешние системы:** дополнительный вызов LLM на каждую новую загрузку
(расход токенов); деградирует штатно — при недоступности LLM работает
алгоритмический фолбек.
- **Инварианты:** не затрагиваются. Имя влияет только на отображение в
qBittorrent; пути на диске берутся из qBit API, источник не трогаем.