using System; using NLog; using NzbDrone.Common.Cache; using NzbDrone.Common.Serializer; using NzbDrone.Core.Indexers.Exceptions; namespace NzbDrone.Core.Indexers.TorrentRss { public interface ITorrentRssParserFactory { TorrentRssParser GetParser(TorrentRssIndexerSettings settings); } public class TorrentRssParserFactory : ITorrentRssParserFactory { protected readonly Logger _logger; private readonly ICached _settingsCache; private readonly ITorrentRssSettingsDetector _torrentRssSettingsDetector; public TorrentRssParserFactory(ICacheManager cacheManager, ITorrentRssSettingsDetector torrentRssSettingsDetector, Logger logger) { _settingsCache = cacheManager.GetCache(GetType()); _torrentRssSettingsDetector = torrentRssSettingsDetector; _logger = logger; } public TorrentRssParser GetParser(TorrentRssIndexerSettings indexerSettings) { var key = indexerSettings.ToJson(); var parserSettings = _settingsCache.Get(key, () => DetectParserSettings(indexerSettings), TimeSpan.FromDays(7)); if (parserSettings.UseEZTVFormat) { return new EzrssTorrentRssParser(); } else { return new TorrentRssParser { UseGuidInfoUrl = false, ParseSeedersInDescription = parserSettings.ParseSeedersInDescription, UseEnclosureUrl = parserSettings.UseEnclosureUrl, UseEnclosureLength = parserSettings.UseEnclosureLength, ParseSizeInDescription = parserSettings.ParseSizeInDescription, SizeElementName = parserSettings.SizeElementName }; } } private TorrentRssIndexerParserSettings DetectParserSettings(TorrentRssIndexerSettings indexerSettings) { var settings = _torrentRssSettingsDetector.Detect(indexerSettings); if (settings == null) { throw new UnsupportedFeedException("Could not parse feed from {0}", indexerSettings.BaseUrl); } return settings; } } }