using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using NLog; using NzbDrone.Core.Parser.Model; using NzbDrone.Common.TPL; namespace NzbDrone.Core.Indexers { public interface IFetchAndParseRss { List Fetch(); } public class FetchAndParseRssService : IFetchAndParseRss { private readonly IIndexerService _indexerService; private readonly IFetchFeedFromIndexers _feedFetcher; private readonly Logger _logger; public FetchAndParseRssService(IIndexerService indexerService, IFetchFeedFromIndexers feedFetcher, Logger logger) { _indexerService = indexerService; _feedFetcher = feedFetcher; _logger = logger; } public List Fetch() { var result = new List(); var indexers = _indexerService.GetAvailableIndexers().ToList(); if (!indexers.Any()) { _logger.Warn("No available indexers. check your configuration."); return result; } _logger.Debug("Available indexers {0}", indexers.Count); var taskList = new List(); var taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None); foreach (var indexer in indexers) { var indexerLocal = indexer; var task = taskFactory.StartNew(() => { var indexerFeed = _feedFetcher.FetchRss(indexerLocal); lock (result) { result.AddRange(indexerFeed); } }).LogExceptions(); taskList.Add(task); } Task.WaitAll(taskList.ToArray()); _logger.Debug("Found {0} reports", result.Count); return result; } } }