4.7 KiB
4.7 KiB
1. qBittorrent: проброс имени
- 1.1 Добавить поле
Rename stringвqbt.AddRequest - 1.2 В
Client.Addписать form-fieldrenameпри непустомRename - 1.3 Тест: при заданном
Renameform-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 Фолбек самодостаточен (лёгкая фильтрация шума для сырого
HTTP/CLI-ввода).
tgbot.cleanContextНЕ рефакторил: он работает на слое транспорта (чистит UI-мусор бота), фолбек — на слое ядра (берёт заголовок из уже-контекста); преждевременная общая зависимость связала бы транспорт с util ядра. Дублирование минимально (две эвристики) - 4.3 Тесты фолбека: заголовок релиза, пустой/бесполезный контекст → ""
5. Интеграция в ingest
- 5.1 Ввести узкий интерфейс
ingest.Namer(DeriveName), реализован пакетомinternal/namingповерх LLM + фолбек; зависимость опциональна (nil-провайдер → только фолбек) - 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): провайдер поднимается один раз, переиспользуетсяnamingиrecognize
6. Проверка
- 6.1
task testиtask lintзелёные - 6.2 Ручная проверка на реальном qBittorrent: имя видно в списке;
подтвердить поведение
renameдля многофайловой раздачи - 6.3 При архивации: дельта-спека синкнута в
openspec/specs/ingest(новая capability), пункт «Название из контекста» убран изdocs/todo.md(реализованное переехало в OpenSpec-спеки)