metadata: TVDB отдаёт локализованное название и оригинал

- локаль из [general].language применяется при разборе ответа /search, а в
  запрос не уходит: параметр language у TVDB — фильтр выдачи, а не селектор
  перевода (ADR-2026-08-07)
- Title берётся из блока translations с тотальным фолбэком на primary name,
  OriginalTitle — из primary name; форма ответа сверена по документации и
  живым прогоном не подтверждена (docs/research)
- неожиданная форма ответа даёт WARN: признак — отсутствие во всей выдаче
  ключей языка ожидаемого вида, а не неудача разбора блока
This commit is contained in:
av
2026-08-07 15:17:05 +03:00
parent 0c83385098
commit fdbc781197
19 changed files with 1444 additions and 21 deletions
+32 -2
View File
@@ -52,12 +52,23 @@ func TestIntegration_TVMaze(t *testing.T) {
// пропускается; включается ключом:
//
// TVDB_API_KEY=... go test ./internal/metadata/ -run Integration -v
//
// Он же — единственный оракул на форму блока переводов в выдаче поиска:
// docs/research/tvdb-search-translations.md записан по документации, живым
// прогоном не подтверждён. Прогон под русской локалью печатает Title и
// OriginalTitle: у movie 131155 «Нэчжа» ожидается в Title, а иероглифический
// primary name — в OriginalTitle. Совпадение Title с OriginalTitle у иноязычной
// записи означает, что перевод не доехал и предположение о форме неверно.
func TestIntegration_TVDB(t *testing.T) {
key := os.Getenv("TVDB_API_KEY")
if key == "" {
t.Skip("set TVDB_API_KEY to run")
}
c, err := metadata.NewTVDB(metadata.TVDBConfig{APIKey: key, Timeout: 20 * time.Second}, nil)
c, err := metadata.NewTVDB(metadata.TVDBConfig{
APIKey: key,
Timeout: 20 * time.Second,
Language: "ru",
}, nil)
if err != nil {
t.Fatalf("NewTVDB: %v", err)
}
@@ -73,11 +84,30 @@ func TestIntegration_TVDB(t *testing.T) {
if i >= 5 {
break
}
t.Logf(" id=%s title=%q year=%d", cd.ID, cd.Title, cd.Year)
t.Logf(" id=%s title=%q original=%q year=%d", cd.ID, cd.Title, cd.OriginalTitle, cd.Year)
}
if len(cands) == 0 {
t.Fatal("ожидался хотя бы один кандидат для Fargo")
}
if cands[0].OriginalTitle == "" {
t.Error("OriginalTitle пуст: primary name в кандидат не доехал")
}
if cands[0].Title == "" {
t.Error("Title пуст: фолбэк на primary name не сработал")
}
// Иноязычная запись — тот случай, ради которого задача заводилась.
// Расхождение Title и OriginalTitle подтверждает форму блока переводов.
film, err := c.Search(ctx, metadata.Query{Type: metadata.Movie, Title: "Ne Zha", Year: 2019})
if err != nil {
t.Fatalf("Search(Ne Zha): %v", err)
}
for i, cd := range film {
if i >= 5 {
break
}
t.Logf(" ne zha: id=%s title=%q original=%q year=%d", cd.ID, cd.Title, cd.OriginalTitle, cd.Year)
}
// Берём первого с непустым id и тянем число серий по сезонам.
id := cands[0].ID