feat(library): exclude configured folders from scanning and analysis
ci / api / api (push) Successful in 56s
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 1m23s
ci / db / db (push) Successful in 1m8s
ci / recommender / recommender (push) Failing after 40s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 1m25s
ci / ts / ts (packages + web) (push) Successful in 7m20s
ci / api / api (push) Successful in 56s
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 1m23s
ci / db / db (push) Successful in 1m8s
ci / recommender / recommender (push) Failing after 40s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 1m25s
ci / ts / ts (packages + web) (push) Successful in 7m20s
This commit is contained in:
1 parent
0dc0384c78
commit
75ae2092ad
23 files changed
+837
-351
No files matched your search
@@ -88,3 +88,73 @@ func TestLibraryDiagnostics(t *testing.T) {
|
||||
require.Equal(t, 1, paths)
|
||||
require.Equal(t, 1, missing)
|
||||
}
|
||||
|
||||
func TestScanExcludedFolders(t *testing.T) {
|
||||
pool := connect(t)
|
||||
ctx := context.Background()
|
||||
require.NoError(t, db.Migrate(ctx, pool))
|
||||
store := library.NewStore(pool)
|
||||
src, err := store.SaveSource(ctx, library.Source{ID: uuid.New(), Name: "exclusions", Type: library.SourceLocal, Status: "mounted", TagsFirst: true, NFSOptions: "ro"})
|
||||
require.NoError(t, err)
|
||||
t.Cleanup(func() {
|
||||
require.NoError(t, store.DeleteSource(ctx, src.ID))
|
||||
require.NoError(t, store.CleanupOrphans(ctx))
|
||||
})
|
||||
root := t.TempDir()
|
||||
for _, rel := range []string{"Downloads_PumpEars/Artist - Loop.wav", "Downloads_PumpEars/nested/Artist - Hit.wav", "Downloads_PumpEars-copy/Artist - Song.flac"} {
|
||||
p := filepath.Join(root, filepath.FromSlash(rel))
|
||||
require.NoError(t, os.MkdirAll(filepath.Dir(p), 0o755))
|
||||
require.NoError(t, os.WriteFile(p, []byte(rel), 0o644))
|
||||
}
|
||||
board := library.NewProgressBoard()
|
||||
scanner := library.NewScanner(store, fakeProber{}, board, slog.New(slog.DiscardHandler))
|
||||
scan := func() library.Progress {
|
||||
require.NoError(t, scanner.Start(src, root, true))
|
||||
require.Eventually(t, func() bool { p, ok := board.Get(src.ID); return ok && !p.Running }, 10*time.Second, 10*time.Millisecond)
|
||||
p, _ := board.Get(src.ID)
|
||||
require.Empty(t, p.Error)
|
||||
return p
|
||||
}
|
||||
require.Equal(t, 3, scan().Found)
|
||||
_, err = pool.Exec(ctx, `UPDATE analysis_jobs SET status = 'failed', error = 'too short' WHERE track_id IN (SELECT track_id FROM media_files WHERE source_id = $1)`, src.ID)
|
||||
require.NoError(t, err)
|
||||
before, err := store.AnalysisCounts(ctx)
|
||||
require.NoError(t, err)
|
||||
src.ExcludedDirs = []string{"Downloads_PumpEars"}
|
||||
src, err = store.SaveSource(ctx, src)
|
||||
require.NoError(t, err)
|
||||
saved, err := store.GetSource(ctx, src.ID)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, src.ExcludedDirs, saved.ExcludedDirs)
|
||||
counts, err := store.AnalysisCounts(ctx)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, before.Failed-2, counts.Failed, "old failed jobs from excluded folders disappear immediately")
|
||||
_, err = store.RetryFailedAnalysis(ctx)
|
||||
require.NoError(t, err)
|
||||
var failed int
|
||||
require.NoError(t, pool.QueryRow(ctx, `SELECT count(*) FROM analysis_jobs WHERE status = 'failed' AND track_id IN (SELECT track_id FROM media_files WHERE source_id = $1)`, src.ID).Scan(&failed))
|
||||
require.Equal(t, 2, failed, "retry must not requeue excluded jobs")
|
||||
p := scan()
|
||||
require.Equal(t, 1, p.Found)
|
||||
require.Equal(t, 1, p.ToProcess)
|
||||
require.Zero(t, p.Missing)
|
||||
files, err := store.Files(ctx, src.ID)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, files, 3, "excluded records must be preserved")
|
||||
for _, f := range files {
|
||||
require.False(t, f.Missing, "excluded files must not be treated as absent")
|
||||
}
|
||||
// Literal matching must not treat % and _ as SQL wildcards.
|
||||
for _, test := range []struct {
|
||||
path string
|
||||
excluded bool
|
||||
}{{"100%_loops/a.wav", true}, {"100xxloops/a.wav", false}, {"100%_loops-copy/a.wav", false}} {
|
||||
var excluded bool
|
||||
require.NoError(t, pool.QueryRow(ctx, `SELECT library_path_excluded($1, ARRAY['100%_loops'])`, test.path).Scan(&excluded))
|
||||
require.Equal(t, test.excluded, excluded)
|
||||
}
|
||||
src.ExcludedDirs = []string{}
|
||||
src, err = store.SaveSource(ctx, src)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, 3, scan().Found, "clearing exclusions makes the subtree eligible again")
|
||||
}
|
||||
Reference in new issue
Block a user