From e29470d8cb9dd3d4d75a3abe1b9b7e8df4f2df4a Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Sat, 4 Feb 2023 09:08:35 +0100 Subject: [PATCH] Fixed: Enable parsing of repacks with revision Closes #5383 --- .../ParserTests/QualityParserFixture.cs | 14 +++++---- src/NzbDrone.Core/Parser/QualityParser.cs | 30 +++++++++---------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/NzbDrone.Core.Test/ParserTests/QualityParserFixture.cs b/src/NzbDrone.Core.Test/ParserTests/QualityParserFixture.cs index d5a3ca020..27af547c1 100644 --- a/src/NzbDrone.Core.Test/ParserTests/QualityParserFixture.cs +++ b/src/NzbDrone.Core.Test/ParserTests/QualityParserFixture.cs @@ -466,14 +466,16 @@ namespace NzbDrone.Core.Test.ParserTests result.ResolutionDetectionSource.Should().Be(QualityDetectionSource.Name); } - [TestCase("Series Title S04E87 REPACK 720p HDTV x264 aAF", true)] - [TestCase("Series.Title.S04E87.REPACK.720p.HDTV.x264-aAF", true)] - [TestCase("Series.Title.S04E87.PROPER.720p.HDTV.x264-aAF", false)] - [TestCase("Series.Title.S01E07.RERIP.720p.BluRay.x264-DEMAND", true)] - public void should_be_able_to_parse_repack(string title, bool isRepack) + [TestCase("Series Title S04E87 REPACK 720p HDTV x264 aAF", true, 2)] + [TestCase("Series.Title.S04E87.REPACK.720p.HDTV.x264-aAF", true, 2)] + [TestCase("Series.Title.S04E87.REPACK2.720p.HDTV.x264-aAF", true, 3)] + [TestCase("Series.Title.S04E87.PROPER.720p.HDTV.x264-aAF", false, 2)] + [TestCase("Series.Title.S01E07.RERIP.720p.BluRay.x264-DEMAND", true, 2)] + [TestCase("Series.Title.S01E07.RERIP2.720p.BluRay.x264-DEMAND", true, 3)] + public void should_be_able_to_parse_repack(string title, bool isRepack, int version) { var result = QualityParser.ParseQuality(title); - result.Revision.Version.Should().Be(2); + result.Revision.Version.Should().Be(version); result.Revision.IsRepack.Should().Be(isRepack); } diff --git a/src/NzbDrone.Core/Parser/QualityParser.cs b/src/NzbDrone.Core/Parser/QualityParser.cs index 6671324cd..a6aaf1738 100644 --- a/src/NzbDrone.Core/Parser/QualityParser.cs +++ b/src/NzbDrone.Core/Parser/QualityParser.cs @@ -37,10 +37,10 @@ namespace NzbDrone.Core.Parser private static readonly Regex ProperRegex = new Regex(@"\b(?proper)\b", RegexOptions.Compiled | RegexOptions.IgnoreCase); - private static readonly Regex RepackRegex = new Regex(@"\b(?repack|rerip)\b", + private static readonly Regex RepackRegex = new Regex(@"\b(?repack\d?|rerip\d?)\b", RegexOptions.Compiled | RegexOptions.IgnoreCase); - private static readonly Regex VersionRegex = new Regex(@"\d[-._ ]?v(?\d)[-._ ]|\[v(?\d)\]", + private static readonly Regex VersionRegex = new Regex(@"\d[-._ ]?v(?\d)[-._ ]|\[v(?\d)\]|repack(?\d)|rerip(?\d)", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex RealRegex = new Regex(@"\b(?REAL)\b", @@ -634,19 +634,6 @@ namespace NzbDrone.Core.Parser { var result = new QualityModel { Quality = Quality.Unknown }; - if (ProperRegex.IsMatch(normalizedName)) - { - result.Revision.Version = 2; - result.RevisionDetectionSource = QualityDetectionSource.Name; - } - - if (RepackRegex.IsMatch(normalizedName)) - { - result.Revision.Version = 2; - result.Revision.IsRepack = true; - result.RevisionDetectionSource = QualityDetectionSource.Name; - } - var versionRegexResult = VersionRegex.Match(normalizedName); if (versionRegexResult.Success) @@ -655,6 +642,19 @@ namespace NzbDrone.Core.Parser result.RevisionDetectionSource = QualityDetectionSource.Name; } + if (ProperRegex.IsMatch(normalizedName)) + { + result.Revision.Version = versionRegexResult.Success ? Convert.ToInt32(versionRegexResult.Groups["version"].Value) + 1 : 2; + result.RevisionDetectionSource = QualityDetectionSource.Name; + } + + if (RepackRegex.IsMatch(normalizedName)) + { + result.Revision.Version = versionRegexResult.Success ? Convert.ToInt32(versionRegexResult.Groups["version"].Value) + 1 : 2; + result.Revision.IsRepack = true; + result.RevisionDetectionSource = QualityDetectionSource.Name; + } + // TODO: re-enable this when we have a reliable way to determine real // TODO: Only treat it as a real if it comes AFTER the season/episode number var realRegexResult = RealRegex.Matches(name);