Files
jellybit/docs/tasks/items/tvdb-title-locale.md
T
av f42db0a275 sprint: набран спринт 2026-08-06 под цель распознавания
- в наборе шесть задач: локаль TVDB и confidence-гейт под цель, плюс баги и
  техдолг помимо неё
- взятым дописаны разделы своего типа: «Затрагивает», критерии с оракулами,
  воспроизведение
- решены развилки: оба расхождения код↔спека правятся спекой (и потому стали
  chore), опрос qBittorrent тормозится бэкоффом до минутного потолка
2026-08-06 13:57:33 +03:00

64 lines
5.1 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.
# ✨ Брать у TVDB название на языке настройки и оригинальное название
- **Тип:** feature
- **Категория:** Ядро продукта
- **Зачем:** [general].language правит только TMDB и промпт LLM — TVDB отдаёт primary name, и при language=ru в карточку ревью и имя папки попадает 哪吒之魔童降世 вместо «Нэчжа»
- **Теги:** goal:recognition-accuracy
Кандидат от TVDB начинает приходить с названием на языке `[general].language`
и с отдельно заполненным оригинальным названием — как это уже делает TMDB.
Сегодня глобальная настройка до клиента TVDB не доезжает вовсе:
`TVDBConfig` (`internal/metadata/tvdb.go`) поля языка не имеет, `serve.go`
собирает провайдер без него, `Search` шлёт только `query`/`type`/`year`, а из
ответа разбирает единственное поле `name` — это primary name записи, то есть
название на языке оригинала. Блок переводов не читается, `OriginalTitle` TVDB
не заполняет вовсе, хотя это ось сравнения при матче. Наблюдаемый случай —
[movie 131155](https://www.thetvdb.com/movies/131155-): primary name
`哪吒之魔童降世`, русский перевод у записи есть («Нэчжа»), но до нас не доходит.
Что сделать:
- прокинуть локаль в `TVDBConfig` из `cfg.ContentLanguage()`, диалект вывести
внутри `tvdb.go` — знание диалекта принадлежит тому, кто на нём говорит
([ADR решения 2 в архиве](../../../openspec/changes/archive/2026-07-24-content-language-switch/design.md));
- разобрать переводы в выдаче поиска (точные имена полей — `name_translated` и
блок `translations`; форму сверить с живым API через `TVDB_API_KEY=… go test
./internal/metadata/ -run Integration`, наугад не писать);
- фолбэк на primary name, когда перевода на нужный язык нет, — молчаливой
пустоты в `Title` быть не должно;
- заполнить `OriginalTitle` primary name'ом;
- заказать поведение спекой: требование «Локаль запроса к TMDB»
([metadata-match](../../../openspec/specs/metadata-match/spec.md)) написано
только под TMDB — либо обобщается на провайдеров, либо получает соседа.
## Затрагивает
- `internal/metadata/tvdb.go``TVDBConfig` (поле языка), строка запроса
`Search`, разбор переводов и `OriginalTitle` в кандидате;
- `cmd/jellybit/serve.go` — сборка провайдера TVDB из конфига;
- `openspec/specs/metadata-match/spec.md` — требование «Локаль запроса к TMDB»:
обобщается на провайдеров либо получает соседа под TVDB;
- внешний контракт: поиск TVDB (`/search`) и его блок переводов — формат
сверяется живым прогоном под `TVDB_API_KEY`, наугад не пишется.
## Критерии приёмки
- Запрос поиска TVDB содержит параметр языка, выведенный из `[general].language`
(оракул: тест на `httptest`-сервере в `tvdb_test.go` — проверяет строку
запроса при `language = ru` и при незаданном, как это сделано для TMDB).
- При наличии перевода `Candidate.Title` приходит на языке настройки, при
отсутствии — равен primary name (оракул: два случая в одном табличном тесте на
фикстуре ответа).
- `Candidate.OriginalTitle` у TVDB непуст и равен primary name (оракул: тот же
тест; плюс интеграционный прогон за `TVDB_API_KEY` печатает оба поля).
- Дельта-спека `metadata-match` заказывает локаль TVDB и фолбэк на оригинал
(оракул: `openspec validate --strict`).
## Рамки
Матч и гейт авто-раскладки не трогаются — локализованное название косметическое,
сравнение идёт по оригинальному; менять из-за него поведение выборки нельзя.
Живой API дёргается только вручную под env-гейтом, лимиты ключа беречь. TVMaze
вне охвата — переводов не отдаёт.