using System; using System.Collections.Generic; using System.Linq; using NLog; using NzbDrone.Core.Model; using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Providers.Indexer; namespace NzbDrone.Core.Providers.Jobs { public class RssSyncJob : IJob { private readonly IEnumerable _indexers; private readonly InventoryProvider _inventoryProvider; private readonly DownloadProvider _downloadProvider; private readonly IndexerProvider _indexerProvider; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); public RssSyncJob(IEnumerable indexers, InventoryProvider inventoryProvider, DownloadProvider downloadProvider, IndexerProvider indexerProvider) { _indexers = indexers; _inventoryProvider = inventoryProvider; _downloadProvider = downloadProvider; _indexerProvider = indexerProvider; } public string Name { get { return "RSS Sync"; } } public int DefaultInterval { get { return 15; } } public void Start(ProgressNotification notification, int targetId) { var reports = new List(); foreach (var indexer in _indexers.Where(i => _indexerProvider.GetSettings(i.GetType()).Enable)) { try { notification.CurrentMessage = "Fetching RSS from " + indexer.Name; reports.AddRange(indexer.FetchRss()); } catch (Exception e) { Logger.ErrorException("An error has occurred while fetching items from " + indexer.Name, e); } } Logger.Debug("Finished fetching reports from all indexers. Total {0}", reports.Count); notification.CurrentMessage = "Processing downloaded RSS"; foreach (var episodeParseResult in reports) { try { if (_inventoryProvider.IsMonitored(episodeParseResult) && _inventoryProvider.IsQualityNeeded(episodeParseResult)) { _downloadProvider.DownloadReport(episodeParseResult); } } catch (Exception e) { Logger.ErrorException("An error has occured while processing parse result items from " + episodeParseResult, e); } } } } }