recognition: глобальный переключатель языка вывода [general].language

- новое поле [general].language (ru|en, дефолт en) — единый источник языка
  локализованного title детектора и локали запросов к метабазам; original_title
  всегда на языке оригинала
- локаль TMDB (поиск + credits) выводится из него, [metadata.tmdb].language убран
- промпт LLM явно задаёт язык title с fallback на оригинал
This commit is contained in:
av
2026-07-24 14:09:04 +03:00
parent 8309ce0664
commit a2d8140e22
18 changed files with 556 additions and 48 deletions
+27 -7
View File
@@ -101,19 +101,39 @@ plan-санитайзинге.
### Requirement: Локаль запроса к TMDB
Запрос поиска к TMDB SHALL передавать параметр `language`, по умолчанию
`ru-RU`, со значением, настраиваемым конфигом `[metadata.tmdb].language`.
Это влияет только на локализованное поле `Title`/`Name`; поле
`original_title`/`original_name` остаётся на языке оригинала, поэтому
оригинальная сторона сравнения не затрагивается.
Локаль запросов к TMDB SHALL выводиться из глобальной настройки `language`
(`ru`|`en`, дефолт `en`): `ru``ru-RU`, `en``en-US`. Отдельной настройки
локали у TMDB быть SHALL NOT — глобальный `language` единственный источник.
#### Scenario: Локализованный заголовок приходит по-русски
Эту локаль система SHALL передавать параметром `language` как в запрос поиска,
так и в запрос credits (режиссёр). На стороне поиска локаль влияет ТОЛЬКО на
локализованное поле `Title`/`Name`; поле `original_title`/`original_name`
остаётся на языке оригинала, поэтому оригинальная сторона сравнения не
затрагивается. На стороне credits передача локали — best-effort: имена людей
провайдер локализует не всегда, при отсутствии перевода имя остаётся на языке
оригинала, и это не проваливает выборку режиссёра.
- **GIVEN** TMDB включён, `language` не задан в конфиге
#### Scenario: Локаль по умолчанию — английская
- **GIVEN** TMDB включён, глобальный `language` не задан в конфиге
- **WHEN** выполняется поиск фильма
- **THEN** запрос содержит `language=en-US`
- **AND** в кандидате `Title` приходит на английском, а `OriginalTitle` — на языке оригинала
#### Scenario: language=ru даёт русскую локаль
- **GIVEN** TMDB включён, глобальный `language` = `ru`
- **WHEN** выполняется поиск фильма с русской локализацией
- **THEN** запрос содержит `language=ru-RU`
- **AND** в кандидате `Title` приходит на русском, а `OriginalTitle` — на языке оригинала
#### Scenario: Локаль передаётся и в запрос режиссёра
- **GIVEN** подтверждённый матч TMDB и глобальный `language` = `ru`
- **WHEN** выполняется запрос credits за режиссёром
- **THEN** запрос содержит `language=ru-RU`
- **AND** при отсутствии локализованного имени режиссёр остаётся на языке оригинала, выборка не проваливается
### Requirement: Нормализация названий при сравнении
Нормализация названий для гейта сильного матча SHALL сводить букву `ё` к `е`,
+28
View File
@@ -16,6 +16,14 @@
`original_title`. При неуверенности в оригинальном названии модель SHALL
дублировать `title`, а не выдумывать название (защита от ложного авто-матча).
Промпт SHALL явно задавать язык локализованного `title` из глобальной
настройки `language` (`ru`|`en`, дефолт `en`): модель SHALL возвращать `title`
на выбранном языке, а при отсутствии перевода — на языке оригинала (fallback).
Языковая директива SHALL касаться ТОЛЬКО `title`; `original_title` остаётся на
языке оригинала независимо от `language` (правила дублирования выше не
меняются). `provider_hint` и структурные поля (`files[].src`, роли, нумерация)
языковой директивой не затрагиваются.
Разбор ответа SHALL оставаться устойчивым к пустому `original_title`: пустое
значение не отбраковывается и не вызывает correction-ретрай; сверка
gracefully использует доступные названия.
@@ -33,6 +41,26 @@ gracefully использует доступные названия.
- **THEN** разбор успешен без correction-ретрая
- **AND** сверка использует `title``provider_hint`)
#### Scenario: title приходит на языке из настройки
- **GIVEN** `language` = `en` и иностранный фильм с известным английским названием
- **WHEN** модель возвращает план
- **THEN** промпт требовал `title` на английском
- **AND** `original_title` остаётся на языке оригинала (директива его не касается)
#### Scenario: Промпт задаёт fallback на оригинал при отсутствии перевода
- **GIVEN** `language` = `en`
- **WHEN** собирается промпт распознавания
- **THEN** промпт требует при отсутствии перевода вернуть `title` на языке
оригинала, а не выдумывать название
#### Scenario: Дефолтный язык — английский
- **GIVEN** `language` не задан в конфиге
- **WHEN** собирается промпт распознавания
- **THEN** промпт требует `title` на английском (дефолт `en`)
### Requirement: Пред-парс имени релиза
Перед вызовом LLM система SHALL выполнять дешёвый пред-парс имени торрента