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 = providers.OfType()
+ .SelectMany(i => i.GetImages(item, directoryService))
+ .ToList();
+
+ if (MergeImages(item, images))
{
- var images = provider.GetImages(item, directoryService);
-
- if (MergeImages(item, images))
- {
- hasChanges = true;
- }
+ 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;
}