using NLog; using NzbDrone.Core.Configuration; using NzbDrone.Core.IndexerSearch; using NzbDrone.Core.Messaging; using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Music; using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Download { public class RedownloadFailedDownloadService : IHandle { private readonly IConfigService _configService; private readonly IAlbumService _albumService; private readonly IManageCommandQueue _commandQueueManager; private readonly Logger _logger; public RedownloadFailedDownloadService(IConfigService configService, IAlbumService albumService, IManageCommandQueue commandQueueManager, Logger logger) { _configService = configService; _albumService = albumService; _commandQueueManager = commandQueueManager; _logger = logger; } [EventHandleOrder(EventHandleOrder.Last)] public void Handle(DownloadFailedEvent message) { if (message.SkipRedownload) { _logger.Debug("Skip redownloading requested by user"); return; } if (!_configService.AutoRedownloadFailed) { _logger.Debug("Auto redownloading failed albums is disabled"); return; } if (message.ReleaseSource == ReleaseSourceType.InteractiveSearch && !_configService.AutoRedownloadFailedFromInteractiveSearch) { _logger.Debug("Auto redownloading failed albums from interactive search is disabled"); return; } if (message.AlbumIds.Count == 1) { _logger.Debug("Failed download only contains one album, searching again"); _commandQueueManager.Push(new AlbumSearchCommand(message.AlbumIds)); return; } var albumsInArtist = _albumService.GetAlbumsByArtist(message.ArtistId); if (message.AlbumIds.Count == albumsInArtist.Count) { _logger.Debug("Failed download was entire artist, searching again"); _commandQueueManager.Push(new ArtistSearchCommand { ArtistId = message.ArtistId }); return; } _logger.Debug("Failed download contains multiple albums, searching again"); _commandQueueManager.Push(new AlbumSearchCommand(message.AlbumIds)); } } }