From 251a631523b22d759db6cd4ee503fe48a979563e Mon Sep 17 00:00:00 2001 From: chibidev Date: Sun, 7 May 2017 09:10:57 +0200 Subject: [PATCH] Bugfix/aggregate indexer radarr compatibility (#1333) * Improving Torznab compatibility in AggregateIndexer The indexer was not correctly reporting the Torznab capabilities it provided. Basically it only reported a default number of caps instead of combining all the caps of all the configured indexers. This lead to an issue with external components (e.g. Radarr) which rendered the Aggregate feed unusable in certain situations. - Correctly reports capabilities based on configured indexers * Fixes incorrect internal state of configured indexers When adding/deleting configured indexers the aggregate was never updated leaving out possible search results. - Introduce reconfiguring of the Aggregate upon addition/deletion of an indexer - Fixing an internal state issue of the indexers reporting themselves as unconfigured after addition * Removing obsolete call (thanks @kaso17) --- src/Jackett/Indexers/AggregateIndexer.cs | 21 +++++++++++++++---- src/Jackett/Services/IndexerManagerService.cs | 12 ++++++++--- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/Jackett/Indexers/AggregateIndexer.cs b/src/Jackett/Indexers/AggregateIndexer.cs index 453caee65..15d0e8887 100644 --- a/src/Jackett/Indexers/AggregateIndexer.cs +++ b/src/Jackett/Indexers/AggregateIndexer.cs @@ -21,7 +21,20 @@ namespace Jackett.Indexers public void SetIndexers(IEnumerable indexers) { - Indexers = indexers; + Indexers = indexers.Where(i => i.IsConfigured); + + var caps = new TorznabCapabilities(); + foreach (var indexer in indexers) { + var indexerCaps = indexer.TorznabCaps; + caps.SearchAvailable = caps.SearchAvailable || indexerCaps.SearchAvailable; + caps.TVSearchAvailable = caps.TVSearchAvailable || indexerCaps.TVSearchAvailable; + caps.MovieSearchAvailable = caps.MovieSearchAvailable || indexerCaps.MovieSearchAvailable; + caps.SupportsTVRageSearch = caps.SupportsTVRageSearch || indexerCaps.SupportsTVRageSearch; + caps.SupportsImdbSearch = caps.SupportsImdbSearch || indexerCaps.SupportsImdbSearch; + caps.Categories.AddRange(indexerCaps.Categories.Except (caps.Categories)); + } + + base.TorznabCaps = caps; base.IsConfigured = true; } @@ -33,7 +46,7 @@ namespace Jackett.Indexers public async Task> PerformQuery(TorznabQuery query) { var tasks = new List>>(); - foreach (var indexer in Indexers.Where(i => i.IsConfigured)) + foreach (var indexer in Indexers) tasks.Add(indexer.PerformQuery(query)); var t = Task.WhenAll>(tasks); @@ -64,7 +77,7 @@ namespace Jackett.Indexers return base.UncleanLink(link); } - public Task Download(Uri link) + public override Task Download(Uri link) { var indexer = GetOriginalIndexerForLink(link); if (indexer != null) @@ -76,7 +89,7 @@ namespace Jackett.Indexers private IIndexer GetOriginalIndexerForLink(Uri link) { var prefix = string.Format("{0}://{1}", link.Scheme, link.Host); - var validIndexers = Indexers.Where(i => i.IsConfigured && i.SiteLink.StartsWith(prefix)); + var validIndexers = Indexers.Where(i => i.SiteLink.StartsWith(prefix)); if (validIndexers.Count() > 0) return validIndexers.First(); diff --git a/src/Jackett/Services/IndexerManagerService.cs b/src/Jackett/Services/IndexerManagerService.cs index f8ad1aeb8..107abb6f1 100644 --- a/src/Jackett/Services/IndexerManagerService.cs +++ b/src/Jackett/Services/IndexerManagerService.cs @@ -36,7 +36,7 @@ namespace Jackett.Services private Logger logger; private Dictionary indexers = new Dictionary(); private ICacheService cacheService; - private IIndexer aggregateIndexer; + private AggregateIndexer aggregateIndexer; public IndexerManagerService(IContainer c, IConfigurationService config, Logger l, ICacheService cache) { @@ -132,9 +132,8 @@ namespace Jackett.Services { logger.Info("Adding aggregate indexer"); AggregateIndexer aggregateIndexer = new AggregateIndexer(this, container.Resolve(), logger, container.Resolve()); - aggregateIndexer.SetIndexers(indexers.Where(p => p.Value.IsConfigured).Select(p => p.Value)); - this.aggregateIndexer = aggregateIndexer; + UpdateAggregateIndexer(); } public IIndexer GetIndexer(string name) @@ -185,6 +184,7 @@ namespace Jackett.Services { indexers[name] = container.ResolveNamed(indexer.ID); } + UpdateAggregateIndexer(); } private string GetIndexerConfigFilePath(IIndexer indexer) @@ -194,6 +194,7 @@ namespace Jackett.Services public void SaveConfig(IIndexer indexer, JToken obj) { + UpdateAggregateIndexer(); lock (configWriteLock) { var uID = Guid.NewGuid().ToString("N"); @@ -262,5 +263,10 @@ namespace Jackett.Services newIndexers.Add(indexer.Key, indexer.Value); indexers = newIndexers; } + + private void UpdateAggregateIndexer() + { + aggregateIndexer.SetIndexers(indexers.Where (p => p.Value.IsConfigured).Select(p => p.Value)); + } } }