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

4.0 KiB
Raw Blame History

1. qBittorrent: проброс имени

  • 1.1 Добавить поле Rename string в qbt.AddRequest
  • 1.2 В Client.Add писать form-field rename при непустом Rename
  • 1.3 Тест: при заданном Rename form-data содержит rename, при пустом — поля нет

2. Вывод имени: структура и рендер

  • 2.1 Описать структуру извлечённого имени (type, title, original_title, year, director, season, is_russian)
  • 2.2 Реализовать чистую функцию рендера структуры в короткий ярлык: Title (Director, Year) с опциональными режиссёром и годом (скобка опускается, если обоих нет), для сериала — суффикс . Сезон N; очистка управляющих символов/переводов строк и обрезка по длине
  • 2.3 Тесты рендера: фильм с режиссёром+годом / только год / только режиссёр / без обоих, сериал с сезоном/без, обрезка длины, очистка

3. Вывод имени: LLM

  • 3.1 Узкий промпт извлечения имени (RU-название для российского контента, иначе EN/оригинал) + описание JSON-схемы ответа
  • 3.2 Парсинг и валидация ответа (валидный JSON, непустой title); бюджет попыток — [llm].max_retries (переиспользуем существующий)
  • 3.3 Тесты на фикстурах (без сети): успешный разбор, выбор языка названия, исчерпание попыток

4. Вывод имени: алгоритмический фолбек

  • 4.1 Реализовать фолбек без сети: первая содержательная строка контекста (без ссылок/команд/UI-мусора), отсечение тех. характеристик, очистка и обрезка
  • 4.2 Вынести/переиспользовать логику чистки строк (сейчас в tgbot.cleanContext), чтобы не дублировать
  • 4.3 Тесты фолбека: заголовок релиза, пустой/бесполезный контекст → ""

5. Интеграция в ingest

  • 5.1 Ввести узкий интерфейс/функцию вывода имени (DeriveName), реализованную поверх LLM + фолбек; зависимость опциональна (нет LLM → только фолбек)
  • 5.2 В Ingest() синхронно выводить имя из req.Context (подсказка — magnet.DisplayName) перед qbt.Add, класть в AddRequest.Rename
  • 5.3 Graceful-деградация: ошибка/таймаут вывода имени логируется и не прерывает приём (пустое имя → без rename). Бюджет попыток и таймаут — общие [llm].max_retries / [llm].timeout, новых параметров не вводим
  • 5.4 Прокинуть зависимость (LLM-провайдер) в сборке сервиса (cmd/jellybit)

6. Проверка

  • 6.1 task test и task lint зелёные
  • 6.2 Ручная проверка на реальном qBittorrent: имя видно в списке; подтвердить поведение rename для многофайловой раздачи
  • 6.3 Обновить docs/specs (architecture/ingest) и отметить todo «Название из контекста» как реализованную при архивации change