diff options
Diffstat (limited to 'Emby.Server.Implementations/Library/Resolvers')
3 files changed, 96 insertions, 37 deletions
diff --git a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index fc5cab0a0..94cafa3e2 100644 --- a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -11,7 +11,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; - +using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; @@ -216,12 +216,12 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies if (string.Equals(collectionType, CollectionType.MusicVideos, StringComparison.OrdinalIgnoreCase)) { - return FindMovie<MusicVideo>(args.Path, args.Parent, files, args.DirectoryService, collectionType, true, false); + return FindMovie<MusicVideo>(args, args.Path, args.Parent, files, args.DirectoryService, collectionType, false); } if (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase)) { - return FindMovie<Video>(args.Path, args.Parent, files, args.DirectoryService, collectionType, false, false); + return FindMovie<Video>(args, args.Path, args.Parent, files, args.DirectoryService, collectionType, false); } if (string.IsNullOrEmpty(collectionType)) @@ -239,13 +239,13 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies } { - return FindMovie<Movie>(args.Path, args.Parent, files, args.DirectoryService, collectionType, true, true); + return FindMovie<Movie>(args, args.Path, args.Parent, files, args.DirectoryService, collectionType, true); } } if (string.Equals(collectionType, CollectionType.Movies, StringComparison.OrdinalIgnoreCase)) { - return FindMovie<Movie>(args.Path, args.Parent, files, args.DirectoryService, collectionType, true, true); + return FindMovie<Movie>(args, args.Path, args.Parent, files, args.DirectoryService, collectionType, true); } return null; @@ -361,11 +361,15 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies /// </summary> /// <typeparam name="T"></typeparam> /// <returns>Movie.</returns> - private T FindMovie<T>(string path, Folder parent, List<FileSystemMetadata> fileSystemEntries, IDirectoryService directoryService, string collectionType, bool allowFilesAsFolders, bool parseName) + private T FindMovie<T>(ItemResolveArgs args, string path, Folder parent, List<FileSystemMetadata> fileSystemEntries, IDirectoryService directoryService, string collectionType, bool parseName) where T : Video, new() { var multiDiscFolders = new List<FileSystemMetadata>(); + var libraryOptions = args.GetLibraryOptions(); + var supportPhotos = string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) && libraryOptions.EnablePhotos; + var photos = new List<FileSystemMetadata>(); + // Search for a folder rip foreach (var child in fileSystemEntries) { @@ -406,30 +410,37 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies Set3DFormat(movie); return movie; } + else if (supportPhotos && !child.IsHidden && PhotoResolver.IsImageFile(child.FullName, _imageProcessor)) + { + photos.Add(child); + } } - if (allowFilesAsFolders) - { - // TODO: Allow GetMultiDiscMovie in here - var supportsMultiVersion = !string.Equals(collectionType, CollectionType.HomeVideos) && - !string.Equals(collectionType, CollectionType.Photos) && - !string.Equals(collectionType, CollectionType.MusicVideos); + // TODO: Allow GetMultiDiscMovie in here + var supportsMultiVersion = !string.Equals(collectionType, CollectionType.HomeVideos) && + !string.Equals(collectionType, CollectionType.Photos) && + !string.Equals(collectionType, CollectionType.MusicVideos); + + var result = ResolveVideos<T>(parent, fileSystemEntries, directoryService, supportsMultiVersion, collectionType, parseName) ?? + new MultiItemResolverResult(); - var result = ResolveVideos<T>(parent, fileSystemEntries, directoryService, supportsMultiVersion, collectionType, parseName) ?? - new MultiItemResolverResult(); + if (result.Items.Count == 1) + { + var videoPath = result.Items[0].Path; + var hasPhotos = photos.Any(i => !PhotoResolver.IsOwnedByResolvedMedia(LibraryManager, libraryOptions, videoPath, i.Name)); - if (result.Items.Count == 1) + if (!hasPhotos) { var movie = (T)result.Items[0]; movie.IsInMixedFolder = false; movie.Name = Path.GetFileName(movie.ContainingFolderPath); return movie; } + } - if (result.Items.Count == 0 && multiDiscFolders.Count > 0) - { - return GetMultiDiscMovie<T>(multiDiscFolders, directoryService); - } + if (result.Items.Count == 0 && multiDiscFolders.Count > 0) + { + return GetMultiDiscMovie<T>(multiDiscFolders, directoryService); } return null; @@ -544,8 +555,11 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies return !validCollectionTypes.Contains(collectionType, StringComparer.OrdinalIgnoreCase); } - public MovieResolver(ILibraryManager libraryManager, IFileSystem fileSystem) : base(libraryManager, fileSystem) + private IImageProcessor _imageProcessor; + + public MovieResolver(ILibraryManager libraryManager, IFileSystem fileSystem, IImageProcessor imageProcessor) : base(libraryManager, fileSystem) { + _imageProcessor = imageProcessor; } } } diff --git a/Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs b/Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs index 3d7ede879..a9cfea34d 100644 --- a/Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs @@ -12,9 +12,12 @@ namespace Emby.Server.Implementations.Library.Resolvers public class PhotoAlbumResolver : FolderResolver<PhotoAlbum> { private readonly IImageProcessor _imageProcessor; - public PhotoAlbumResolver(IImageProcessor imageProcessor) + private ILibraryManager _libraryManager; + + public PhotoAlbumResolver(IImageProcessor imageProcessor, ILibraryManager libraryManager) { _imageProcessor = imageProcessor; + _libraryManager = libraryManager; } /// <summary> @@ -25,14 +28,18 @@ namespace Emby.Server.Implementations.Library.Resolvers protected override PhotoAlbum Resolve(ItemResolveArgs args) { // Must be an image file within a photo collection - if (args.IsDirectory && string.Equals(args.GetCollectionType(), CollectionType.Photos, StringComparison.OrdinalIgnoreCase)) + if (args.IsDirectory) { - if (HasPhotos(args)) + if (string.Equals(args.GetCollectionType(), CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) || + string.Equals(args.GetCollectionType(), CollectionType.Photos, StringComparison.OrdinalIgnoreCase)) { - return new PhotoAlbum + if (HasPhotos(args)) { - Path = args.Path - }; + return new PhotoAlbum + { + Path = args.Path + }; + } } } @@ -41,7 +48,32 @@ namespace Emby.Server.Implementations.Library.Resolvers private bool HasPhotos(ItemResolveArgs args) { - return args.FileSystemChildren.Any(i => (!i.IsDirectory) && PhotoResolver.IsImageFile(i.FullName, _imageProcessor)); + var files = args.FileSystemChildren; + + foreach (var file in files) + { + if (!file.IsDirectory && PhotoResolver.IsImageFile(file.FullName, _imageProcessor)) + { + var libraryOptions = args.GetLibraryOptions(); + var filename = file.Name; + var ownedByMedia = false; + + foreach (var siblingFile in files) + { + if (PhotoResolver.IsOwnedByMedia(_libraryManager, libraryOptions, siblingFile.FullName, filename)) + { + ownedByMedia = true; + break; + } + } + + if (!ownedByMedia) + { + return true; + } + } + } + return false; } public override ResolverPriority Priority diff --git a/Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs b/Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs index 04312f277..48f5802a9 100644 --- a/Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs @@ -35,7 +35,6 @@ namespace Emby.Server.Implementations.Library.Resolvers // Must be an image file within a photo collection var collectionType = args.GetCollectionType(); - if (string.Equals(collectionType, CollectionType.Photos, StringComparison.OrdinalIgnoreCase) || (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) && args.GetLibraryOptions().EnablePhotos)) { @@ -44,9 +43,15 @@ namespace Emby.Server.Implementations.Library.Resolvers var filename = Path.GetFileNameWithoutExtension(args.Path); // Make sure the image doesn't belong to a video file - if (_fileSystem.GetFilePaths(_fileSystem.GetDirectoryName(args.Path)).Any(i => IsOwnedByMedia(args.GetLibraryOptions(), i, filename))) + var files = args.DirectoryService.GetFiles(_fileSystem.GetDirectoryName(args.Path)); + var libraryOptions = args.GetLibraryOptions(); + + foreach (var file in files) { - return null; + if (IsOwnedByMedia(_libraryManager, libraryOptions, file.FullName, filename)) + { + return null; + } } return new Photo @@ -60,14 +65,21 @@ namespace Emby.Server.Implementations.Library.Resolvers return null; } - private bool IsOwnedByMedia(LibraryOptions libraryOptions, string file, string imageFilename) + internal static bool IsOwnedByMedia(ILibraryManager libraryManager, LibraryOptions libraryOptions, string file, string imageFilename) { - if (_libraryManager.IsVideoFile(file, libraryOptions)) + if (libraryManager.IsVideoFile(file, libraryOptions)) { - if (imageFilename.StartsWith(Path.GetFileNameWithoutExtension(file), StringComparison.OrdinalIgnoreCase)) - { - return true; - } + return IsOwnedByResolvedMedia(libraryManager, libraryOptions, file, imageFilename); + } + + return false; + } + + internal static bool IsOwnedByResolvedMedia(ILibraryManager libraryManager, LibraryOptions libraryOptions, string file, string imageFilename) + { + if (imageFilename.StartsWith(Path.GetFileNameWithoutExtension(file), StringComparison.OrdinalIgnoreCase)) + { + return true; } return false; @@ -81,7 +93,8 @@ namespace Emby.Server.Implementations.Library.Resolvers "fanart", "backdrop", "poster", - "cover" + "cover", + "logo" }; internal static bool IsImageFile(string path, IImageProcessor imageProcessor) |
