summaryrefslogtreecommitdiff
path: root/internal/service/media.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-03 19:17:04 +0300
committerPaul Buetow <paul@buetow.org>2026-05-03 19:17:04 +0300
commit30c2b0fe8232cc748ab2bded6ab4d76febe32425 (patch)
tree985578b326a1ff8fe7af395bf08471857376b8fc /internal/service/media.go
parent687b86cdeef2192272f0945ddd496322a9113f9e (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.go17
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)