Jelajahi Sumber

Ignore casing photo extensions

Bond-009 6 tahun lalu
induk
melakukan
35d7e97258

+ 27 - 51
Emby.Photos/PhotoProvider.cs

@@ -20,7 +20,10 @@ namespace Emby.Photos
     public class PhotoProvider : ICustomMetadataProvider<Photo>, IForcedProvider, IHasItemChangeMonitor
     public class PhotoProvider : ICustomMetadataProvider<Photo>, IForcedProvider, IHasItemChangeMonitor
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
-        private IImageProcessor _imageProcessor;
+        private readonly IImageProcessor _imageProcessor;
+
+        // These are causing taglib to hang
+        private string[] _includextensions = new string[] { ".jpg", ".jpeg", ".png", ".tiff", ".cr2" };
 
 
         public PhotoProvider(ILogger logger, IImageProcessor imageProcessor)
         public PhotoProvider(ILogger logger, IImageProcessor imageProcessor)
         {
         {
@@ -28,75 +31,55 @@ namespace Emby.Photos
             _imageProcessor = imageProcessor;
             _imageProcessor = imageProcessor;
         }
         }
 
 
+        public string Name => "Embedded Information";
+
         public bool HasChanged(BaseItem item, IDirectoryService directoryService)
         public bool HasChanged(BaseItem item, IDirectoryService directoryService)
         {
         {
             if (item.IsFileProtocol)
             if (item.IsFileProtocol)
             {
             {
                 var file = directoryService.GetFile(item.Path);
                 var file = directoryService.GetFile(item.Path);
-                if (file != null && file.LastWriteTimeUtc != item.DateModified)
-                {
-                    return true;
-                }
+                return (file != null && file.LastWriteTimeUtc != item.DateModified);
             }
             }
 
 
             return false;
             return false;
         }
         }
 
 
