diff --git a/src/Jackett.Test/TestIIndexerManagerServiceHelper.cs b/src/Jackett.Test/TestIIndexerManagerServiceHelper.cs index 7dd67729d..9dc538dd4 100644 --- a/src/Jackett.Test/TestIIndexerManagerServiceHelper.cs +++ b/src/Jackett.Test/TestIIndexerManagerServiceHelper.cs @@ -52,5 +52,10 @@ namespace JackettTest { throw new NotImplementedException(); } + + public void InitAggregateIndexer() + { + throw new NotImplementedException(); + } } } diff --git a/src/Jackett/Indexers/AggregateIndexer.cs b/src/Jackett/Indexers/AggregateIndexer.cs new file mode 100644 index 000000000..558567963 --- /dev/null +++ b/src/Jackett/Indexers/AggregateIndexer.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Jackett.Models; +using Newtonsoft.Json.Linq; +using Jackett.Services; +using Jackett.Utils.Clients; +using NLog; + +namespace Jackett.Indexers +{ + class AggregateIndexer : BaseIndexer, IIndexer + { + private IEnumerable Indexers; + public AggregateIndexer(IIndexerManagerService i, IWebClient wc, Logger l, IProtectionService ps) + : base("AggregateSearch", "http://127.0.0.1/", "This feed includes all configured trackers", i, wc, l, new Models.IndexerConfig.ConfigurationData(), ps) + { + } + + public void SetIndexers(IEnumerable indexers) + { + Indexers = indexers; + base.IsConfigured = true; + } + + public async Task ApplyConfiguration(JToken configJson) + { + return IndexerConfigurationStatus.Completed; + } + + public async Task> PerformQuery(TorznabQuery query) + { + var tasks = new List>>(); + foreach (var indexer in Indexers.Where(i => i.IsConfigured)) + tasks.Add(indexer.PerformQuery(query)); + + var t = Task.WhenAll>(tasks); + t.Wait(); + + IEnumerable result = t.Result.SelectMany(x => x).OrderByDescending(r => r.PublishDate); + // Limiting the response size might be interesting for use-cases where there are + // tons of trackers configured in Jackett. For now just use the limit param if + // someone wants to do that. + if (query.Limit > 0) + result = result.Take(query.Limit); + return result; + } + } +} \ No newline at end of file diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index ff15a764b..f2f40c2b0 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -178,6 +178,7 @@ + diff --git a/src/Jackett/Services/IndexerManagerService.cs b/src/Jackett/Services/IndexerManagerService.cs index c3bebd156..e3ffe6231 100644 --- a/src/Jackett/Services/IndexerManagerService.cs +++ b/src/Jackett/Services/IndexerManagerService.cs @@ -23,6 +23,7 @@ namespace Jackett.Services void SaveConfig(IIndexer indexer, JToken obj); void InitIndexers(); void InitCardigannIndexers(string path); + void InitAggregateIndexer(); void SortIndexers(); } @@ -35,6 +36,7 @@ namespace Jackett.Services private Logger logger; private Dictionary indexers = new Dictionary(); private ICacheService cacheService; + private IIndexer aggregateIndexer; public IndexerManagerService(IContainer c, IConfigurationService config, Logger l, ICacheService cache) { @@ -86,7 +88,7 @@ namespace Jackett.Services { logger.Info("Using HTTP Client: " + container.Resolve().GetType().Name); - foreach (var idx in container.Resolve>().Where(p => p.ID != "cardigannindexer").OrderBy(_ => _.DisplayName)) + foreach (var idx in container.Resolve>().Where(p => p.ID != "cardigannindexer" && p.ID != "aggregateindexer").OrderBy(_ => _.DisplayName)) { indexers.Add(idx.ID, idx); LoadIndexerConfig(idx); @@ -126,12 +128,25 @@ namespace Jackett.Services } } + public void InitAggregateIndexer() + { + logger.Info("Adding aggregate indexer"); + AggregateIndexer aggregateIndexer = new AggregateIndexer(this, container.Resolve(), logger, container.Resolve()); + aggregateIndexer.SetIndexers(indexers.Values); + + this.aggregateIndexer = aggregateIndexer; + } + public IIndexer GetIndexer(string name) { if (indexers.ContainsKey(name)) { return indexers[name]; } + else if (name == "all") + { + return aggregateIndexer; + } else { logger.Error("Request for unknown indexer: " + name); diff --git a/src/Jackett/Services/ServerService.cs b/src/Jackett/Services/ServerService.cs index 590555ce5..cbb4b73c9 100644 --- a/src/Jackett/Services/ServerService.cs +++ b/src/Jackett/Services/ServerService.cs @@ -287,6 +287,7 @@ namespace Jackett.Services { indexerService.InitCardigannIndexers(dir); } + indexerService.InitAggregateIndexer(); indexerService.SortIndexers(); client.Init(); updater.CleanupTempDir();