From 0abe0685f5bab61124d6212360744a24fb47d09c Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 10 Apr 2015 21:42:37 -0400 Subject: [PATCH] rework image providers --- MediaBrowser.Controller/Entities/BaseItem.cs | 28 +++++++++++--- .../Entities/IHasImages.cs | 8 +++- .../Images/EpisodeLocalImageProvider.cs | 7 +++- .../InternalMetadataFolderImageProvider.cs | 5 +++ .../Images/LocalImageProvider.cs | 2 +- .../Manager/ItemImageProvider.cs | 37 +++++++++++-------- 6 files changed, 64 insertions(+), 23 deletions(-) diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index a1bcde9e68..ea8510b536 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -44,7 +44,7 @@ namespace MediaBrowser.Controller.Entities /// /// The supported image extensions /// - public static readonly string[] SupportedImageExtensions = { ".png", ".jpg", ".jpeg", ".tbn" }; + public static readonly string[] SupportedImageExtensions = { ".png", ".jpg", ".jpeg" }; public static readonly List SupportedImageExtensionsList = SupportedImageExtensions.ToList(); @@ -1532,7 +1532,7 @@ namespace MediaBrowser.Controller.Entities } // Remove it from the item - ImageInfos.Remove(info); + RemoveImage(info); // Delete the source file var currentFile = new FileInfo(info.Path); @@ -1551,6 +1551,11 @@ namespace MediaBrowser.Controller.Entities return UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); } + public void RemoveImage(ItemImageInfo image) + { + ImageInfos.Remove(image); + } + public virtual Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) { return LibraryManager.UpdateItem(this, updateReason, cancellationToken); @@ -1641,9 +1646,9 @@ namespace MediaBrowser.Controller.Entities return ImageInfos.Where(i => i.Type == imageType); } - public bool AddImages(ImageType imageType, IEnumerable images) + public bool AddImages(ImageType imageType, List images) { - return AddImages(imageType, images.Cast()); + return AddImages(imageType, images.Cast().ToList()); } /// @@ -1653,7 +1658,7 @@ namespace MediaBrowser.Controller.Entities /// The images. /// true if XXXX, false otherwise. /// Cannot call AddImages with chapter images - public bool AddImages(ImageType imageType, IEnumerable images) + public bool AddImages(ImageType imageType, List images) { if (imageType == ImageType.Chapter) { @@ -1664,6 +1669,7 @@ namespace MediaBrowser.Controller.Entities .ToList(); var newImageList = new List(); + var imageAdded = false; foreach (var newImage in images) { @@ -1678,6 +1684,7 @@ namespace MediaBrowser.Controller.Entities if (existing == null) { newImageList.Add(newImage); + imageAdded = true; } else { @@ -1686,6 +1693,17 @@ namespace MediaBrowser.Controller.Entities } } + if (imageAdded || images.Count != existingImages.Count) + { + var newImagePaths = images.Select(i => i.FullName).ToList(); + + var deleted = existingImages + .Where(i => !newImagePaths.Contains(i.Path, StringComparer.OrdinalIgnoreCase) && !File.Exists(i.Path)) + .ToList(); + + ImageInfos = ImageInfos.Except(deleted).ToList(); + } + ImageInfos.AddRange(newImageList.Select(i => GetImageInfo(i, imageType))); return newImageList.Count > 0; diff --git a/MediaBrowser.Controller/Entities/IHasImages.cs b/MediaBrowser.Controller/Entities/IHasImages.cs index 00a42271b5..1871d7b68a 100644 --- a/MediaBrowser.Controller/Entities/IHasImages.cs +++ b/MediaBrowser.Controller/Entities/IHasImages.cs @@ -141,7 +141,7 @@ namespace MediaBrowser.Controller.Entities /// Type of the image. /// The images. /// true if XXXX, false otherwise. - bool AddImages(ImageType imageType, IEnumerable images); + bool AddImages(ImageType imageType, List images); /// /// Determines whether [is save local metadata enabled]. @@ -190,6 +190,12 @@ namespace MediaBrowser.Controller.Entities /// /// true if [is internet metadata enabled]; otherwise, false. bool IsInternetMetadataEnabled(); + + /// + /// Removes the image. + /// + /// The image. + void RemoveImage(ItemImageInfo image); } public static class HasImagesExtensions diff --git a/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs b/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs index 31329e6d7d..0089a71d52 100644 --- a/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs +++ b/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs @@ -10,7 +10,7 @@ using System.Linq; namespace MediaBrowser.LocalMetadata.Images { - public class EpisodeLocalLocalImageProvider : ILocalImageFileProvider + public class EpisodeLocalLocalImageProvider : ILocalImageFileProvider, IHasOrder { private readonly IFileSystem _fileSystem; @@ -24,6 +24,11 @@ namespace MediaBrowser.LocalMetadata.Images get { return "Local Images"; } } + public int Order + { + get { return 0; } + } + public bool Supports(IHasImages item) { return item is Episode && item.SupportsLocalMetadata; diff --git a/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs b/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs index 60533797ab..f118c2763f 100644 --- a/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs +++ b/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs @@ -26,6 +26,11 @@ namespace MediaBrowser.LocalMetadata.Images public bool Supports(IHasImages item) { + if (item is Photo) + { + return false; + } + if (!item.IsSaveLocalMetadataEnabled()) { return true; diff --git a/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs b/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs index 6083c88dea..ba87b3c43b 100644 --- a/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs +++ b/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs @@ -12,7 +12,7 @@ using System.Linq; namespace MediaBrowser.LocalMetadata.Images { - public class LocalImageProvider : ILocalImageFileProvider + public class LocalImageProvider : ILocalImageFileProvider, IHasOrder { private readonly IFileSystem _fileSystem; diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs index 533e843ea8..a3b5691500 100644 --- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs +++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs @@ -36,16 +36,15 @@ namespace MediaBrowser.Providers.Manager public bool ValidateImages(IHasImages item, IEnumerable providers, IDirectoryService directoryService) { - var hasChanges = item.ValidateImages(directoryService); + var hasChanges = false; - foreach (var provider in providers.OfType()) - { - var images = provider.GetImages(item, directoryService); + var images = providers.OfType() + .SelectMany(i => i.GetImages(item, directoryService)) + .ToList(); - if (MergeImages(item, images)) - { - hasChanges = true; - } + if (MergeImages(item, images)) + { + hasChanges = true; } return hasChanges; @@ -377,8 +376,7 @@ namespace MediaBrowser.Providers.Manager item.SetImagePath(type, image.FileInfo); changed = true; } - else if (!string.Equals(currentImage.Path, image.FileInfo.FullName, - StringComparison.OrdinalIgnoreCase)) + else if (!string.Equals(currentImage.Path, image.FileInfo.FullName, StringComparison.OrdinalIgnoreCase)) { item.SetImagePath(type, image.FileInfo); changed = true; @@ -389,6 +387,15 @@ namespace MediaBrowser.Providers.Manager currentImage.Length = ((FileInfo) image.FileInfo).Length; } } + else + { + var existing = item.GetImageInfo(type, 0); + if (existing != null && !File.Exists(existing.Path)) + { + item.RemoveImage(existing); + changed = true; + } + } } if (UpdateMultiImages(item, images, ImageType.Backdrop)) @@ -412,16 +419,16 @@ namespace MediaBrowser.Providers.Manager { var changed = false; - var backdrops = images.Where(i => i.Type == type).ToList(); - if (backdrops.Count > 0) + var newImages = images.Where(i => i.Type == type).ToList(); + if (newImages.Count > 0) { - var foundImages = images.Where(i => i.Type == type) + var newImageFileInfos = images.Where(i => i.Type == type) .Select(i => i.FileInfo) .ToList(); - if (foundImages.Count > 0) + if (newImageFileInfos.Count > 0) { - if (item.AddImages(type, foundImages)) + if (item.AddImages(type, newImageFileInfos)) { changed = true; }