using System; using System.Linq; using NLog; using NzbDrone.Core.Configuration; using NzbDrone.Core.Download.TrackedDownloads; using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Events; namespace NzbDrone.Core.Download { public class DownloadProcessingService : IExecute { private readonly IConfigService _configService; private readonly ICompletedDownloadService _completedDownloadService; private readonly IFailedDownloadService _failedDownloadService; private readonly ITrackedDownloadService _trackedDownloadService; private readonly IEventAggregator _eventAggregator; private readonly Logger _logger; public DownloadProcessingService(IConfigService configService, ICompletedDownloadService completedDownloadService, IFailedDownloadService failedDownloadService, ITrackedDownloadService trackedDownloadService, IEventAggregator eventAggregator, Logger logger) { _configService = configService; _completedDownloadService = completedDownloadService; _failedDownloadService = failedDownloadService; _trackedDownloadService = trackedDownloadService; _eventAggregator = eventAggregator; _logger = logger; } private void RemoveCompletedDownloads() { var trackedDownloads = _trackedDownloadService.GetTrackedDownloads() .Where(t => !t.DownloadItem.Removed && t.DownloadItem.CanBeRemoved && t.State == TrackedDownloadState.Imported) .ToList(); foreach (var trackedDownload in trackedDownloads) { _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(); foreach (var trackedDownload in trackedDownloads) { try { if (trackedDownload.State == TrackedDownloadState.DownloadFailedPending) { _failedDownloadService.ProcessFailed(trackedDownload); } else if (enableCompletedDownloadHandling && trackedDownload.State == TrackedDownloadState.ImportPending) { _completedDownloadService.Import(trackedDownload); } } catch (Exception e) { _logger.Debug(e, "Failed to process download: {0}", trackedDownload.DownloadItem.Title); } } // Imported downloads are no longer trackable so process them after processing trackable downloads if (removeCompletedDownloads) { RemoveCompletedDownloads(); } _eventAggregator.PublishEvent(new DownloadsProcessedEvent()); } } }