Limit removal scope

This commit is contained in:
Shadowghost 2024-06-09 00:46:19 +02:00
parent 19a89d5a60
commit f9e7d5229e
4 changed files with 41 additions and 32 deletions

View File

@ -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)
{

View File

@ -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)

View File

@ -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);
}
}

View File

@ -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);