From 4b391403af661c7480ffecf72555c5081de8ccbe Mon Sep 17 00:00:00 2001 From: Rijul-A <31570722+Rijul-A@users.noreply.github.com> Date: Thu, 14 May 2026 18:59:41 +0000 Subject: [PATCH 1/2] fix: resolve as movie if movie.nfo in lib If a folder is found in a library of content type `Movie` and a `movie.nfo` exists, the folder should resolve as a movie content item and not just a folder item --- .../Library/Resolvers/Movies/MovieResolver.cs | 13 ++++++++++ .../Library/MovieResolverTests.cs | 26 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index 98e8f5350b..ec6b36a340 100644 --- a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -482,6 +482,19 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies { return GetMultiDiscMovie(multiDiscFolders, directoryService); } + else if (result.Items.Count == 0 && (collectionType == CollectionType.movies || collectionType is null)) + { + if (fileSystemEntries.Any(i => string.Equals(i.Name, "movie.nfo", StringComparison.OrdinalIgnoreCase))) + { + return new T + { + Path = path, + Name = Path.GetFileName(path), + IsVirtualItem = true, + IsPlaceHolder = true + }; + } + } return null; } diff --git a/tests/Jellyfin.Server.Implementations.Tests/Library/MovieResolverTests.cs b/tests/Jellyfin.Server.Implementations.Tests/Library/MovieResolverTests.cs index aed584355c..82dae95783 100644 --- a/tests/Jellyfin.Server.Implementations.Tests/Library/MovieResolverTests.cs +++ b/tests/Jellyfin.Server.Implementations.Tests/Library/MovieResolverTests.cs @@ -32,4 +32,30 @@ public class MovieResolverTests Assert.NotNull(movieResolver.Resolve(itemResolveArgs)); } + + [Fact] + public void Resolve_MetadataOnlyFolder_ResolvesToMovie() + { + var movieResolver = new MovieResolver(Mock.Of(), Mock.Of>(), _namingOptions, Mock.Of()); + var itemResolveArgs = new ItemResolveArgs( + Mock.Of(), + null) + { + Parent = new MediaBrowser.Controller.Entities.Folder(), + FileInfo = new FileSystemMetadata + { + FullName = "/movies/Upcoming Movie", + IsDirectory = true + }, + FileSystemChildren = [ + new FileSystemMetadata { Name = "movie.nfo", FullName = "/movies/Upcoming Movie/movie.nfo" }, + new FileSystemMetadata { Name = "poster.jpg", FullName = "/movies/Upcoming Movie/poster.jpg" } + ] + }; + + var result = movieResolver.Resolve(itemResolveArgs); + Assert.NotNull(result); + Assert.True(result.IsVirtualItem); + Assert.True(result.IsPlaceHolder); + } } From baf9c8760352f2318c4f82b2fbd0b1f94acbc04c Mon Sep 17 00:00:00 2001 From: Rijul-A <31570722+Rijul-A@users.noreply.github.com> Date: Thu, 14 May 2026 19:30:36 +0000 Subject: [PATCH 2/2] fix: sonarcloud --- .../Library/Resolvers/Movies/MovieResolver.cs | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index ec6b36a340..1a44f0f071 100644 --- a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -482,18 +482,18 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies { return GetMultiDiscMovie(multiDiscFolders, directoryService); } - else if (result.Items.Count == 0 && (collectionType == CollectionType.movies || collectionType is null)) + else if ( + result.Items.Count == 0 && + (collectionType == CollectionType.movies || collectionType is null) && + fileSystemEntries.Any(i => string.Equals(i.Name, "movie.nfo", StringComparison.OrdinalIgnoreCase))) { - if (fileSystemEntries.Any(i => string.Equals(i.Name, "movie.nfo", StringComparison.OrdinalIgnoreCase))) + return new T { - return new T - { - Path = path, - Name = Path.GetFileName(path), - IsVirtualItem = true, - IsPlaceHolder = true - }; - } + Path = path, + Name = Path.GetFileName(path), + IsVirtualItem = true, + IsPlaceHolder = true + }; } return null;