Browse Source

Make season paths case-insensitive (#15102)

theguymadmax 4 days ago
parent
commit
305b0fdca3

+ 3 - 3
Emby.Naming/TV/SeasonPathParser.cs

@@ -10,10 +10,10 @@ namespace Emby.Naming.TV
     /// </summary>
     public static partial class SeasonPathParser
     {
-        [GeneratedRegex(@"^\s*((?<seasonnumber>(?>\d+))(?:st|nd|rd|th|\.)*(?!\s*[Ee]\d+))\s*(?:[[시즌]*|[シーズン]*|[sS](?:eason|æson|aison|taffel|eries|tagione|äsong|eizoen|easong|ezon|ezona|ezóna|ezonul)*|[tT](?:emporada)*|[kK](?:ausi)*|[Сс](?:езон)*)\s*(?<rightpart>.*)$")]
+        [GeneratedRegex(@"^\s*((?<seasonnumber>(?>\d+))(?:st|nd|rd|th|\.)*(?!\s*[Ee]\d+))\s*(?:[[시즌]*|[シーズン]*|[sS](?:eason|æson|aison|taffel|eries|tagione|äsong|eizoen|easong|ezon|ezona|ezóna|ezonul)*|[tT](?:emporada)*|[kK](?:ausi)*|[Сс](?:езон)*)\s*(?<rightpart>.*)$", RegexOptions.IgnoreCase)]
         private static partial Regex ProcessPre();
 
-        [GeneratedRegex(@"^\s*(?:[[시즌]*|[シーズン]*|[sS](?:eason|æson|aison|taffel|eries|tagione|äsong|eizoen|easong|ezon|ezona|ezóna|ezonul)*|[tT](?:emporada)*|[kK](?:ausi)*|[Сс](?:езон)*)\s*(?<seasonnumber>(?>\d+)(?!\s*[Ee]\d+))(?<rightpart>.*)$")]
+        [GeneratedRegex(@"^\s*(?:[[시즌]*|[シーズン]*|[sS](?:eason|æson|aison|taffel|eries|tagione|äsong|eizoen|easong|ezon|ezona|ezóna|ezonul)*|[tT](?:emporada)*|[kK](?:ausi)*|[Сс](?:езон)*)\s*(?<seasonnumber>(?>\d+)(?!\s*[Ee]\d+))(?<rightpart>.*)$", RegexOptions.IgnoreCase)]
         private static partial Regex ProcessPost();
 
         /// <summary>
@@ -86,7 +86,7 @@ namespace Emby.Naming.TV
                 }
             }
 
-            if (filename.StartsWith('s'))
+            if (filename.Length > 0 && (filename[0] == 'S' || filename[0] == 's'))
             {
                 var testFilename = filename.AsSpan()[1..];
 

+ 18 - 0
tests/Jellyfin.Naming.Tests/TV/SeasonPathParserTests.cs

@@ -7,23 +7,38 @@ public class SeasonPathParserTests
 {
     [Theory]
     [InlineData("/Drive/Season 1", "/Drive", 1, true)]
+    [InlineData("/Drive/SEASON 1", "/Drive", 1, true)]
     [InlineData("/Drive/Staffel 1", "/Drive", 1, true)]
+    [InlineData("/Drive/STAFFEL 1", "/Drive", 1, true)]
     [InlineData("/Drive/Stagione 1", "/Drive", 1, true)]
+    [InlineData("/Drive/STAGIONE 1", "/Drive", 1, true)]
     [InlineData("/Drive/sæson 1", "/Drive", 1, true)]
+    [InlineData("/Drive/SÆSON 1", "/Drive", 1, true)]
     [InlineData("/Drive/Temporada 1", "/Drive", 1, true)]
+    [InlineData("/Drive/TEMPORADA 1", "/Drive", 1, true)]
     [InlineData("/Drive/series 1", "/Drive", 1, true)]
+    [InlineData("/Drive/SERIES 1", "/Drive", 1, true)]
     [InlineData("/Drive/Kausi 1", "/Drive", 1, true)]
+    [InlineData("/Drive/KAUSI 1", "/Drive", 1, true)]
     [InlineData("/Drive/Säsong 1", "/Drive", 1, true)]
+    [InlineData("/Drive/SÄSONG 1", "/Drive", 1, true)]
     [InlineData("/Drive/Seizoen 1", "/Drive", 1, true)]
+    [InlineData("/Drive/SEIZOEN 1", "/Drive", 1, true)]
     [InlineData("/Drive/Seasong 1", "/Drive", 1, true)]
+    [InlineData("/Drive/SEASONG 1", "/Drive", 1, true)]
     [InlineData("/Drive/Sezon 1", "/Drive", 1, true)]
+    [InlineData("/Drive/SEZON 1", "/Drive", 1, true)]
     [InlineData("/Drive/sezona 1", "/Drive", 1, true)]
+    [InlineData("/Drive/SEZONA 1", "/Drive", 1, true)]
     [InlineData("/Drive/sezóna 1", "/Drive", 1, true)]
+    [InlineData("/Drive/SEZÓNA 1", "/Drive", 1, true)]
     [InlineData("/Drive/Sezonul 1", "/Drive", 1, true)]
+    [InlineData("/Drive/SEZONUL 1", "/Drive", 1, true)]
     [InlineData("/Drive/시즌 1", "/Drive", 1, true)]
     [InlineData("/Drive/シーズン 1", "/Drive", 1, true)]
     [InlineData("/Drive/сезон 1", "/Drive", 1, true)]
     [InlineData("/Drive/Сезон 1", "/Drive", 1, true)]
+    [InlineData("/Drive/СЕЗОН 1", "/Drive", 1, true)]
     [InlineData("/Drive/Season 10", "/Drive", 10, true)]
     [InlineData("/Drive/Season 100", "/Drive", 100, true)]
     [InlineData("/Drive/s1", "/Drive", 1, true)]
@@ -46,8 +61,11 @@ public class SeasonPathParserTests
     [InlineData("/Drive/s06e05", "/Drive", null, false)]
     [InlineData("/Drive/The.Legend.of.Condor.Heroes.2017.V2.web-dl.1080p.h264.aac-hdctv", "/Drive", null, false)]
     [InlineData("/Drive/extras", "/Drive", 0, true)]
+    [InlineData("/Drive/EXTRAS", "/Drive", 0, true)]
     [InlineData("/Drive/specials", "/Drive", 0, true)]
+    [InlineData("/Drive/SPECIALS", "/Drive", 0, true)]
     [InlineData("/Drive/Episode 1 Season 2", "/Drive", null, false)]
+    [InlineData("/Drive/Episode 1 SEASON 2", "/Drive", null, false)]
     public void GetSeasonNumberFromPathTest(string path, string? parentPath, int? seasonNumber, bool isSeasonDirectory)
     {
         var result = SeasonPathParser.Parse(path, parentPath, true, true);