From df8dbfc5e11822e9c4047be52ba833ba64582993 Mon Sep 17 00:00:00 2001 From: Josh Patra Date: Fri, 30 Jan 2026 13:37:42 -0500 Subject: [PATCH] fix: prevent duplicate downloads by registering before releasing lock - Move RegisterDownloadedSongAsync call before lock release - Prevents race condition where multiple threads download same song - Second thread now finds registered mapping before starting download - Fixes duplicate files like 'Song (1).flac', 'Song (2).flac' - Library scan and album download still happen after lock release --- allstarr/Services/Common/BaseDownloadService.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/allstarr/Services/Common/BaseDownloadService.cs b/allstarr/Services/Common/BaseDownloadService.cs index 4c2ae84..26f014a 100644 --- a/allstarr/Services/Common/BaseDownloadService.cs +++ b/allstarr/Services/Common/BaseDownloadService.cs @@ -298,6 +298,12 @@ public abstract class BaseDownloadService : IDownloadService song.LocalPath = localPath; + // Register BEFORE releasing lock to prevent race conditions + if (!isCache) + { + await LocalLibraryService.RegisterDownloadedSongAsync(song, localPath); + } + // Check if this track belongs to a playlist and update M3U if (PlaylistSyncService != null) { @@ -316,11 +322,9 @@ public abstract class BaseDownloadService : IDownloadService } } - // Only register and scan if NOT in cache mode + // Trigger library scan and album download AFTER releasing lock if (!isCache) { - await LocalLibraryService.RegisterDownloadedSongAsync(song, localPath); - // Trigger a Subsonic library rescan (with debounce) _ = Task.Run(async () => {