/src/NzbDrone.Core/Indexers/IndexerFactory.cs

https://github.com/NzbDrone/NzbDrone
C# | 114 lines | 93 code | 21 blank | 0 comment | 9 complexity | 7be22e7b2775e3c20af409a9ebd0eb3f MD5 | raw file
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using FluentValidation.Results;
  4. using NLog;
  5. using NzbDrone.Common.Composition;
  6. using NzbDrone.Core.Messaging.Events;
  7. using NzbDrone.Core.ThingiProvider;
  8. namespace NzbDrone.Core.Indexers
  9. {
  10. public interface IIndexerFactory : IProviderFactory<IIndexer, IndexerDefinition>
  11. {
  12. List<IIndexer> RssEnabled(bool filterBlockedIndexers = true);
  13. List<IIndexer> AutomaticSearchEnabled(bool filterBlockedIndexers = true);
  14. List<IIndexer> InteractiveSearchEnabled(bool filterBlockedIndexers = true);
  15. }
  16. public class IndexerFactory : ProviderFactory<IIndexer, IndexerDefinition>, IIndexerFactory
  17. {
  18. private readonly IIndexerStatusService _indexerStatusService;
  19. private readonly Logger _logger;
  20. public IndexerFactory(IIndexerStatusService indexerStatusService,
  21. IIndexerRepository providerRepository,
  22. IEnumerable<IIndexer> providers,
  23. IContainer container,
  24. IEventAggregator eventAggregator,
  25. Logger logger)
  26. : base(providerRepository, providers, container, eventAggregator, logger)
  27. {
  28. _indexerStatusService = indexerStatusService;
  29. _logger = logger;
  30. }
  31. protected override List<IndexerDefinition> Active()
  32. {
  33. return base.Active().Where(c => c.Enable).ToList();
  34. }
  35. public override void SetProviderCharacteristics(IIndexer provider, IndexerDefinition definition)
  36. {
  37. base.SetProviderCharacteristics(provider, definition);
  38. definition.Protocol = provider.Protocol;
  39. definition.SupportsRss = provider.SupportsRss;
  40. definition.SupportsSearch = provider.SupportsSearch;
  41. }
  42. public List<IIndexer> RssEnabled(bool filterBlockedIndexers = true)
  43. {
  44. var enabledIndexers = GetAvailableProviders().Where(n => ((IndexerDefinition)n.Definition).EnableRss);
  45. if (filterBlockedIndexers)
  46. {
  47. return FilterBlockedIndexers(enabledIndexers).ToList();
  48. }
  49. return enabledIndexers.ToList();
  50. }
  51. public List<IIndexer> AutomaticSearchEnabled(bool filterBlockedIndexers = true)
  52. {
  53. var enabledIndexers = GetAvailableProviders().Where(n => ((IndexerDefinition)n.Definition).EnableAutomaticSearch);
  54. if (filterBlockedIndexers)
  55. {
  56. return FilterBlockedIndexers(enabledIndexers).ToList();
  57. }
  58. return enabledIndexers.ToList();
  59. }
  60. public List<IIndexer> InteractiveSearchEnabled(bool filterBlockedIndexers = true)
  61. {
  62. var enabledIndexers = GetAvailableProviders().Where(n => ((IndexerDefinition)n.Definition).EnableInteractiveSearch);
  63. if (filterBlockedIndexers)
  64. {
  65. return FilterBlockedIndexers(enabledIndexers).ToList();
  66. }
  67. return enabledIndexers.ToList();
  68. }
  69. private IEnumerable<IIndexer> FilterBlockedIndexers(IEnumerable<IIndexer> indexers)
  70. {
  71. var blockedIndexers = _indexerStatusService.GetBlockedProviders().ToDictionary(v => v.ProviderId, v => v);
  72. foreach (var indexer in indexers)
  73. {
  74. IndexerStatus blockedIndexerStatus;
  75. if (blockedIndexers.TryGetValue(indexer.Definition.Id, out blockedIndexerStatus))
  76. {
  77. _logger.Debug("Temporarily ignoring indexer {0} till {1} due to recent failures.", indexer.Definition.Name, blockedIndexerStatus.DisabledTill.Value.ToLocalTime());
  78. continue;
  79. }
  80. yield return indexer;
  81. }
  82. }
  83. public override ValidationResult Test(IndexerDefinition definition)
  84. {
  85. var result = base.Test(definition);
  86. if ((result == null || result.IsValid) && definition.Id != 0)
  87. {
  88. _indexerStatusService.RecordSuccess(definition.Id);
  89. }
  90. return result;
  91. }
  92. }
  93. }