mirror of https://github.com/Sonarr/Sonarr
113 lines
4.7 KiB
C#
113 lines
4.7 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.IO;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using NLog;
|
|||
|
using NzbDrone.Core.Helpers;
|
|||
|
using NzbDrone.Core.Model;
|
|||
|
using NzbDrone.Core.Repository;
|
|||
|
using System.ServiceModel.Syndication;
|
|||
|
|
|||
|
namespace NzbDrone.Core.Providers.Indexer
|
|||
|
{
|
|||
|
public class IsNeededProvider
|
|||
|
{
|
|||
|
private readonly SeriesProvider _seriesProvider;
|
|||
|
private readonly SeasonProvider _seasonProvider;
|
|||
|
private readonly EpisodeProvider _episodeProvider;
|
|||
|
private readonly HistoryProvider _historyProvider;
|
|||
|
private readonly SabProvider _sabProvider;
|
|||
|
|
|||
|
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
|||
|
|
|||
|
public IsNeededProvider(SeriesProvider seriesProvider, SeasonProvider seasonProvider, EpisodeProvider episodeProvider, HistoryProvider historyProvider, SabProvider sabProvider)
|
|||
|
{
|
|||
|
_seriesProvider = seriesProvider;
|
|||
|
_seasonProvider = seasonProvider;
|
|||
|
_episodeProvider = episodeProvider;
|
|||
|
_historyProvider = historyProvider;
|
|||
|
_sabProvider = sabProvider;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
internal bool IsNeeded(EpisodeParseResult parseResult, Series series)
|
|||
|
{
|
|||
|
foreach (var episodeNumber in parseResult.Episodes)
|
|||
|
{
|
|||
|
//Todo: How to handle full season files? Currently the episode list is completely empty for these releases
|
|||
|
//Todo: Should we assume that the release contains all the episodes that belong to this season and add them from the DB?
|
|||
|
//Todo: Fix this so it properly handles multi-epsiode releases (Currently as long as the first episode is needed we download it)
|
|||
|
//Todo: for small releases this is less of an issue, but for Full Season Releases this could be an issue if we only need the first episode (or first few)
|
|||
|
|
|||
|
if (!series.Monitored)
|
|||
|
{
|
|||
|
Logger.Debug("{0} is present in the DB but not tracked. skipping.", parseResult.CleanTitle);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (!_seriesProvider.QualityWanted(series.SeriesId, parseResult.Quality))
|
|||
|
{
|
|||
|
Logger.Debug("Post doesn't meet the quality requirements [{0}]. skipping.", parseResult.Quality);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (_seasonProvider.IsIgnored(series.SeriesId, parseResult.SeasonNumber))
|
|||
|
{
|
|||
|
Logger.Debug("Season {0} is currently set to ignore. skipping.", parseResult.SeasonNumber);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var episodeInfo = _episodeProvider.GetEpisode(series.SeriesId, parseResult.SeasonNumber, episodeNumber);
|
|||
|
if (episodeInfo == null)
|
|||
|
{
|
|||
|
episodeInfo = _episodeProvider.GetEpisode(series.SeriesId, parseResult.AirDate);
|
|||
|
}
|
|||
|
//if still null we should add the temp episode
|
|||
|
if (episodeInfo == null)
|
|||
|
{
|
|||
|
Logger.Debug("Episode {0} doesn't exist in db. adding it now.", parseResult);
|
|||
|
episodeInfo = new Episode
|
|||
|
{
|
|||
|
SeriesId = series.SeriesId,
|
|||
|
AirDate = DateTime.Now.Date,
|
|||
|
EpisodeNumber = episodeNumber,
|
|||
|
SeasonNumber = parseResult.SeasonNumber,
|
|||
|
Title = parseResult.EpisodeTitle,
|
|||
|
Overview = String.Empty,
|
|||
|
Language = "en"
|
|||
|
};
|
|||
|
|
|||
|
_episodeProvider.AddEpisode(episodeInfo);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (!_episodeProvider.IsNeeded(parseResult, episodeInfo))
|
|||
|
{
|
|||
|
Logger.Debug("Episode {0} is not needed. skipping.", parseResult);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (_historyProvider.Exists(episodeInfo.EpisodeId, parseResult.Quality, parseResult.Proper))
|
|||
|
{
|
|||
|
Logger.Debug("Episode {0} is in history. skipping.", parseResult);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
parseResult.EpisodeTitle = episodeInfo.Title;
|
|||
|
var sabTitle = _sabProvider.GetSabTitle(parseResult, new DirectoryInfo(series.Path).Name);
|
|||
|
|
|||
|
if (_sabProvider.IsInQueue(sabTitle))
|
|||
|
{
|
|||
|
Logger.Debug("Episode {0} is already in sab's queue. skipping.", parseResult);
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
//Congragulations younge feed item! you have made it this far. you are truly special!!!
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|