/src/NzbDrone.Core/Indexers/IndexerFactory.cs
C# | 114 lines | 93 code | 21 blank | 0 comment | 9 complexity | 7be22e7b2775e3c20af409a9ebd0eb3f MD5 | raw file
- using System.Collections.Generic;
- using System.Linq;
- using FluentValidation.Results;
- using NLog;
- using NzbDrone.Common.Composition;
- using NzbDrone.Core.Messaging.Events;
- using NzbDrone.Core.ThingiProvider;
- namespace NzbDrone.Core.Indexers
- {
- public interface IIndexerFactory : IProviderFactory<IIndexer, IndexerDefinition>
- {
- List<IIndexer> RssEnabled(bool filterBlockedIndexers = true);
- List<IIndexer> AutomaticSearchEnabled(bool filterBlockedIndexers = true);
- List<IIndexer> InteractiveSearchEnabled(bool filterBlockedIndexers = true);
- }
- public class IndexerFactory : ProviderFactory<IIndexer, IndexerDefinition>, IIndexerFactory
- {
- private readonly IIndexerStatusService _indexerStatusService;
- private readonly Logger _logger;
- public IndexerFactory(IIndexerStatusService indexerStatusService,
- IIndexerRepository providerRepository,
- IEnumerable<IIndexer> providers,
- IContainer container,
- IEventAggregator eventAggregator,
- Logger logger)
- : base(providerRepository, providers, container, eventAggregator, logger)
- {
- _indexerStatusService = indexerStatusService;
- _logger = logger;
- }
- protected override List<IndexerDefinition> Active()
- {
- return base.Active().Where(c => c.Enable).ToList();
- }
- public override void SetProviderCharacteristics(IIndexer provider, IndexerDefinition definition)
- {
- base.SetProviderCharacteristics(provider, definition);
- definition.Protocol = provider.Protocol;
- definition.SupportsRss = provider.SupportsRss;
- definition.SupportsSearch = provider.SupportsSearch;
- }
- public List<IIndexer> RssEnabled(bool filterBlockedIndexers = true)
- {
- var enabledIndexers = GetAvailableProviders().Where(n => ((IndexerDefinition)n.Definition).EnableRss);
- if (filterBlockedIndexers)
- {
- return FilterBlockedIndexers(enabledIndexers).ToList();
- }
- return enabledIndexers.ToList();
- }
- public List<IIndexer> AutomaticSearchEnabled(bool filterBlockedIndexers = true)
- {
- var enabledIndexers = GetAvailableProviders().Where(n => ((IndexerDefinition)n.Definition).EnableAutomaticSearch);
- if (filterBlockedIndexers)
- {
- return FilterBlockedIndexers(enabledIndexers).ToList();
- }
- return enabledIndexers.ToList();
- }
- public List<IIndexer> InteractiveSearchEnabled(bool filterBlockedIndexers = true)
- {
- var enabledIndexers = GetAvailableProviders().Where(n => ((IndexerDefinition)n.Definition).EnableInteractiveSearch);
- if (filterBlockedIndexers)
- {
- return FilterBlockedIndexers(enabledIndexers).ToList();
- }
- return enabledIndexers.ToList();
- }
- private IEnumerable<IIndexer> FilterBlockedIndexers(IEnumerable<IIndexer> indexers)
- {
- var blockedIndexers = _indexerStatusService.GetBlockedProviders().ToDictionary(v => v.ProviderId, v => v);
- foreach (var indexer in indexers)
- {
- IndexerStatus blockedIndexerStatus;
- if (blockedIndexers.TryGetValue(indexer.Definition.Id, out blockedIndexerStatus))
- {
- _logger.Debug("Temporarily ignoring indexer {0} till {1} due to recent failures.", indexer.Definition.Name, blockedIndexerStatus.DisabledTill.Value.ToLocalTime());
- continue;
- }
- yield return indexer;
- }
- }
- public override ValidationResult Test(IndexerDefinition definition)
- {
- var result = base.Test(definition);
- if ((result == null || result.IsValid) && definition.Id != 0)
- {
- _indexerStatusService.RecordSuccess(definition.Id);
- }
- return result;
- }
- }
- }