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 try
{ {
var index = item.GetImageIndex(img); 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) catch (ArgumentException)
{ {

View File

@ -189,12 +189,27 @@ namespace MediaBrowser.Providers.Manager
{ {
_fileSystem.DeleteFile(currentPath); _fileSystem.DeleteFile(currentPath);
// Remove containing directory if empty // Remove local episode metadata directory if it exists and is empty
var folder = Path.GetDirectoryName(currentPath); var directory = Path.GetDirectoryName(currentPath);
FileSystemHelper.DeleteEmptyFolders(_fileSystem, folder, _logger); if (item is Episode && directory.Equals("metadata", StringComparison.Ordinal))
if (!_fileSystem.GetFiles(folder).Any())
{ {
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) catch (FileNotFoundException)

View File

@ -10,7 +10,7 @@ using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;
@ -97,7 +97,7 @@ namespace MediaBrowser.Providers.Manager
public bool ValidateImages(BaseItem item, IEnumerable<IImageProvider> providers, ImageRefreshOptions refreshOptions) public bool ValidateImages(BaseItem item, IEnumerable<IImageProvider> providers, ImageRefreshOptions refreshOptions)
{ {
var hasChanges = false; var hasChanges = false;
IDirectoryService directoryService = refreshOptions?.DirectoryService; var directoryService = refreshOptions?.DirectoryService;
if (item is not Photo) if (item is not Photo)
{ {
@ -360,10 +360,8 @@ namespace MediaBrowser.Providers.Manager
private void PruneImages(BaseItem item, IReadOnlyList<ItemImageInfo> images) 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) if (image.IsLocalFile)
{ {
try try
@ -378,16 +376,17 @@ namespace MediaBrowser.Providers.Manager
{ {
_logger.LogWarning(ex, "Unable to delete {Image}", image.Path); _logger.LogWarning(ex, "Unable to delete {Image}", image.Path);
} }
finally }
{ }
// Always remove empty parent folder
var folder = Path.GetDirectoryName(image.Path); // Cleanup old metadata directory for episodes if empty
FileSystemHelper.DeleteEmptyFolders(_fileSystem, folder, _logger); if (item is Episode)
if (!_fileSystem.GetFiles(folder).Any()) {
{ var oldLocalMetadataDirectory = Path.Combine(item.ContainingFolderPath, "metadata");
Directory.Delete(folder); 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 (refreshOptions.RemoveOldMetadata && refreshOptions.ReplaceAllImages)
{ {
if (ImageProvider.RemoveImages(item)) if (ImageProvider.RemoveImages(item))
@ -105,6 +101,8 @@ namespace MediaBrowser.Providers.Manager
} }
// Start by validating images // Start by validating images
var localImagesFailed = false;
var allImageProviders = ProviderManager.GetImageProviders(item, refreshOptions).ToList();
try try
{ {
// Always validate images and check for new locally stored ones. // Always validate images and check for new locally stored ones.
@ -811,19 +809,16 @@ namespace MediaBrowser.Providers.Manager
{ {
var refreshResult = new RefreshResult(); var refreshResult = new RefreshResult();
var tmpDataMerged = false; if (id is not null)
{
MergeNewData(temp.Item, id);
}
foreach (var provider in providers) foreach (var provider in providers)
{ {
var providerName = provider.GetType().Name; var providerName = provider.GetType().Name;
Logger.LogDebug("Running {Provider} for {Item}", providerName, logName); Logger.LogDebug("Running {Provider} for {Item}", providerName, logName);
if (id is not null && !tmpDataMerged)
{
MergeNewData(temp.Item, id);
tmpDataMerged = true;
}
try try
{ {
var result = await provider.GetMetadata(id, cancellationToken).ConfigureAwait(false); var result = await provider.GetMetadata(id, cancellationToken).ConfigureAwait(false);