Selaa lähdekoodia

Limit removal scope

Shadowghost 1 vuosi sitten
vanhempi
sitoutus
f9e7d5229e

+ 1 - 1
Emby.Server.Implementations/Library/LibraryManager.cs

@@ -1884,7 +1884,7 @@ namespace Emby.Server.Implementations.Library
                     try
                     {
                         var index = item.GetImageIndex(img);
-                        image = await ConvertImageToLocal(item, img, index, removeOnFailure: true).ConfigureAwait(false);
+                        image = await ConvertImageToLocal(item, img, index, true).ConfigureAwait(false);
                     }
                     catch (ArgumentException)
                     {

+ 20 - 5
MediaBrowser.Providers/Manager/ImageSaver.cs

@@ -189,12 +189,27 @@ namespace MediaBrowser.Providers.Manager
                 {
                     _fileSystem.DeleteFile(currentPath);
 
-                    // Remove containing directory if empty
-                    var folder = Path.GetDirectoryName(currentPath);
-                    FileSystemHelper.DeleteEmptyFolders(_fileSystem, folder, _logger);
-                    if (!_fileSystem.GetFiles(folder).Any())
+                    // Remove local episode metadata directory if it exists and is empty
+                    var directory = Path.GetDirectoryName(currentPath);
+                    if (item is Episode && directory.Equals("metadata", StringComparison.Ordinal))
                     {
-                        Directory.Delete(folder);
+                        var parentDirectoryPath = Directory.GetParent(currentPath).FullName;
+                        if (!_fileSystem.GetFiles(parentDirectoryPath).Any())
+                        {
+                            try
+                            {
+                                _logger.LogInformation("Deleting empty local metadata folder {Folder}", parentDirectoryPath);
+                                Directory.Delete(parentDirectoryPath);
+                            }
+                            catch (UnauthorizedAccessException ex)
+                            {
+                                _logger.LogError(ex, "Error deleting directory {Path}", parentDirectoryPath);
+                            }
+                            catch (IOException ex)
+                            {
+                                _logger.LogError(ex, "Error deleting directory {Path}", parentDirectoryPath);
+                            }
+                        }
                     }
                 }
                 catch (FileNotFoundException)

+ 14 - 15
MediaBrowser.Providers/Manager/ItemImageProvider.cs

@@ -10,7 +10,7 @@ using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
-using MediaBrowser.Controller.IO;
+using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.LiveTv;
 using MediaBrowser.Controller.Providers;
@@ -97,7 +97,7 @@ namespace MediaBrowser.Providers.Manager
         public bool ValidateImages(BaseItem item, IEnumerable<IImageProvider> providers, ImageRefreshOptions refreshOptions)
         {
             var hasChanges = false;
-            IDirectoryService directoryService = refreshOptions?.DirectoryService;
+            var directoryService = refreshOptions?.DirectoryService;
 
             if (item is not Photo)
             {
@@ -360,10 +360,8 @@ namespace MediaBrowser.Providers.Manager
 
         private void PruneImages(BaseItem item, IReadOnlyList<ItemImageInfo> images)
         {
-            for (var i = 0; i < images.Count; i++)
+            foreach (var image in images)
             {
-                var image = images[i];
-
                 if (image.IsLocalFile)
                 {
                     try
@@ -378,16 +376,17 @@ namespace MediaBrowser.Providers.Manager
                     {
                         _logger.LogWarning(ex, "Unable to delete {Image}", image.Path);
                     }
-                    finally
-                    {
-                        // Always remove empty parent folder
-                        var folder = Path.GetDirectoryName(image.Path);
-                        FileSystemHelper.DeleteEmptyFolders(_fileSystem, folder, _logger);
-                        if (!_fileSystem.GetFiles(folder).Any())
-                        {
-                            Directory.Delete(folder);
-                        }
-                    }
+                }
+            }
+
+            // Cleanup old metadata directory for episodes if empty
+            if (item is Episode)
+            {
+                var oldLocalMetadataDirectory = Path.Combine(item.ContainingFolderPath, "metadata");
+                var localImages = images.Where(i => i.Path.StartsWith(oldLocalMetadataDirectory, StringComparison.Ordinal)).ToList();
+                if (!_fileSystem.GetFiles(oldLocalMetadataDirectory).Any())
+                {
+                    Directory.Delete(oldLocalMetadataDirectory);
                 }
             }
 

+ 6 - 11
MediaBrowser.Providers/Manager/MetadataService.cs

@@ -92,10 +92,6 @@ namespace MediaBrowser.Providers.Manager
                 }
             }
 
-            var localImagesFailed = false;
-
-            var allImageProviders = ProviderManager.GetImageProviders(item, refreshOptions).ToList();
-
             if (refreshOptions.RemoveOldMetadata && refreshOptions.ReplaceAllImages)
             {
                 if (ImageProvider.RemoveImages(item))
@@ -105,6 +101,8 @@ namespace MediaBrowser.Providers.Manager
             }
 
             // Start by validating images
+            var localImagesFailed = false;
+            var allImageProviders = ProviderManager.GetImageProviders(item, refreshOptions).ToList();
             try
             {
                 // Always validate images and check for new locally stored ones.
@@ -811,19 +809,16 @@ namespace MediaBrowser.Providers.Manager
         {
             var refreshResult = new RefreshResult();
 
-            var tmpDataMerged = false;
+            if (id is not null)
+            {
+                MergeNewData(temp.Item, id);
+            }
 
             foreach (var provider in providers)
             {
                 var providerName = provider.GetType().Name;
                 Logger.LogDebug("Running {Provider} for {Item}", providerName, logName);
 
-                if (id is not null && !tmpDataMerged)
-                {
-                    MergeNewData(temp.Item, id);
-                    tmpDataMerged = true;
-                }
-
                 try
                 {
                     var result = await provider.GetMetadata(id, cancellationToken).ConfigureAwait(false);