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
+24 -14
View File
@@ -13,18 +13,32 @@ import (
"git.vakhrushev.me/av/jellybit/internal/logging"
)
const (
tmdbDefaultBaseURL = "https://api.themoviedb.org/3"
tmdbDefaultLanguage = "ru-RU"
)
const tmdbDefaultBaseURL = "https://api.themoviedb.org/3"
// TMDBConfig — настройки клиента TMDB.
type TMDBConfig struct {
APIKey string
Proxy string
Timeout time.Duration
BaseURL string // пусто → api.themoviedb.org; задаётся в тестах
Language string // локаль возвращаемых названий; пусто → ru-RU
APIKey string
Proxy string
Timeout time.Duration
BaseURL string // пусто → api.themoviedb.org; задаётся в тестах
// Language — абстрактный код языка вывода ("ru" | "en"); диалект локали TMDB
// выводит сам клиент (tmdbLocale). Знание диалекта живёт здесь, у провайдера,
// который на нём говорит, а не в общем слое конфига.
Language string
}
// tmdbLocale переводит абстрактный код языка вывода в диалект локали TMDB.
// Тотальна: непокрытый вход (пусто, неизвестный код) → en-US, чтобы запрос
// никогда не ушёл без локали (defense in depth поверх валидации конфига).
// Множество кодов задаёт config.validate ({ru, en}); при добавлении кода —
// синхронно добавь ветку здесь, иначе он молча уедет в en-US.
func tmdbLocale(lang string) string {
switch lang {
case "ru":
return "ru-RU"
default:
return "en-US"
}
}
// TMDB — клиент The Movie Database (API v3, авторизация по api_key).
@@ -49,14 +63,10 @@ func NewTMDB(cfg TMDBConfig, logger *slog.Logger) (*TMDB, error) {
if base == "" {
base = tmdbDefaultBaseURL
}
lang := cfg.Language
if lang == "" {
lang = tmdbDefaultLanguage
}
if logger == nil {
logger = slog.Default()
}
return &TMDB{apiKey: cfg.APIKey, baseURL: strings.TrimRight(base, "/"), language: lang, hc: hc, log: logger}, nil
return &TMDB{apiKey: cfg.APIKey, baseURL: strings.TrimRight(base, "/"), language: tmdbLocale(cfg.Language), hc: hc, log: logger}, nil
}
func (t *TMDB) Name() string { return "tmdb" }