From d36608b4fd411c71446eff0a7367405cedcc6d47 Mon Sep 17 00:00:00 2001 From: Qstick Date: Thu, 30 Apr 2020 19:40:50 -0400 Subject: [PATCH] Fixed: Imports triggered through API not being marked as imported/removed from client Co-Authored-By: Mark McDowall --- .../Download/CompletedDownloadService.cs | 56 ++++++++++--------- .../DownloadedMovieCommandService.cs | 16 ++++-- 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/NzbDrone.Core/Download/CompletedDownloadService.cs b/src/NzbDrone.Core/Download/CompletedDownloadService.cs index 45afd8cad..9b74ada18 100644 --- a/src/NzbDrone.Core/Download/CompletedDownloadService.cs +++ b/src/NzbDrone.Core/Download/CompletedDownloadService.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.IO; using System.Linq; using NzbDrone.Common.EnvironmentInfo; @@ -16,6 +17,7 @@ namespace NzbDrone.Core.Download { void Check(TrackedDownload trackedDownload); void Import(TrackedDownload trackedDownload); + bool VerifyImport(TrackedDownload trackedDownload, List importResults); } public class CompletedDownloadService : ICompletedDownloadService @@ -104,6 +106,31 @@ namespace NzbDrone.Core.Download var outputPath = trackedDownload.DownloadItem.OutputPath.FullPath; var importResults = _downloadedMovieImportService.ProcessPath(outputPath, ImportMode.Auto, trackedDownload.RemoteMovie.Movie, 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.LocalMovie.Path), v.Errors)) + .ToArray(); + + trackedDownload.Warn(statusMessages); + } + } + + public bool VerifyImport(TrackedDownload trackedDownload, List importResults) + { var allMoviesImported = importResults.Where(c => c.Result == ImportResultType.Imported) .Select(c => c.ImportDecision.LocalMovie.Movie) .Any(); @@ -112,7 +139,7 @@ namespace NzbDrone.Core.Download { trackedDownload.State = TrackedDownloadState.Imported; _eventAggregator.PublishEvent(new DownloadCompletedEvent(trackedDownload)); - return; + return true; } // Double check if all movies were imported by checking the history if at least one @@ -130,34 +157,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 => - { - if (v.ImportDecision.LocalMovie == null) - { - return new TrackedDownloadStatusMessage("", v.Errors); - } - - return new TrackedDownloadStatusMessage(Path.GetFileName(v.ImportDecision.LocalMovie.Path), v.Errors); - }) - .ToArray(); - - trackedDownload.Warn(statusMessages); - } + return false; } } } diff --git a/src/NzbDrone.Core/MediaFiles/DownloadedMovieCommandService.cs b/src/NzbDrone.Core/MediaFiles/DownloadedMovieCommandService.cs index 6d3bc1989..2afbe1516 100644 --- a/src/NzbDrone.Core/MediaFiles/DownloadedMovieCommandService.cs +++ b/src/NzbDrone.Core/MediaFiles/DownloadedMovieCommandService.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.MovieImport; @@ -17,16 +18,19 @@ namespace NzbDrone.Core.MediaFiles private readonly IDownloadedMovieImportService _downloadedMovieImportService; private readonly ITrackedDownloadService _trackedDownloadService; private readonly IDiskProvider _diskProvider; + private readonly ICompletedDownloadService _completedDownloadService; private readonly Logger _logger; public DownloadedMovieCommandService(IDownloadedMovieImportService downloadedMovieImportService, ITrackedDownloadService trackedDownloadService, IDiskProvider diskProvider, + ICompletedDownloadService completedDownloadService, Logger logger) { _downloadedMovieImportService = downloadedMovieImportService; _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 _downloadedMovieImportService.ProcessPath(message.Path, message.ImportMode, trackedDownload.RemoteMovie.Movie, trackedDownload.DownloadItem); - } - else - { - _logger.Warn("External directory scan request for unknown download {0}, attempting normal import. [{1}]", message.DownloadClientId, message.Path); + var importResults = _downloadedMovieImportService.ProcessPath(message.Path, message.ImportMode, trackedDownload.RemoteMovie.Movie, trackedDownload.DownloadItem); - return _downloadedMovieImportService.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 _downloadedMovieImportService.ProcessPath(message.Path, message.ImportMode);