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_write.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_write.go')
| -rw-r--r-- | internal/service/media_write.go | 13 |
1 files changed, 11 insertions, 2 deletions
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) |
