diff --git a/src/NzbDrone.Core.Test/DecisionEngineTests/RawDiskSpecificationFixture.cs b/src/NzbDrone.Core.Test/DecisionEngineTests/RawDiskSpecificationFixture.cs index 024c3763b..014225692 100644 --- a/src/NzbDrone.Core.Test/DecisionEngineTests/RawDiskSpecificationFixture.cs +++ b/src/NzbDrone.Core.Test/DecisionEngineTests/RawDiskSpecificationFixture.cs @@ -19,7 +19,11 @@ namespace NzbDrone.Core.Test.DecisionEngineTests { _remoteEpisode = new RemoteEpisode { - Release = new ReleaseInfo() { DownloadProtocol = DownloadProtocol.Torrent } + Release = new ReleaseInfo + { + Title = "Series.title.s01e01", + DownloadProtocol = DownloadProtocol.Torrent + } }; } @@ -29,7 +33,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests } [Test] - public void should_return_true_if_no_container_specified() + public void should_return_true_if_no_container_specified_and_does_not_match_disc_release_pattern() { Subject.IsSatisfiedBy(_remoteEpisode, null).Accepted.Should().BeTrue(); } @@ -69,5 +73,15 @@ namespace NzbDrone.Core.Test.DecisionEngineTests Subject.IsSatisfiedBy(_remoteEpisode, null).Accepted.Should().BeFalse(); } + [TestCase("How the Earth Was Made S02 Disc 1 1080i Blu-ray DTS-HD MA 2.0 AVC-TrollHD")] + [TestCase("The Universe S03 Disc 1 1080p Blu-ray LPCM 2.0 AVC-TrollHD")] + [TestCase("HELL ON WHEELS S02 1080P FULL BLURAY AVC DTS-HD MA 5 1")] + [TestCase("Game.of.Thrones.S06.2016.DISC.3.BluRay.1080p.AVC.Atmos.TrueHD7.1-MTeam")] + [TestCase("Game of Thrones S05 Disc 1 BluRay 1080p AVC Atmos TrueHD 7 1-MTeam")] + public void should_return_false_if_matches_disc_format(string title) + { + _remoteEpisode.Release.Title = title; + Subject.IsSatisfiedBy(_remoteEpisode, null).Accepted.Should().BeFalse(); + } } } \ No newline at end of file diff --git a/src/NzbDrone.Core/DecisionEngine/Specifications/RawDiskSpecification.cs b/src/NzbDrone.Core/DecisionEngine/Specifications/RawDiskSpecification.cs index 77b9c006f..23fcaa901 100644 --- a/src/NzbDrone.Core/DecisionEngine/Specifications/RawDiskSpecification.cs +++ b/src/NzbDrone.Core/DecisionEngine/Specifications/RawDiskSpecification.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System.Linq; +using System.Text.RegularExpressions; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Core.IndexerSearch.Definitions; @@ -8,8 +9,13 @@ namespace NzbDrone.Core.DecisionEngine.Specifications { public class RawDiskSpecification : IDecisionEngineSpecification { - private static readonly string[] _dvdContainerTypes = new[] { "vob", "iso" }; + private static readonly Regex[] DiscRegex = new[] + { + new Regex(@"(?:dis[ck])(?:[-_. ]\d+[-_. ])(?:(?:(?:480|720|1080|2160)[ip]|)[-_. ])?(?:Blu\-?ray)", RegexOptions.Compiled | RegexOptions.IgnoreCase), + new Regex(@"(?:(?:480|720|1080|2160)[ip]|)[-_. ](?:full)[-_. ](?:Blu\-?ray)", RegexOptions.Compiled | RegexOptions.IgnoreCase) + }; + private static readonly string[] _dvdContainerTypes = new[] { "vob", "iso" }; private static readonly string[] _blurayContainerTypes = new[] { "m2ts" }; private readonly Logger _logger; @@ -24,7 +30,21 @@ namespace NzbDrone.Core.DecisionEngine.Specifications public virtual Decision IsSatisfiedBy(RemoteEpisode subject, SearchCriteriaBase searchCriteria) { - if (subject.Release == null || subject.Release.Container.IsNullOrWhiteSpace()) + if (subject.Release == null) + { + return Decision.Accept(); + } + + foreach (var regex in DiscRegex) + { + if (regex.IsMatch(subject.Release.Title)) + { + _logger.Debug("Release contains raw Bluray, rejecting."); + return Decision.Reject("Raw Bluray release"); + } + } + + if (subject.Release.Container.IsNullOrWhiteSpace()) { return Decision.Accept(); }