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