diff options
7 files changed, 54 insertions, 36 deletions
diff --git a/Emby.Naming/Common/NamingOptions.cs b/Emby.Naming/Common/NamingOptions.cs index e8c855b5a..eb211050f 100644 --- a/Emby.Naming/Common/NamingOptions.cs +++ b/Emby.Naming/Common/NamingOptions.cs @@ -591,6 +591,10 @@ namespace Emby.Naming.Common MediaType.Video) }; + AllExtrasTypesFolderNames = VideoExtraRules + .Where(i => i.RuleType == ExtraRuleType.DirectoryName) + .ToDictionary(i => i.Token, i => i.ExtraType, StringComparer.OrdinalIgnoreCase); + Format3DRules = new[] { // Kodi rules: @@ -679,6 +683,10 @@ namespace Emby.Naming.Common ".mxf" }); + VideoFileExtensions = extensions + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToArray(); + MultipleEpisodeExpressions = new[] { @".*(\\|\/)[sS]?(?<seasonnumber>[0-9]{1,4})[xX](?<epnumber>[0-9]{1,3})((-| - )[0-9]{1,4}[eExX](?<endingepnumber>[0-9]{1,3}))+[^\\\/]*$", @@ -696,25 +704,6 @@ namespace Emby.Naming.Common IsNamed = true }).ToArray(); - VideoFileExtensions = extensions - .Distinct(StringComparer.OrdinalIgnoreCase) - .ToArray(); - - AllExtrasTypesFolderNames = new Dictionary<string, ExtraType>(StringComparer.OrdinalIgnoreCase) - { - ["trailers"] = ExtraType.Trailer, - ["theme-music"] = ExtraType.ThemeSong, - ["backdrops"] = ExtraType.ThemeVideo, - ["extras"] = ExtraType.Unknown, - ["behind the scenes"] = ExtraType.BehindTheScenes, - ["deleted scenes"] = ExtraType.DeletedScene, - ["interviews"] = ExtraType.Interview, - ["scenes"] = ExtraType.Scene, - ["samples"] = ExtraType.Sample, - ["shorts"] = ExtraType.Clip, - ["featurettes"] = ExtraType.Clip - }; - Compile(); } diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs index 7ba34e74a..88d9303a5 100644 --- a/Emby.Server.Implementations/Dto/DtoService.cs +++ b/Emby.Server.Implementations/Dto/DtoService.cs @@ -1102,12 +1102,13 @@ namespace Emby.Server.Implementations.Dto if (options.ContainsField(ItemFields.LocalTrailerCount)) { - allExtras ??= item.GetExtras().ToArray(); - dto.LocalTrailerCount = allExtras.Count(i => i.ExtraType == ExtraType.Trailer); - if (item is IHasTrailers hasTrailers) { - dto.LocalTrailerCount += hasTrailers.GetTrailerCount(); + dto.LocalTrailerCount = hasTrailers.GetTrailerCount(); + } + else + { + dto.LocalTrailerCount = (allExtras ?? item.GetExtras()).Count(i => i.ExtraType == ExtraType.Trailer); } } diff --git a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index 1a9295dc8..122e9654a 100644 --- a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -128,10 +128,9 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies return movie?.ExtraType == null ? movie : null; } - // Owned items will be caught by the video extra resolver if (args.Parent == null) { - return null; + return base.Resolve(args); } if (IsInvalid(args.Parent, collectionType)) diff --git a/Emby.Server.Implementations/Localization/Core/cs.json b/Emby.Server.Implementations/Localization/Core/cs.json index 25f51db16..65a31e676 100644 --- a/Emby.Server.Implementations/Localization/Core/cs.json +++ b/Emby.Server.Implementations/Localization/Core/cs.json @@ -23,7 +23,7 @@ "HeaderFavoriteShows": "Oblíbené seriály", "HeaderFavoriteSongs": "Oblíbená hudba", "HeaderLiveTV": "Televize", - "HeaderNextUp": "Nadcházející", + "HeaderNextUp": "Další díly", "HeaderRecordingGroups": "Skupiny nahrávek", "HomeVideos": "Domácí videa", "Inherit": "Zdědit", diff --git a/Jellyfin.Api/Controllers/UserLibraryController.cs b/Jellyfin.Api/Controllers/UserLibraryController.cs index 8b99170d9..90cb4a74a 100644 --- a/Jellyfin.Api/Controllers/UserLibraryController.cs +++ b/Jellyfin.Api/Controllers/UserLibraryController.cs @@ -206,21 +206,16 @@ namespace Jellyfin.Api.Controllers : _libraryManager.GetItemById(itemId); var dtoOptions = new DtoOptions().AddClientFields(Request); - var dtosExtras = item.GetExtras(new[] { ExtraType.Trailer }) - .Select(i => _dtoService.GetBaseItemDto(i, dtoOptions, user, item)) - .ToArray(); if (item is IHasTrailers hasTrailers) { var trailers = hasTrailers.LocalTrailers; - var dtosTrailers = _dtoService.GetBaseItemDtos(trailers, dtoOptions, user, item); - var allTrailers = new BaseItemDto[dtosExtras.Length + dtosTrailers.Count]; - dtosExtras.CopyTo(allTrailers, 0); - dtosTrailers.CopyTo(allTrailers, dtosExtras.Length); - return allTrailers; + return Ok(_dtoService.GetBaseItemDtos(trailers, dtoOptions, user, item)); } - return dtosExtras; + return Ok(item.GetExtras() + .Where(e => e.ExtraType == ExtraType.Trailer) + .Select(i => _dtoService.GetBaseItemDto(i, dtoOptions, user, item))); } /// <summary> diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieProvider.cs b/MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieProvider.cs index e4a56fde9..f14f31858 100644 --- a/MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieProvider.cs +++ b/MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieProvider.cs @@ -312,7 +312,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies var trailers = new List<MediaUrl>(); for (var i = 0; i < movieResult.Videos.Results.Count; i++) { - var video = movieResult.Videos.Results[0]; + var video = movieResult.Videos.Results[i]; if (!TmdbUtils.IsTrailerType(video)) { continue; diff --git a/tests/Jellyfin.Server.Implementations.Tests/Library/MovieResolverTests.cs b/tests/Jellyfin.Server.Implementations.Tests/Library/MovieResolverTests.cs new file mode 100644 index 000000000..f2efcddba --- /dev/null +++ b/tests/Jellyfin.Server.Implementations.Tests/Library/MovieResolverTests.cs @@ -0,0 +1,34 @@ +using Emby.Naming.Common; +using Emby.Server.Implementations.Library.Resolvers.Movies; +using MediaBrowser.Controller; +using MediaBrowser.Controller.Drawing; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.IO; +using Moq; +using Xunit; + +namespace Jellyfin.Server.Implementations.Tests.Library; + +public class MovieResolverTests +{ + private static readonly NamingOptions _namingOptions = new(); + + [Fact] + public void Resolve_GivenLocalAlternateVersion_ResolvesToVideo() + { + var movieResolver = new MovieResolver(Mock.Of<IImageProcessor>(), _namingOptions); + var itemResolveArgs = new ItemResolveArgs( + Mock.Of<IServerApplicationPaths>(), + Mock.Of<IDirectoryService>()) + { + Parent = null, + FileInfo = new FileSystemMetadata + { + FullName = "/movies/Black Panther (2018)/Black Panther (2018) - 1080p 3D.mk3d" + } + }; + + Assert.NotNull(movieResolver.Resolve(itemResolveArgs)); + } +} |
