diff --git a/create_test_cases.py b/create_test_cases.py new file mode 100644 index 000000000..5d1879ea1 --- /dev/null +++ b/create_test_cases.py @@ -0,0 +1,44 @@ +input1 = """Prometheus.Special.Edition.Fan Edit.2012..BRRip.x264.AAC-m2g +Star Wars Episode IV - A New Hope (Despecialized) 1999.mkv +Prometheus.(Special.Edition.Remastered).2012.[Bluray-1080p].mkv +Prometheus Extended 2012 +Prometheus Extended Directors Cut Fan Edit 2012 +Prometheus Director's Cut 2012 +Prometheus Directors Cut 2012 +Prometheus.(Extended.Theatrical.Version.IMAX).BluRay.1080p.2012.asdf +2001 A Space Odyssey Director's Cut (1968).mkv +2001: A Space Odyssey (Extended Directors Cut FanEdit) Bluray 1080p 1968 +A Fake Movie 2035 Directors 2012.mkv +Blade Runner Director's Cut 2049.mkv +Prometheus 50th Anniversary Edition 2012.mkv +Movie 2in1 2012.mkv +Movie IMAX 2012.mkv""" + +output1 = """Special.Edition.Fan Edit BRRip.x264.AAC-m2g +Despecialized mkv +Special.Edition.Remastered Bluray-1080p].mkv +Extended mkv +Extended Directors Cut Fan Edit mkv +Director's Cut mkv +Directors Cut mkv +Extended.Theatrical.Version.IMAX asdf +Director's Cut mkv +Extended Directors Cut FanEdit mkv +Directors mkv +Director's Cut mkv +50th Anniversary Edition mkv +2in1 mkv +IMAX mkv""" + +inputs = input1.split("\n") +outputs = output1.split("\n") +real_o = [] +for output in outputs: + real_o.append(output.split(" ")[0].replace(".", " ").strip()) + +count = 0 + +for inp in inputs: + o = real_o[count] + print "[TestCase(\"{0}\", \"{1}\")]".format(inp, o) + count += 1 diff --git a/src/NzbDrone.Core.Test/ParserTests/ParserFixture.cs b/src/NzbDrone.Core.Test/ParserTests/ParserFixture.cs index 1c1377be7..0ee998579 100644 --- a/src/NzbDrone.Core.Test/ParserTests/ParserFixture.cs +++ b/src/NzbDrone.Core.Test/ParserTests/ParserFixture.cs @@ -91,5 +91,41 @@ namespace NzbDrone.Core.Test.ParserTests { Parser.Parser.ParseMovieTitle(postTitle).Language.Should().Be(Language.English); } + + [TestCase("Prometheus 2012 Directors Cut", "Directors Cut")] + [TestCase("Star Wars Episode IV - A New Hope 1999 (Despecialized).mkv", "Despecialized")] + [TestCase("Prometheus.2012.(Special.Edition.Remastered).[Bluray-1080p].mkv", "Special Edition Remastered")] + [TestCase("Prometheus 2012 Extended", "Extended")] + [TestCase("Prometheus 2012 Extended Directors Cut Fan Edit", "Extended Directors Cut Fan Edit")] + [TestCase("Prometheus 2012 Director's Cut", "Director's Cut")] + [TestCase("Prometheus 2012 Directors Cut", "Directors Cut")] + [TestCase("Prometheus.2012.(Extended.Theatrical.Version.IMAX).BluRay.1080p.2012.asdf", "Extended Theatrical Version IMAX")] + [TestCase("2001 A Space Odyssey (1968) Director's Cut .mkv", "Director's Cut")] + [TestCase("2001: A Space Odyssey 1968 (Extended Directors Cut FanEdit)", "Extended Directors Cut FanEdit")] + [TestCase("A Fake Movie 2035 2012 Directors.mkv", "Directors")] + [TestCase("Blade Runner 2049 Director's Cut.mkv", "Director's Cut")] + [TestCase("Prometheus 2012 50th Anniversary Edition.mkv", "50th Anniversary Edition")] + [TestCase("Movie 2012 2in1.mkv", "2in1")] + [TestCase("Movie 2012 IMAX.mkv", "IMAX")] + [TestCase("Movie 2012 Restored.mkv", "Restored")] + [TestCase("Prometheus.Special.Edition.Fan Edit.2012..BRRip.x264.AAC-m2g", "Special Edition Fan Edit")] + [TestCase("Star Wars Episode IV - A New Hope (Despecialized) 1999.mkv", "Despecialized")] + [TestCase("Prometheus.(Special.Edition.Remastered).2012.[Bluray-1080p].mkv", "Special Edition Remastered")] + [TestCase("Prometheus Extended 2012", "Extended")] + [TestCase("Prometheus Extended Directors Cut Fan Edit 2012", "Extended Directors Cut Fan Edit")] + [TestCase("Prometheus Director's Cut 2012", "Director's Cut")] + [TestCase("Prometheus Directors Cut 2012", "Directors Cut")] + [TestCase("Prometheus.(Extended.Theatrical.Version.IMAX).BluRay.1080p.2012.asdf", "Extended Theatrical Version IMAX")] + [TestCase("2001 A Space Odyssey Director's Cut (1968).mkv", "Director's Cut")] + [TestCase("2001: A Space Odyssey (Extended Directors Cut FanEdit) Bluray 1080p 1968", "Extended Directors Cut FanEdit")] + [TestCase("A Fake Movie 2035 Directors 2012.mkv", "Directors")] + [TestCase("Blade Runner Director's Cut 2049.mkv", "Director's Cut")] + [TestCase("Prometheus 50th Anniversary Edition 2012.mkv", "50th Anniversary Edition")] + [TestCase("Movie 2in1 2012.mkv", "2in1")] + [TestCase("Movie IMAX 2012.mkv", "IMAX")] + public void should_parse_edition(string postTitle, string edition) + { + Parser.Parser.ParseMovieTitle(postTitle).Edition.Should().Be(edition); + } } } diff --git a/src/NzbDrone.Core/Parser/Parser.cs b/src/NzbDrone.Core/Parser/Parser.cs index b3165435f..adbbac553 100644 --- a/src/NzbDrone.Core/Parser/Parser.cs +++ b/src/NzbDrone.Core/Parser/Parser.cs @@ -19,11 +19,11 @@ namespace NzbDrone.Core.Parser private static readonly Regex[] ReportMovieTitleRegex = new[] { //Special, Despecialized, etc. Edition Movies, e.g: Mission.Impossible.3.Special.Edition.2011 - new Regex(@"^(?(?![(\[]).+?)?(?:(?:[-_\W](?<![)\[!]))*(?<edition>(\.?((Extended.|Ultimate.)?(Director.?s|Collector.?s|Theatrical|Ultimate|Final|Extended|Rogue|Special|Despecialized).(Cut|Edition|Version)|Extended|Uncensored|Remastered|Unrated|Uncut|IMAX)))\.(?<year>(19|20)\d{2}(?!p|i|\d+|\]|\W\d+)))+(\W+|_|$)(?!\\)", + new Regex(@"^(?<title>(?![(\[]).+?)?(?:(?:[-_\W](?<![)\[!]))*\(?(?<edition>(((Extended.|Ultimate.)?(Director.?s|Collector.?s|Theatrical|Ultimate|Final|Extended|Rogue|Special|Despecialized|\d{2,3}(th)?.Anniversary)(.(Cut|Edition|Version))?(.(Extended|Uncensored|Remastered|Unrated|Uncut|IMAX|Fan.?Edit))?|((Uncensored|Remastered|Unrated|Uncut|IMAX|Fan.?Edit|Edition|Restored|((2|3|4)in1))))))\)?.+(?<year>(19|20)\d{2}(?!p|i|\d+|\]|\W\d+)))+(\W+|_|$)(?!\\)", RegexOptions.IgnoreCase | RegexOptions.Compiled), //Special, Despecialized, etc. Edition Movies, e.g: Mission.Impossible.3.2011.Special.Edition //TODO: Seems to slow down parsing heavily! - new Regex(@"^(?<title>(?![(\[]).+?)?(?:(?:[-_\W](?<![)\[!]))*(?<year>(19|20)\d{2}(?!p|i|\d+|\]|\W\d+)))+(\W+|_|$)(?!\\)(?<edition>((Extended.|Ultimate.)?(Director.?s|Collector.?s|Theatrical|Ultimate|Final|Extended|Rogue|Special|Despecialized).(Cut|Edition|Version)|Extended|Uncensored|Remastered|Unrated|Uncut|IMAX))", + new Regex(@"^(?<title>(?![(\[]).+?)?(?:(?:[-_\W](?<![)\[!]))*(?<year>(19|20)\d{2}(?!p|i|(19|20)\d{2}|\]|\W(19|20)\d{2})))+(\W+|_|$)(?!\\)\(?(?<edition>(((Extended.|Ultimate.)?(Director.?s|Collector.?s|Theatrical|Ultimate|Final|Extended|Rogue|Special|Despecialized|\d{2,3}(th)?.Anniversary)(.(Cut|Edition|Version))?(.(Extended|Uncensored|Remastered|Unrated|Uncut|IMAX|Fan.?Edit))?|((Uncensored|Remastered|Unrated|Uncut|IMAX|Fan.?Edit|Edition|Restored|((2|3|4)in1))))))\)?", RegexOptions.IgnoreCase | RegexOptions.Compiled), //Normal movie format, e.g: Mission.Impossible.3.2011