From 30c2b0fe8232cc748ab2bded6ab4d76febe32425 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sun, 3 May 2026 19:17:04 +0300 Subject: 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. --- internal/service/media_write.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'internal/service/media_write.go') diff --git a/internal/service/media_write.go b/internal/service/media_write.go index ff316c7..4343db8 100644 --- a/internal/service/media_write.go +++ b/internal/service/media_write.go @@ -92,8 +92,17 @@ func (s *mediaService) UploadMedia(ctx context.Context, setID, userID int64, fil media.Codec = meta.Codec media.Resolution = meta.Resolution media.Bitrate = meta.Bitrate - - if media.Type == model.MediaTypeVideo { + media.Width = meta.Width + media.Height = meta.Height + media.EXIFCamera = meta.EXIFCamera + media.EXIFLens = meta.EXIFLens + media.EXIFDate = meta.EXIFDate + media.EXIFISO = meta.EXIFISO + media.EXIFFNumber = meta.EXIFFNumber + media.EXIFExposure = meta.EXIFExposure + media.EXIFFocalLength = meta.EXIFFocalLength + + if media.Type == model.MediaTypeVideo || media.Type == model.MediaTypeImage { if err := s.generateThumbnail(ctx, media, meta.Duration); err != nil { os.Remove(path) _ = s.store.HardDeleteMedia(ctx, media.ID) -- cgit v1.2.3