diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-03 19:17:04 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-03 19:17:04 +0300 |
| commit | 30c2b0fe8232cc748ab2bded6ab4d76febe32425 (patch) | |
| tree | 985578b326a1ff8fe7af395bf08471857376b8fc /internal/service/media.go | |
| parent | 687b86cdeef2192272f0945ddd496322a9113f9e (diff) | |
fix(admin): fix rescan goroutine lifecycle and race on shared ScanProgress
- Protect adminService scan state (cancel func + progress pointer) with sync.Mutex.
- Allocate fresh ScanProgress per trigger and pass it to the scanner,
eliminating races on the previously shared progress struct.
- Cancel previous scan context before starting a new one.
- Add tests for cancellation, fresh progress per scan, concurrent triggers,
and empty progress when never started.
- Fix race-prone tests by polling Running==true before waiting for completion.
Diffstat (limited to 'internal/service/media.go')
| -rw-r--r-- | internal/service/media.go | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/internal/service/media.go b/internal/service/media.go index a617a29..2f7719d 100644 --- a/internal/service/media.go +++ b/internal/service/media.go @@ -75,6 +75,14 @@ var supportedExtensions = map[string]struct{}{ ".wma": {}, ".m4b": {}, ".opus": {}, + ".jpg": {}, + ".jpeg": {}, + ".png": {}, + ".gif": {}, + ".webp": {}, + ".bmp": {}, + ".avif": {}, + ".svg": {}, } func isSupportedExtension(name string) bool { @@ -90,13 +98,20 @@ func guessMediaType(name string) model.MediaType { return model.MediaTypeVideo case ".mp3", ".wav", ".flac", ".aac", ".ogg", ".m4a", ".wma", ".m4b", ".opus": return model.MediaTypeAudio + case ".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp", ".avif", ".svg": + return model.MediaTypeImage default: return model.MediaTypeVideo } } -// generateThumbnail creates a thumbnail for a video file. +// generateThumbnail creates a thumbnail for a video or image file. func (s *mediaService) generateThumbnail(ctx context.Context, media *model.Media, duration float64) error { + ext := strings.ToLower(filepath.Ext(media.AbsPath)) + if ext == ".svg" { + media.ThumbnailPath = media.AbsPath + return nil + } thumbDir := filepath.Join(filepath.Dir(media.AbsPath), ".thumbnails") if err := os.MkdirAll(thumbDir, 0o755); err != nil { return fmt.Errorf("mkdir thumbnails: %w", err) |
