From bd265e47fa01bd8188a0c54ee3d88fa164df8dd9 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 27 Dec 2022 01:07:15 -0800 Subject: [PATCH] Fixed: Don't try to remove the same item from queue multiple times (cherry picked from commit 2491da067815e129df3a3a79c0cc7221a9d87094) Closes #2087 --- src/Readarr.Api.V1/Queue/QueueController.cs | 66 ++++++++++++++------- 1 file changed, 44 insertions(+), 22 deletions(-) diff --git a/src/Readarr.Api.V1/Queue/QueueController.cs b/src/Readarr.Api.V1/Queue/QueueController.cs index a3fb4312a..df66d23ac 100644 --- a/src/Readarr.Api.V1/Queue/QueueController.cs +++ b/src/Readarr.Api.V1/Queue/QueueController.cs @@ -71,29 +71,62 @@ namespace Readarr.Api.V1.Queue [RestDeleteById] public void RemoveAction(int id, bool removeFromClient = true, bool blocklist = false, bool skipRedownload = false) { - var trackedDownload = Remove(id, removeFromClient, blocklist, skipRedownload); + var pendingRelease = _pendingReleaseService.FindPendingQueueItem(id); - if (trackedDownload != null) + if (pendingRelease != null) + { + Remove(pendingRelease); + + return; + } + + var trackedDownload = GetTrackedDownload(id); + + if (trackedDownload == null) { - _trackedDownloadService.StopTracking(trackedDownload.DownloadItem.DownloadId); + throw new NotFoundException(); } + + Remove(trackedDownload, removeFromClient, blocklist, skipRedownload); + _trackedDownloadService.StopTracking(trackedDownload.DownloadItem.DownloadId); } [HttpDelete("bulk")] public object RemoveMany([FromBody] QueueBulkResource resource, [FromQuery] bool removeFromClient = true, [FromQuery] bool blocklist = false, [FromQuery] bool skipRedownload = false) { var trackedDownloadIds = new List(); + var pendingToRemove = new List(); + var trackedToRemove = new List(); foreach (var id in resource.Ids) { - var trackedDownload = Remove(id, removeFromClient, blocklist, skipRedownload); + var pendingRelease = _pendingReleaseService.FindPendingQueueItem(id); + + if (pendingRelease != null) + { + pendingToRemove.Add(pendingRelease); + continue; + } + + var trackedDownload = GetTrackedDownload(id); if (trackedDownload != null) { - trackedDownloadIds.Add(trackedDownload.DownloadItem.DownloadId); + trackedToRemove.Add(trackedDownload); } } + foreach (var pendingRelease in pendingToRemove.DistinctBy(p => p.Id)) + { + Remove(pendingRelease); + } + + foreach (var trackedDownload in trackedToRemove.DistinctBy(t => t.DownloadItem.DownloadId)) + { + Remove(trackedDownload, removeFromClient, blocklist, skipRedownload); + trackedDownloadIds.Add(trackedDownload.DownloadItem.DownloadId); + } + _trackedDownloadService.StopTracking(trackedDownloadIds); return new { }; @@ -206,25 +239,14 @@ namespace Readarr.Api.V1.Queue } } - private TrackedDownload Remove(int id, bool removeFromClient, bool blocklist, bool skipRedownload) + private void Remove(NzbDrone.Core.Queue.Queue pendingRelease) { - var pendingRelease = _pendingReleaseService.FindPendingQueueItem(id); - - if (pendingRelease != null) - { - _blocklistService.Block(pendingRelease.RemoteBook, "Pending book manually blocklisted"); - _pendingReleaseService.RemovePendingQueueItems(pendingRelease.Id); - - return null; - } - - var trackedDownload = GetTrackedDownload(id); - - if (trackedDownload == null) - { - throw new NotFoundException(); - } + _blocklistService.Block(pendingRelease.RemoteBook, "Pending release manually blocklisted"); + _pendingReleaseService.RemovePendingQueueItems(pendingRelease.Id); + } + private TrackedDownload Remove(TrackedDownload trackedDownload, bool removeFromClient, bool blocklist, bool skipRedownload) + { if (removeFromClient) { var downloadClient = _downloadClientProvider.Get(trackedDownload.DownloadClient);