aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/Manager/MetadataService.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Providers/Manager/MetadataService.cs')
-rw-r--r--MediaBrowser.Providers/Manager/MetadataService.cs446
1 files changed, 303 insertions, 143 deletions
diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs
index 4e72240f2..57711d3b6 100644
--- a/MediaBrowser.Providers/Manager/MetadataService.cs
+++ b/MediaBrowser.Providers/Manager/MetadataService.cs
@@ -18,7 +18,7 @@ using MediaBrowser.Providers.MediaInfo;
namespace MediaBrowser.Providers.Manager
{
public abstract class MetadataService<TItemType, TIdType> : IMetadataService
- where TItemType : IHasMetadata, IHasLookupInfo<TIdType>, new()
+ where TItemType : BaseItem, IHasLookupInfo<TIdType>, new()
where TIdType : ItemLookupInfo, new()
{
protected readonly IServerConfigurationManager ServerConfigurationManager;
@@ -27,7 +27,6 @@ namespace MediaBrowser.Providers.Manager
protected readonly IFileSystem FileSystem;
protected readonly IUserDataManager UserDataManager;
protected readonly ILibraryManager LibraryManager;
- private readonly SubtitleResolver _subtitleResolver;
protected MetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager)
{
@@ -37,11 +36,22 @@ namespace MediaBrowser.Providers.Manager
FileSystem = fileSystem;
UserDataManager = userDataManager;
LibraryManager = libraryManager;
+ }
- _subtitleResolver = new SubtitleResolver(BaseItem.LocalizationManager, fileSystem);
+ private FileSystemMetadata TryGetFile(string path, IDirectoryService directoryService)
+ {
+ try
+ {
+ return directoryService.GetFile(path);
+ }
+ catch (Exception ex)
+ {
+ Logger.ErrorException("Error getting file {0}", ex, path);
+ return null;
+ }
}
- public async Task<ItemUpdateType> RefreshMetadata(IHasMetadata item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken)
+ public async Task<ItemUpdateType> RefreshMetadata(BaseItem item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken)
{
var itemOfType = (TItemType)item;
var config = ProviderManager.GetMetadataOptions(item);
@@ -49,46 +59,22 @@ namespace MediaBrowser.Providers.Manager
var updateType = ItemUpdateType.None;
var requiresRefresh = false;
- var libraryOptions = LibraryManager.GetLibraryOptions((BaseItem)item);
+ var libraryOptions = LibraryManager.GetLibraryOptions(item);
if (!requiresRefresh && libraryOptions.AutomaticRefreshIntervalDays > 0 && (DateTime.UtcNow - item.DateLastRefreshed).TotalDays >= libraryOptions.AutomaticRefreshIntervalDays)
{
requiresRefresh = true;
}
- DateTime? newDateModified = null;
- if (item.LocationType == LocationType.FileSystem)
- {
- var file = refreshOptions.DirectoryService.GetFile(item.Path);
- if (file != null)
- {
- newDateModified = file.LastWriteTimeUtc;
- if (item.EnableRefreshOnDateModifiedChange)
- {
- if (newDateModified != item.DateModified)
- {
- Logger.Debug("Date modified for {0}. Old date {1} new date {2} Id {3}", item.Path, item.DateModified, newDateModified, item.Id);
- requiresRefresh = true;
- }
- }
-
- if (!requiresRefresh && item.SupportsLocalMetadata)
- {
- var video = item as Video;
-
- if (video != null && !video.IsPlaceHolder)
- {
- requiresRefresh = !video.SubtitleFiles
- .SequenceEqual(_subtitleResolver.GetExternalSubtitleFiles(video, refreshOptions.DirectoryService, false), StringComparer.Ordinal);
- }
- }
- }
- }
-
if (!requiresRefresh && refreshOptions.MetadataRefreshMode != MetadataRefreshMode.None)
{
// TODO: If this returns true, should we instead just change metadata refresh mode to Full?
requiresRefresh = item.RequiresRefresh();
+
+ if (requiresRefresh)
+ {
+ Logger.Debug("Refreshing {0} {1} because item.RequiresRefresh() returned true", typeof(TItemType).Name, item.Path ?? item.Name);
+ }
}
var itemImageProvider = new ItemImageProvider(Logger, ProviderManager, ServerConfigurationManager, FileSystem);
@@ -108,7 +94,10 @@ namespace MediaBrowser.Providers.Manager
catch (Exception ex)
{
localImagesFailed = true;
- Logger.ErrorException("Error validating images for {0}", ex, item.Path ?? item.Name ?? "Unknown name");
+ if (!(item is IItemByName))
+ {
+ Logger.ErrorException("Error validating images for {0}", ex, item.Path ?? item.Name ?? "Unknown name");
+ }
}
var metadataResult = new MetadataResult<TItemType>
@@ -123,12 +112,12 @@ namespace MediaBrowser.Providers.Manager
// Next run metadata providers
if (refreshOptions.MetadataRefreshMode != MetadataRefreshMode.None)
{
- var providers = GetProviders(item, refreshOptions, isFirstRefresh, requiresRefresh)
+ var providers = GetProviders(item, libraryOptions, refreshOptions, isFirstRefresh, requiresRefresh)
.ToList();
if (providers.Count > 0 || isFirstRefresh || requiresRefresh)
{
- if (item.BeforeMetadataRefresh())
+ if (item.BeforeMetadataRefresh(refreshOptions.ReplaceAllMetadata))
{
updateType = updateType | ItemUpdateType.MetadataImport;
}
@@ -157,7 +146,7 @@ namespace MediaBrowser.Providers.Manager
}
// Next run remote image providers, but only if local image providers didn't throw an exception
- if (!localImagesFailed && refreshOptions.ImageRefreshMode != ImageRefreshMode.ValidationOnly)
+ if (!localImagesFailed && refreshOptions.ImageRefreshMode != MetadataRefreshMode.ValidationOnly)
{
var providers = GetNonLocalImageProviders(item, allImageProviders, refreshOptions).ToList();
@@ -173,17 +162,21 @@ namespace MediaBrowser.Providers.Manager
}
}
- var beforeSaveResult = BeforeSave(itemOfType, isFirstRefresh || refreshOptions.ReplaceAllMetadata || refreshOptions.MetadataRefreshMode == MetadataRefreshMode.FullRefresh || requiresRefresh, updateType);
+ var beforeSaveResult = BeforeSave(itemOfType, isFirstRefresh || refreshOptions.ReplaceAllMetadata || refreshOptions.MetadataRefreshMode == MetadataRefreshMode.FullRefresh || requiresRefresh || refreshOptions.ForceSave, updateType);
updateType = updateType | beforeSaveResult;
- if (newDateModified.HasValue)
- {
- item.DateModified = newDateModified.Value;
- }
-
// Save if changes were made, or it's never been saved before
if (refreshOptions.ForceSave || updateType > ItemUpdateType.None || isFirstRefresh || refreshOptions.ReplaceAllMetadata || requiresRefresh)
{
+ if (item.IsFileProtocol)
+ {
+ var file = TryGetFile(item.Path, refreshOptions.DirectoryService);
+ if (file != null)
+ {
+ item.DateModified = file.LastWriteTimeUtc;
+ }
+ }
+
// If any of these properties are set then make sure the updateType is not None, just to force everything to save
if (refreshOptions.ForceSave || refreshOptions.ReplaceAllMetadata)
{
@@ -200,7 +193,7 @@ namespace MediaBrowser.Providers.Manager
}
// Save to database
- await SaveItem(metadataResult, libraryOptions, updateType, cancellationToken).ConfigureAwait(false);
+ SaveItem(metadataResult, libraryOptions, updateType, cancellationToken);
}
await AfterMetadataRefresh(itemOfType, refreshOptions, cancellationToken).ConfigureAwait(false);
@@ -215,19 +208,19 @@ namespace MediaBrowser.Providers.Manager
lookupInfo.Year = result.ProductionYear;
}
- protected async Task SaveItem(MetadataResult<TItemType> result, LibraryOptions libraryOptions, ItemUpdateType reason, CancellationToken cancellationToken)
+ protected void SaveItem(MetadataResult<TItemType> result, LibraryOptions libraryOptions, ItemUpdateType reason, CancellationToken cancellationToken)
{
if (result.Item.SupportsPeople && result.People != null)
{
- var baseItem = result.Item as BaseItem;
+ var baseItem = result.Item;
LibraryManager.UpdatePeople(baseItem, result.People);
- await SavePeopleMetadata(result.People, libraryOptions, cancellationToken).ConfigureAwait(false);
+ SavePeopleMetadata(result.People, libraryOptions, cancellationToken);
}
result.Item.UpdateToRepository(reason, cancellationToken);
}
- private async Task SavePeopleMetadata(List<PersonInfo> people, LibraryOptions libraryOptions, CancellationToken cancellationToken)
+ private void SavePeopleMetadata(List<PersonInfo> people, LibraryOptions libraryOptions, CancellationToken cancellationToken)
{
foreach (var person in people)
{
@@ -250,7 +243,7 @@ namespace MediaBrowser.Providers.Manager
if (!string.IsNullOrWhiteSpace(person.ImageUrl) && !personEntity.HasImage(ImageType.Primary))
{
- await AddPersonImage(personEntity, libraryOptions, person.ImageUrl, cancellationToken).ConfigureAwait(false);
+ AddPersonImage(personEntity, libraryOptions, person.ImageUrl, cancellationToken);
saveEntity = true;
updateType = updateType | ItemUpdateType.ImageUpdate;
@@ -264,20 +257,20 @@ namespace MediaBrowser.Providers.Manager
}
}
- private async Task AddPersonImage(Person personEntity, LibraryOptions libraryOptions, string imageUrl, CancellationToken cancellationToken)
+ private void AddPersonImage(Person personEntity, LibraryOptions libraryOptions, string imageUrl, CancellationToken cancellationToken)
{
- if (libraryOptions.DownloadImagesInAdvance)
- {
- try
- {
- await ProviderManager.SaveImage(personEntity, imageUrl, ImageType.Primary, null, cancellationToken).ConfigureAwait(false);
- return;
- }
- catch (Exception ex)
- {
- Logger.ErrorException("Error in AddPersonImage", ex);
- }
- }
+ //if (libraryOptions.DownloadImagesInAdvance)
+ //{
+ // try
+ // {
+ // await ProviderManager.SaveImage(personEntity, imageUrl, ImageType.Primary, null, cancellationToken).ConfigureAwait(false);
+ // return;
+ // }
+ // catch (Exception ex)
+ // {
+ // Logger.ErrorException("Error in AddPersonImage", ex);
+ // }
+ //}
personEntity.SetImage(new ItemImageInfo
{
@@ -286,11 +279,10 @@ namespace MediaBrowser.Providers.Manager
}, 0);
}
- private readonly Task _cachedTask = Task.FromResult(true);
protected virtual Task AfterMetadataRefresh(TItemType item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken)
{
item.AfterMetadataRefresh();
- return _cachedTask;
+ return Task.CompletedTask;
}
/// <summary>
@@ -309,12 +301,17 @@ namespace MediaBrowser.Providers.Manager
return updateType;
}
- protected virtual ItemUpdateType BeforeSaveInternal(TItemType item, bool isFullRefresh, ItemUpdateType currentUpdateType)
+ protected virtual ItemUpdateType BeforeSaveInternal(TItemType item, bool isFullRefresh, ItemUpdateType updateType)
{
- var updateType = ItemUpdateType.None;
+ if (EnableUpdateMetadataFromChildren(item, isFullRefresh, updateType))
+ {
+ if (isFullRefresh || updateType > ItemUpdateType.None)
+ {
+ var children = GetChildrenForMetadataUpdates(item);
- updateType |= SaveCumulativeRunTimeTicks(item, isFullRefresh, currentUpdateType);
- updateType |= SaveDateLastMediaAdded(item, isFullRefresh, currentUpdateType);
+ updateType = UpdateMetadataFromChildren(item, children, isFullRefresh, updateType);
+ }
+ }
var presentationUniqueKey = item.CreatePresentationUniqueKey();
if (!string.Equals(item.PresentationUniqueKey, presentationUniqueKey, StringComparison.Ordinal))
@@ -326,42 +323,119 @@ namespace MediaBrowser.Providers.Manager
return updateType;
}
- private ItemUpdateType SaveCumulativeRunTimeTicks(TItemType item, bool isFullRefresh, ItemUpdateType currentUpdateType)
+ protected virtual bool EnableUpdateMetadataFromChildren(TItemType item, bool isFullRefresh, ItemUpdateType currentUpdateType)
+ {
+ if (isFullRefresh || currentUpdateType > ItemUpdateType.None)
+ {
+ if (EnableUpdatingPremiereDateFromChildren || EnableUpdatingGenresFromChildren || EnableUpdatingStudiosFromChildren || EnableUpdatingOfficialRatingFromChildren)
+ {
+ return true;
+ }
+ var folder = item as Folder;
+ if (folder != null)
+ {
+ return folder.SupportsDateLastMediaAdded || folder.SupportsCumulativeRunTimeTicks;
+ }
+ }
+
+ return false;
+ }
+
+ protected virtual IList<BaseItem> GetChildrenForMetadataUpdates(TItemType item)
+ {
+ var folder = item as Folder;
+ if (folder != null)
+ {
+ return folder.GetRecursiveChildren();
+ }
+
+ return new List<BaseItem>();
+ }
+
+ protected virtual ItemUpdateType UpdateMetadataFromChildren(TItemType item, IList<BaseItem> children, bool isFullRefresh, ItemUpdateType currentUpdateType)
{
var updateType = ItemUpdateType.None;
if (isFullRefresh || currentUpdateType > ItemUpdateType.None)
{
- var folder = item as Folder;
- if (folder != null && folder.SupportsCumulativeRunTimeTicks)
+ updateType |= UpdateCumulativeRunTimeTicks(item, children);
+ updateType |= UpdateDateLastMediaAdded(item, children);
+
+ if (EnableUpdatingPremiereDateFromChildren)
{
- var items = folder.GetRecursiveChildren(i => !i.IsFolder);
- var ticks = items.Select(i => i.RunTimeTicks ?? 0).Sum();
+ updateType |= UpdatePremiereDate(item, children);
+ }
+
+ if (EnableUpdatingGenresFromChildren)
+ {
+ updateType |= UpdateGenres(item, children);
+ }
+
+ if (EnableUpdatingStudiosFromChildren)
+ {
+ updateType |= UpdateStudios(item, children);
+ }
+
+ if (EnableUpdatingOfficialRatingFromChildren)
+ {
+ updateType |= UpdateOfficialRating(item, children);
+ }
+ }
- if (!folder.RunTimeTicks.HasValue || folder.RunTimeTicks.Value != ticks)
+ return updateType;
+ }
+
+ private ItemUpdateType UpdateCumulativeRunTimeTicks(TItemType item, IList<BaseItem> children)
+ {
+ var folder = item as Folder;
+ if (folder != null && folder.SupportsCumulativeRunTimeTicks)
+ {
+ long ticks = 0;
+
+ foreach (var child in children)
+ {
+ if (!child.IsFolder)
{
- folder.RunTimeTicks = ticks;
- updateType = ItemUpdateType.MetadataEdit;
+ ticks += (child.RunTimeTicks ?? 0);
}
}
+
+ if (!folder.RunTimeTicks.HasValue || folder.RunTimeTicks.Value != ticks)
+ {
+ folder.RunTimeTicks = ticks;
+ return ItemUpdateType.MetadataEdit;
+ }
}
- return updateType;
+ return ItemUpdateType.None;
}
- private ItemUpdateType SaveDateLastMediaAdded(TItemType item, bool isFullRefresh, ItemUpdateType currentUpdateType)
+ private ItemUpdateType UpdateDateLastMediaAdded(TItemType item, IList<BaseItem> children)
{
var updateType = ItemUpdateType.None;
var folder = item as Folder;
if (folder != null && folder.SupportsDateLastMediaAdded)
{
- var items = folder.GetRecursiveChildren(i => !i.IsFolder).Select(i => i.DateCreated).ToList();
- var date = items.Count == 0 ? (DateTime?)null : items.Max();
+ DateTime dateLastMediaAdded = DateTime.MinValue;
+ var any = false;
+
+ foreach (var child in children)
+ {
+ if (!child.IsFolder)
+ {
+ var childDateCreated = child.DateCreated;
+ if (childDateCreated > dateLastMediaAdded)
+ {
+ dateLastMediaAdded = childDateCreated;
+ }
+ any = true;
+ }
+ }
- if ((!folder.DateLastMediaAdded.HasValue && date.HasValue) || folder.DateLastMediaAdded != date)
+ if ((!folder.DateLastMediaAdded.HasValue && any) || folder.DateLastMediaAdded != dateLastMediaAdded)
{
- folder.DateLastMediaAdded = date;
+ folder.DateLastMediaAdded = dateLastMediaAdded;
updateType = ItemUpdateType.MetadataImport;
}
}
@@ -369,14 +443,138 @@ namespace MediaBrowser.Providers.Manager
return updateType;
}
+ protected virtual bool EnableUpdatingPremiereDateFromChildren
+ {
+ get
+ {
+ return false;
+ }
+ }
+ protected virtual bool EnableUpdatingGenresFromChildren
+ {
+ get
+ {
+ return false;
+ }
+ }
+ protected virtual bool EnableUpdatingStudiosFromChildren
+ {
+ get
+ {
+ return false;
+ }
+ }
+ protected virtual bool EnableUpdatingOfficialRatingFromChildren
+ {
+ get
+ {
+ return false;
+ }
+ }
+
+ private ItemUpdateType UpdatePremiereDate(TItemType item, IList<BaseItem> children)
+ {
+ var updateType = ItemUpdateType.None;
+
+ if (children.Count == 0)
+ {
+ return updateType;
+ }
+
+ var date = children.Select(i => i.PremiereDate ?? DateTime.MaxValue).Min();
+
+ var originalPremiereDate = item.PremiereDate;
+ var originalProductionYear = item.ProductionYear;
+
+ if (date > DateTime.MinValue && date < DateTime.MaxValue)
+ {
+ item.PremiereDate = date;
+ item.ProductionYear = date.Year;
+ }
+ else
+ {
+ var year = children.Select(i => i.ProductionYear ?? 0).Min();
+
+ if (year > 0)
+ {
+ item.ProductionYear = year;
+ }
+ }
+
+ if ((originalPremiereDate ?? DateTime.MinValue) != (item.PremiereDate ?? DateTime.MinValue) ||
+ (originalProductionYear ?? -1) != (item.ProductionYear ?? -1))
+ {
+ updateType = updateType | ItemUpdateType.MetadataEdit;
+ }
+
+ return updateType;
+ }
+
+ private ItemUpdateType UpdateGenres(TItemType item, IList<BaseItem> children)
+ {
+ var updateType = ItemUpdateType.None;
+
+ if (!item.LockedFields.Contains(MetadataFields.Genres))
+ {
+ var currentList = item.Genres;
+
+ item.Genres = children.SelectMany(i => i.Genres)
+ .Distinct(StringComparer.OrdinalIgnoreCase)
+ .ToArray();
+
+ if (currentList.Length != item.Genres.Length || !currentList.OrderBy(i => i).SequenceEqual(item.Genres.OrderBy(i => i), StringComparer.OrdinalIgnoreCase))
+ {
+ updateType = updateType | ItemUpdateType.MetadataEdit;
+ }
+ }
+
+ return updateType;
+ }
+
+ private ItemUpdateType UpdateStudios(TItemType item, IList<BaseItem> children)
+ {
+ var updateType = ItemUpdateType.None;
+
+ if (!item.LockedFields.Contains(MetadataFields.Studios))
+ {
+ var currentList = item.Studios;
+
+ item.Studios = children.SelectMany(i => i.Studios)
+ .Distinct(StringComparer.OrdinalIgnoreCase)
+ .ToArray();
+
+ if (currentList.Length != item.Studios.Length || !currentList.OrderBy(i => i).SequenceEqual(item.Studios.OrderBy(i => i), StringComparer.OrdinalIgnoreCase))
+ {
+ updateType = updateType | ItemUpdateType.MetadataEdit;
+ }
+ }
+
+ return updateType;
+ }
+
+ private ItemUpdateType UpdateOfficialRating(TItemType item, IList<BaseItem> children)
+ {
+ var updateType = ItemUpdateType.None;
+
+ if (!item.LockedFields.Contains(MetadataFields.OfficialRating))
+ {
+ if (item.UpdateRatingToItems(children))
+ {
+ updateType = updateType | ItemUpdateType.MetadataEdit;
+ }
+ }
+
+ return updateType;
+ }
+
/// <summary>
/// Gets the providers.
/// </summary>
/// <returns>IEnumerable{`0}.</returns>
- protected IEnumerable<IMetadataProvider> GetProviders(IHasMetadata item, MetadataRefreshOptions options, bool isFirstRefresh, bool requiresRefresh)
+ protected IEnumerable<IMetadataProvider> GetProviders(BaseItem item, LibraryOptions libraryOptions, MetadataRefreshOptions options, bool isFirstRefresh, bool requiresRefresh)
{
// Get providers to refresh
- var providers = ((ProviderManager)ProviderManager).GetMetadataProviders<TItemType>(item).ToList();
+ var providers = ((ProviderManager)ProviderManager).GetMetadataProviders<TItemType>(item, libraryOptions).ToList();
var metadataRefreshMode = options.MetadataRefreshMode;
@@ -410,12 +608,18 @@ namespace MediaBrowser.Providers.Manager
var anyRemoteProvidersChanged = providersWithChanges.OfType<IRemoteMetadataProvider>()
.Any();
+ var anyLocalProvidersChanged = providersWithChanges.OfType<ILocalMetadataProvider>()
+ .Any();
+
+ var anyLocalPreRefreshProvidersChanged = providersWithChanges.OfType<IPreRefreshProvider>()
+ .Any();
+
providers = providers.Where(i =>
{
// If any provider reports a change, always run local ones as well
if (i is ILocalMetadataProvider)
{
- return true;
+ return anyRemoteProvidersChanged || anyLocalProvidersChanged || anyLocalPreRefreshProvidersChanged;
}
// If any remote providers changed, run them all so that priorities can be honored
@@ -429,7 +633,7 @@ namespace MediaBrowser.Providers.Manager
return anyRemoteProvidersChanged;
}
- // Run custom providers if they report a change or any remote providers change
+ // Run custom refresh providers if they report a change or any remote providers change
return anyRemoteProvidersChanged || providersWithChanges.Contains(i);
}).ToList();
@@ -439,7 +643,7 @@ namespace MediaBrowser.Providers.Manager
return providers;
}
- protected virtual IEnumerable<IImageProvider> GetNonLocalImageProviders(IHasMetadata item, IEnumerable<IImageProvider> allImageProviders, ImageRefreshOptions options)
+ protected virtual IEnumerable<IImageProvider> GetNonLocalImageProviders(BaseItem item, IEnumerable<IImageProvider> allImageProviders, ImageRefreshOptions options)
{
// Get providers to refresh
var providers = allImageProviders.Where(i => !(i is ILocalImageProvider)).ToList();
@@ -447,7 +651,7 @@ namespace MediaBrowser.Providers.Manager
var dateLastImageRefresh = item.DateLastRefreshed;
// Run all if either of these flags are true
- var runAllProviders = options.ImageRefreshMode == ImageRefreshMode.FullRefresh || dateLastImageRefresh == default(DateTime);
+ var runAllProviders = options.ImageRefreshMode == MetadataRefreshMode.FullRefresh || dateLastImageRefresh == default(DateTime);
if (!runAllProviders)
{
@@ -468,7 +672,7 @@ namespace MediaBrowser.Providers.Manager
return providers;
}
- public bool CanRefresh(IHasMetadata item)
+ public bool CanRefresh(BaseItem item)
{
return item is TItemType;
}
@@ -487,14 +691,13 @@ namespace MediaBrowser.Providers.Manager
{
var refreshResult = new RefreshResult
{
- UpdateType = ItemUpdateType.None,
- Providers = providers.Select(i => i.GetType().FullName.GetMD5()).ToList()
+ UpdateType = ItemUpdateType.None
};
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;
+ var logName = !item.IsFileProtocol ? item.Name ?? item.Path : item.Path ?? item.Name;
foreach (var provider in customProviders.Where(i => i is IPreRefreshProvider))
{
@@ -606,7 +809,7 @@ namespace MediaBrowser.Providers.Manager
await RunCustomProvider(provider, item, logName, options, refreshResult, cancellationToken).ConfigureAwait(false);
}
- ImportUserData(item, userDataList, cancellationToken);
+ //ImportUserData(item, userDataList, cancellationToken);
return refreshResult;
}
@@ -621,19 +824,6 @@ namespace MediaBrowser.Providers.Manager
return true;
}
- private void ImportUserData(TItemType item, List<UserItemData> userDataList, CancellationToken cancellationToken)
- {
- var hasUserData = item as IHasUserData;
-
- if (hasUserData != null)
- {
- foreach (var userData in userDataList)
- {
- UserDataManager.SaveUserData(userData.UserId, hasUserData, userData, UserDataSaveReason.Import, cancellationToken);
- }
- }
- }
-
private async Task RunCustomProvider(ICustomMetadataProvider<TItemType> provider, TItemType item, string logName, MetadataRefreshOptions options, RefreshResult refreshResult, CancellationToken cancellationToken)
{
Logger.Debug("Running {0} for {1}", provider.GetType().Name, logName);
@@ -662,16 +852,17 @@ namespace MediaBrowser.Providers.Manager
{
var refreshResult = new RefreshResult();
- var results = new List<MetadataResult<TItemType>>();
+ var tmpDataMerged = false;
foreach (var provider in providers)
{
var providerName = provider.GetType().Name;
Logger.Debug("Running {0} for {1}", providerName, logName);
- if (id != null)
+ if (id != null && !tmpDataMerged)
{
MergeNewData(temp.Item, id);
+ tmpDataMerged = true;
}
try
@@ -682,7 +873,8 @@ namespace MediaBrowser.Providers.Manager
{
result.Provider = provider.Name;
- results.Add(result);
+ MergeData(result, temp, new MetadataFields[] { }, false, false);
+ MergeNewData(temp.Item, id);
refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataDownload;
}
@@ -703,37 +895,6 @@ namespace MediaBrowser.Providers.Manager
}
}
- var orderedResults = new List<MetadataResult<TItemType>>();
- var preferredLanguage = NormalizeLanguage(id.MetadataLanguage);
-
- // prioritize results with matching ResultLanguage
- foreach (var result in results)
- {
- if (!result.QueriedById)
- {
- break;
- }
-
- if (string.Equals(NormalizeLanguage(result.ResultLanguage), preferredLanguage, StringComparison.OrdinalIgnoreCase) && result.QueriedById)
- {
- orderedResults.Add(result);
- }
- }
-
- // add all other results
- foreach (var result in results)
- {
- if (!orderedResults.Contains(result))
- {
- orderedResults.Add(result);
- }
- }
-
- foreach (var result in results)
- {
- MergeData(result, temp, new MetadataFields[] { }, false, false);
- }
-
return refreshResult;
}
@@ -775,7 +936,7 @@ namespace MediaBrowser.Providers.Manager
}
}
- private bool HasChanged(IHasMetadata item, IHasItemChangeMonitor changeMonitor, IDirectoryService directoryService)
+ private bool HasChanged(BaseItem item, IHasItemChangeMonitor changeMonitor, IDirectoryService directoryService)
{
try
{
@@ -800,7 +961,6 @@ namespace MediaBrowser.Providers.Manager
{
public ItemUpdateType UpdateType { get; set; }
public string ErrorMessage { get; set; }
- public List<Guid> Providers { get; set; }
public int Failures { get; set; }
}
}