diff --git a/CHANGELOG.md b/CHANGELOG.md index 23e35b9b..f2edba51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,6 +62,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - This allows these movies to appear in the Trash where they can be deleted - Fix synchronizing trakt lists from users with special characters in their username - Note that these lists MUST be added as URLs; the short-form `user/list` will NOT work with special characters +- Fix local subtitle scanner to detect non-lowercase extensions (e.g. `Movie (2000).EN.SRT`) ### Changed - Remove some unnecessary API calls related to media server scanning and paging diff --git a/ErsatzTV.Scanner.Tests/Core/Metadata/LocalSubtitlesProviderTests.cs b/ErsatzTV.Scanner.Tests/Core/Metadata/LocalSubtitlesProviderTests.cs index 3cf436ae..1a90bdf3 100644 --- a/ErsatzTV.Scanner.Tests/Core/Metadata/LocalSubtitlesProviderTests.cs +++ b/ErsatzTV.Scanner.Tests/Core/Metadata/LocalSubtitlesProviderTests.cs @@ -41,7 +41,9 @@ public class LocalSubtitlesProviderTests new(@"/Movies/Avatar (2009)/Avatar (2009).en.forced.ass"), new(@"/Movies/Avatar (2009)/Avatar (2009).en.sdh.srt"), new(@"/Movies/Avatar (2009)/Avatar (2009).de.srt"), - new(@"/Movies/Avatar (2009)/Avatar (2009).de.sdh.forced.srt") + + // non-uniform (lower-case) extensions should also work + new(@"/Movies/Avatar (2009)/Avatar (2009).DE.SDH.FORCED.SRT") }; var provider = new LocalSubtitlesProvider( @@ -84,7 +86,9 @@ public class LocalSubtitlesProviderTests new(@"/Movies/Avatar (2009)/Avatar (2009).en.sdh.srt"), new(@"/Movies/Avatar (2009)/Avatar (2009).sdh.en.srt"), new(@"/Movies/Avatar (2009)/Avatar (2009).de.srt"), - new(@"/Movies/Avatar (2009)/Avatar (2009).de.sdh.forced.srt") + + // non-uniform (lower-case) extensions should also work + new(@"/Movies/Avatar (2009)/Avatar (2009).DE.SDH.FORCED.SRT") }; var provider = new LocalSubtitlesProvider( diff --git a/ErsatzTV.Scanner/Core/Metadata/LocalSubtitlesProvider.cs b/ErsatzTV.Scanner/Core/Metadata/LocalSubtitlesProvider.cs index a3f59347..d0dc7a1b 100644 --- a/ErsatzTV.Scanner/Core/Metadata/LocalSubtitlesProvider.cs +++ b/ErsatzTV.Scanner/Core/Metadata/LocalSubtitlesProvider.cs @@ -108,13 +108,15 @@ public class LocalSubtitlesProvider : ILocalSubtitlesProvider string withoutExtension = Path.GetFileNameWithoutExtension(mediaItemPath); foreach (string file in _localFileSystem.ListFiles(folder, $"{withoutExtension}*")) { + string lowerFile = file.ToLowerInvariant(); + string fileName = Path.GetFileName(file); if (!fileName.StartsWith(withoutExtension, StringComparison.OrdinalIgnoreCase)) { continue; } - string extension = Path.GetExtension(file); + string extension = Path.GetExtension(lowerFile); string codec = extension switch { ".ssa" or ".ass" => "ass", @@ -128,30 +130,32 @@ public class LocalSubtitlesProvider : ILocalSubtitlesProvider continue; } - string language = fileName; + string language = Path.GetFileName(lowerFile); var forced = false; var sdh = false; - if (file.Contains(".forced.")) + if (lowerFile.Contains(".forced.")) { forced = true; language = language.Replace(".forced", string.Empty); } - if (file.Contains(".sdh")) + if (lowerFile.Contains(".sdh")) { sdh = true; language = language.Replace(".sdh", string.Empty); } - if (file.Contains(".cc.")) + if (lowerFile.Contains(".cc.")) { sdh = true; language = language.Replace(".cc", string.Empty); } - language = language.Replace($"{withoutExtension}.", string.Empty)[..3].Replace(".", string.Empty); + language = language + .Replace($"{withoutExtension.ToLowerInvariant()}.", string.Empty)[..3] + .Replace(".", string.Empty); Option<CultureInfo> maybeCulture = languageCodes.Find( ci => ci.TwoLetterISOLanguageName == language || ci.ThreeLetterISOLanguageName == language);