using System; using System.Collections.Generic; using System.IO; using System.Linq; using NLog; using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.Download; using NzbDrone.Core.Download.TrackedDownloads; using NzbDrone.Core.MediaFiles.Commands; using NzbDrone.Core.MediaFiles.EpisodeImport; using NzbDrone.Core.Messaging.Commands; namespace NzbDrone.Core.MediaFiles { public class DownloadedEpisodesCommandService : IExecute { private readonly IDownloadedEpisodesImportService _downloadedEpisodesImportService; private readonly ITrackedDownloadService _trackedDownloadService; private readonly IDiskProvider _diskProvider; private readonly IConfigService _configService; private readonly Logger _logger; public DownloadedEpisodesCommandService(IDownloadedEpisodesImportService downloadedEpisodesImportService, ITrackedDownloadService trackedDownloadService, IDiskProvider diskProvider, IConfigService configService, Logger logger) { _downloadedEpisodesImportService = downloadedEpisodesImportService; _trackedDownloadService = trackedDownloadService; _diskProvider = diskProvider; _configService = configService; _logger = logger; } private List ProcessDroneFactoryFolder() { var downloadedEpisodesFolder = _configService.DownloadedEpisodesFolder; if (String.IsNullOrEmpty(downloadedEpisodesFolder)) { _logger.Trace("Drone Factory folder is not configured"); return new List(); } if (!_diskProvider.FolderExists(downloadedEpisodesFolder)) { _logger.Warn("Drone Factory folder [{0}] doesn't exist.", downloadedEpisodesFolder); return new List(); } return _downloadedEpisodesImportService.ProcessRootFolder(new DirectoryInfo(downloadedEpisodesFolder)); } private List ProcessFolder(DownloadedEpisodesScanCommand message) { if (!_diskProvider.FolderExists(message.Path)) { _logger.Warn("Folder specified for import scan [{0}] doesn't exist.", message.Path); return new List(); } if (message.DownloadClientId.IsNotNullOrWhiteSpace()) { var trackedDownload = _trackedDownloadService.Find(message.DownloadClientId); if (trackedDownload != null) { _logger.Debug("External directory scan request for known download {0}. [{1}]", message.DownloadClientId, message.Path); return _downloadedEpisodesImportService.ProcessPath(message.Path, trackedDownload.RemoteEpisode.Series, trackedDownload.DownloadItem); } else { _logger.Warn("External directory scan request for unknown download {0}, attempting normal import. [{1}]", message.DownloadClientId, message.Path); return _downloadedEpisodesImportService.ProcessPath(message.Path); } } return _downloadedEpisodesImportService.ProcessPath(message.Path); } public void Execute(DownloadedEpisodesScanCommand message) { List importResults; if (message.Path.IsNotNullOrWhiteSpace()) { importResults = ProcessFolder(message); } else { importResults = ProcessDroneFactoryFolder(); } if (importResults == null || importResults.All(v => v.Result != ImportResultType.Imported)) { // Atm we don't report it as a command failure, coz that would cause the download to be failed. // Changing the message won't do a thing either, coz it will get set to 'Completed' a msec later. //message.SetMessage("Failed to import"); } } } }