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);