@ -1,5 +1,6 @@
using System.Linq ;
using NLog ;
using NzbDrone.Core.Configuration ;
using NzbDrone.Core.DecisionEngine ;
using NzbDrone.Core.Download ;
using NzbDrone.Core.Parser.Model ;
@ -10,30 +11,44 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Specifications
{
public class UpgradeSpecification : IImportDecisionEngineSpecification
{
private readonly IConfigService _configService ;
private readonly Logger _logger ;
public UpgradeSpecification ( Logger logger )
public UpgradeSpecification ( IConfigService configService , Logger logger )
{
_configService = configService ;
_logger = logger ;
}
public Decision IsSatisfiedBy ( LocalEpisode localEpisode , DownloadClientItem downloadClientItem )
{
var downloadPropersAndRepacks = _configService . DownloadPropersAndRepacks ;
var qualityComparer = new QualityModelComparer ( localEpisode . Series . QualityProfile ) ;
var languageComparer = new LanguageComparer ( localEpisode . Series . LanguageProfile ) ;
if ( localEpisode . Episodes . Any ( e = > e . EpisodeFileId ! = 0 & & qualityComparer . Compare ( e . EpisodeFile . Value . Quality , localEpisode . Quality ) > 0 ) )
{
_logger . Debug ( "This file isn't a quality upgrade for all episodes. Skipping {0}" , localEpisode . Path ) ;
return Decision . Reject ( "Not an upgrade for existing episode file(s)" ) ;
}
if ( localEpisode . Episodes . Any ( e = > e . EpisodeFileId ! = 0 & &
languageComparer . Compare ( e . EpisodeFile . Value . Language , localEpisode . Language ) > 0 & &
qualityComparer . Compare ( e . EpisodeFile . Value . Quality , localEpisode . Quality ) = = 0 ) )
foreach ( var episode in localEpisode . Episodes . Where ( e = > e . EpisodeFileId > 0 ) )
{
var episodeFile = episode . EpisodeFile . Value ;
var qualityCompare = qualityComparer . Compare ( localEpisode . Quality . Quality , episodeFile . Quality . Quality ) ;
if ( qualityCompare < 0 )
{
_logger . Debug ( "This file isn't a quality upgrade for all episodes. Skipping {0}" , localEpisode . Path ) ;
return Decision . Reject ( "Not an upgrade for existing episode file(s)" ) ;
}
if ( downloadPropersAndRepacks ! = ProperDownloadTypes . DoNotPrefer & &
localEpisode . Quality . Revision . CompareTo ( episodeFile . Quality . Revision ) < 0 )
{
_logger . Debug ( "This file isn't a quality upgrade for all episodes. Skipping {0}" , localEpisode . Path ) ;
return Decision . Reject ( "Not an upgrade for existing episode file(s)" ) ;
}
if ( languageComparer . Compare ( localEpisode . Language , episodeFile . Language ) < 0 & & qualityCompare = = 0 )
{
_logger . Debug ( "This file isn't a language upgrade for all episodes. Skipping {0}" , localEpisode . Path ) ;
return Decision . Reject ( "Not an upgrade for existing episode file(s)" ) ;
}
}
return Decision . Accept ( ) ;