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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user