diff --git a/src/NzbDrone.Core.Test/ParserTests/LanguageParserFixture.cs b/src/NzbDrone.Core.Test/ParserTests/LanguageParserFixture.cs index eec79002b1..1267fd9ed6 100644 --- a/src/NzbDrone.Core.Test/ParserTests/LanguageParserFixture.cs +++ b/src/NzbDrone.Core.Test/ParserTests/LanguageParserFixture.cs @@ -70,6 +70,10 @@ public void should_parse_language(string postTitle, params Language[] languages) [TestCase("2 Broke Girls - S01E01 - Pilot.sub", Language.Unknown)] [TestCase("2 Broke Girls - S01E01 - Pilot.eng.forced.sub", Language.English)] [TestCase("2 Broke Girls - S01E01 - Pilot-eng-forced.sub", Language.English)] + [TestCase("2_Eng.srt", Language.English)] + [TestCase("3_English.srt", Language.English)] + [TestCase("Title.2000.1080p.BluRay.H264.AAC-RARBG.idx", Language.Unknown)] + [TestCase("Title.2000.1080p.BluRay.H264.AAC-RARBG.sub", Language.Unknown)] public void should_parse_subtitle_language(string fileName, Language language) { var result = LanguageParser.ParseSubtitleLanguage(fileName); diff --git a/src/NzbDrone.Core/Extras/ExtraService.cs b/src/NzbDrone.Core/Extras/ExtraService.cs index aedb233dd3..59d0070718 100644 --- a/src/NzbDrone.Core/Extras/ExtraService.cs +++ b/src/NzbDrone.Core/Extras/ExtraService.cs @@ -66,15 +66,13 @@ public void ImportExtraFiles(LocalMovie localMovie, MovieFile movieFile, bool is var sourcePath = localMovie.Path; var sourceFolder = _diskProvider.GetParentFolder(sourcePath); var sourceFileName = Path.GetFileNameWithoutExtension(sourcePath); - var files = _diskProvider.GetFiles(sourceFolder, SearchOption.TopDirectoryOnly); + var files = _diskProvider.GetFiles(sourceFolder, SearchOption.AllDirectories).OrderByDescending(d => d).ToArray(); var wantedExtensions = _configService.ExtraFileExtensions.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .Select(e => e.Trim(' ', '.')) .ToList(); - var matchingFilenames = files.Where(f => Path.GetFileNameWithoutExtension(f).StartsWith(sourceFileName, StringComparison.InvariantCultureIgnoreCase)); - - foreach (var matchingFilename in matchingFilenames) + foreach (var matchingFilename in files) { var matchingExtension = wantedExtensions.FirstOrDefault(e => matchingFilename.EndsWith(e)); diff --git a/src/NzbDrone.Core/Extras/Subtitles/SubtitleService.cs b/src/NzbDrone.Core/Extras/Subtitles/SubtitleService.cs index d37a1d226d..a0915c7e90 100644 --- a/src/NzbDrone.Core/Extras/Subtitles/SubtitleService.cs +++ b/src/NzbDrone.Core/Extras/Subtitles/SubtitleService.cs @@ -88,11 +88,22 @@ public override ExtraFile Import(Movie movie, MovieFile movieFile, string path, if (SubtitleFileExtensions.Extensions.Contains(Path.GetExtension(path))) { var language = LanguageParser.ParseSubtitleLanguage(path); - var suffix = GetSuffix(language, 1, false); - var subtitleFile = ImportFile(movie, movieFile, path, readOnly, extension, suffix); - subtitleFile.Language = language; + var subtitleFiles = _subtitleFileService.GetFilesByMovie(movie.Id); + var existingSrtSubs = subtitleFiles.Where(m => m.MovieFileId == movieFile.Id) + .Where(m => m.Language == language) + .Where(m => m.Extension == extension); - _subtitleFileService.Upsert(subtitleFile); + var suffix = GetSuffix(language, existingSrtSubs.Count() + 1, extension.EqualsIgnoreCase(".srt")); + var subtitleFile = new SubtitleFile(); + + if ((extension.EqualsIgnoreCase(".srt") && language != Language.Unknown) || + !extension.EqualsIgnoreCase(".srt")) + { + subtitleFile = ImportFile(movie, movieFile, path, readOnly, extension, suffix); + subtitleFile.Language = language; + + _subtitleFileService.Upsert(subtitleFile); + } return subtitleFile; } diff --git a/src/NzbDrone.Core/Parser/LanguageParser.cs b/src/NzbDrone.Core/Parser/LanguageParser.cs index 68af72c2f8..c3f1b72241 100644 --- a/src/NzbDrone.Core/Parser/LanguageParser.cs +++ b/src/NzbDrone.Core/Parser/LanguageParser.cs @@ -15,9 +15,8 @@ public static class LanguageParser private static readonly Regex LanguageRegex = new Regex(@"(?:\W|_|^)(?\b(?:ita|italian)\b)|(?german\b|videomann)|(?flemish)|(?greek)|(?(?:\W|_)(?:FR|VOSTFR|VO|VFF|VFQ|VF2|TRUEFRENCH)(?:\W|_))|(?\brus\b)|(?nl\W?subs?)|(?\b(?:HUNDUB|HUN)\b)|(?\bHebDub\b)|(?\b(?:CZ|SK)\b)|(?\bukr\b)", RegexOptions.IgnoreCase | RegexOptions.Compiled); - private static readonly Regex SubtitleLanguageRegex = new Regex(".+?[-_. ](?[a-z]{2,3})(?:[-_. ]forced)?$", RegexOptions.Compiled | RegexOptions.IgnoreCase); - + private static readonly Regex RarbgSubtitleLanguageRegex = new Regex("^[0-9]{1,2}_(?[A-Za-z]{2,3}).*$", RegexOptions.Compiled | RegexOptions.IgnoreCase); public static List ParseLanguages(string title) { var lowerTitle = title.ToLower(); @@ -153,13 +152,19 @@ public static Language ParseSubtitleLanguage(string fileName) var simpleFilename = Path.GetFileNameWithoutExtension(fileName); var languageMatch = SubtitleLanguageRegex.Match(simpleFilename); + + if (!languageMatch.Success) + { + languageMatch = RarbgSubtitleLanguageRegex.Match(simpleFilename); + } if (languageMatch.Success) { var isoCode = languageMatch.Groups["iso_code"].Value; - var isoLanguage = IsoLanguages.Find(isoCode); + var isoLanguage = IsoLanguages.Find(isoCode.ToLower()); - return isoLanguage?.Language ?? Language.Unknown; + Logger.Debug("Parsed language: {0}", isoLanguage?.Language ?? Language.Unknown); + return isoLanguage?.Language ?? Language.Unknown; } #if !LIBRARY Logger.Debug("Unable to parse langauge from subtitle file: {0}", fileName);