summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
Diffstat (limited to 'internal')
-rw-r--r--internal/model/scan.go7
-rw-r--r--internal/model/scan_test.go11
-rw-r--r--internal/scanner/scanner.go2
-rw-r--r--internal/scanner/scanner_test.go56
4 files changed, 75 insertions, 1 deletions
diff --git a/internal/model/scan.go b/internal/model/scan.go
index 7fb4e8d..aeec15e 100644
--- a/internal/model/scan.go
+++ b/internal/model/scan.go
@@ -47,6 +47,13 @@ func (p *ScanProgress) SetFilesTotal(total int) {
p.FilesTotal = total
}
+// AddFilesTotal adds to the total number of files discovered during the scan.
+func (p *ScanProgress) AddFilesTotal(total int) {
+ p.mu.Lock()
+ defer p.mu.Unlock()
+ p.FilesTotal += total
+}
+
// IncrementSet increments the completed set count.
func (p *ScanProgress) IncrementSet() {
p.mu.Lock()
diff --git a/internal/model/scan_test.go b/internal/model/scan_test.go
index acd1dd1..7d370c3 100644
--- a/internal/model/scan_test.go
+++ b/internal/model/scan_test.go
@@ -50,6 +50,17 @@ func TestScanProgress_SetFilesTotal(t *testing.T) {
}
}
+func TestScanProgress_AddFilesTotal(t *testing.T) {
+ var p ScanProgress
+ p.Start(2)
+ p.AddFilesTotal(10)
+ p.AddFilesTotal(15)
+ cp := p.Copy()
+ if cp.FilesTotal != 25 {
+ t.Errorf("FilesTotal = %d, want 25", cp.FilesTotal)
+ }
+}
+
func TestScanProgress_IncrementFile(t *testing.T) {
var p ScanProgress
p.Start(1)
diff --git a/internal/scanner/scanner.go b/internal/scanner/scanner.go
index dc5f34f..d1e50ba 100644
--- a/internal/scanner/scanner.go
+++ b/internal/scanner/scanner.go
@@ -347,7 +347,7 @@ func (s *FSScanner) scanSet(ctx context.Context, root, setPath string, progress
}
if progress != nil {
- progress.SetFilesTotal(len(files))
+ progress.AddFilesTotal(len(files))
}
pathChan := make(chan string, len(files))
diff --git a/internal/scanner/scanner_test.go b/internal/scanner/scanner_test.go
index ad6ddd7..0738709 100644
--- a/internal/scanner/scanner_test.go
+++ b/internal/scanner/scanner_test.go
@@ -268,6 +268,62 @@ func TestFSScanner_Scan(t *testing.T) {
}
})
+ t.Run("progress accumulates file totals across sets", func(t *testing.T) {
+ mfs := &mockFS{
+ entries: map[string][]os.DirEntry{
+ "/media": {
+ mockDirEntry{name: "Music", isDir: true},
+ mockDirEntry{name: "Movies", isDir: true},
+ },
+ },
+ fileInfos: map[string]os.FileInfo{
+ "/media/Music/a.mp3": mockFileInfo{name: "a.mp3", size: 100},
+ "/media/Music/b.mp3": mockFileInfo{name: "b.mp3", size: 200},
+ "/media/Movies/c.mp3": mockFileInfo{name: "c.mp3", size: 300},
+ },
+ walkList: []walkEntry{
+ {path: "/media/Music", isDir: true},
+ {path: "/media/Music/a.mp3", isDir: false},
+ {path: "/media/Music/b.mp3", isDir: false},
+ {path: "/media/Movies", isDir: true},
+ {path: "/media/Movies/c.mp3", isDir: false},
+ {path: "/media/Movies/readme", isDir: false},
+ },
+ }
+ store := repository.NewMockStore()
+ store.SetRepo.ListSetsFunc = func(_ context.Context) ([]model.Set, error) {
+ return []model.Set{
+ {ID: 1, Name: "Music", RootPath: "Music"},
+ {ID: 2, Name: "Movies", RootPath: "Movies"},
+ }, nil
+ }
+ store.MediaRepo.ListMediaFunc = func(_ context.Context, filter repository.MediaFilter) ([]model.Media, error) {
+ return nil, nil
+ }
+ store.MediaRepo.CreateMediaFunc = func(_ context.Context, m *model.Media) (int64, error) {
+ return 1, nil
+ }
+ prober := &probe.MockProber{
+ ProbeFunc: func(_ context.Context, path string) (*model.Metadata, error) {
+ return &model.Metadata{Duration: 1, Codec: "mp3"}, nil
+ },
+ }
+
+ var progress model.ScanProgress
+ s := newTestScanner(store, prober, &thumb.MockGenerator{}, clk, mfs)
+ if err := s.Scan(ctx, "/media", &progress); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+
+ cp := progress.Copy()
+ if cp.SetsTotal != 2 || cp.SetsDone != 2 {
+ t.Fatalf("expected 2/2 sets, got %d/%d", cp.SetsDone, cp.SetsTotal)
+ }
+ if cp.FilesTotal != 3 || cp.FilesDone != 3 {
+ t.Fatalf("expected 3/3 files, got %d/%d", cp.FilesDone, cp.FilesTotal)
+ }
+ })
+
t.Run("scans all top-level dirs and marks canonical podcast root", func(t *testing.T) {
mfs := &mockFS{
entries: map[string][]os.DirEntry{