Browse Source

allow photos in home video libraries

Luke Pulverenti 9 years ago
parent
commit
96efd27e20

+ 39 - 9
MediaBrowser.Server.Implementations/Library/Resolvers/PhotoResolver.cs

@@ -5,15 +5,19 @@ using MediaBrowser.Model.Entities;
 using System;
 using System.IO;
 using System.Linq;
+using CommonIO;
 
 namespace MediaBrowser.Server.Implementations.Library.Resolvers
 {
     public class PhotoResolver : ItemResolver<Photo>
     {
         private readonly IImageProcessor _imageProcessor;
-        public PhotoResolver(IImageProcessor imageProcessor)
+        private readonly ILibraryManager _libraryManager;
+
+        public PhotoResolver(IImageProcessor imageProcessor, ILibraryManager libraryManager)
         {
             _imageProcessor = imageProcessor;
+            _libraryManager = libraryManager;
         }
 
         /// <summary>
@@ -23,20 +27,45 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
         /// <returns>Trailer.</returns>
         protected override Photo Resolve(ItemResolveArgs args)
         {
-            // Must be an image file within a photo collection
-            if (string.Equals(args.GetCollectionType(), CollectionType.Photos, StringComparison.OrdinalIgnoreCase) &&
-                !args.IsDirectory &&
-                IsImageFile(args.Path, _imageProcessor))
+            if (!args.IsDirectory)
             {
-                return new Photo
+                // 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))
                 {
-                    Path = args.Path
-                };
+                    if (IsImageFile(args.Path, _imageProcessor))
+                    {
+                        var filename = Path.GetFileNameWithoutExtension(args.Path);
+
+                        // Make sure the image doesn't belong to a video file
+                        if (args.DirectoryService.GetFiles(Path.GetDirectoryName(args.Path)).Any(i => IsOwnedByMedia(i, filename)))
+                        {
+                            return null;
+                        }
+
+                        return new Photo
+                        {
+                            Path = args.Path
+                        };
+                    }
+                }
             }
 
             return null;
         }
 
+        private bool IsOwnedByMedia(FileSystemMetadata file, string imageFilename)
+        {
+            if (_libraryManager.IsVideoFile(file.FullName) && imageFilename.StartsWith(Path.GetFileNameWithoutExtension(file.Name), StringComparison.OrdinalIgnoreCase))
+            {
+                return true;
+            }
+
+            return false;
+        }
+
         private static readonly string[] IgnoreFiles =
         {
             "folder",
@@ -44,7 +73,8 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
             "landscape",
             "fanart",
             "backdrop",
-            "poster"
+            "poster",
+            "cover"
         };
 
         internal static bool IsImageFile(string path, IImageProcessor imageProcessor)