From a7e22718457500233328ddd88b59cf869fc94785 Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Sun, 2 Jun 2024 09:17:43 +0200 Subject: [PATCH 1/6] Skip local metadata providers when identifying --- .../Manager/MetadataService.cs | 101 +++++++++--------- 1 file changed, 53 insertions(+), 48 deletions(-) diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index 0a98967da4..7526f93542 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -669,69 +669,74 @@ namespace MediaBrowser.Providers.Manager temp.Item.Id = item.Id; var foundImageTypes = new List(); - foreach (var provider in providers.OfType>()) + + // Only execute local providers if we are not identifying + if (options.SearchResult is null) { - var providerName = provider.GetType().Name; - Logger.LogDebug("Running {Provider} for {Item}", providerName, logName); - - var itemInfo = new ItemInfo(item); - - try + foreach (var provider in providers.OfType>()) { - 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) - && !options.IsReplacingImage(remoteImage.Type)) + try { - 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(), false, true); + refreshResult.UpdateType |= ItemUpdateType.MetadataImport; + + break; } - if (foundImageTypes.Count > 0) - { - imageService.UpdateReplaceImages(options, foundImageTypes); - } - - if (imageService.MergeImages(item, localItem.Images, options)) - { - refreshResult.UpdateType |= ItemUpdateType.ImageUpdate; - } - - MergeData(localItem, temp, Array.Empty(), false, true); - refreshResult.UpdateType |= ItemUpdateType.MetadataImport; - - break; + Logger.LogDebug("{Provider} returned no metadata for {Item}", providerName, logName); } + catch (OperationCanceledException) + { + throw; + } + catch (Exception ex) + { + Logger.LogError(ex, "Error in {Provider}", provider.Name); - Logger.LogDebug("{Provider} returned no metadata for {Item}", providerName, logName); - } - 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; + // If a local provider fails, consider that a failure + refreshResult.ErrorMessage = ex.Message; + } } } From b14edb8876ae95abc043ef9f89dc445f87de87be Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Tue, 4 Jun 2024 21:54:04 +0200 Subject: [PATCH 2/6] Do not run local providers if replacing and saving is enabled --- MediaBrowser.Providers/Manager/MetadataService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index 7526f93542..616df6c260 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -670,8 +670,8 @@ namespace MediaBrowser.Providers.Manager var foundImageTypes = new List(); - // Only execute local providers if we are not identifying - if (options.SearchResult is null) + // Do not execute local providers if we are identifying or replacing with NFO saving enabled + if (options.SearchResult is null && !(item.IsSaveLocalMetadataEnabled() && options.ReplaceAllMetadata)) { foreach (var provider in providers.OfType>()) { From 4714b3af670bd669521ab2ba8f862f6014c58722 Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Wed, 5 Jun 2024 00:26:30 +0200 Subject: [PATCH 3/6] Ignore local images when replacing and saving is enabled --- MediaBrowser.Providers/Manager/ItemImageProvider.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs index 1a5dbd7a55..961671a141 100644 --- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs +++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs @@ -419,7 +419,8 @@ namespace MediaBrowser.Providers.Manager var type = _singularImages[i]; 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); // if image file is stored with media, don't replace that later From 262f7dd98f13c0e534eb5e0abe7f25e1fc43befa Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Wed, 5 Jun 2024 00:53:09 +0200 Subject: [PATCH 4/6] Fix metadata saver check --- MediaBrowser.Controller/Providers/IProviderManager.cs | 8 ++++++++ MediaBrowser.Providers/Manager/MetadataService.cs | 8 +++++--- MediaBrowser.Providers/Manager/ProviderManager.cs | 6 ++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs index eb5069b062..f6a707edc8 100644 --- a/MediaBrowser.Controller/Providers/IProviderManager.cs +++ b/MediaBrowser.Controller/Providers/IProviderManager.cs @@ -140,6 +140,14 @@ namespace MediaBrowser.Controller.Providers IEnumerable> GetMetadataProviders(BaseItem item, LibraryOptions libraryOptions) where T : BaseItem; + /// + /// Gets the metadata savers for the provided item. + /// + /// The item. + /// The library options. + /// The metadata providers. + IEnumerable GetMetadataSavers(BaseItem item, LibraryOptions libraryOptions); + /// /// Gets all metadata plugins. /// diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index 616df6c260..c82ca763d0 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -154,7 +154,8 @@ namespace MediaBrowser.Providers.Manager 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; if (result.Failures > 0) @@ -639,6 +640,7 @@ namespace MediaBrowser.Providers.Manager MetadataRefreshOptions options, ICollection providers, ItemImageProvider imageService, + bool isSavingMetadata, CancellationToken cancellationToken) { var refreshResult = new RefreshResult @@ -670,8 +672,8 @@ namespace MediaBrowser.Providers.Manager var foundImageTypes = new List(); - // Do not execute local providers if we are identifying or replacing with NFO saving enabled - if (options.SearchResult is null && !(item.IsSaveLocalMetadataEnabled() && options.ReplaceAllMetadata)) + // Do not execute local providers if we are identifying or replacing with local metadata saving enabled + if (options.SearchResult is null && !(isSavingMetadata && options.ReplaceAllMetadata)) { foreach (var provider in providers.OfType>()) { diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index 275f4028d0..f2ca99da63 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -418,6 +418,12 @@ namespace MediaBrowser.Providers.Manager return GetMetadataProvidersInternal(item, libraryOptions, globalMetadataOptions, false, false); } + /// + public IEnumerable GetMetadataSavers(BaseItem item, LibraryOptions libraryOptions) + { + return _savers.Where(i => IsSaverEnabledForItem(i, item, libraryOptions, ItemUpdateType.MetadataEdit, false)); + } + private IEnumerable> GetMetadataProvidersInternal(BaseItem item, LibraryOptions libraryOptions, MetadataOptions globalMetadataOptions, bool includeDisabled, bool forceEnableInternetMetadata) where T : BaseItem { From 57ae0b5796cfd6aa993c3ab09110bec8e73562f9 Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Wed, 5 Jun 2024 00:58:00 +0200 Subject: [PATCH 5/6] Fix typo --- MediaBrowser.Controller/Providers/IProviderManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs index f6a707edc8..b52f16edc8 100644 --- a/MediaBrowser.Controller/Providers/IProviderManager.cs +++ b/MediaBrowser.Controller/Providers/IProviderManager.cs @@ -145,7 +145,7 @@ namespace MediaBrowser.Controller.Providers /// /// The item. /// The library options. - /// The metadata providers. + /// The metadata savers. IEnumerable GetMetadataSavers(BaseItem item, LibraryOptions libraryOptions); /// From 918a36d564b52932ea21965b2f7c0ff554c516d1 Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Wed, 5 Jun 2024 01:12:47 +0200 Subject: [PATCH 6/6] Fix test --- .../Manager/ItemImageProviderTests.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/Jellyfin.Providers.Tests/Manager/ItemImageProviderTests.cs b/tests/Jellyfin.Providers.Tests/Manager/ItemImageProviderTests.cs index c6a45eb2d3..5dd3eb8ab9 100644 --- a/tests/Jellyfin.Providers.Tests/Manager/ItemImageProviderTests.cs +++ b/tests/Jellyfin.Providers.Tests/Manager/ItemImageProviderTests.cs @@ -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 BaseItem.FileSystem ??= Mock.Of(); - var item = new Video(); + var item = new Mock