2
0
cvium 4 жил өмнө
parent
commit
025e351f61

+ 1 - 1
Emby.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs

@@ -42,7 +42,7 @@ namespace Emby.Server.Implementations.Library.Resolvers
         /// <param name="args">The args.</param>
         /// <param name="parseName">if set to <c>true</c> [parse name].</param>
         /// <returns>``0.</returns>
-        protected TVideoType ResolveVideo<TVideoType>(ItemResolveArgs args, bool parseName)
+        protected virtual TVideoType ResolveVideo<TVideoType>(ItemResolveArgs args, bool parseName)
               where TVideoType : Video, new()
         {
             var namingOptions = ((LibraryManager)LibraryManager).GetNamingOptions();

+ 10 - 10
Emby.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs

@@ -12,6 +12,15 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV
     /// </summary>
     public class EpisodeResolver : BaseVideoResolver<Episode>
     {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="EpisodeResolver"/> class.
+        /// </summary>
+        /// <param name="libraryManager">The library manager.</param>
+        public EpisodeResolver(ILibraryManager libraryManager)
+            : base(libraryManager)
+        {
+        }
+
         /// <summary>
         /// Resolves the specified args.
         /// </summary>
@@ -40,7 +49,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV
             if ((season != null ||
                  string.Equals(args.GetCollectionType(), CollectionType.TvShows, StringComparison.OrdinalIgnoreCase) ||
                  args.HasParent<Series>())
-                && !BaseItem.AllExtrasTypesFolderNames.Contains(parent.Name, StringComparer.OrdinalIgnoreCase))
+                && (parent is Series || !BaseItem.AllExtrasTypesFolderNames.Contains(parent.Name, StringComparer.OrdinalIgnoreCase)))
             {
                 var episode = ResolveVideo<Episode>(args, false);
 
@@ -76,14 +85,5 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV
 
             return null;
         }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="EpisodeResolver"/> class.
-        /// </summary>
-        /// <param name="libraryManager">The library manager.</param>
-        public EpisodeResolver(ILibraryManager libraryManager)
-            : base(libraryManager)
-        {
-        }
     }
 }

+ 65 - 0
tests/Jellyfin.Server.Implementations.Tests/Library/EpisodeResolverTest.cs

@@ -0,0 +1,65 @@
+using System;
+using Emby.Server.Implementations.Library.Resolvers.TV;
+using MediaBrowser.Controller;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Entities;
+using Moq;
+using Xunit;
+
+namespace Jellyfin.Server.Implementations.Tests.Library
+{
+    public class EpisodeResolverTest
+    {
+        [Fact]
+        public void Resolve_GivenVideoInExtrasFolder_DoesNotResolveToEpisode()
+        {
+            var season = new Season { Name = "Season 1" };
+            var parent = new Folder { Name = "extras" };
+            var libraryManagerMock = new Mock<ILibraryManager>();
+            libraryManagerMock.Setup(x => x.GetItemById(It.IsAny<Guid>())).Returns(season);
+
+            var episodeResolver = new EpisodeResolver(libraryManagerMock.Object);
+            var itemResolveArgs = new ItemResolveArgs(
+                Mock.Of<IServerApplicationPaths>(),
+                Mock.Of<IDirectoryService>())
+            {
+                Parent = parent,
+                CollectionType = CollectionType.TvShows,
+                Path = "All My Children/Season 01/Extras/All My Children S01E01 - Behind The Scenes.mkv"
+            };
+
+            Assert.Null(episodeResolver.Resolve(itemResolveArgs));
+        }
+
+        [Fact]
+        public void Resolve_GivenVideoInExtrasSeriesFolder_ResolvesToEpisode()
+        {
+            var series = new Series { Name = "Extras" };
+
+            // Have to create a mock because of moq proxies not being castable to a concrete implementation
+            // https://github.com/jellyfin/jellyfin/blob/ab0cff8556403e123642dc9717ba778329554634/Emby.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs#L48
+            var episodeResolver = new EpisodeResolverMock(Mock.Of<ILibraryManager>());
+            var itemResolveArgs = new ItemResolveArgs(
+                Mock.Of<IServerApplicationPaths>(),
+                Mock.Of<IDirectoryService>())
+            {
+                Parent = series,
+                CollectionType = CollectionType.TvShows,
+                Path = "Extras/Extras S01E01.mkv"
+            };
+            Assert.NotNull(episodeResolver.Resolve(itemResolveArgs));
+        }
+
+        private class EpisodeResolverMock : EpisodeResolver
+        {
+            public EpisodeResolverMock(ILibraryManager libraryManager) : base(libraryManager)
+            {
+            }
+
+            protected override TVideoType ResolveVideo<TVideoType>(ItemResolveArgs args, bool parseName) => new ();
+        }
+    }
+}