Lidarr/NzbDrone.Core/Indexers/IndexerFetchService.cs

143 lines
5.0 KiB
C#
Raw Normal View History

2013-04-07 07:30:37 +00:00
using System;
using System.Collections.Generic;
using System.Net;
using NLog;
using NzbDrone.Common;
using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Parser.Model;
using System.Linq;
2013-04-07 07:30:37 +00:00
namespace NzbDrone.Core.Indexers
{
public interface IFetchFeedFromIndexers
{
IList<ReportInfo> FetchRss(IIndexer indexer);
2013-04-07 07:30:37 +00:00
IList<ReportInfo> Fetch(IIndexer indexer, SeasonSearchCriteria searchCriteria);
IList<ReportInfo> Fetch(IIndexer indexer, SingleEpisodeSearchCriteria searchCriteria);
IList<ReportInfo> Fetch(IIndexer indexer, DailyEpisodeSearchCriteria searchCriteria);
2013-04-07 07:30:37 +00:00
}
public class FetchFeedService : IFetchFeedFromIndexers
{
private readonly Logger _logger;
2013-04-10 23:41:45 +00:00
private readonly IHttpProvider _httpProvider;
2013-04-07 07:30:37 +00:00
2013-04-10 23:41:45 +00:00
public FetchFeedService(IHttpProvider httpProvider, Logger logger)
2013-04-07 07:30:37 +00:00
{
_httpProvider = httpProvider;
_logger = logger;
}
public virtual IList<ReportInfo> FetchRss(IIndexer indexer)
2013-04-07 07:30:37 +00:00
{
_logger.Debug("Fetching feeds from " + indexer.Name);
var result = Fetch(indexer, indexer.RecentFeed);
_logger.Debug("Finished processing feeds from " + indexer.Name);
return result;
}
public IList<ReportInfo> Fetch(IIndexer indexer, SeasonSearchCriteria searchCriteria)
2013-04-07 07:30:37 +00:00
{
_logger.Debug("Searching for {0}", searchCriteria);
2013-04-07 07:30:37 +00:00
var result = Fetch(indexer, searchCriteria, 0).DistinctBy(c => c.NzbUrl).ToList();
2013-04-07 07:30:37 +00:00
_logger.Info("Finished searching {0} on {1}. Found {2}", indexer.Name, searchCriteria, result.Count);
2013-04-07 07:30:37 +00:00
return result;
}
private IList<ReportInfo> Fetch(IIndexer indexer, SeasonSearchCriteria searchCriteria, int offset)
2013-04-07 07:30:37 +00:00
{
_logger.Debug("Searching for {0} offset: {1}", searchCriteria, offset);
2013-04-07 07:30:37 +00:00
var searchUrls = indexer.GetSeasonSearchUrls(searchCriteria.QueryTitle, searchCriteria.SeriesTvRageId, searchCriteria.SeasonNumber, offset);
2013-04-07 07:30:37 +00:00
var result = Fetch(indexer, searchUrls);
_logger.Info("{0} offset {1}. Found {2}", indexer.Name, searchCriteria, result.Count);
if (result.Count > 90)
{
result.AddRange(Fetch(indexer, searchCriteria, offset + 90));
}
2013-04-07 07:30:37 +00:00
return result;
2013-04-07 07:30:37 +00:00
}
public IList<ReportInfo> Fetch(IIndexer indexer, SingleEpisodeSearchCriteria searchCriteria)
2013-04-07 07:30:37 +00:00
{
_logger.Debug("Searching for {0}", searchCriteria);
2013-04-07 07:30:37 +00:00
var searchUrls = indexer.GetEpisodeSearchUrls(searchCriteria.QueryTitle, searchCriteria.SeriesTvRageId, searchCriteria.SeasonNumber, searchCriteria.EpisodeNumber);
2013-04-07 07:30:37 +00:00
var result = Fetch(indexer, searchUrls);
_logger.Info("Finished searching {0} on {1}. Found {2}", indexer.Name, searchCriteria, result.Count);
2013-04-07 07:30:37 +00:00
return result;
2013-04-07 07:30:37 +00:00
}
public IList<ReportInfo> Fetch(IIndexer indexer, DailyEpisodeSearchCriteria searchCriteria)
2013-04-07 07:30:37 +00:00
{
_logger.Debug("Searching for {0}", searchCriteria);
2013-04-07 07:30:37 +00:00
2013-08-06 08:15:24 +00:00
var searchUrls = indexer.GetDailyEpisodeSearchUrls(searchCriteria.QueryTitle, searchCriteria.SeriesTvRageId, searchCriteria.Airtime);
2013-04-07 07:30:37 +00:00
var result = Fetch(indexer, searchUrls);
_logger.Info("Finished searching {0} on {1}. Found {2}", indexer.Name, searchCriteria, result.Count);
2013-04-07 07:30:37 +00:00
return result;
}
private List<ReportInfo> Fetch(IIndexer indexer, IEnumerable<string> urls)
2013-04-07 07:30:37 +00:00
{
var result = new List<ReportInfo>();
2013-04-07 07:30:37 +00:00
foreach (var url in urls)
{
try
{
2013-08-06 05:06:58 +00:00
_logger.Trace("Downloading Feed " + url);
var xml = _httpProvider.DownloadString(url);
if (!string.IsNullOrWhiteSpace(xml))
{
result.AddRange(indexer.Parser.Process(xml, url));
}
else
{
_logger.Warn("{0} returned empty response.", url);
}
2013-04-07 07:30:37 +00:00
}
catch (WebException webException)
{
if (webException.Message.Contains("502") || webException.Message.Contains("503") || webException.Message.Contains("timed out"))
2013-04-07 07:30:37 +00:00
{
2013-08-06 02:45:57 +00:00
_logger.Warn("{0} server is currently unavailable. {1} {2}", indexer.Name, url, webException.Message);
2013-04-07 07:30:37 +00:00
}
else
{
_logger.Warn("{0} {1} {2}", indexer.Name, url, webException.Message);
2013-04-07 07:30:37 +00:00
}
}
catch (Exception feedEx)
{
feedEx.Data.Add("FeedUrl", url);
2013-08-06 05:06:58 +00:00
_logger.ErrorException("An error occurred while processing feed. " + url, feedEx);
2013-04-07 07:30:37 +00:00
}
}
result.ForEach(c => c.Indexer = indexer.Name);
return result;
}
}
}