From 0b1e99991e34ca022d2d7eed73136ffaffddb14c Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Wed, 29 Apr 2020 00:08:01 -0700 Subject: [PATCH] Fixed: Imports triggered through API not being marked as imported/removed from client Fixes #3717 --- .../Download/CompletedDownloadService.cs | 48 ++++++++++++------- .../DownloadedEpisodesCommandService.cs | 16 ++++--- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/src/NzbDrone.Core/Download/CompletedDownloadService.cs b/src/NzbDrone.Core/Download/CompletedDownloadService.cs index 9bd762388..172db7183 100644 --- a/src/NzbDrone.Core/Download/CompletedDownloadService.cs +++ b/src/NzbDrone.Core/Download/CompletedDownloadService.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using System.Linq; using NzbDrone.Common.EnvironmentInfo; @@ -17,6 +18,7 @@ namespace NzbDrone.Core.Download { void Check(TrackedDownload trackedDownload); void Import(TrackedDownload trackedDownload); + bool VerifyImport(TrackedDownload trackedDownload, List importResults); } public class CompletedDownloadService : ICompletedDownloadService @@ -106,6 +108,31 @@ namespace NzbDrone.Core.Download var importResults = _downloadedEpisodesImportService.ProcessPath(outputPath, ImportMode.Auto, trackedDownload.RemoteEpisode.Series, trackedDownload.DownloadItem); + if (VerifyImport(trackedDownload, importResults)) + { + return; + } + + trackedDownload.State = TrackedDownloadState.ImportPending; + + if (importResults.Empty()) + { + trackedDownload.Warn("No files found are eligible for import in {0}", outputPath); + } + + if (importResults.Any(c => c.Result != ImportResultType.Imported)) + { + var statusMessages = importResults + .Where(v => v.Result != ImportResultType.Imported) + .Select(v => new TrackedDownloadStatusMessage(Path.GetFileName(v.ImportDecision.LocalEpisode.Path), v.Errors)) + .ToArray(); + + trackedDownload.Warn(statusMessages); + } + } + + public bool VerifyImport(TrackedDownload trackedDownload, List importResults) + { var allEpisodesImported = importResults.Where(c => c.Result == ImportResultType.Imported) .SelectMany(c => c.ImportDecision.LocalEpisode.Episodes) .Count() >= Math.Max(1, @@ -115,7 +142,7 @@ namespace NzbDrone.Core.Download { trackedDownload.State = TrackedDownloadState.Imported; _eventAggregator.PublishEvent(new DownloadCompletedEvent(trackedDownload)); - return; + return true; } // Double check if all episodes were imported by checking the history if at least one @@ -139,26 +166,11 @@ namespace NzbDrone.Core.Download { trackedDownload.State = TrackedDownloadState.Imported; _eventAggregator.PublishEvent(new DownloadCompletedEvent(trackedDownload)); - return; + return true; } } - trackedDownload.State = TrackedDownloadState.ImportPending; - - if (importResults.Empty()) - { - trackedDownload.Warn("No files found are eligible for import in {0}", outputPath); - } - - if (importResults.Any(c => c.Result != ImportResultType.Imported)) - { - var statusMessages = importResults - .Where(v => v.Result != ImportResultType.Imported) - .Select(v => new TrackedDownloadStatusMessage(Path.GetFileName(v.ImportDecision.LocalEpisode.Path), v.Errors)) - .ToArray(); - - trackedDownload.Warn(statusMessages); - } + return false; } } } diff --git a/src/NzbDrone.Core/MediaFiles/DownloadedEpisodesCommandService.cs b/src/NzbDrone.Core/MediaFiles/DownloadedEpisodesCommandService.cs index ca6543c8c..656a22b7f 100644 --- a/src/NzbDrone.Core/MediaFiles/DownloadedEpisodesCommandService.cs +++ b/src/NzbDrone.Core/MediaFiles/DownloadedEpisodesCommandService.cs @@ -5,6 +5,7 @@ using NLog; using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Common.Instrumentation.Extensions; +using NzbDrone.Core.Download; using NzbDrone.Core.Download.TrackedDownloads; using NzbDrone.Core.MediaFiles.Commands; using NzbDrone.Core.MediaFiles.EpisodeImport; @@ -17,16 +18,19 @@ namespace NzbDrone.Core.MediaFiles private readonly IDownloadedEpisodesImportService _downloadedEpisodesImportService; private readonly ITrackedDownloadService _trackedDownloadService; private readonly IDiskProvider _diskProvider; + private readonly ICompletedDownloadService _completedDownloadService; private readonly Logger _logger; public DownloadedEpisodesCommandService(IDownloadedEpisodesImportService downloadedEpisodesImportService, ITrackedDownloadService trackedDownloadService, IDiskProvider diskProvider, + ICompletedDownloadService completedDownloadService, Logger logger) { _downloadedEpisodesImportService = downloadedEpisodesImportService; _trackedDownloadService = trackedDownloadService; _diskProvider = diskProvider; + _completedDownloadService = completedDownloadService; _logger = logger; } @@ -46,14 +50,14 @@ namespace NzbDrone.Core.MediaFiles { _logger.Debug("External directory scan request for known download {0}. [{1}]", message.DownloadClientId, message.Path); - return _downloadedEpisodesImportService.ProcessPath(message.Path, message.ImportMode, trackedDownload.RemoteEpisode.Series, trackedDownload.DownloadItem); - } - else - { - _logger.Warn("External directory scan request for unknown download {0}, attempting normal import. [{1}]", message.DownloadClientId, message.Path); + var importResults = _downloadedEpisodesImportService.ProcessPath(message.Path, message.ImportMode, trackedDownload.RemoteEpisode.Series, trackedDownload.DownloadItem); - return _downloadedEpisodesImportService.ProcessPath(message.Path, message.ImportMode); + _completedDownloadService.VerifyImport(trackedDownload, importResults); + + return importResults; } + + _logger.Warn("External directory scan request for unknown download {0}, attempting normal import. [{1}]", message.DownloadClientId, message.Path); } return _downloadedEpisodesImportService.ProcessPath(message.Path, message.ImportMode);