From 0f0afd62bbf4b4ea2287ae22baf96a98006fa91c Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sat, 25 Apr 2020 11:49:18 -0700 Subject: [PATCH] Fixed: Remove seeded downloads if they've finished seeding after import --- .../Download/DownloadCanBeRemovedEvent.cs | 15 ++++++++ .../Download/DownloadClientItem.cs | 2 +- .../Download/DownloadCompletedEvent.cs | 15 ++++++++ .../Download/DownloadEventHub.cs | 38 +++++++++---------- .../Download/DownloadProcessingService.cs | 20 ++++++++++ .../DownloadMonitoringService.cs | 1 + 6 files changed, 69 insertions(+), 22 deletions(-) create mode 100644 src/NzbDrone.Core/Download/DownloadCanBeRemovedEvent.cs create mode 100644 src/NzbDrone.Core/Download/DownloadCompletedEvent.cs diff --git a/src/NzbDrone.Core/Download/DownloadCanBeRemovedEvent.cs b/src/NzbDrone.Core/Download/DownloadCanBeRemovedEvent.cs new file mode 100644 index 000000000..99cb3e706 --- /dev/null +++ b/src/NzbDrone.Core/Download/DownloadCanBeRemovedEvent.cs @@ -0,0 +1,15 @@ +using NzbDrone.Common.Messaging; +using NzbDrone.Core.Download.TrackedDownloads; + +namespace NzbDrone.Core.Download +{ + public class DownloadCanBeRemovedEvent : IEvent + { + public TrackedDownload TrackedDownload { get; private set; } + + public DownloadCanBeRemovedEvent(TrackedDownload trackedDownload) + { + TrackedDownload = trackedDownload; + } + } +} diff --git a/src/NzbDrone.Core/Download/DownloadClientItem.cs b/src/NzbDrone.Core/Download/DownloadClientItem.cs index 91e19e3c3..e548b027d 100644 --- a/src/NzbDrone.Core/Download/DownloadClientItem.cs +++ b/src/NzbDrone.Core/Download/DownloadClientItem.cs @@ -6,7 +6,7 @@ namespace NzbDrone.Core.Download { - [DebuggerDisplay("{DownloadClientName}:{Title}")] + [DebuggerDisplay("{DownloadClientInfo?.Name}:{Title}")] public class DownloadClientItem { public DownloadClientItemClientInfo DownloadClientInfo { get; set; } diff --git a/src/NzbDrone.Core/Download/DownloadCompletedEvent.cs b/src/NzbDrone.Core/Download/DownloadCompletedEvent.cs new file mode 100644 index 000000000..30cfd63c7 --- /dev/null +++ b/src/NzbDrone.Core/Download/DownloadCompletedEvent.cs @@ -0,0 +1,15 @@ +using NzbDrone.Common.Messaging; +using NzbDrone.Core.Download.TrackedDownloads; + +namespace NzbDrone.Core.Download +{ + public class DownloadCompletedEvent : IEvent + { + public TrackedDownload TrackedDownload { get; private set; } + + public DownloadCompletedEvent(TrackedDownload trackedDownload) + { + TrackedDownload = trackedDownload; + } + } +} diff --git a/src/NzbDrone.Core/Download/DownloadEventHub.cs b/src/NzbDrone.Core/Download/DownloadEventHub.cs index b63826ee8..ef219a3a0 100644 --- a/src/NzbDrone.Core/Download/DownloadEventHub.cs +++ b/src/NzbDrone.Core/Download/DownloadEventHub.cs @@ -1,24 +1,14 @@ using System; using NLog; -using NzbDrone.Common.Messaging; using NzbDrone.Core.Configuration; using NzbDrone.Core.Download.TrackedDownloads; using NzbDrone.Core.Messaging.Events; namespace NzbDrone.Core.Download { - public class DownloadCompletedEvent : IEvent - { - public TrackedDownload TrackedDownload { get; private set; } - - public DownloadCompletedEvent(TrackedDownload trackedDownload) - { - TrackedDownload = trackedDownload; - } - } - public class DownloadEventHub : IHandle, - IHandle + IHandle, + IHandle { private readonly IConfigService _configService; private readonly IProvideDownloadClient _downloadClientProvider; @@ -33,6 +23,18 @@ public DownloadEventHub(IConfigService configService, _logger = logger; } + public void Handle(DownloadFailedEvent message) + { + var trackedDownload = message.TrackedDownload; + + if (trackedDownload == null || !trackedDownload.DownloadItem.CanBeRemoved || _configService.RemoveFailedDownloads == false) + { + return; + } + + RemoveFromDownloadClient(trackedDownload); + } + public void Handle(DownloadCompletedEvent message) { if (_configService.RemoveCompletedDownloads && @@ -48,16 +50,10 @@ public void Handle(DownloadCompletedEvent message) } } - public void Handle(DownloadFailedEvent message) + public void Handle(DownloadCanBeRemovedEvent message) { - var trackedDownload = message.TrackedDownload; - - if (trackedDownload == null || !trackedDownload.DownloadItem.CanBeRemoved || _configService.RemoveFailedDownloads == false) - { - return; - } - - RemoveFromDownloadClient(trackedDownload); + // Already verified that it can be removed, just needs to be removed + RemoveFromDownloadClient(message.TrackedDownload); } private void RemoveFromDownloadClient(TrackedDownload trackedDownload) diff --git a/src/NzbDrone.Core/Download/DownloadProcessingService.cs b/src/NzbDrone.Core/Download/DownloadProcessingService.cs index 689fe0c20..b510cac4d 100644 --- a/src/NzbDrone.Core/Download/DownloadProcessingService.cs +++ b/src/NzbDrone.Core/Download/DownloadProcessingService.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using NLog; using NzbDrone.Core.Configuration; @@ -32,9 +33,18 @@ public DownloadProcessingService(IConfigService configService, _logger = logger; } + private void RemoveCompletedDownloads(List trackedDownloads) + { + foreach (var trackedDownload in trackedDownloads.Where(c => c.DownloadItem.CanBeRemoved && c.State == TrackedDownloadState.Imported)) + { + _eventAggregator.PublishEvent(new DownloadCompletedEvent(trackedDownload)); + } + } + public void Execute(ProcessMonitoredDownloadsCommand message) { var enableCompletedDownloadHandling = _configService.EnableCompletedDownloadHandling; + var removeCompletedDownloads = _configService.RemoveCompletedDownloads; var trackedDownloads = _trackedDownloadService.GetTrackedDownloads() .Where(t => t.IsTrackable) .ToList(); @@ -46,11 +56,21 @@ public void Execute(ProcessMonitoredDownloadsCommand message) if (trackedDownload.State == TrackedDownloadState.FailedPending) { _failedDownloadService.ProcessFailed(trackedDownload); + continue; } if (enableCompletedDownloadHandling && trackedDownload.State == TrackedDownloadState.ImportPending) { _completedDownloadService.Import(trackedDownload); + continue; + } + + if (removeCompletedDownloads && + trackedDownload.DownloadItem.Removed && + trackedDownload.DownloadItem.CanBeRemoved && + trackedDownload.State == TrackedDownloadState.Imported) + { + _eventAggregator.PublishEvent(new DownloadCanBeRemovedEvent(trackedDownload)); } } catch (Exception e) diff --git a/src/NzbDrone.Core/Download/TrackedDownloads/DownloadMonitoringService.cs b/src/NzbDrone.Core/Download/TrackedDownloads/DownloadMonitoringService.cs index 6e41c24ab..96c624028 100644 --- a/src/NzbDrone.Core/Download/TrackedDownloads/DownloadMonitoringService.cs +++ b/src/NzbDrone.Core/Download/TrackedDownloads/DownloadMonitoringService.cs @@ -108,6 +108,7 @@ private TrackedDownload ProcessClientItem(IDownloadClient downloadClient, Downlo try { var trackedDownload = _trackedDownloadService.TrackDownload((DownloadClientDefinition)downloadClient.Definition, downloadItem); + if (trackedDownload != null && trackedDownload.State == TrackedDownloadState.Downloading) { _failedDownloadService.Check(trackedDownload);