Files
jellybit/docs/tasks/items/tvdb-title-locale.md
T
av 905a1ee4d3 backlog: добавлена задача про локаль названий TVDB
- [general].language доезжает только до TMDB и промпта LLM: клиент TVDB читает
  primary name и отдаёт название на языке оригинала
- в охвате также OriginalTitle, который TVDB не заполняет вовсе
2026-08-06 12:49:45 +03:00

4.3 KiB

Локаль TVDB: перевод названия и оригинальное название

  • Секция: Ядро продукта
  • Зачем: [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: primary name 哪吒之魔童降世, русский перевод у записи есть («Нэчжа»), но до нас не доходит.

Что сделать:

  • прокинуть локаль в TVDBConfig из cfg.ContentLanguage(), диалект вывести внутри tvdb.go — знание диалекта принадлежит тому, кто на нём говорит (ADR решения 2 в архиве);
  • разобрать переводы в выдаче поиска (точные имена полей — name_translated и блок translations; форму сверить с живым API через TVDB_API_KEY=… go test ./internal/metadata/ -run Integration, наугад не писать);
  • фолбэк на primary name, когда перевода на нужный язык нет, — молчаливой пустоты в Title быть не должно;
  • заполнить OriginalTitle primary name'ом;
  • заказать поведение спекой: требование «Локаль запроса к TMDB» (metadata-match) написано только под TMDB — либо обобщается на провайдеров, либо получает соседа.

Критерии приёмки

  • Запрос поиска 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 вне охвата — переводов не отдаёт.