aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/Manager
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Providers/Manager')
-rw-r--r--MediaBrowser.Providers/Manager/ImageSaver.cs21
-rw-r--r--MediaBrowser.Providers/Manager/ItemImageProvider.cs4
-rw-r--r--MediaBrowser.Providers/Manager/MetadataService.cs16
-rw-r--r--MediaBrowser.Providers/Manager/ProviderManager.cs196
4 files changed, 41 insertions, 196 deletions
diff --git a/MediaBrowser.Providers/Manager/ImageSaver.cs b/MediaBrowser.Providers/Manager/ImageSaver.cs
index 52aaf412a6..2a4ef75970 100644
--- a/MediaBrowser.Providers/Manager/ImageSaver.cs
+++ b/MediaBrowser.Providers/Manager/ImageSaver.cs
@@ -379,14 +379,19 @@ namespace MediaBrowser.Providers.Manager
if (saveLocally)
{
- if (item.IsInMixedFolder && !(item is Episode))
+ if (item is Episode)
+ {
+ path = Path.Combine(Path.GetDirectoryName(item.Path), "metadata", filename + extension);
+ }
+
+ else if (item.IsInMixedFolder)
{
path = GetSavePathForItemInMixedFolder(item, type, filename, extension);
}
if (string.IsNullOrEmpty(path))
{
- path = Path.Combine(item.MetaLocation, filename + extension);
+ path = Path.Combine(item.ContainingFolderPath, filename + extension);
}
}
@@ -468,7 +473,7 @@ namespace MediaBrowser.Providers.Manager
return new[]
{
- Path.Combine(item.MetaLocation, "fanart" + extension)
+ Path.Combine(item.ContainingFolderPath, "fanart" + extension)
};
}
@@ -483,8 +488,8 @@ namespace MediaBrowser.Providers.Manager
return new[]
{
- Path.Combine(item.MetaLocation, "extrafanart", extraFanartFilename + extension),
- Path.Combine(item.MetaLocation, "extrathumbs", "thumb" + outputIndex.ToString(UsCulture) + extension)
+ Path.Combine(item.ContainingFolderPath, "extrafanart", extraFanartFilename + extension),
+ Path.Combine(item.ContainingFolderPath, "extrathumbs", "thumb" + outputIndex.ToString(UsCulture) + extension)
};
}
@@ -519,10 +524,10 @@ namespace MediaBrowser.Providers.Manager
if (item is MusicAlbum || item is MusicArtist)
{
- return new[] { Path.Combine(item.MetaLocation, "folder" + extension) };
+ return new[] { Path.Combine(item.ContainingFolderPath, "folder" + extension) };
}
- return new[] { Path.Combine(item.MetaLocation, "poster" + extension) };
+ return new[] { Path.Combine(item.ContainingFolderPath, "poster" + extension) };
}
if (type == ImageType.Banner)
@@ -561,7 +566,7 @@ namespace MediaBrowser.Providers.Manager
return new[] { GetSavePathForItemInMixedFolder(item, type, "landscape", extension) };
}
- return new[] { Path.Combine(item.MetaLocation, "landscape" + extension) };
+ return new[] { Path.Combine(item.ContainingFolderPath, "landscape" + extension) };
}
// All other paths are the same
diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs
index 3fb1e7074b..f2fa4dc294 100644
--- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs
+++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs
@@ -93,8 +93,6 @@ namespace MediaBrowser.Providers.Manager
/// <returns>Task.</returns>
private async Task RefreshFromProvider(IHasImages item, IDynamicImageProvider provider, MetadataOptions savedOptions, RefreshResult result, CancellationToken cancellationToken)
{
- _logger.Debug("Running {0} for {1}", provider.GetType().Name, item.Path ?? item.Name);
-
try
{
var images = provider.GetSupportedImages(item);
@@ -103,6 +101,8 @@ namespace MediaBrowser.Providers.Manager
{
if (!item.HasImage(imageType) && savedOptions.IsEnabled(imageType))
{
+ _logger.Debug("Running {0} for {1}", provider.GetType().Name, item.Path ?? item.Name);
+
var response = await provider.GetImage(item, imageType, cancellationToken).ConfigureAwait(false);
if (response.HasImage)
diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs
index c817180c51..e0272bc7bc 100644
--- a/MediaBrowser.Providers/Manager/MetadataService.cs
+++ b/MediaBrowser.Providers/Manager/MetadataService.cs
@@ -88,12 +88,16 @@ namespace MediaBrowser.Providers.Manager
// Next run metadata providers
if (refreshOptions.MetadataRefreshMode != MetadataRefreshMode.None)
{
- updateType = updateType | BeforeMetadataRefresh(itemOfType);
-
var providers = GetProviders(item, refreshResult.DateLastMetadataRefresh.HasValue, refreshOptions).ToList();
+ if (providers.Count > 0 || !refreshResult.DateLastMetadataRefresh.HasValue)
+ {
+ updateType = updateType | BeforeMetadataRefresh(itemOfType);
+ }
+
if (providers.Count > 0)
{
+
var result = await RefreshWithProviders(itemOfType, refreshOptions, providers, cancellationToken).ConfigureAwait(false);
updateType = updateType | result.UpdateType;
@@ -145,7 +149,7 @@ namespace MediaBrowser.Providers.Manager
{
var type = item.GetType().Name;
return ServerConfigurationManager.Configuration.MetadataOptions
- .FirstOrDefault(i => string.Equals(i.ItemType, type, StringComparison.OrdinalIgnoreCase)) ??
+ .FirstOrDefault(i => string.Equals(i.ItemType, type, StringComparison.OrdinalIgnoreCase)) ??
_defaultOptions;
}
@@ -278,9 +282,11 @@ namespace MediaBrowser.Providers.Manager
{
Logger.Debug("Running {0} for {1}", provider.GetType().Name, item.Path ?? item.Name);
+ var itemInfo = new ItemInfo { Path = item.Path, IsInMixedFolder = item.IsInMixedFolder };
+
try
{
- var localItem = await provider.GetMetadata(item.Path, cancellationToken).ConfigureAwait(false);
+ var localItem = await provider.GetMetadata(itemInfo, cancellationToken).ConfigureAwait(false);
if (localItem.HasMetadata)
{
@@ -327,7 +333,7 @@ namespace MediaBrowser.Providers.Manager
{
await RunCustomProvider(provider, item, refreshResult, cancellationToken).ConfigureAwait(false);
}
-
+
return refreshResult;
}
diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs
index dbfc97d517..030b3cbd90 100644
--- a/MediaBrowser.Providers/Manager/ProviderManager.cs
+++ b/MediaBrowser.Providers/Manager/ProviderManager.cs
@@ -48,12 +48,6 @@ namespace MediaBrowser.Providers.Manager
/// <value>The configuration manager.</value>
private IServerConfigurationManager ConfigurationManager { get; set; }
- /// <summary>
- /// Gets the list of currently registered metadata prvoiders
- /// </summary>
- /// <value>The metadata providers enumerable.</value>
- private BaseMetadataProvider[] MetadataProviders { get; set; }
-
private IImageProvider[] ImageProviders { get; set; }
private readonly IFileSystem _fileSystem;
@@ -86,15 +80,12 @@ namespace MediaBrowser.Providers.Manager
/// <summary>
/// Adds the metadata providers.
/// </summary>
- /// <param name="providers">The providers.</param>
/// <param name="imageProviders">The image providers.</param>
/// <param name="metadataServices">The metadata services.</param>
/// <param name="metadataProviders">The metadata providers.</param>
/// <param name="metadataSavers">The metadata savers.</param>
- public void AddParts(IEnumerable<BaseMetadataProvider> providers, IEnumerable<IImageProvider> imageProviders, IEnumerable<IMetadataService> metadataServices, IEnumerable<IMetadataProvider> metadataProviders, IEnumerable<IMetadataSaver> metadataSavers)
+ public void AddParts(IEnumerable<IImageProvider> imageProviders, IEnumerable<IMetadataService> metadataServices, IEnumerable<IMetadataProvider> metadataProviders, IEnumerable<IMetadataSaver> metadataSavers)
{
- MetadataProviders = providers.OrderBy(e => e.Priority).ToArray();
-
ImageProviders = imageProviders.ToArray();
_metadataServices = metadataServices.OrderBy(i => i.Order).ToArray();
@@ -111,174 +102,8 @@ namespace MediaBrowser.Providers.Manager
return service.RefreshMetadata(item, options, cancellationToken);
}
- return ((BaseItem)item).RefreshMetadataDirect(cancellationToken, options.ForceSave, options.ReplaceAllMetadata);
- }
-
- /// <summary>
- /// Runs all metadata providers for an entity, and returns true or false indicating if at least one was refreshed and requires persistence
- /// </summary>
- /// <param name="item">The item.</param>
- /// <param name="cancellationToken">The cancellation token.</param>
- /// <param name="force">if set to <c>true</c> [force].</param>
- /// <returns>Task{System.Boolean}.</returns>
- /// <exception cref="System.ArgumentNullException">item</exception>
- public async Task<ItemUpdateType?> ExecuteMetadataProviders(BaseItem item, CancellationToken cancellationToken, bool force = false)
- {
- if (item == null)
- {
- throw new ArgumentNullException("item");
- }
-
- ItemUpdateType? result = null;
-
- cancellationToken.ThrowIfCancellationRequested();
-
- var enableInternetProviders = ConfigurationManager.Configuration.EnableInternetProviders;
-
- var providerHistories = item.DateLastSaved == default(DateTime) ?
- new List<BaseProviderInfo>() :
- _providerRepo.GetProviderHistory(item.Id).ToList();
-
- // Run the normal providers sequentially in order of priority
- foreach (var provider in MetadataProviders)
- {
- cancellationToken.ThrowIfCancellationRequested();
-
- if (!ProviderSupportsItem(provider, item))
- {
- continue;
- }
-
- // Skip if internet providers are currently disabled
- if (provider.RequiresInternet && !enableInternetProviders)
- {
- continue;
- }
-
- // Put this check below the await because the needs refresh of the next tier of providers may depend on the previous ones running
- // This is the case for the fan art provider which depends on the movie and tv providers having run before them
- if (provider.RequiresInternet && item.DontFetchMeta && provider.EnforceDontFetchMetadata)
- {
- continue;
- }
-
- var providerInfo = providerHistories.FirstOrDefault(i => i.ProviderId == provider.Id);
-
- if (providerInfo == null)
- {
- providerInfo = new BaseProviderInfo
- {
- ProviderId = provider.Id
- };
- providerHistories.Add(providerInfo);
- }
-
- try
- {
- if (!force && !provider.NeedsRefresh(item, providerInfo))
- {
- continue;
- }
- }
- catch (Exception ex)
- {
- _logger.Error("Error determining NeedsRefresh for {0}", ex, item.Path);
- }
-
- var updateType = await FetchAsync(provider, item, providerInfo, force, cancellationToken).ConfigureAwait(false);
-
- if (updateType.HasValue)
- {
- if (result.HasValue)
- {
- result = result.Value | updateType.Value;
- }
- else
- {
- result = updateType;
- }
- }
- }
-
- if (result.HasValue || force)
- {
- await _providerRepo.SaveProviderHistory(item.Id, providerHistories, cancellationToken);
- }
-
- return result;
- }
-
- /// <summary>
- /// Providers the supports item.
- /// </summary>
- /// <param name="provider">The provider.</param>
- /// <param name="item">The item.</param>
- /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
- private bool ProviderSupportsItem(BaseMetadataProvider provider, BaseItem item)
- {
- try
- {
- return provider.Supports(item);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("{0} failed in Supports for type {1}", ex, provider.GetType().Name, item.GetType().Name);
- return false;
- }
- }
-
- /// <summary>
- /// Fetches metadata and returns true or false indicating if any work that requires persistence was done
- /// </summary>
- /// <param name="provider">The provider.</param>
- /// <param name="item">The item.</param>
- /// <param name="providerInfo">The provider information.</param>
- /// <param name="force">if set to <c>true</c> [force].</param>
- /// <param name="cancellationToken">The cancellation token.</param>
- /// <returns>Task{System.Boolean}.</returns>
- /// <exception cref="System.ArgumentNullException">item</exception>
- private async Task<ItemUpdateType?> FetchAsync(BaseMetadataProvider provider, BaseItem item, BaseProviderInfo providerInfo, bool force, CancellationToken cancellationToken)
- {
- if (item == null)
- {
- throw new ArgumentNullException("item");
- }
-
- cancellationToken.ThrowIfCancellationRequested();
-
- _logger.Debug("Running {0} for {1}", provider.GetType().Name, item.Path ?? item.Name ?? "--Unknown--");
-
- try
- {
- var changed = await provider.FetchAsync(item, force, providerInfo, cancellationToken).ConfigureAwait(false);
-
- if (changed)
- {
- return provider.ItemUpdateType;
- }
-
- return null;
- }
- catch (OperationCanceledException ex)
- {
- _logger.Debug("{0} canceled for {1}", provider.GetType().Name, item.Name);
-
- // If the outer cancellation token is the one that caused the cancellation, throw it
- if (cancellationToken.IsCancellationRequested && ex.CancellationToken == cancellationToken)
- {
- throw;
- }
-
- return null;
- }
- catch (Exception ex)
- {
- _logger.ErrorException("{0} failed refreshing {1} {2}", ex, provider.GetType().Name, item.Name, item.Path ?? string.Empty);
-
- provider.SetLastRefreshed(item, DateTime.UtcNow, providerInfo, ProviderRefreshStatus.Failure);
-
- return ItemUpdateType.Unspecified;
- }
+ _logger.Error("Unable to find a metadata service for item of type " + item.GetType().Name);
+ return Task.FromResult(true);
}
/// <summary>
@@ -328,9 +153,6 @@ namespace MediaBrowser.Providers.Manager
await dataToSave.CopyToAsync(fs, StreamDefaults.DefaultCopyToBufferSize, cancellationToken).ConfigureAwait(false);
}
}
-
- // If this is ever used for something other than metadata we can add a file type param
- item.ResolveArgs.AddMetadataFile(path);
}
finally
{
@@ -517,6 +339,15 @@ namespace MediaBrowser.Providers.Manager
return false;
}
+ // If this restriction is ever lifted, movie xml providers will have to be updated to prevent owned items like trailers from reading those files
+ if (item.IsOwnedItem)
+ {
+ if (provider is ILocalMetadataProvider || provider is IRemoteMetadataProvider)
+ {
+ return false;
+ }
+ }
+
return true;
}
@@ -581,6 +412,7 @@ namespace MediaBrowser.Providers.Manager
list.Add(GetPluginSummary<AdultVideo>());
list.Add(GetPluginSummary<MusicVideo>());
+ list.Add(GetPluginSummary<Video>());
list.Add(GetPluginSummary<LiveTvChannel>());
list.Add(GetPluginSummary<LiveTvProgram>());
@@ -678,6 +510,8 @@ namespace MediaBrowser.Providers.Manager
{
foreach (var saver in _savers.Where(i => i.IsEnabledFor(item, updateType)))
{
+ _logger.Debug("Saving {0} to {1}.", item.Path ?? item.Name, saver.Name);
+
var fileSaver = saver as IMetadataFileSaver;
if (fileSaver != null)