using System.Linq; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.Download; using NzbDrone.Core.History; using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.MediaFiles.MovieImport.Specifications { public class AlreadyImportedSpecification : IImportDecisionEngineSpecification { private readonly IHistoryService _historyService; private readonly Logger _logger; public AlreadyImportedSpecification(IHistoryService historyService, Logger logger) { _historyService = historyService; _logger = logger; } public SpecificationPriority Priority => SpecificationPriority.Database; public Decision IsSatisfiedBy(LocalMovie localMovie, DownloadClientItem downloadClientItem) { if (downloadClientItem == null) { _logger.Debug("No download client information is available, skipping"); return Decision.Accept(); } var movie = localMovie.Movie; if (!movie.HasFile) { _logger.Debug("Skipping already imported check for movie without file"); return Decision.Accept(); } var movieImportedHistory = _historyService.GetByMovieId(movie.Id, null); var lastImported = movieImportedHistory.FirstOrDefault(h => h.DownloadId == downloadClientItem.DownloadId && h.EventType == MovieHistoryEventType.DownloadFolderImported); var lastGrabbed = movieImportedHistory.FirstOrDefault(h => h.DownloadId == downloadClientItem.DownloadId && h.EventType == MovieHistoryEventType.Grabbed); if (lastImported == null) { _logger.Trace("Movie file has not been imported"); return Decision.Accept(); } if (lastGrabbed != null) { // If the release was grabbed again after importing don't reject it if (lastGrabbed.Date.After(lastImported.Date)) { _logger.Trace("Movie file was grabbed again after importing"); return Decision.Accept(); } // If the release was imported after the last grab reject it if (lastImported.Date.After(lastGrabbed.Date)) { _logger.Debug("Movie file previously imported at {0}", lastImported.Date); return Decision.Reject("Movie file already imported at {0}", lastImported.Date.ToLocalTime()); } } else { _logger.Debug("Movie file previously imported at {0}", lastImported.Date); return Decision.Reject("Movie file already imported at {0}", lastImported.Date.ToLocalTime()); } return Decision.Accept(); } } }