Files
jellybit/internal/metadata/integration_test.go
T
av fdbc781197 metadata: TVDB отдаёт локализованное название и оригинал
- локаль из [general].language применяется при разборе ответа /search, а в
  запрос не уходит: параметр language у TVDB — фильтр выдачи, а не селектор
  перевода (ADR-2026-08-07)
- Title берётся из блока translations с тотальным фолбэком на primary name,
  OriginalTitle — из primary name; форма ответа сверена по документации и
  живым прогоном не подтверждена (docs/research)
- неожиданная форма ответа даёт WARN: признак — отсутствие во всей выдаче
  ключей языка ожидаемого вида, а не неудача разбора блока
2026-08-07 15:17:05 +03:00

123 lines
4.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package metadata_test
import (
"context"
"os"
"testing"
"time"
"git.vakhrushev.me/av/jellybit/internal/metadata"
)
// TestIntegration_TVMaze бьётся в реальный TVMaze (без ключа). Сетевой, по
// умолчанию пропускается; включается флагом:
//
// JELLYBIT_LIVE=1 go test ./internal/metadata/ -run Integration -v
func TestIntegration_TVMaze(t *testing.T) {
if os.Getenv("JELLYBIT_LIVE") == "" {
t.Skip("set JELLYBIT_LIVE=1 to run network tests")
}
c, err := metadata.NewTVMaze(metadata.TVMazeConfig{Timeout: 20 * time.Second}, nil)
if err != nil {
t.Fatalf("NewTVMaze: %v", err)
}
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
cands, err := c.Search(ctx, metadata.Query{Type: metadata.Series, Title: "Fargo", Year: 2014})
if err != nil {
t.Fatalf("Search: %v", err)
}
if len(cands) == 0 {
t.Fatal("ожидался хотя бы один кандидат")
}
top := cands[0]
t.Logf("top: id=%s title=%q year=%d tag=%s/%s",
top.ID, top.Title, top.Year, top.TagProvider, top.TagID)
if top.TagProvider != "tvdb" || top.TagID == "" {
t.Errorf("ожидался TVDB-тег из externals, got %s/%s", top.TagProvider, top.TagID)
}
counts, err := c.SeasonEpisodeCounts(ctx, top.ID)
if err != nil {
t.Fatalf("SeasonEpisodeCounts: %v", err)
}
t.Logf("season counts: %v", counts)
if counts[1] == 0 {
t.Error("ожидались серии в первом сезоне")
}
}
// TestIntegration_TVDB бьётся в реальный TheTVDB v4. По умолчанию
// пропускается; включается ключом:
//
// 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,
Language: "ru",
}, nil)
if err != nil {
t.Fatalf("NewTVDB: %v", err)
}
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
cands, err := c.Search(ctx, metadata.Query{Type: metadata.Series, Title: "Fargo", Year: 2014})
if err != nil {
t.Fatalf("Search: %v", err)
}
t.Logf("candidates (%d):", len(cands))
for i, cd := range cands {
if i >= 5 {
break
}
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
counts, err := c.SeasonEpisodeCounts(ctx, id)
if err != nil {
t.Fatalf("SeasonEpisodeCounts(%s): %v", id, err)
}
t.Logf("season episode counts for id=%s: %v", id, counts)
if len(counts) == 0 {
t.Error("ожидались данные о числе серий по сезонам")
}
}