Merge pull request #11921 from Shadowghost/fix-identify-over-nfo

Fix identify over NFO and replace all when NFO saving enabled
This commit is contained in:
Joshua M. Boniface 2024-06-05 17:24:36 -04:00 committed by GitHub
commit bfcc09db8a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 79 additions and 53 deletions

View File

@ -140,6 +140,14 @@ namespace MediaBrowser.Controller.Providers
IEnumerable<IMetadataProvider<T>> GetMetadataProviders<T>(BaseItem item, LibraryOptions libraryOptions) IEnumerable<IMetadataProvider<T>> GetMetadataProviders<T>(BaseItem item, LibraryOptions libraryOptions)
where T : BaseItem; where T : BaseItem;
/// <summary>
/// Gets the metadata savers for the provided item.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="libraryOptions">The library options.</param>
/// <returns>The metadata savers.</returns>
IEnumerable<IMetadataSaver> GetMetadataSavers(BaseItem item, LibraryOptions libraryOptions);
/// <summary> /// <summary>
/// Gets all metadata plugins. /// Gets all metadata plugins.
/// </summary> /// </summary>

View File

@ -428,7 +428,8 @@ namespace MediaBrowser.Providers.Manager
var type = _singularImages[i]; var type = _singularImages[i];
var image = GetFirstLocalImageInfoByType(images, type); var image = GetFirstLocalImageInfoByType(images, type);
if (image is not null) // Only use local images if we are not replacing and saving
if (image is not null && !(item.IsSaveLocalMetadataEnabled() && refreshOptions.ReplaceAllImages))
{ {
var currentImage = item.GetImageInfo(type, 0); var currentImage = item.GetImageInfo(type, 0);
// if image file is stored with media, don't replace that later // if image file is stored with media, don't replace that later

View File

@ -154,7 +154,8 @@ namespace MediaBrowser.Providers.Manager
id.IsAutomated = refreshOptions.IsAutomated; id.IsAutomated = refreshOptions.IsAutomated;
var result = await RefreshWithProviders(metadataResult, id, refreshOptions, providers, ImageProvider, cancellationToken).ConfigureAwait(false); var hasMetadataSavers = ProviderManager.GetMetadataSavers(item, libraryOptions).Any();
var result = await RefreshWithProviders(metadataResult, id, refreshOptions, providers, ImageProvider, hasMetadataSavers, cancellationToken).ConfigureAwait(false);
updateType |= result.UpdateType; updateType |= result.UpdateType;
if (result.Failures > 0) if (result.Failures > 0)
@ -639,6 +640,7 @@ namespace MediaBrowser.Providers.Manager
MetadataRefreshOptions options, MetadataRefreshOptions options,
ICollection<IMetadataProvider> providers, ICollection<IMetadataProvider> providers,
ItemImageProvider imageService, ItemImageProvider imageService,
bool isSavingMetadata,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
var refreshResult = new RefreshResult var refreshResult = new RefreshResult
@ -669,69 +671,74 @@ namespace MediaBrowser.Providers.Manager
temp.Item.Id = item.Id; temp.Item.Id = item.Id;
var foundImageTypes = new List<ImageType>(); var foundImageTypes = new List<ImageType>();
foreach (var provider in providers.OfType<ILocalMetadataProvider<TItemType>>())
// Do not execute local providers if we are identifying or replacing with local metadata saving enabled
if (options.SearchResult is null && !(isSavingMetadata && options.ReplaceAllMetadata))
{ {
var providerName = provider.GetType().Name; foreach (var provider in providers.OfType<ILocalMetadataProvider<TItemType>>())
Logger.LogDebug("Running {Provider} for {Item}", providerName, logName);
var itemInfo = new ItemInfo(item);
try
{ {
var localItem = await provider.GetMetadata(itemInfo, options.DirectoryService, cancellationToken).ConfigureAwait(false); var providerName = provider.GetType().Name;
Logger.LogDebug("Running {Provider} for {Item}", providerName, logName);
if (localItem.HasMetadata) var itemInfo = new ItemInfo(item);
try
{ {
foreach (var remoteImage in localItem.RemoteImages) var localItem = await provider.GetMetadata(itemInfo, options.DirectoryService, cancellationToken).ConfigureAwait(false);
if (localItem.HasMetadata)
{ {
try foreach (var remoteImage in localItem.RemoteImages)
{ {
if (item.ImageInfos.Any(x => x.Type == remoteImage.Type) try
&& !options.IsReplacingImage(remoteImage.Type))
{ {
continue; if (item.ImageInfos.Any(x => x.Type == remoteImage.Type)
&& !options.IsReplacingImage(remoteImage.Type))
{
continue;
}
await ProviderManager.SaveImage(item, remoteImage.Url, remoteImage.Type, null, cancellationToken).ConfigureAwait(false);
refreshResult.UpdateType |= ItemUpdateType.ImageUpdate;
// remember imagetype that has just been downloaded
foundImageTypes.Add(remoteImage.Type);
}
catch (HttpRequestException ex)
{
Logger.LogError(ex, "Could not save {ImageType} image: {Url}", Enum.GetName(remoteImage.Type), remoteImage.Url);
} }
await ProviderManager.SaveImage(item, remoteImage.Url, remoteImage.Type, null, cancellationToken).ConfigureAwait(false);
refreshResult.UpdateType |= ItemUpdateType.ImageUpdate;
// remember imagetype that has just been downloaded
foundImageTypes.Add(remoteImage.Type);
} }
catch (HttpRequestException ex)
if (foundImageTypes.Count > 0)
{ {
Logger.LogError(ex, "Could not save {ImageType} image: {Url}", Enum.GetName(remoteImage.Type), remoteImage.Url); imageService.UpdateReplaceImages(options, foundImageTypes);
} }
if (imageService.MergeImages(item, localItem.Images, options))
{
refreshResult.UpdateType |= ItemUpdateType.ImageUpdate;
}
MergeData(localItem, temp, Array.Empty<MetadataField>(), false, true);
refreshResult.UpdateType |= ItemUpdateType.MetadataImport;
break;
} }
if (foundImageTypes.Count > 0) Logger.LogDebug("{Provider} returned no metadata for {Item}", providerName, logName);
{
imageService.UpdateReplaceImages(options, foundImageTypes);
}
if (imageService.MergeImages(item, localItem.Images, options))
{
refreshResult.UpdateType |= ItemUpdateType.ImageUpdate;
}
MergeData(localItem, temp, Array.Empty<MetadataField>(), false, true);
refreshResult.UpdateType |= ItemUpdateType.MetadataImport;
break;
} }
catch (OperationCanceledException)
{
throw;
}
catch (Exception ex)
{
Logger.LogError(ex, "Error in {Provider}", provider.Name);
Logger.LogDebug("{Provider} returned no metadata for {Item}", providerName, logName); // If a local provider fails, consider that a failure
} refreshResult.ErrorMessage = ex.Message;
catch (OperationCanceledException) }
{
throw;
}
catch (Exception ex)
{
Logger.LogError(ex, "Error in {Provider}", provider.Name);
// If a local provider fails, consider that a failure
refreshResult.ErrorMessage = ex.Message;
} }
} }

View File

@ -418,6 +418,12 @@ namespace MediaBrowser.Providers.Manager
return GetMetadataProvidersInternal<T>(item, libraryOptions, globalMetadataOptions, false, false); return GetMetadataProvidersInternal<T>(item, libraryOptions, globalMetadataOptions, false, false);
} }
/// <inheritdoc />
public IEnumerable<IMetadataSaver> GetMetadataSavers(BaseItem item, LibraryOptions libraryOptions)
{
return _savers.Where(i => IsSaverEnabledForItem(i, item, libraryOptions, ItemUpdateType.MetadataEdit, false));
}
private IEnumerable<IMetadataProvider<T>> GetMetadataProvidersInternal<T>(BaseItem item, LibraryOptions libraryOptions, MetadataOptions globalMetadataOptions, bool includeDisabled, bool forceEnableInternetMetadata) private IEnumerable<IMetadataProvider<T>> GetMetadataProvidersInternal<T>(BaseItem item, LibraryOptions libraryOptions, MetadataOptions globalMetadataOptions, bool includeDisabled, bool forceEnableInternetMetadata)
where T : BaseItem where T : BaseItem
{ {

View File

@ -575,18 +575,22 @@ namespace Jellyfin.Providers.Tests.Manager
// Has to exist for querying DateModified time on file, results stored but not checked so not populating // Has to exist for querying DateModified time on file, results stored but not checked so not populating
BaseItem.FileSystem ??= Mock.Of<IFileSystem>(); BaseItem.FileSystem ??= Mock.Of<IFileSystem>();
var item = new Video(); var item = new Mock<Video>
{
CallBase = true
};
item.Setup(m => m.IsSaveLocalMetadataEnabled()).Returns(false);
var path = validPaths ? _testDataImagePath.Format : "invalid path {0}"; var path = validPaths ? _testDataImagePath.Format : "invalid path {0}";
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
item.SetImagePath(type, i, new FileSystemMetadata item.Object.SetImagePath(type, i, new FileSystemMetadata
{ {
FullName = string.Format(CultureInfo.InvariantCulture, path, i), FullName = string.Format(CultureInfo.InvariantCulture, path, i),
}); });
} }
return item; return item.Object;
} }
private static ILocalImageProvider GetImageProvider(ImageType type, int count, bool validPaths) private static ILocalImageProvider GetImageProvider(ImageType type, int count, bool validPaths)