2015-02-26 16:13:15 +00:00
using System.Linq ;
using NLog ;
using NzbDrone.Core.IndexerSearch.Definitions ;
using NzbDrone.Core.Parser.Model ;
2019-02-23 22:39:11 +00:00
using NzbDrone.Core.Profiles.Releases ;
2015-02-26 16:13:15 +00:00
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 ;
2019-02-23 22:39:11 +00:00
private readonly IPreferredWordService _preferredWordServiceCalculator ;
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 ,
2019-02-23 22:39:11 +00:00
IPreferredWordService preferredWordServiceCalculator ,
2015-02-26 16:13:15 +00:00
Logger logger )
{
_queueService = queueService ;
2017-12-24 05:34:21 +00:00
_upgradableSpecification = upgradableSpecification ;
2019-02-23 22:39:11 +00:00
_preferredWordServiceCalculator = preferredWordServiceCalculator ;
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
{
2019-02-23 22:39:11 +00:00
var queue = _queueService . GetQueue ( ) ;
var matchingAlbum = queue . Where ( q = > q . RemoteAlbum ! = null & &
q . RemoteAlbum . Artist ! = null & &
q . RemoteAlbum . Artist . Id = = subject . Artist . Id & &
q . RemoteAlbum . Albums . Select ( e = > e . Id ) . Intersect ( subject . Albums . Select ( e = > e . Id ) ) . Any ( ) )
. ToList ( ) ;
2015-02-26 16:13:15 +00:00
2019-02-23 22:39:11 +00:00
foreach ( var queueItem in matchingAlbum )
2015-02-26 16:13:15 +00:00
{
2019-02-23 22:39:11 +00:00
var remoteAlbum = queueItem . RemoteAlbum ;
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 ) ;
2019-02-23 22:39:11 +00:00
var queuedItemPreferredWordScore = _preferredWordServiceCalculator . Calculate ( subject . Artist , queueItem . Title ) ;
2015-02-26 16:13:15 +00:00
2019-02-23 22:39:11 +00:00
if ( ! _upgradableSpecification . CutoffNotMet ( subject . Artist . QualityProfile ,
2017-09-04 02:20:56 +00:00
subject . Artist . LanguageProfile ,
remoteAlbum . ParsedAlbumInfo . Quality ,
remoteAlbum . ParsedAlbumInfo . Language ,
2019-02-23 22:39:11 +00:00
queuedItemPreferredWordScore ,
subject . ParsedAlbumInfo . Quality ,
subject . PreferredWordScore ) )
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
2019-02-23 22:39:11 +00:00
if ( ! _upgradableSpecification . IsUpgradable ( subject . Artist . QualityProfile ,
2017-09-04 02:20:56 +00:00
subject . Artist . LanguageProfile ,
remoteAlbum . ParsedAlbumInfo . Quality ,
remoteAlbum . ParsedAlbumInfo . Language ,
2019-02-23 22:39:11 +00:00
queuedItemPreferredWordScore ,
2017-09-04 02:20:56 +00:00
subject . ParsedAlbumInfo . Quality ,
2019-02-23 22:39:11 +00:00
subject . ParsedAlbumInfo . Language ,
subject . PreferredWordScore ) )
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
}
}
}