Добавил поиск метаданных по каталогам

This commit is contained in:
2026-06-14 15:21:01 +03:00
parent 9c1b178e46
commit 5087f35861
21 changed files with 1435 additions and 72 deletions
+26 -12
View File
@@ -56,7 +56,7 @@ func TestRecognize_Movie(t *testing.T) {
{"src":"The.Matrix.1999/sample.mkv","role":"sample","season":null,"episode":null}
]}`
f := &fakeLLM{responses: []string{resp}}
r := New(f, Config{MaxRetries: 2}, testLogger())
r := New(f, nil, Config{MaxRetries: 2}, testLogger())
res, err := r.Recognize(context.Background(), in)
if err != nil {
@@ -74,9 +74,10 @@ func TestRecognize_Movie(t *testing.T) {
if len(res.Decision.Reasons) == 0 {
t.Error("expected at least the no-DB-match reason")
}
// Чистая структура: единственная причина — отсутствие матча в базе.
if len(res.Decision.Reasons) != 1 {
t.Errorf("unexpected extra warnings: %v", res.Decision.Reasons)
// Чистая структура + уверенность 0.9 ≥ порога: единственная причина —
// отсутствие матча в базе.
if len(res.Decision.Reasons) != 1 || !hasReason(res.Decision.Reasons, "метабазы отключены") {
t.Errorf("unexpected reasons: %v", res.Decision.Reasons)
}
}
@@ -96,7 +97,7 @@ func TestRecognize_Series(t *testing.T) {
{"src":"Avatar/03.mkv","role":"episode","season":2,"episode":3}
]}`
f := &fakeLLM{responses: []string{resp}}
r := New(f, Config{}, testLogger())
r := New(f, nil, Config{}, testLogger())
res, err := r.Recognize(context.Background(), in)
if err != nil {
@@ -105,9 +106,22 @@ func TestRecognize_Series(t *testing.T) {
if res.Plan.Type != MediaSeries || len(res.Plan.Files) != 3 {
t.Errorf("plan = %+v", res.Plan)
}
if len(res.Decision.Reasons) != 1 {
t.Errorf("clean series should warn only about DB match, got: %v", res.Decision.Reasons)
// Метабазы выключены → авто нет; причина про базу обязательна.
if res.Decision.Auto {
t.Error("auto must be false without metadata providers")
}
if !hasReason(res.Decision.Reasons, "метабазы отключены") {
t.Errorf("expected metadata-off reason, got: %v", res.Decision.Reasons)
}
}
func hasReason(reasons []string, substr string) bool {
for _, r := range reasons {
if strings.Contains(r, substr) {
return true
}
}
return false
}
func TestRecognize_RetriesOnBadSrcThenSucceeds(t *testing.T) {
@@ -120,7 +134,7 @@ func TestRecognize_RetriesOnBadSrcThenSucceeds(t *testing.T) {
good := `{"type":"movie","title":"Some Movie","year":2020,"files":[
{"src":"movie/film.mkv","role":"main"}]}`
f := &fakeLLM{responses: []string{bad, good}}
r := New(f, Config{MaxRetries: 2}, testLogger())
r := New(f, nil, Config{MaxRetries: 2}, testLogger())
res, err := r.Recognize(context.Background(), in)
if err != nil {
@@ -143,7 +157,7 @@ func TestRecognize_ExhaustedRetriesGoesToReview(t *testing.T) {
in := Input{Name: "x", Files: []File{{Path: "a.mkv", Size: 1}}}
bad := `not a json at all`
f := &fakeLLM{responses: []string{bad}}
r := New(f, Config{MaxRetries: 2}, testLogger())
r := New(f, nil, Config{MaxRetries: 2}, testLogger())
res, err := r.Recognize(context.Background(), in)
if err != nil {
@@ -167,7 +181,7 @@ func TestRecognize_TransportErrorPropagates(t *testing.T) {
in := Input{Name: "x", Files: []File{{Path: "a.mkv", Size: 1}}}
wantErr := errors.New("connection refused")
f := &fakeLLM{errs: []error{wantErr}}
r := New(f, Config{MaxRetries: 2}, testLogger())
r := New(f, nil, Config{MaxRetries: 2}, testLogger())
_, err := r.Recognize(context.Background(), in)
if err == nil || !errors.Is(err, wantErr) {
@@ -188,7 +202,7 @@ func TestRecognize_PromptCarriesSignals(t *testing.T) {
resp := `{"type":"series","title":"Some Show","files":[
{"src":"ep1.mkv","role":"episode","season":1,"episode":1}]}`
f := &fakeLLM{responses: []string{resp}}
r := New(f, Config{}, testLogger())
r := New(f, nil, Config{}, testLogger())
if _, err := r.Recognize(context.Background(), in); err != nil {
t.Fatalf("Recognize: %v", err)
}
@@ -219,7 +233,7 @@ func TestRecognize_FileListTruncated(t *testing.T) {
resp := `{"type":"series","title":"Big","files":[{"src":"` + pathOf(0) +
`","role":"episode","season":1,"episode":1}]}`
f := &fakeLLM{responses: []string{resp}}
r := New(f, Config{MaxFiles: 100}, testLogger())
r := New(f, nil, Config{MaxFiles: 100}, testLogger())
if _, err := r.Recognize(context.Background(), in); err != nil {
t.Fatalf("Recognize: %v", err)
}