From 905a1ee4d3e59f0274c658e809a26e9386fa4f6d Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Thu, 6 Aug 2026 12:49:45 +0300 Subject: [PATCH] =?UTF-8?q?backlog:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D1=8C=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D0=B9=20TVDB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - [general].language доезжает только до TMDB и промпта LLM: клиент TVDB читает primary name и отдаёт название на языке оригинала - в охвате также OriginalTitle, который TVDB не заполняет вовсе --- docs/tasks/BACKLOG.md | 1 + docs/tasks/items/tvdb-title-locale.md | 52 +++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 docs/tasks/items/tvdb-title-locale.md diff --git a/docs/tasks/BACKLOG.md b/docs/tasks/BACKLOG.md index 5976034..2d4f499 100644 --- a/docs/tasks/BACKLOG.md +++ b/docs/tasks/BACKLOG.md @@ -34,6 +34,7 @@ - [Современный Web-UI как PWA](items/web-ui-pwa.md) — текущий server-rendered UI функционален — PWA (устанавливаемое, удобное с телефона) это улучшение большого объёма, не блокер - [Полный редактор маппинга «файл → серия» и ручной режим ревью](items/review-mapping-editor.md) — правка S·E, «нумеровать подряд» и ручной режим при полном провале LLM были запланированы объёмом Ф5 и не заведены задачей — в ревью сегодня можно только подсказать текстом - [Крайние случаи именования: многофайловый фильм, редакции, двойная серия](items/naming-edge-cases.md) — стэкинг частей (part1/cd1), редакции [edition-…] и двойная серия SxxEyy-Eyy описаны нарративом, но в file-layout не заказаны — раскладка таких раздач не определена +- [Локаль TVDB: перевод названия и оригинальное название](items/tvdb-title-locale.md) — [general].language правит только TMDB и промпт LLM — TVDB отдаёт primary name, и при language=ru в карточку ревью и имя папки попадает 哪吒之魔童降世 вместо «Нэчжа» ## Инфраструктура - [Агенты-ревьюверы качества (наименования, архитектура, конвенции, стиль)](items/quality-review-agents.md) — конвейер ревью переехал в плагин `av-dev-pipeline`; осталась калибровка проходов на этом проекте и ревьювер наименований (ждёт словарь единого языка) diff --git a/docs/tasks/items/tvdb-title-locale.md b/docs/tasks/items/tvdb-title-locale.md new file mode 100644 index 0000000..f3c0512 --- /dev/null +++ b/docs/tasks/items/tvdb-title-locale.md @@ -0,0 +1,52 @@ +# Локаль 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](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 — либо обобщается на провайдеров, либо получает соседа. + +## Критерии приёмки + +- Запрос поиска 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 +вне охвата — переводов не отдаёт.