diff --git a/src/NzbDrone.Core/Download/DownloadClientProvider.cs b/src/NzbDrone.Core/Download/DownloadClientProvider.cs index 3fa2bcc39..63af8f27f 100644 --- a/src/NzbDrone.Core/Download/DownloadClientProvider.cs +++ b/src/NzbDrone.Core/Download/DownloadClientProvider.cs @@ -10,7 +10,7 @@ namespace NzbDrone.Core.Download public interface IProvideDownloadClient { IDownloadClient GetDownloadClient(DownloadProtocol downloadProtocol, int indexerId = 0); - IEnumerable GetDownloadClients(); + IEnumerable GetDownloadClients(bool filterBlockedClients = false); IDownloadClient Get(int id); } @@ -86,14 +86,39 @@ namespace NzbDrone.Core.Download return provider; } - public IEnumerable GetDownloadClients() + public IEnumerable GetDownloadClients(bool filterBlockedClients = false) { - return _downloadClientFactory.GetAvailableProviders(); + var enabledClients = _downloadClientFactory.GetAvailableProviders(); + + if (filterBlockedClients) + { + return FilterBlockedIndexers(enabledClients).ToList(); + } + + return enabledClients; } public IDownloadClient Get(int id) { return _downloadClientFactory.GetAvailableProviders().Single(d => d.Definition.Id == id); } + + private IEnumerable FilterBlockedIndexers(IEnumerable clients) + { + var blockedClients = _downloadClientStatusService.GetBlockedProviders().ToDictionary(v => v.ProviderId, v => v); + + foreach (var client in clients) + { + DownloadClientStatus blockedClientStatus; + + if (blockedClients.TryGetValue(client.Definition.Id, out blockedClientStatus)) + { + _logger.Debug("Temporarily ignoring client {0} till {1} due to recent failures.", client.Definition.Name, blockedClientStatus.DisabledTill.Value.ToLocalTime()); + continue; + } + + yield return client; + } + } } } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRootFolderCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRootFolderCheck.cs index b0d4d4540..5ae837431 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRootFolderCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRootFolderCheck.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Net.Http; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Core.Datastore.Events; @@ -34,7 +35,9 @@ namespace NzbDrone.Core.HealthCheck.Checks public override HealthCheck Check() { - var clients = _downloadClientProvider.GetDownloadClients(); + // Only check clients not in failure status, those get another message + var clients = _downloadClientProvider.GetDownloadClients(true); + var rootFolders = _rootFolderService.All(); foreach (var client in clients) @@ -55,6 +58,10 @@ namespace NzbDrone.Core.HealthCheck.Checks { _logger.Debug(ex, "Unable to communicate with {0}", client.Definition.Name); } + catch (HttpRequestException ex) + { + _logger.Debug(ex, "Unable to communicate with {0}", client.Definition.Name); + } catch (Exception ex) { _logger.Error(ex, "Unknown error occurred in DownloadClientRootFolderCheck HealthCheck");