- в наборе шесть задач: локаль TVDB и confidence-гейт под цель, плюс баги и техдолг помимо неё - взятым дописаны разделы своего типа: «Затрагивает», критерии с оракулами, воспроизведение - решены развилки: оба расхождения код↔спека правятся спекой (и потому стали chore), опрос qBittorrent тормозится бэкоффом до минутного потолка
64 lines
5.1 KiB
Markdown
64 lines
5.1 KiB
Markdown
# ✨ Брать у 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
|
||
вне охвата — переводов не отдаёт.
|