2017-09-27 03:30:24 +00:00
using System.Linq ;
2012-02-07 05:08:07 +00:00
using NLog ;
2014-10-27 05:51:50 +00:00
using NzbDrone.Common.Extensions ;
2013-08-07 03:18:05 +00:00
using NzbDrone.Core.IndexerSearch.Definitions ;
2013-04-15 01:41:39 +00:00
using NzbDrone.Core.Parser.Model ;
2013-02-27 03:19:22 +00:00
using NzbDrone.Core.Qualities ;
2014-05-02 22:04:58 +00:00
using System.Collections.Generic ;
2012-02-07 05:08:07 +00:00
2013-03-07 00:19:49 +00:00
namespace NzbDrone.Core.DecisionEngine.Specifications
2012-02-07 05:08:07 +00:00
{
2013-04-07 07:30:37 +00:00
public class AcceptableSizeSpecification : IDecisionEngineSpecification
2012-02-07 05:08:07 +00:00
{
2014-01-18 11:44:36 +00:00
private readonly IQualityDefinitionService _qualityDefinitionService ;
2013-03-07 00:19:49 +00:00
private readonly Logger _logger ;
2012-02-07 05:08:07 +00:00
2017-08-14 02:58:42 +00:00
public AcceptableSizeSpecification ( IQualityDefinitionService qualityDefinitionService , Logger logger )
2012-02-07 05:08:07 +00:00
{
2014-01-18 11:44:36 +00:00
_qualityDefinitionService = qualityDefinitionService ;
2013-03-07 00:19:49 +00:00
_logger = logger ;
2012-02-07 05:08:07 +00:00
}
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 ;
2017-08-14 02:58:42 +00:00
public Decision IsSatisfiedBy ( RemoteAlbum subject , SearchCriteriaBase searchCriteria )
2012-02-07 05:08:07 +00:00
{
2014-03-13 20:12:42 +00:00
_logger . Debug ( "Beginning size check for: {0}" , subject ) ;
2012-02-07 05:08:07 +00:00
2017-08-14 02:58:42 +00:00
var quality = subject . ParsedAlbumInfo . Quality . Quality ;
2013-01-09 08:15:06 +00:00
2015-05-14 20:57:45 +00:00
if ( subject . Release . Size = = 0 )
{
_logger . Debug ( "Release has unknown size, skipping size check." ) ;
return Decision . Accept ( ) ;
}
2014-01-18 11:44:36 +00:00
var qualityDefinition = _qualityDefinitionService . Get ( quality ) ;
2017-12-28 02:41:11 +00:00
var albumsDuration = subject . Albums . Sum ( album = > album . Duration ) / 1000 ;
2017-08-14 02:58:42 +00:00
2015-05-19 22:57:01 +00:00
if ( qualityDefinition . MinSize . HasValue )
{
2017-12-28 02:41:11 +00:00
var minSize = qualityDefinition . MinSize . Value . Kilobits ( ) ;
2012-02-07 05:08:07 +00:00
2017-08-14 02:58:42 +00:00
//Multiply minSize by Album.Duration
minSize = minSize * albumsDuration ;
2012-02-07 05:08:07 +00:00
2015-05-19 22:57:01 +00:00
//If the parsed size is smaller than minSize we don't want it
if ( subject . Release . Size < minSize )
{
2017-12-28 02:41:11 +00:00
var runtimeMessage = $"{albumsDuration}sec" ;
2016-09-22 20:38:38 +00:00
2017-12-28 02:41:11 +00:00
_logger . Debug ( "Item: {0}, Size: {1} is smaller than minimum allowed size ({2} bytes for {3}), rejecting." , subject , subject . Release . Size , minSize , runtimeMessage ) ;
2017-08-14 02:58:42 +00:00
return Decision . Reject ( "{0} is smaller than minimum allowed {1}" , subject . Release . Size . SizeSuffix ( ) , minSize . SizeSuffix ( ) ) ;
2015-05-19 22:57:01 +00:00
}
2014-02-15 10:51:52 +00:00
}
2015-12-27 20:03:27 +00:00
if ( ! qualityDefinition . MaxSize . HasValue | | qualityDefinition . MaxSize . Value = = 0 )
2012-02-07 05:08:07 +00:00
{
2015-05-19 22:57:01 +00:00
_logger . Debug ( "Max size is unlimited - skipping check." ) ;
2012-02-07 05:08:07 +00:00
}
2014-02-15 10:51:52 +00:00
else
2012-04-17 03:42:18 +00:00
{
2017-12-28 02:41:11 +00:00
var maxSize = qualityDefinition . MaxSize . Value . Kilobits ( ) ;
2014-02-15 10:51:52 +00:00
2017-08-14 02:58:42 +00:00
//Multiply maxSize by Album.Duration
maxSize = maxSize * albumsDuration ;
2014-02-15 10:51:52 +00:00
//If the parsed size is greater than maxSize we don't want it
if ( subject . Release . Size > maxSize )
{
2017-12-28 02:41:11 +00:00
var runtimeMessage = $"{albumsDuration}sec" ;
2016-09-22 20:38:38 +00:00
2017-12-28 02:41:11 +00:00
_logger . Debug ( "Item: {0}, Size: {1} is greater than maximum allowed size ({2} bytes for {3}), rejecting." , subject , subject . Release . Size , maxSize , runtimeMessage ) ;
2017-08-14 02:58:42 +00:00
return Decision . Reject ( "{0} is larger than maximum allowed {1}" , subject . Release . Size . SizeSuffix ( ) , maxSize . SizeSuffix ( ) ) ;
2014-02-15 10:51:52 +00:00
}
2012-04-17 03:42:18 +00:00
}
2014-10-27 05:51:50 +00:00
2014-03-13 20:12:42 +00:00
_logger . Debug ( "Item: {0}, meets size constraints." , subject ) ;
2014-10-27 05:51:50 +00:00
return Decision . Accept ( ) ;
2012-02-07 05:08:07 +00:00
}
}
}