aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations
diff options
context:
space:
mode:
authorcvium <clausvium@gmail.com>2021-12-20 12:15:20 +0100
committercvium <clausvium@gmail.com>2021-12-20 12:15:20 +0100
commit83a94aa612f2451acc1e9ce7fcfc5c88b7989396 (patch)
tree584673e43c0cfa4ea4ae5182607bf0e770e60b90 /Emby.Server.Implementations
parentcd760943a9d554c560f35be2ee134969a224f92a (diff)
Fix extras folders
Diffstat (limited to 'Emby.Server.Implementations')
-rw-r--r--Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs18
-rw-r--r--Emby.Server.Implementations/Library/LibraryManager.cs67
-rw-r--r--Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs7
3 files changed, 67 insertions, 25 deletions
diff --git a/Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs b/Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
index 29758a078..e558fbe27 100644
--- a/Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
+++ b/Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
@@ -54,20 +54,10 @@ namespace Emby.Server.Implementations.Library
{
if (parent != null)
{
- // Ignore trailer folders but allow it at the collection level
- if (string.Equals(filename, BaseItem.TrailersFolderName, StringComparison.OrdinalIgnoreCase)
- && !(parent is AggregateFolder)
- && !(parent is UserRootFolder))
- {
- return true;
- }
-
- if (string.Equals(filename, BaseItem.ThemeVideosFolderName, StringComparison.OrdinalIgnoreCase))
- {
- return true;
- }
-
- if (string.Equals(filename, BaseItem.ThemeSongsFolderName, StringComparison.OrdinalIgnoreCase))
+ // Ignore extras folders but allow it at the collection level
+ if (_namingOptions.AllExtrasTypesFolderNames.ContainsKey(filename)
+ && parent is not AggregateFolder
+ && parent is not UserRootFolder)
{
return true;
}
diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs
index 8cc9a2fd5..224550f5f 100644
--- a/Emby.Server.Implementations/Library/LibraryManager.cs
+++ b/Emby.Server.Implementations/Library/LibraryManager.cs
@@ -531,8 +531,8 @@ namespace Emby.Server.Implementations.Library
return key.GetMD5();
}
- public BaseItem ResolvePath(FileSystemMetadata fileInfo, Folder parent = null)
- => ResolvePath(fileInfo, new DirectoryService(_fileSystem), null, parent);
+ public BaseItem ResolvePath(FileSystemMetadata fileInfo, Folder parent = null, IDirectoryService directoryService = null)
+ => ResolvePath(fileInfo, directoryService ?? new DirectoryService(_fileSystem), null, parent);
private BaseItem ResolvePath(
FileSystemMetadata fileInfo,
@@ -652,7 +652,7 @@ namespace Emby.Server.Implementations.Library
return !args.ContainsFileSystemEntryByName(".ignore");
}
- public IEnumerable<BaseItem> ResolvePaths(IEnumerable<FileSystemMetadata> files, IDirectoryService directoryService, Folder parent, LibraryOptions libraryOptions, string collectionType)
+ public IEnumerable<BaseItem> ResolvePaths(IEnumerable<FileSystemMetadata> files, IDirectoryService directoryService, Folder parent, LibraryOptions libraryOptions, string collectionType = null)
{
return ResolvePaths(files, directoryService, parent, libraryOptions, collectionType, EntityResolvers);
}
@@ -2683,7 +2683,7 @@ namespace Emby.Server.Implementations.Library
};
}
- public IEnumerable<Video> FindExtras(BaseItem owner, List<FileSystemMetadata> fileSystemChildren)
+ public IEnumerable<BaseItem> FindExtras(BaseItem owner, List<FileSystemMetadata> fileSystemChildren, IDirectoryService directoryService)
{
var ownerVideoInfo = VideoResolver.Resolve(owner.Path, owner.IsFolder, _namingOptions);
if (ownerVideoInfo == null)
@@ -2692,17 +2692,36 @@ namespace Emby.Server.Implementations.Library
}
var count = fileSystemChildren.Count;
- var files = new List<FileSystemMetadata>();
+ var files = new List<VideoFileInfo>();
+ var nonVideoFiles = new List<FileSystemMetadata>();
for (var i = 0; i < count; i++)
{
var current = fileSystemChildren[i];
- if (current.IsDirectory && BaseItem.AllExtrasTypesFolderNames.ContainsKey(current.Name))
+ if (current.IsDirectory && _namingOptions.AllExtrasTypesFolderNames.ContainsKey(current.Name))
{
- files.AddRange(_fileSystem.GetFiles(current.FullName, _namingOptions.VideoFileExtensions, false, false));
+ var filesInSubFolder = _fileSystem.GetFiles(current.FullName, _namingOptions.VideoFileExtensions, false, false);
+ foreach (var file in filesInSubFolder)
+ {
+ var videoInfo = VideoResolver.Resolve(file.FullName, file.IsDirectory, _namingOptions);
+ if (videoInfo == null)
+ {
+ nonVideoFiles.Add(file);
+ continue;
+ }
+
+ files.Add(videoInfo);
+ }
}
else if (!current.IsDirectory)
{
- files.Add(current);
+ var videoInfo = VideoResolver.Resolve(current.FullName, current.IsDirectory, _namingOptions);
+ if (videoInfo == null)
+ {
+ nonVideoFiles.Add(current);
+ continue;
+ }
+
+ files.Add(videoInfo);
}
}
@@ -2714,11 +2733,10 @@ namespace Emby.Server.Implementations.Library
var videos = VideoListResolver.Resolve(files, _namingOptions);
// owner video info cannot be null as that implies it has no path
var extras = ExtraResolver.GetExtras(videos, ownerVideoInfo, _namingOptions.VideoFlagDelimiters);
-
for (var i = 0; i < extras.Count; i++)
{
var currentExtra = extras[i];
- var resolved = ResolvePath(_fileSystem.GetFileInfo(currentExtra.Path));
+ var resolved = ResolvePath(_fileSystem.GetFileInfo(currentExtra.Path), null, directoryService);
if (resolved is not Video video)
{
continue;
@@ -2735,6 +2753,35 @@ namespace Emby.Server.Implementations.Library
video.OwnerId = owner.Id;
yield return video;
}
+
+ // TODO: theme songs must be handled "manually" (but should we?) since they aren't video files
+ for (var i = 0; i < nonVideoFiles.Count; i++)
+ {
+ var current = nonVideoFiles[i];
+ var extraInfo = ExtraResolver.GetExtraInfo(current.FullName, _namingOptions);
+ if (extraInfo.ExtraType != ExtraType.ThemeSong)
+ {
+ continue;
+ }
+
+ var resolved = ResolvePath(current, null, directoryService);
+ if (resolved is not Audio themeSong)
+ {
+ continue;
+ }
+
+ // Try to retrieve it from the db. If we don't find it, use the resolved version
+ if (GetItemById(themeSong.Id) is Audio dbItem)
+ {
+ themeSong = dbItem;
+ }
+
+ themeSong.ExtraType = ExtraType.ThemeSong;
+ themeSong.OwnerId = owner.Id;
+ themeSong.ParentId = Guid.Empty;
+
+ yield return themeSong;
+ }
}
public string GetPathAfterNetworkSubstitution(string path, BaseItem ownerItem)
diff --git a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
index 10f42b926..4feaf3fb4 100644
--- a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
+++ b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
@@ -261,7 +261,12 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies
}
}
- var resolverResult = VideoListResolver.Resolve(files, NamingOptions, supportMultiEditions, parseName);
+ var videoInfos = files
+ .Select(i => VideoResolver.Resolve(i.FullName, i.IsDirectory, NamingOptions, parseName))
+ .Where(f => f != null)
+ .ToList();
+
+ var resolverResult = VideoListResolver.Resolve(videoInfos, NamingOptions, supportMultiEditions, parseName);
var result = new MultiItemResolverResult
{