2011-05-20 03:47:07 +00:00
|
|
|
|
using System;
|
2011-05-24 04:12:54 +00:00
|
|
|
|
using System.Collections.Generic;
|
2011-05-20 03:47:07 +00:00
|
|
|
|
using NLog;
|
|
|
|
|
using NzbDrone.Core.Model;
|
|
|
|
|
using NzbDrone.Core.Repository;
|
2011-05-28 19:23:35 +00:00
|
|
|
|
using NzbDrone.Core.Repository.Quality;
|
2011-05-20 03:47:07 +00:00
|
|
|
|
|
2011-05-26 04:25:59 +00:00
|
|
|
|
namespace NzbDrone.Core.Providers
|
2011-05-20 03:47:07 +00:00
|
|
|
|
{
|
2011-05-20 04:59:35 +00:00
|
|
|
|
public class InventoryProvider
|
2011-05-20 03:47:07 +00:00
|
|
|
|
{
|
|
|
|
|
private readonly SeriesProvider _seriesProvider;
|
|
|
|
|
private readonly SeasonProvider _seasonProvider;
|
|
|
|
|
private readonly EpisodeProvider _episodeProvider;
|
|
|
|
|
private readonly HistoryProvider _historyProvider;
|
|
|
|
|
|
|
|
|
|
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
|
|
|
|
|
2011-05-27 03:07:32 +00:00
|
|
|
|
public InventoryProvider(SeriesProvider seriesProvider, SeasonProvider seasonProvider, EpisodeProvider episodeProvider, HistoryProvider historyProvider)
|
2011-05-20 03:47:07 +00:00
|
|
|
|
{
|
|
|
|
|
_seriesProvider = seriesProvider;
|
|
|
|
|
_seasonProvider = seasonProvider;
|
|
|
|
|
_episodeProvider = episodeProvider;
|
|
|
|
|
_historyProvider = historyProvider;
|
|
|
|
|
}
|
|
|
|
|
|
2011-05-27 03:07:32 +00:00
|
|
|
|
public InventoryProvider()
|
|
|
|
|
{
|
2011-05-28 19:23:35 +00:00
|
|
|
|
|
2011-05-27 03:07:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-05-28 19:23:35 +00:00
|
|
|
|
|
|
|
|
|
public virtual bool IsMonitored(EpisodeParseResult parseResult)
|
2011-05-20 03:47:07 +00:00
|
|
|
|
{
|
2011-05-20 04:59:35 +00:00
|
|
|
|
var series = _seriesProvider.FindSeries(parseResult.CleanTitle);
|
|
|
|
|
|
|
|
|
|
if (series == null)
|
|
|
|
|
{
|
|
|
|
|
Logger.Trace("{0} is not mapped to any series in DB. skipping", parseResult.CleanTitle);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2011-05-20 05:52:05 +00:00
|
|
|
|
parseResult.Series = series;
|
2011-05-24 04:12:54 +00:00
|
|
|
|
parseResult.Episodes = new List<Episode>();
|
2011-05-20 05:52:05 +00:00
|
|
|
|
|
2011-05-24 04:12:54 +00:00
|
|
|
|
if (!series.Monitored)
|
2011-05-20 03:47:07 +00:00
|
|
|
|
{
|
2011-05-24 04:12:54 +00:00
|
|
|
|
Logger.Debug("{0} is present in the DB but not tracked. skipping.", parseResult.CleanTitle);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2011-05-20 03:47:07 +00:00
|
|
|
|
|
2011-05-24 04:12:54 +00:00
|
|
|
|
if (_seasonProvider.IsIgnored(series.SeriesId, parseResult.SeasonNumber))
|
|
|
|
|
{
|
|
|
|
|
Logger.Debug("Season {0} is currently set to ignore. skipping.", parseResult.SeasonNumber);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2011-05-20 03:47:07 +00:00
|
|
|
|
|
2011-05-24 04:12:54 +00:00
|
|
|
|
foreach (var episodeNumber in parseResult.EpisodeNumbers)
|
|
|
|
|
{
|
2011-05-20 03:47:07 +00:00
|
|
|
|
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,
|
2011-05-28 19:23:35 +00:00
|
|
|
|
Title = "TBD",
|
2011-05-20 03:47:07 +00:00
|
|
|
|
Overview = String.Empty,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
_episodeProvider.AddEpisode(episodeInfo);
|
|
|
|
|
}
|
|
|
|
|
|
2011-05-24 04:12:54 +00:00
|
|
|
|
parseResult.Episodes.Add(episodeInfo);
|
|
|
|
|
}
|
2011-05-20 03:47:07 +00:00
|
|
|
|
|
2011-05-28 19:23:35 +00:00
|
|
|
|
return true;
|
|
|
|
|
}
|
2011-05-24 04:12:54 +00:00
|
|
|
|
|
2011-05-28 19:23:35 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Comprehensive check on whether or not this episode is needed.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name = "parsedReport">Episode that needs to be checked</param>
|
|
|
|
|
/// <returns>Whether or not the file quality meets the requirements </returns>
|
|
|
|
|
/// <remarks>for multi episode files, all episodes need to meet the requirement
|
|
|
|
|
/// before the report is downloaded</remarks>
|
|
|
|
|
public virtual bool IsQualityNeeded(EpisodeParseResult parsedReport)
|
|
|
|
|
{
|
|
|
|
|
Logger.Trace("Checking if report meets quality requirements. {0}", parsedReport.Quality);
|
|
|
|
|
if (!parsedReport.Series.QualityProfile.Allowed.Contains(parsedReport.Quality.QualityType))
|
|
|
|
|
{
|
|
|
|
|
Logger.Trace("Quality {0} rejected by Series' quality profile", parsedReport.Quality);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2011-05-24 04:12:54 +00:00
|
|
|
|
|
2011-05-28 19:23:35 +00:00
|
|
|
|
var cutoff = parsedReport.Series.QualityProfile.Cutoff;
|
2011-05-24 04:12:54 +00:00
|
|
|
|
|
2011-05-28 19:23:35 +00:00
|
|
|
|
foreach (var episode in parsedReport.Episodes)
|
|
|
|
|
{
|
|
|
|
|
//Checking File
|
|
|
|
|
var file = episode.EpisodeFile;
|
|
|
|
|
if (file != null)
|
2011-05-20 03:47:07 +00:00
|
|
|
|
{
|
2011-05-28 19:23:35 +00:00
|
|
|
|
Logger.Trace("Comparing file quality with report. Existing file is {0} proper:{1}", file.Quality, file.Proper);
|
|
|
|
|
if (!IsUpgrade(new Quality { QualityType = file.Quality, Proper = file.Proper }, parsedReport.Quality, cutoff))
|
|
|
|
|
return false;
|
2011-05-20 03:47:07 +00:00
|
|
|
|
}
|
2011-05-20 04:59:35 +00:00
|
|
|
|
|
2011-05-28 19:23:35 +00:00
|
|
|
|
//Checking History
|
|
|
|
|
var bestQualityInHistory = _historyProvider.GetBestQualityInHistory(episode.EpisodeId);
|
|
|
|
|
if (bestQualityInHistory != null)
|
2011-05-20 03:47:07 +00:00
|
|
|
|
{
|
2011-05-28 19:23:35 +00:00
|
|
|
|
Logger.Trace("Comparing history quality with report. History is {0}", bestQualityInHistory);
|
|
|
|
|
if (!IsUpgrade(bestQualityInHistory, parsedReport.Quality, cutoff))
|
|
|
|
|
return false;
|
2011-05-20 03:47:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-05-28 19:23:35 +00:00
|
|
|
|
}
|
2011-05-24 04:12:54 +00:00
|
|
|
|
|
2011-05-28 19:23:35 +00:00
|
|
|
|
Logger.Debug("Episode {0} is needed", parsedReport);
|
|
|
|
|
return true; //If we get to this point and the file has not yet been rejected then accept it
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static bool IsUpgrade(Quality currentQuality, Quality newQuality, QualityTypes cutOff)
|
|
|
|
|
{
|
|
|
|
|
if (currentQuality.QualityType >= cutOff)
|
|
|
|
|
{
|
|
|
|
|
Logger.Trace("Existing file meets cut-off. skipping.");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (newQuality > currentQuality)
|
2011-05-20 03:47:07 +00:00
|
|
|
|
return true;
|
2011-05-28 19:23:35 +00:00
|
|
|
|
|
|
|
|
|
if (currentQuality > newQuality)
|
|
|
|
|
{
|
|
|
|
|
Logger.Trace("existing item has better quality. skipping");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (currentQuality == newQuality && !newQuality.Proper)
|
|
|
|
|
{
|
|
|
|
|
Logger.Trace("same quality. not proper skipping");
|
|
|
|
|
return false;
|
2011-05-20 03:47:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
2011-05-28 19:23:35 +00:00
|
|
|
|
Logger.Debug("New item has better quality than existing item");
|
|
|
|
|
return true;
|
2011-05-20 03:47:07 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|