2015-02-26 16:13:15 +00:00
using System.Linq ;
using NLog ;
using NzbDrone.Core.IndexerSearch.Definitions ;
using NzbDrone.Core.Parser.Model ;
using NzbDrone.Core.Queue ;
namespace NzbDrone.Core.DecisionEngine.Specifications
{
public class QueueSpecification : IDecisionEngineSpecification
{
private readonly IQueueService _queueService ;
2017-09-04 02:20:56 +00:00
private readonly UpgradableSpecification _upgradableSpecification ;
2015-02-26 16:13:15 +00:00
private readonly Logger _logger ;
public QueueSpecification ( IQueueService queueService ,
2017-12-24 05:34:21 +00:00
UpgradableSpecification upgradableSpecification ,
2015-02-26 16:13:15 +00:00
Logger logger )
{
_queueService = queueService ;
2017-12-24 05:34:21 +00:00
_upgradableSpecification = upgradableSpecification ;
2015-02-26 16:13:15 +00:00
_logger = logger ;
}
2017-09-27 03:30:24 +00:00
public SpecificationPriority Priority = > SpecificationPriority . Default ;
2016-12-09 06:54:15 +00:00
public RejectionType Type = > RejectionType . Permanent ;
2015-02-26 16:13:15 +00:00
2017-08-14 02:58:42 +00:00
public Decision IsSatisfiedBy ( RemoteAlbum subject , SearchCriteriaBase searchCriteria )
2015-02-26 16:13:15 +00:00
{
var queue = _queueService . GetQueue ( )
2017-08-14 02:58:42 +00:00
. Select ( q = > q . RemoteAlbum ) . ToList ( ) ;
2015-02-26 16:13:15 +00:00
2017-08-14 02:58:42 +00:00
var matchingArtist = queue . Where ( q = > q . Artist . Id = = subject . Artist . Id ) ;
var matchingAlbum = matchingArtist . Where ( q = > q . Albums . Select ( e = > e . Id ) . Intersect ( subject . Albums . Select ( e = > e . Id ) ) . Any ( ) ) ;
2015-02-26 16:13:15 +00:00
2017-08-14 02:58:42 +00:00
foreach ( var remoteAlbum in matchingAlbum )
2015-02-26 16:13:15 +00:00
{
2017-12-24 05:34:21 +00:00
_logger . Debug ( "Checking if existing release in queue meets cutoff. Queued quality is: {0} - {1}" , remoteAlbum . ParsedAlbumInfo . Quality , remoteAlbum . ParsedAlbumInfo . Language ) ;
2015-02-26 16:13:15 +00:00
2017-09-04 02:20:56 +00:00
if ( ! _upgradableSpecification . CutoffNotMet ( subject . Artist . Profile ,
subject . Artist . LanguageProfile ,
remoteAlbum . ParsedAlbumInfo . Quality ,
remoteAlbum . ParsedAlbumInfo . Language ,
subject . ParsedAlbumInfo . Quality ) )
2015-02-26 16:13:15 +00:00
{
2017-08-14 02:58:42 +00:00
return Decision . Reject ( "Quality for release in queue already meets cutoff: {0}" , remoteAlbum . ParsedAlbumInfo . Quality ) ;
2015-02-26 16:13:15 +00:00
}
2017-12-24 05:34:21 +00:00
_logger . Debug ( "Checking if release is higher quality than queued release. Queued quality is: {0} - {1}" , remoteAlbum . ParsedAlbumInfo . Quality , remoteAlbum . ParsedAlbumInfo . Language ) ;
2015-02-26 16:13:15 +00:00
2017-09-04 02:20:56 +00:00
if ( ! _upgradableSpecification . IsUpgradable ( subject . Artist . Profile ,
subject . Artist . LanguageProfile ,
remoteAlbum . ParsedAlbumInfo . Quality ,
remoteAlbum . ParsedAlbumInfo . Language ,
subject . ParsedAlbumInfo . Quality ,
subject . ParsedAlbumInfo . Language ) )
2015-02-26 16:13:15 +00:00
{
2017-12-24 05:34:21 +00:00
return Decision . Reject ( "Quality for release in queue is of equal or higher preference: {0} - {1}" , remoteAlbum . ParsedAlbumInfo . Quality , remoteAlbum . ParsedAlbumInfo . Language ) ;
2015-02-26 16:13:15 +00:00
}
}
return Decision . Accept ( ) ;
2017-08-14 02:58:42 +00:00
2015-02-26 16:13:15 +00:00
}
}
}