using System; using System.Collections.Generic; using System.Linq; using FluentValidation.Results; using NLog; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.ThingiProvider; namespace NzbDrone.Core.ImportLists { public interface IImportListFactory : IProviderFactory { List AutomaticAddEnabled(bool filterBlockedImportLists = true); } public class ImportListFactory : ProviderFactory, IImportListFactory { private readonly IImportListStatusService _importListStatusService; private readonly Logger _logger; public ImportListFactory(IImportListStatusService importListStatusService, IImportListRepository providerRepository, IEnumerable providers, IServiceProvider container, IEventAggregator eventAggregator, Logger logger) : base(providerRepository, providers, container, eventAggregator, logger) { _importListStatusService = importListStatusService; _logger = logger; } protected override List Active() { return base.Active().Where(c => c.Enable).ToList(); } public override void SetProviderCharacteristics(IImportList provider, ImportListDefinition definition) { base.SetProviderCharacteristics(provider, definition); definition.ListType = provider.ListType; } public List AutomaticAddEnabled(bool filterBlockedImportLists = true) { var enabledImportLists = GetAvailableProviders().Where(n => ((ImportListDefinition)n.Definition).EnableAutomaticAdd); if (filterBlockedImportLists) { return FilterBlockedImportLists(enabledImportLists).ToList(); } return enabledImportLists.ToList(); } private IEnumerable FilterBlockedImportLists(IEnumerable importLists) { var blockedImportLists = _importListStatusService.GetBlockedProviders().ToDictionary(v => v.ProviderId, v => v); foreach (var importList in importLists) { if (blockedImportLists.TryGetValue(importList.Definition.Id, out var blockedImportListStatus)) { _logger.Debug("Temporarily ignoring import list {0} till {1} due to recent failures.", importList.Definition.Name, blockedImportListStatus.DisabledTill.Value.ToLocalTime()); continue; } yield return importList; } } public override ValidationResult Test(ImportListDefinition definition) { var result = base.Test(definition); if ((result == null || result.IsValid) && definition.Id != 0) { _importListStatusService.RecordSuccess(definition.Id); } return result; } } }