diff --git a/NzbDrone.Core.Test/ParserTest.cs b/NzbDrone.Core.Test/ParserTest.cs index ff6afb8a7..76deb79bb 100644 --- a/NzbDrone.Core.Test/ParserTest.cs +++ b/NzbDrone.Core.Test/ParserTest.cs @@ -123,6 +123,19 @@ public void episode_daily_parse(string postTitle, string title, int year, int mo Assert.IsNull(result.Episodes); } + + [Test] + [Row("30.Rock.Season.04.HDTV.XviD-DIMENSION", "30.Rock", 4)] + [Row("Parks.and.Recreation.S02.720p.x264-DIMENSION", "Parks.and.Recreation", 2)] + [Row("The.Office.US.S03.720p.x264-DIMENSION", "The.Office.US", 3)] + public void full_season_release_parse(string postTitle, string title, int season) + { + var result = Parser.ParseEpisodeInfo(postTitle); + Assert.AreEqual(season, result.SeasonNumber); + Assert.AreEqual(Parser.NormalizeTitle(title), result.CleanTitle); + Assert.AreEqual(0, result.Episodes.Count); + } + [Test] [Row("Conan", "conan")] [Row("The Tonight Show With Jay Leno", "tonightshowwithjayleno")] diff --git a/NzbDrone.Core/Parser.cs b/NzbDrone.Core/Parser.cs index 73bf457ad..e67d7738e 100644 --- a/NzbDrone.Core/Parser.cs +++ b/NzbDrone.Core/Parser.cs @@ -19,10 +19,11 @@ public static class Parser new Regex(@"^(?.*?)?(?:\W?S?(?<season>\d{1,2}(?!\d+))(?:(?:\-|\.|[ex]|\s|\sto\s){1,2}(?<episode>\d{1,2}(?!\d+)))+)+\W?(?!\\)", RegexOptions.IgnoreCase | RegexOptions.Compiled), new Regex(@"^(?<title>.+?)?\W?(?:\W(?<season>\d+)(?<episode>\d{2}))+\W?(?!\\)", - RegexOptions.IgnoreCase | RegexOptions.Compiled), - //Supports 103/113 naming + RegexOptions.IgnoreCase | RegexOptions.Compiled), //Supports 103/113 naming new Regex(@"^(?<title>.*?)?(?:\W?S?(?<season>\d{1,2}(?!\d+))(?:(?:\-|\.|[ex]|\s|to)+(?<episode>\d+))+)+\W?(?!\\)", - RegexOptions.IgnoreCase | RegexOptions.Compiled) + RegexOptions.IgnoreCase | RegexOptions.Compiled), + new Regex(@"^(?<title>.*?)\W(?:S|Season\W?)?(?<season>\d{1,2}(?!\d+))+\W?(?!\\)", + RegexOptions.IgnoreCase | RegexOptions.Compiled) //Supports Season only releases }; private static readonly Regex[] SeasonReportTitleRegex = new[] @@ -75,13 +76,18 @@ internal static EpisodeParseResult ParseEpisodeInfo(string title) foreach (Match matchGroup in match) { - var count = matchGroup.Groups["episode"].Captures.Count; - var first = Convert.ToInt32(matchGroup.Groups["episode"].Captures[0].Value); - var last = Convert.ToInt32(matchGroup.Groups["episode"].Captures[count - 1].Value); - - for (int i = first; i <= last; i++) - { - parsedEpisode.Episodes.Add(i); + var count = matchGroup.Groups["episode"].Captures.Count; + + //Allows use to return a list of 0 episodes (We can handle that as a full season release) + if (count > 0) + { + var first = Convert.ToInt32(matchGroup.Groups["episode"].Captures[0].Value); + var last = Convert.ToInt32(matchGroup.Groups["episode"].Captures[count - 1].Value); + + for (int i = first; i <= last; i++) + { + parsedEpisode.Episodes.Add(i); + } } } }