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

5.1 KiB

Брать у 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: 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 — либо обобщается на провайдеров, либо получает соседа.

Затрагивает

  • internal/metadata/tvdb.goTVDBConfig (поле языка), строка запроса 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 вне охвата — переводов не отдаёт.