diff --git a/src/NzbDrone.Core.Test/ParserTests/LanguageParserFixture.cs b/src/NzbDrone.Core.Test/ParserTests/LanguageParserFixture.cs index f4429af0f..2a5d99262 100644 --- a/src/NzbDrone.Core.Test/ParserTests/LanguageParserFixture.cs +++ b/src/NzbDrone.Core.Test/ParserTests/LanguageParserFixture.cs @@ -213,5 +213,13 @@ namespace NzbDrone.Core.Test.ParserTests result.Language.Id.Should().Be(Language.Czech.Id); } + + [TestCase("Russian.Puppets.S01E07.Cold.Action.HDTV.XviD-Droned")] + public void should_not_parse_series_or_episode_title(string postTitle) + { + var result = Parser.Parser.ParseTitle(postTitle); + result.Language.Name.Should().Be(Language.English.Name); + } + } } diff --git a/src/NzbDrone.Core/Parser/LanguageParser.cs b/src/NzbDrone.Core/Parser/LanguageParser.cs index c751d1523..35db62d0d 100644 --- a/src/NzbDrone.Core/Parser/LanguageParser.cs +++ b/src/NzbDrone.Core/Parser/LanguageParser.cs @@ -12,6 +12,11 @@ namespace NzbDrone.Core.Parser { private static readonly Logger Logger = NzbDroneLogger.GetLogger(typeof(LanguageParser)); + private static readonly RegexReplace[] CleanSeriesTitleRegex = new[] + { + new RegexReplace(@".*?\.(S\d{2}E\d{2,4}\..*)", "$1", RegexOptions.Compiled | RegexOptions.IgnoreCase) + }; + private static readonly Regex LanguageRegex = new Regex(@"(?:\W|_)(?\b(?:ita|italian)\b)|(?german\b|videomann)|(?flemish)|(?greek)|(?(?:\W|_)(?:FR|VOSTFR)(?:\W|_))|(?\brus\b)|(?nl\W?subs?)|(?\b(?:HUNDUB|HUN)\b)|(?\bHebDub\b)", RegexOptions.IgnoreCase | RegexOptions.Compiled); @@ -23,6 +28,12 @@ namespace NzbDrone.Core.Parser public static Language ParseLanguage(string title) { + foreach (var regex in CleanSeriesTitleRegex) + { + if (regex.TryReplace(ref title)) + break; + } + var lowerTitle = title.ToLower(); if (lowerTitle.Contains("english")) diff --git a/src/NzbDrone.Core/Parser/RegexReplace.cs b/src/NzbDrone.Core/Parser/RegexReplace.cs index 04ddbc7cc..f4a10db23 100644 --- a/src/NzbDrone.Core/Parser/RegexReplace.cs +++ b/src/NzbDrone.Core/Parser/RegexReplace.cs @@ -22,5 +22,12 @@ namespace NzbDrone.Core.Parser { return _regex.Replace(input, _replacement); } + + public bool TryReplace(ref string input) + { + var result = _regex.IsMatch(input); + input = _regex.Replace(input, _replacement); + return result; + } } }