Browse Source

Fix alt version name generation

Instead of replacing all occurrences of the containing folder name, just check the start of the string.
This matches what happens in VideoListResolver.IsEligibleForMultiVersion
Fixes #12555
Bond_009 9 tháng trước cách đây
mục cha
commit
e1ac30ba17

+ 9 - 8
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -1180,28 +1180,29 @@ namespace MediaBrowser.Controller.Entities
             return info;
             return info;
         }
         }
 
 
-        private string GetMediaSourceName(BaseItem item)
+        internal string GetMediaSourceName(BaseItem item)
         {
         {
             var terms = new List<string>();
             var terms = new List<string>();
 
 
             var path = item.Path;
             var path = item.Path;
             if (item.IsFileProtocol && !string.IsNullOrEmpty(path))
             if (item.IsFileProtocol && !string.IsNullOrEmpty(path))
             {
             {
+                var displayName = System.IO.Path.GetFileNameWithoutExtension(path);
                 if (HasLocalAlternateVersions)
                 if (HasLocalAlternateVersions)
                 {
                 {
-                    var displayName = System.IO.Path.GetFileNameWithoutExtension(path)
-                        .Replace(System.IO.Path.GetFileName(ContainingFolderPath), string.Empty, StringComparison.OrdinalIgnoreCase)
-                        .TrimStart(new char[] { ' ', '-' });
-
-                    if (!string.IsNullOrEmpty(displayName))
+                    var containingFolderName = System.IO.Path.GetFileName(ContainingFolderPath);
+                    if (displayName.Length > containingFolderName.Length && displayName.StartsWith(containingFolderName, StringComparison.OrdinalIgnoreCase))
                     {
                     {
-                        terms.Add(displayName);
+                        var name = displayName.AsSpan(containingFolderName.Length).TrimStart([' ', '-']);
+                        if (!name.IsWhiteSpace())
+                        {
+                            terms.Add(name.ToString());
+                        }
                     }
                     }
                 }
                 }
 
 
                 if (terms.Count == 0)
                 if (terms.Count == 0)
                 {
                 {
-                    var displayName = System.IO.Path.GetFileNameWithoutExtension(path);
                     terms.Add(displayName);
                     terms.Add(displayName);
                 }
                 }
             }
             }

+ 29 - 0
tests/Jellyfin.Controller.Tests/Entities/BaseItemTests.cs

@@ -1,4 +1,7 @@
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Model.MediaInfo;
+using Moq;
 using Xunit;
 using Xunit;
 
 
 namespace Jellyfin.Controller.Tests.Entities;
 namespace Jellyfin.Controller.Tests.Entities;
@@ -14,4 +17,30 @@ public class BaseItemTests
     [InlineData("1test 2", "0000000001test 0000000002")]
     [InlineData("1test 2", "0000000001test 0000000002")]
     public void BaseItem_ModifySortChunks_Valid(string input, string expected)
     public void BaseItem_ModifySortChunks_Valid(string input, string expected)
         => Assert.Equal(expected, BaseItem.ModifySortChunks(input));
         => Assert.Equal(expected, BaseItem.ModifySortChunks(input));
+
+    [Theory]
+    [InlineData("/Movies/Ted/Ted.mp4", "/Movies/Ted/Ted - Unrated Edition.mp4", "Ted", "Unrated Edition")]
+    [InlineData("/Movies/Deadpool 2 (2018)/Deadpool 2 (2018).mkv", "/Movies/Deadpool 2 (2018)/Deadpool 2 (2018) - Super Duper Cut.mkv", "Deadpool 2 (2018)", "Super Duper Cut")]
+    public void GetMediaSourceName_Valid(string primaryPath, string altPath, string name, string altName)
+    {
+        var mediaSourceManager = new Mock<IMediaSourceManager>();
+        mediaSourceManager.Setup(x => x.GetPathProtocol(It.IsAny<string>()))
+                .Returns((string x) => MediaProtocol.File);
+        BaseItem.MediaSourceManager = mediaSourceManager.Object;
+
+        var video = new Video()
+        {
+            Path = primaryPath
+        };
+
+        var videoAlt = new Video()
+        {
+            Path = altPath,
+        };
+
+        video.LocalAlternateVersions = [videoAlt.Path];
+
+        Assert.Equal(name, video.GetMediaSourceName(video));
+        Assert.Equal(altName, video.GetMediaSourceName(videoAlt));
+    }
 }
 }