aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Rogers <1337joe@gmail.com>2022-01-03 23:41:13 +0100
committerJoe Rogers <1337joe@gmail.com>2022-01-03 23:41:13 +0100
commitc81d2e9dec63808d51d095ecab02a5aac8613fd1 (patch)
tree23b5b1c84bc42472729da1f57ede9d068f7edc3e
parentce66df2c927c8c4d8fd40a01b8d42db9adcf29d9 (diff)
Remove existing images when applying identify
-rw-r--r--MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs1
-rw-r--r--MediaBrowser.Providers/Manager/ItemImageProvider.cs24
-rw-r--r--MediaBrowser.Providers/Manager/MetadataService.cs9
-rw-r--r--tests/Jellyfin.Providers.Tests/Manager/ItemImageProviderTests.cs29
4 files changed, 63 insertions, 0 deletions
diff --git a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs
index 90fd6e269..1fb18334a 100644
--- a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs
+++ b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs
@@ -30,6 +30,7 @@ namespace MediaBrowser.Controller.Providers
ReplaceAllImages = copy.ReplaceAllImages;
ReplaceImages = copy.ReplaceImages;
SearchResult = copy.SearchResult;
+ IsIdentify = copy.IsIdentify;
if (copy.RefreshPaths != null && copy.RefreshPaths.Length > 0)
{
diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs
index 5f18578e4..542be1caa 100644
--- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs
+++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs
@@ -62,6 +62,30 @@ namespace MediaBrowser.Providers.Manager
}
/// <summary>
+ /// Removes all existing images from the provided item.
+ /// </summary>
+ /// <param name="item">The <see cref="BaseItem"/> to remove images from.</param>
+ /// <returns><c>true</c> if changes were made to the item; otherwise <c>false</c>.</returns>
+ public bool RemoveImages(BaseItem item)
+ {
+ var singular = new List<ItemImageInfo>();
+ for (var i = 0; i < _singularImages.Length; i++)
+ {
+ var currentImage = item.GetImageInfo(_singularImages[i], 0);
+ if (currentImage != null)
+ {
+ singular.Add(currentImage);
+ }
+ }
+
+ var oldBackdropImages = item.GetImages(ImageType.Backdrop).ToArray();
+ var toRemove = singular.Concat(oldBackdropImages).ToArray();
+ PruneImages(item, toRemove);
+
+ return toRemove.Length > 0;
+ }
+
+ /// <summary>
/// Verifies existing images have valid paths and adds any new local images provided.
/// </summary>
/// <param name="item">The <see cref="BaseItem"/> to validate images for.</param>
diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs
index 80ee32030..0b62b5cbc 100644
--- a/MediaBrowser.Providers/Manager/MetadataService.cs
+++ b/MediaBrowser.Providers/Manager/MetadataService.cs
@@ -98,6 +98,15 @@ namespace MediaBrowser.Providers.Manager
var allImageProviders = ((ProviderManager)ProviderManager).GetImageProviders(item, refreshOptions).ToList();
+ // If replacing images with identify purge existing images.
+ if (refreshOptions.IsIdentify && refreshOptions.ReplaceAllImages)
+ {
+ if (ImageProvider.RemoveImages(item))
+ {
+ updateType |= ItemUpdateType.ImageUpdate;
+ }
+ }
+
// Start by validating images
try
{
diff --git a/tests/Jellyfin.Providers.Tests/Manager/ItemImageProviderTests.cs b/tests/Jellyfin.Providers.Tests/Manager/ItemImageProviderTests.cs
index af273390b..f466f5fbc 100644
--- a/tests/Jellyfin.Providers.Tests/Manager/ItemImageProviderTests.cs
+++ b/tests/Jellyfin.Providers.Tests/Manager/ItemImageProviderTests.cs
@@ -172,6 +172,35 @@ namespace Jellyfin.Providers.Tests.Manager
}
[Theory]
+ [InlineData(ImageType.Primary, 0)]
+ [InlineData(ImageType.Primary, 1)]
+ [InlineData(ImageType.Backdrop, 2)]
+ public void RemoveImages_DeletesImages_WhenFound(ImageType imageType, int imageCount)
+ {
+ var item = GetItemWithImages(imageType, imageCount, false);
+
+ var mockFileSystem = new Mock<IFileSystem>(MockBehavior.Strict);
+ if (imageCount > 0)
+ {
+ mockFileSystem.Setup(fs => fs.DeleteFile("invalid path 0"))
+ .Verifiable();
+ }
+
+ if (imageCount > 1)
+ {
+ mockFileSystem.Setup(fs => fs.DeleteFile("invalid path 1"))
+ .Verifiable();
+ }
+
+ var itemImageProvider = GetItemImageProvider(Mock.Of<IProviderManager>(), mockFileSystem);
+ var result = itemImageProvider.RemoveImages(item);
+
+ Assert.Equal(imageCount != 0, result);
+ Assert.Empty(item.GetImages(imageType));
+ mockFileSystem.Verify();
+ }
+
+ [Theory]
[InlineData(ImageType.Primary, 1, false)]
[InlineData(ImageType.Backdrop, 2, false)]
[InlineData(ImageType.Primary, 1, true)]