diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs index 2b81450414..fed9689b36 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Providers; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Users; @@ -148,12 +149,15 @@ namespace MediaBrowser.Controller.Entities.Audio var totalItems = songs.Count + others.Count; var numComplete = 0; + var childUpdateType = ItemUpdateType.None; + // Refresh songs foreach (var item in songs) { cancellationToken.ThrowIfCancellationRequested(); - await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false); + var updateType = await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false); + childUpdateType = childUpdateType | updateType; numComplete++; double percent = numComplete; @@ -161,15 +165,22 @@ namespace MediaBrowser.Controller.Entities.Audio progress.Report(percent * 100); } + var parentRefreshOptions = refreshOptions; + if (childUpdateType > ItemUpdateType.None) + { + parentRefreshOptions = new MetadataRefreshOptions(refreshOptions); + parentRefreshOptions.MetadataRefreshMode = MetadataRefreshMode.FullRefresh; + } + // Refresh current item - await RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false); + await RefreshMetadata(parentRefreshOptions, cancellationToken).ConfigureAwait(false); // Refresh all non-songs foreach (var item in others) { cancellationToken.ThrowIfCancellationRequested(); - await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false); + var updateType = await item.RefreshMetadata(parentRefreshOptions, cancellationToken).ConfigureAwait(false); numComplete++; double percent = numComplete; diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 7a13bfc1c0..df28c282d2 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -717,7 +717,7 @@ namespace MediaBrowser.Controller.Entities /// The options. /// The cancellation token. /// true if a provider reports we changed - public async Task RefreshMetadata(MetadataRefreshOptions options, CancellationToken cancellationToken) + public async Task RefreshMetadata(MetadataRefreshOptions options, CancellationToken cancellationToken) { var locationType = LocationType; @@ -744,15 +744,16 @@ namespace MediaBrowser.Controller.Entities } } - var dateLastSaved = DateLastSaved; + var refreshOptions = requiresSave + ? new MetadataRefreshOptions(options) + { + ForceSave = true + } + : options; - await ProviderManager.RefreshMetadata(this, options, cancellationToken).ConfigureAwait(false); + var result = await ProviderManager.RefreshMetadata(this, refreshOptions, cancellationToken).ConfigureAwait(false); - // If it wasn't saved by the provider process, save now - if (requiresSave && dateLastSaved == DateLastSaved) - { - await UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); - } + return result; } [IgnoreDataMember] diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs b/MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs index 784cb6ea18..3a0045f4b4 100644 --- a/MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs +++ b/MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs @@ -1,4 +1,5 @@ using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Library; using System.Threading; @@ -22,7 +23,7 @@ namespace MediaBrowser.Controller.LiveTv bool IsParentalAllowed(User user); - Task RefreshMetadata(MetadataRefreshOptions options, CancellationToken cancellationToken); + Task RefreshMetadata(MetadataRefreshOptions options, CancellationToken cancellationToken); PlayAccess GetPlayAccess(User user); diff --git a/MediaBrowser.Controller/Providers/IMetadataService.cs b/MediaBrowser.Controller/Providers/IMetadataService.cs index 786a7147c2..2d4873f7ed 100644 --- a/MediaBrowser.Controller/Providers/IMetadataService.cs +++ b/MediaBrowser.Controller/Providers/IMetadataService.cs @@ -1,6 +1,7 @@ -using System.Threading; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; +using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Controller.Entities; namespace MediaBrowser.Controller.Providers { @@ -20,7 +21,7 @@ namespace MediaBrowser.Controller.Providers /// The options. /// The cancellation token. /// Task. - Task RefreshMetadata(IHasMetadata item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken); + Task RefreshMetadata(IHasMetadata item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken); /// /// Gets the order. diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs index 3cb745ff43..38ac958b38 100644 --- a/MediaBrowser.Controller/Providers/IProviderManager.cs +++ b/MediaBrowser.Controller/Providers/IProviderManager.cs @@ -23,7 +23,7 @@ namespace MediaBrowser.Controller.Providers /// The options. /// The cancellation token. /// Task. - Task RefreshMetadata(IHasMetadata item, MetadataRefreshOptions options, CancellationToken cancellationToken); + Task RefreshMetadata(IHasMetadata item, MetadataRefreshOptions options, CancellationToken cancellationToken); /// /// Saves the image. diff --git a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs index 2cd119cf51..078f1e77a9 100644 --- a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs +++ b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs @@ -12,7 +12,7 @@ namespace MediaBrowser.Controller.Providers public bool ReplaceAllMetadata { get; set; } public bool IsPostRecursiveRefresh { get; set; } - + public MetadataRefreshMode MetadataRefreshMode { get; set; } public bool ForceSave { get; set; } @@ -28,7 +28,7 @@ namespace MediaBrowser.Controller.Providers MetadataRefreshMode = MetadataRefreshMode.Default; } - public MetadataRefreshOptions( MetadataRefreshOptions copy) + public MetadataRefreshOptions(MetadataRefreshOptions copy) : base(copy.DirectoryService) { MetadataRefreshMode = copy.MetadataRefreshMode; diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index 523d393759..8e5fe8c0e8 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -87,7 +87,7 @@ namespace MediaBrowser.Providers.Manager return ProviderRepo.GetMetadataStatus(item.Id) ?? new MetadataStatus { ItemId = item.Id }; } - public async Task RefreshMetadata(IHasMetadata item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken) + public async Task RefreshMetadata(IHasMetadata item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken) { var itemOfType = (TItemType)item; var config = ProviderManager.GetMetadataOptions(item); @@ -184,6 +184,8 @@ namespace MediaBrowser.Providers.Manager } await AfterMetadataRefresh(itemOfType, refreshOptions, cancellationToken).ConfigureAwait(false); + + return updateType; } private readonly Task _cachedTask = Task.FromResult(true); diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index 823c34a756..55a4549778 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -108,7 +108,7 @@ namespace MediaBrowser.Providers.Manager _externalIds = externalIds.OrderBy(i => i.Name).ToArray(); } - public Task RefreshMetadata(IHasMetadata item, MetadataRefreshOptions options, CancellationToken cancellationToken) + public Task RefreshMetadata(IHasMetadata item, MetadataRefreshOptions options, CancellationToken cancellationToken) { var service = _metadataServices.FirstOrDefault(i => i.CanRefresh(item)); @@ -118,7 +118,7 @@ namespace MediaBrowser.Providers.Manager } _logger.Error("Unable to find a metadata service for item of type " + item.GetType().Name); - return Task.FromResult(true); + return Task.FromResult(ItemUpdateType.None); } public async Task SaveImage(IHasImages item, string url, SemaphoreSlim resourcePool, ImageType type, int? imageIndex, CancellationToken cancellationToken)