diff options
Diffstat (limited to 'MediaBrowser.Providers/Manager')
| -rw-r--r-- | MediaBrowser.Providers/Manager/MetadataService.cs | 52 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Manager/ProviderManager.cs | 19 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Manager/ProviderUtils.cs | 13 |
3 files changed, 55 insertions, 29 deletions
diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index bc0b1bcb2..de41a0f96 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -24,8 +24,9 @@ namespace MediaBrowser.Providers.Manager protected readonly IProviderRepository ProviderRepo; protected readonly IFileSystem FileSystem; protected readonly IUserDataManager UserDataManager; + protected readonly ILibraryManager LibraryManager; - protected MetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager) + protected MetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) { ServerConfigurationManager = serverConfigurationManager; Logger = logger; @@ -33,6 +34,7 @@ namespace MediaBrowser.Providers.Manager ProviderRepo = providerRepo; FileSystem = fileSystem; UserDataManager = userDataManager; + LibraryManager = libraryManager; } /// <summary> @@ -118,6 +120,11 @@ namespace MediaBrowser.Providers.Manager refreshResult.AddStatus(ProviderRefreshStatus.Failure, ex.Message); } + var metadataResult = new MetadataResult<TItemType> + { + Item = itemOfType + }; + // Next run metadata providers if (refreshOptions.MetadataRefreshMode != MetadataRefreshMode.None) { @@ -136,7 +143,7 @@ namespace MediaBrowser.Providers.Manager { var id = await CreateInitialLookupInfo(itemOfType, cancellationToken).ConfigureAwait(false); - var result = await RefreshWithProviders(itemOfType, id, refreshOptions, providers, itemImageProvider, cancellationToken).ConfigureAwait(false); + var result = await RefreshWithProviders(metadataResult, id, refreshOptions, providers, itemImageProvider, cancellationToken).ConfigureAwait(false); updateType = updateType | result.UpdateType; refreshResult.AddStatus(result.Status, result.ErrorMessage); @@ -174,7 +181,7 @@ namespace MediaBrowser.Providers.Manager } // Save to database - await SaveItem(itemOfType, updateType, cancellationToken); + await SaveItem(metadataResult, updateType, cancellationToken).ConfigureAwait(false); } if (updateType > ItemUpdateType.None || refreshResult.IsDirty) @@ -321,9 +328,14 @@ namespace MediaBrowser.Providers.Manager return providers; } - protected Task SaveItem(TItemType item, ItemUpdateType reason, CancellationToken cancellationToken) + protected async Task SaveItem(MetadataResult<TItemType> result, ItemUpdateType reason, CancellationToken cancellationToken) { - return item.UpdateToRepository(reason, cancellationToken); + await result.Item.UpdateToRepository(reason, cancellationToken).ConfigureAwait(false); + + if (result.Item.SupportsPeople) + { + await LibraryManager.UpdatePeople(result.Item as BaseItem, result.People); + } } public bool CanRefresh(IHasMetadata item) @@ -331,7 +343,7 @@ namespace MediaBrowser.Providers.Manager return item is TItemType; } - protected virtual async Task<RefreshResult> RefreshWithProviders(TItemType item, + protected virtual async Task<RefreshResult> RefreshWithProviders(MetadataResult<TItemType> metadata, TIdType id, MetadataRefreshOptions options, List<IMetadataProvider> providers, @@ -344,6 +356,8 @@ namespace MediaBrowser.Providers.Manager Providers = providers.Select(i => i.GetType().FullName.GetMD5()).ToList() }; + var item = metadata.Item; + var customProviders = providers.OfType<ICustomMetadataProvider<TItemType>>().ToList(); var logName = item.LocationType == LocationType.Remote ? item.Name ?? item.Path : item.Path ?? item.Name; @@ -352,11 +366,16 @@ namespace MediaBrowser.Providers.Manager await RunCustomProvider(provider, item, logName, options, refreshResult, cancellationToken).ConfigureAwait(false); } - var temp = CreateNew(); - temp.Path = item.Path; + var temp = new MetadataResult<TItemType> + { + Item = CreateNew() + }; + temp.Item.Path = item.Path; var successfulProviderCount = 0; var failedProviderCount = 0; + var userDataList = new List<UserItemData>(); + // If replacing all metadata, run internet providers first if (options.ReplaceAllMetadata) { @@ -371,7 +390,6 @@ namespace MediaBrowser.Providers.Manager } var hasLocalMetadata = false; - var userDataList = new List<UserItemData>(); foreach (var provider in providers.OfType<ILocalMetadataProvider<TItemType>>().ToList()) { @@ -393,7 +411,7 @@ namespace MediaBrowser.Providers.Manager userDataList = localItem.UserDataLIst; - MergeData(localItem.Item, temp, new List<MetadataFields>(), !options.ReplaceAllMetadata, true); + MergeData(localItem, temp, new List<MetadataFields>(), !options.ReplaceAllMetadata, true); refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataImport; // Only one local provider allowed per item @@ -452,10 +470,10 @@ namespace MediaBrowser.Providers.Manager if (!hasLocalMetadata) { // TODO: If the new metadata from above has some blank data, this can cause old data to get filled into those empty fields - MergeData(item, temp, new List<MetadataFields>(), false, true); + MergeData(metadata, temp, new List<MetadataFields>(), false, true); } - MergeData(temp, item, item.LockedFields, true, true); + MergeData(temp, metadata, item.LockedFields, true, true); } } @@ -526,7 +544,7 @@ namespace MediaBrowser.Providers.Manager return new TItemType(); } - private async Task<RefreshResult> ExecuteRemoteProviders(TItemType temp, string logName, TIdType id, IEnumerable<IRemoteMetadataProvider<TItemType, TIdType>> providers, CancellationToken cancellationToken) + private async Task<RefreshResult> ExecuteRemoteProviders(MetadataResult<TItemType> temp, string logName, TIdType id, IEnumerable<IRemoteMetadataProvider<TItemType, TIdType>> providers, CancellationToken cancellationToken) { var refreshResult = new RefreshResult(); @@ -537,7 +555,7 @@ namespace MediaBrowser.Providers.Manager if (id != null) { - MergeNewData(temp, id); + MergeNewData(temp.Item, id); } try @@ -548,7 +566,7 @@ namespace MediaBrowser.Providers.Manager { NormalizeRemoteResult(result.Item); - MergeData(result.Item, temp, new List<MetadataFields>(), false, false); + MergeData(result, temp, new List<MetadataFields>(), false, false); refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataDownload; @@ -624,8 +642,8 @@ namespace MediaBrowser.Providers.Manager } } - protected abstract void MergeData(TItemType source, - TItemType target, + protected abstract void MergeData(MetadataResult<TItemType> source, + MetadataResult<TItemType> target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings); diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index 01a89bf26..14009a94f 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -150,6 +150,11 @@ namespace MediaBrowser.Providers.Manager public Task SaveImage(IHasImages item, string source, string mimeType, ImageType type, int? imageIndex, string internalCacheKey, CancellationToken cancellationToken) { + if (string.IsNullOrWhiteSpace(source)) + { + throw new ArgumentNullException("source"); + } + var fileStream = _fileSystem.GetFileStream(source, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true); return new ImageSaver(ConfigurationManager, _libraryMonitor, _fileSystem, _logger).SaveImage(item, fileStream, mimeType, type, imageIndex, internalCacheKey, cancellationToken); @@ -480,12 +485,11 @@ namespace MediaBrowser.Providers.Manager // Give it a dummy path just so that it looks like a file system item var dummy = new T() { - Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy"), - - // Dummy this up to fool the local trailer check - Parent = new Folder() + Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy") }; + dummy.SetParent(new Folder()); + var options = GetMetadataOptions(dummy); var summary = new MetadataPluginSummary @@ -722,12 +726,11 @@ namespace MediaBrowser.Providers.Manager // Give it a dummy path just so that it looks like a file system item var dummy = new TItemType { - Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy"), - - // Dummy this up to fool the local trailer check - Parent = new Folder() + Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy") }; + dummy.SetParent(new Folder()); + var options = GetMetadataOptions(dummy); var providers = GetMetadataProvidersInternal<TItemType>(dummy, options, searchInfo.IncludeDisabledProviders) diff --git a/MediaBrowser.Providers/Manager/ProviderUtils.cs b/MediaBrowser.Providers/Manager/ProviderUtils.cs index 1c526b4db..a0a0493d5 100644 --- a/MediaBrowser.Providers/Manager/ProviderUtils.cs +++ b/MediaBrowser.Providers/Manager/ProviderUtils.cs @@ -1,5 +1,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; @@ -8,12 +9,16 @@ namespace MediaBrowser.Providers.Manager { public static class ProviderUtils { - public static void MergeBaseItemData(BaseItem source, - BaseItem target, + public static void MergeBaseItemData<T>(MetadataResult<T> sourceResult, + MetadataResult<T> targetResult, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings) + where T : BaseItem { + var source = sourceResult.Item; + var target = targetResult.Item; + if (source == null) { throw new ArgumentNullException("source"); @@ -100,9 +105,9 @@ namespace MediaBrowser.Providers.Manager if (!lockedFields.Contains(MetadataFields.Cast)) { - if (replaceData || target.People.Count == 0) + if (replaceData || targetResult.People.Count == 0) { - target.People = source.People; + targetResult.People = sourceResult.People; } } |
