|
@@ -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<IMetadataProvider> providers,
|
|
|
ItemImageProvider imageService,
|
|
|
+ bool isSavingMetadata,
|
|
|
CancellationToken cancellationToken)
|
|
|
{
|
|
|
var refreshResult = new RefreshResult
|
|
@@ -669,69 +671,74 @@ namespace MediaBrowser.Providers.Manager
|
|
|
temp.Item.Id = item.Id;
|
|
|
|
|
|
var foundImageTypes = new List<ImageType>();
|
|
|
- foreach (var provider in providers.OfType<ILocalMetadataProvider<TItemType>>())
|
|
|
- {
|
|
|
- var providerName = provider.GetType().Name;
|
|
|
- Logger.LogDebug("Running {Provider} for {Item}", providerName, logName);
|
|
|
|
|
|
- var itemInfo = new ItemInfo(item);
|
|
|
-
|
|
|
- try
|
|
|
+ // 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<ILocalMetadataProvider<TItemType>>())
|
|
|
{
|
|
|
- var localItem = await provider.GetMetadata(itemInfo, options.DirectoryService, cancellationToken).ConfigureAwait(false);
|
|
|
+ var providerName = provider.GetType().Name;
|
|
|
+ Logger.LogDebug("Running {Provider} for {Item}", providerName, logName);
|
|
|
+
|
|
|
+ var itemInfo = new ItemInfo(item);
|
|
|
|
|
|
- if (localItem.HasMetadata)
|
|
|
+ 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;
|
|
|
+ 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);
|
|
|
+ // 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);
|
|
|
+ }
|
|
|
}
|
|
|
- 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 (foundImageTypes.Count > 0)
|
|
|
- {
|
|
|
- imageService.UpdateReplaceImages(options, foundImageTypes);
|
|
|
- }
|
|
|
+ if (imageService.MergeImages(item, localItem.Images, options))
|
|
|
+ {
|
|
|
+ refreshResult.UpdateType |= ItemUpdateType.ImageUpdate;
|
|
|
+ }
|
|
|
|
|
|
- if (imageService.MergeImages(item, localItem.Images, options))
|
|
|
- {
|
|
|
- refreshResult.UpdateType |= ItemUpdateType.ImageUpdate;
|
|
|
- }
|
|
|
+ MergeData(localItem, temp, Array.Empty<MetadataField>(), false, true);
|
|
|
+ refreshResult.UpdateType |= ItemUpdateType.MetadataImport;
|
|
|
|
|
|
- MergeData(localItem, temp, Array.Empty<MetadataField>(), false, true);
|
|
|
- refreshResult.UpdateType |= ItemUpdateType.MetadataImport;
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- 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;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|