Browse Source

Move the remove source implementation into ProviderManager

gnattu 7 months ago
parent
commit
469bf9d514

+ 2 - 1
MediaBrowser.Controller/Providers/IProviderManager.cs

@@ -77,7 +77,8 @@ namespace MediaBrowser.Controller.Providers
         Task SaveImage(BaseItem item, Stream source, string mimeType, ImageType type, int? imageIndex, CancellationToken cancellationToken);
         Task SaveImage(BaseItem item, Stream source, string mimeType, ImageType type, int? imageIndex, CancellationToken cancellationToken);
 
 
         /// <summary>
         /// <summary>
-        /// Saves the image.
+        /// Saves the image by giving the image path on filesystem.
+        /// This method will remove the image on the source path after saving it to the destination.
         /// </summary>
         /// </summary>
         /// <param name="item">Image to save.</param>
         /// <param name="item">Image to save.</param>
         /// <param name="source">Source of image.</param>
         /// <param name="source">Source of image.</param>

+ 1 - 5
MediaBrowser.Providers/Manager/ItemImageProvider.cs

@@ -229,11 +229,7 @@ namespace MediaBrowser.Providers.Manager
                                 {
                                 {
                                     var mimeType = MimeTypes.GetMimeType(response.Path);
                                     var mimeType = MimeTypes.GetMimeType(response.Path);
 
 
-                                    var stream = AsyncFile.OpenRead(response.Path);
-
-                                    await _providerManager.SaveImage(item, stream, mimeType, imageType, null, cancellationToken).ConfigureAwait(false);
-
-                                    File.Delete(response.Path);
+                                    await _providerManager.SaveImage(item, response.Path, mimeType, imageType, null, null, cancellationToken).ConfigureAwait(false);
                                 }
                                 }
                             }
                             }
 
 

+ 10 - 2
MediaBrowser.Providers/Manager/ProviderManager.cs

@@ -251,7 +251,7 @@ namespace MediaBrowser.Providers.Manager
         }
         }
 
 
         /// <inheritdoc/>
         /// <inheritdoc/>
-        public Task SaveImage(BaseItem item, string source, string mimeType, ImageType type, int? imageIndex, bool? saveLocallyWithMedia, CancellationToken cancellationToken)
+        public async Task SaveImage(BaseItem item, string source, string mimeType, ImageType type, int? imageIndex, bool? saveLocallyWithMedia, CancellationToken cancellationToken)
         {
         {
             if (string.IsNullOrWhiteSpace(source))
             if (string.IsNullOrWhiteSpace(source))
             {
             {
@@ -259,7 +259,15 @@ namespace MediaBrowser.Providers.Manager
             }
             }
 
 
             var fileStream = AsyncFile.OpenRead(source);
             var fileStream = AsyncFile.OpenRead(source);
-            return new ImageSaver(_configurationManager, _libraryMonitor, _fileSystem, _logger).SaveImage(item, fileStream, mimeType, type, imageIndex, saveLocallyWithMedia, cancellationToken);
+            await new ImageSaver(_configurationManager, _libraryMonitor, _fileSystem, _logger).SaveImage(item, fileStream, mimeType, type, imageIndex, saveLocallyWithMedia, cancellationToken);
+            try
+            {
+                File.Delete(source);
+            }
+            catch (IOException ex)
+            {
+                _logger.LogError(ex, "Source file {Source} not found or in use, skip removing", source);
+            }
         }
         }
 
 
         /// <inheritdoc/>
         /// <inheritdoc/>

+ 3 - 0
tests/Jellyfin.Providers.Tests/Manager/ItemImageProviderTests.cs

@@ -292,6 +292,9 @@ namespace Jellyfin.Providers.Tests.Manager
             providerManager.Setup(pm => pm.SaveImage(item, It.IsAny<Stream>(), It.IsAny<string>(), imageType, null, It.IsAny<CancellationToken>()))
             providerManager.Setup(pm => pm.SaveImage(item, It.IsAny<Stream>(), It.IsAny<string>(), imageType, null, It.IsAny<CancellationToken>()))
                 .Callback<BaseItem, Stream, string, ImageType, int?, CancellationToken>((callbackItem, _, _, callbackType, _, _) => callbackItem.SetImagePath(callbackType, 0, new FileSystemMetadata()))
                 .Callback<BaseItem, Stream, string, ImageType, int?, CancellationToken>((callbackItem, _, _, callbackType, _, _) => callbackItem.SetImagePath(callbackType, 0, new FileSystemMetadata()))
                 .Returns(Task.CompletedTask);
                 .Returns(Task.CompletedTask);
+            providerManager.Setup(pm => pm.SaveImage(item, It.IsAny<string>(), It.IsAny<string>(), imageType, null, null, It.IsAny<CancellationToken>()))
+                .Callback<BaseItem, string, string, ImageType, int?, bool?, CancellationToken>((callbackItem, _, _, callbackType, _, _, _) => callbackItem.SetImagePath(callbackType, 0, new FileSystemMetadata()))
+                .Returns(Task.CompletedTask);
             var itemImageProvider = GetItemImageProvider(providerManager.Object, null);
             var itemImageProvider = GetItemImageProvider(providerManager.Object, null);
             var result = await itemImageProvider.RefreshImages(item, libraryOptions, new List<IImageProvider> { dynamicProvider.Object }, refreshOptions, CancellationToken.None);
             var result = await itemImageProvider.RefreshImages(item, libraryOptions, new List<IImageProvider> { dynamicProvider.Object }, refreshOptions, CancellationToken.None);