-        // These are causing taglib to hang
-        private string[] _includextensions = new string[] { ".jpg", ".jpeg", ".png", ".tiff", ".cr2" };
-
         public Task<ItemUpdateType> FetchAsync(Photo item, MetadataRefreshOptions options, CancellationToken cancellationToken)
         public Task<ItemUpdateType> FetchAsync(Photo item, MetadataRefreshOptions options, CancellationToken cancellationToken)
         {
         {
             item.SetImagePath(ImageType.Primary, item.Path);
             item.SetImagePath(ImageType.Primary, item.Path);
 
 
             // Examples: https://github.com/mono/taglib-sharp/blob/a5f6949a53d09ce63ee7495580d6802921a21f14/tests/fixtures/TagLib.Tests.Images/NullOrientationTest.cs
             // Examples: https://github.com/mono/taglib-sharp/blob/a5f6949a53d09ce63ee7495580d6802921a21f14/tests/fixtures/TagLib.Tests.Images/NullOrientationTest.cs
-            if (_includextensions.Contains(Path.GetExtension(item.Path) ?? string.Empty, StringComparer.OrdinalIgnoreCase))
+            if (_includextensions.Contains(Path.GetExtension(item.Path), StringComparer.OrdinalIgnoreCase))
             {
             {
                 try
                 try
                 {
                 {
                     using (var file = TagLib.File.Create(item.Path))
                     using (var file = TagLib.File.Create(item.Path))
                     {
                     {
-                        var image = file as TagLib.Image.File;
-
-                        var tag = file.GetTag(TagTypes.TiffIFD) as IFDTag;
-
-                        if (tag != null)
+                        if (file.GetTag(TagTypes.TiffIFD) is IFDTag tag)
                         {
                         {
                             var structure = tag.Structure;
                             var structure = tag.Structure;
-
-                            if (structure != null)
+                            if (structure != null
+                                && structure.GetEntry(0, (ushort)IFDEntryTag.ExifIFD) is SubIFDEntry exif)
                             {
                             {
-                                var exif = structure.GetEntry(0, (ushort)IFDEntryTag.ExifIFD) as SubIFDEntry;
-
-                                if (exif != null)
+                                var exifStructure = exif.Structure;
+                                if (exifStructure != null)
                                 {
                                 {
-                                    var exifStructure = exif.Structure;
+                                    var entry = exifStructure.GetEntry(0, (ushort)ExifEntryTag.ApertureValue) as RationalIFDEntry;
+                                    if (entry != null)
+                                    {
+                                        item.Aperture = (double)entry.Value.Numerator / entry.Value.Denominator;
+                                    }
 
 
-                                    if (exifStructure != null)
+                                    entry = exifStructure.GetEntry(0, (ushort)ExifEntryTag.ShutterSpeedValue) as RationalIFDEntry;
+                                    if (entry != null)
                                     {
                                     {
-                                        var entry = exifStructure.GetEntry(0, (ushort)ExifEntryTag.ApertureValue) as RationalIFDEntry;
-
-                                        if (entry != null)
-                                        {
-                                            double val = entry.Value.Numerator;
-                                            val /= entry.Value.Denominator;
-                                            item.Aperture = val;
-                                        }
-
-                                        entry = exifStructure.GetEntry(0, (ushort)ExifEntryTag.ShutterSpeedValue) as RationalIFDEntry;
-
-                                        if (entry != null)
-                                        {
-                                            double val = entry.Value.Numerator;
-                                            val /= entry.Value.Denominator;
-                                            item.ShutterSpeed = val;
-                                        }
+                                        item.ShutterSpeed = (double)entry.Value.Numerator / entry.Value.Denominator;
                                     }
                                     }
                                 }
                                 }
                             }
                             }
                         }
                         }
 
 
-                        if (image != null)
+                        if (file is TagLib.Image.File image)
                         {
                         {
                             item.CameraMake = image.ImageTag.Make;
                             item.CameraMake = image.ImageTag.Make;
                             item.CameraModel = image.ImageTag.Model;
                             item.CameraModel = image.ImageTag.Model;
@@ -116,12 +99,10 @@ namespace Emby.Photos
 
 
                             item.Overview = image.ImageTag.Comment;
                             item.Overview = image.ImageTag.Comment;
 
 
-                            if (!string.IsNullOrWhiteSpace(image.ImageTag.Title))
+                            if (!string.IsNullOrWhiteSpace(image.ImageTag.Title)
+                                && !item.LockedFields.Contains(MetadataFields.Name))
                             {
                             {
-                                if (!item.LockedFields.Contains(MetadataFields.Name))
-                                {
-                                    item.Name = image.ImageTag.Title;
-                                }
+                                item.Name = image.ImageTag.Title;
                             }
                             }
 
 
                             var dateTaken = image.ImageTag.DateTime;
                             var dateTaken = image.ImageTag.DateTime;
@@ -140,12 +121,9 @@ namespace Emby.Photos
                             {
                             {
                                 item.Orientation = null;
                                 item.Orientation = null;
                             }
                             }
-                            else
+                            else if (Enum.TryParse(image.ImageTag.Orientation.ToString(), true, out ImageOrientation orientation))
                             {
                             {
-                                if (Enum.TryParse(image.ImageTag.Orientation.ToString(), true, out ImageOrientation orientation))
-                                {
-                                    item.Orientation = orientation;
-                                }
+                                item.Orientation = orientation;
                             }
                             }
 
 
                             item.ExposureTime = image.ImageTag.ExposureTime;
                             item.ExposureTime = image.ImageTag.ExposureTime;
@@ -195,7 +173,5 @@ namespace Emby.Photos
             const ItemUpdateType result = ItemUpdateType.ImageUpdate | ItemUpdateType.MetadataImport;
             const ItemUpdateType result = ItemUpdateType.ImageUpdate | ItemUpdateType.MetadataImport;
             return Task.FromResult(result);
             return Task.FromResult(result);
         }
         }
-
-        public string Name => "Embedded Information";
     }
     }
 }
 }

+ 25 - 27
Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs

@@ -14,6 +14,18 @@ namespace Emby.Server.Implementations.Library.Resolvers
     {
     {
         private readonly IImageProcessor _imageProcessor;
         private readonly IImageProcessor _imageProcessor;
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;
+        private static readonly HashSet<string> _ignoreFiles = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
+        {
+            "folder",
+            "thumb",
+            "landscape",
+            "fanart",
+            "backdrop",
+            "poster",
+            "cover",
+            "logo",
+            "default"
+        };
 
 
         public PhotoResolver(IImageProcessor imageProcessor, ILibraryManager libraryManager)
         public PhotoResolver(IImageProcessor imageProcessor, ILibraryManager libraryManager)
         {
         {
@@ -31,10 +43,10 @@ namespace Emby.Server.Implementations.Library.Resolvers
             if (!args.IsDirectory)
             if (!args.IsDirectory)
             {
             {
                 // Must be an image file within a photo collection
                 // Must be an image file within a photo collection
-                var collectionType = args.GetCollectionType();
+                var collectionType = args.CollectionType;
 
 
-                if (string.Equals(collectionType, CollectionType.Photos, StringComparison.OrdinalIgnoreCase) ||
-                    (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) && args.GetLibraryOptions().EnablePhotos))
+                if (string.Equals(collectionType, CollectionType.Photos, StringComparison.OrdinalIgnoreCase)
+                    || (string.Equals(collectionType, CollectionType.HomeVideos, StringComparison.OrdinalIgnoreCase) && args.GetLibraryOptions().EnablePhotos))
                 {
                 {
                     if (IsImageFile(args.Path, _imageProcessor))
                     if (IsImageFile(args.Path, _imageProcessor))
                     {
                     {
@@ -74,43 +86,29 @@ namespace Emby.Server.Implementations.Library.Resolvers
         }
         }
 
 
         internal static bool IsOwnedByResolvedMedia(ILibraryManager libraryManager, LibraryOptions libraryOptions, string file, string imageFilename)
         internal static bool IsOwnedByResolvedMedia(ILibraryManager libraryManager, LibraryOptions libraryOptions, string file, string imageFilename)
+            => imageFilename.StartsWith(Path.GetFileNameWithoutExtension(file), StringComparison.OrdinalIgnoreCase);
+
+        internal static bool IsImageFile(string path, IImageProcessor imageProcessor)
         {
         {
-            if (imageFilename.StartsWith(Path.GetFileNameWithoutExtension(file), StringComparison.OrdinalIgnoreCase))
+            if (path == null)
             {
             {
-                return true;
+                throw new ArgumentNullException(nameof(path));
             }
             }
 
 
-            return false;
-        }
-
-        private static readonly HashSet<string> IgnoreFiles = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
-        {
-            "folder",
-            "thumb",
-            "landscape",
-            "fanart",
-            "backdrop",
-            "poster",
-            "cover",
-            "logo",
-            "default"
-        };
-
-        internal static bool IsImageFile(string path, IImageProcessor imageProcessor)
-        {
-            var filename = Path.GetFileNameWithoutExtension(path) ?? string.Empty;
+            var filename = Path.GetFileNameWithoutExtension(path);
 
 
-            if (IgnoreFiles.Contains(filename))
+            if (_ignoreFiles.Contains(filename))
             {
             {
                 return false;
                 return false;
             }
             }
 
 
-            if (IgnoreFiles.Any(i => filename.IndexOf(i, StringComparison.OrdinalIgnoreCase) != -1))
+            if (_ignoreFiles.Any(i => filename.IndexOf(i, StringComparison.OrdinalIgnoreCase) != -1))
             {
             {
                 return false;
                 return false;
             }
             }
 
 
-            return imageProcessor.SupportedInputFormats.Contains(Path.GetExtension(path).TrimStart('.'), StringComparer.Ordinal);
+            string extension = Path.GetExtension(path).TrimStart('.');
+            return imageProcessor.SupportedInputFormats.Contains(extension, StringComparer.OrdinalIgnoreCase);
         }
         }
     }
     }
 }
 }