|
|
|
@ -1,5 +1,3 @@
|
|
|
|
|
#nullable disable
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Concurrent;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
@ -47,7 +45,7 @@ namespace MediaBrowser.Providers.Manager
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class ProviderManager : IProviderManager, IDisposable
|
|
|
|
|
{
|
|
|
|
|
private readonly object _refreshQueueLock = new object();
|
|
|
|
|
private readonly object _refreshQueueLock = new ();
|
|
|
|
|
private readonly ILogger<ProviderManager> _logger;
|
|
|
|
|
private readonly IHttpClientFactory _httpClientFactory;
|
|
|
|
|
private readonly ILibraryMonitor _libraryMonitor;
|
|
|
|
@ -57,11 +55,11 @@ namespace MediaBrowser.Providers.Manager
|
|
|
|
|
private readonly ISubtitleManager _subtitleManager;
|
|
|
|
|
private readonly IServerConfigurationManager _configurationManager;
|
|
|
|
|
private readonly IBaseItemManager _baseItemManager;
|
|
|
|
|
private readonly ConcurrentDictionary<Guid, double> _activeRefreshes = new ConcurrentDictionary<Guid, double>();
|
|
|
|
|
private readonly CancellationTokenSource _disposeCancellationTokenSource = new CancellationTokenSource();
|
|
|
|
|
private readonly SimplePriorityQueue<Tuple<Guid, MetadataRefreshOptions>> _refreshQueue =
|
|
|
|
|
new SimplePriorityQueue<Tuple<Guid, MetadataRefreshOptions>>();
|
|
|
|
|
private readonly ConcurrentDictionary<Guid, double> _activeRefreshes = new ();
|
|
|
|
|
private readonly CancellationTokenSource _disposeCancellationTokenSource = new ();
|
|
|
|
|
private readonly SimplePriorityQueue<Tuple<Guid, MetadataRefreshOptions>> _refreshQueue = new ();
|
|
|
|
|
|
|
|
|
|
private IImageProvider[] _imageProviders = Array.Empty<IImageProvider>();
|
|
|
|
|
private IMetadataService[] _metadataServices = Array.Empty<IMetadataService>();
|
|
|
|
|
private IMetadataProvider[] _metadataProviders = Array.Empty<IMetadataProvider>();
|
|
|
|
|
private IMetadataSaver[] _savers = Array.Empty<IMetadataSaver>();
|
|
|
|
@ -104,15 +102,13 @@ namespace MediaBrowser.Providers.Manager
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
|
public event EventHandler<GenericEventArgs<BaseItem>> RefreshStarted;
|
|
|
|
|
public event EventHandler<GenericEventArgs<BaseItem>>? RefreshStarted;
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
|
public event EventHandler<GenericEventArgs<BaseItem>> RefreshCompleted;
|
|
|
|
|
public event EventHandler<GenericEventArgs<BaseItem>>? RefreshCompleted;
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
|
public event EventHandler<GenericEventArgs<Tuple<BaseItem, double>>> RefreshProgress;
|
|
|
|
|
|
|
|
|
|
private IImageProvider[] ImageProviders { get; set; }
|
|
|
|
|
public event EventHandler<GenericEventArgs<Tuple<BaseItem, double>>>? RefreshProgress;
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
|
public void AddParts(
|
|
|
|
@ -122,8 +118,7 @@ namespace MediaBrowser.Providers.Manager
|
|
|
|
|
IEnumerable<IMetadataSaver> metadataSavers,
|
|
|
|
|
IEnumerable<IExternalId> externalIds)
|
|
|
|
|
{
|
|
|
|
|
ImageProviders = imageProviders.ToArray();
|
|
|
|
|
|
|
|
|
|
_imageProviders = imageProviders.ToArray();
|
|
|
|
|
_metadataServices = metadataServices.OrderBy(i => i.Order).ToArray();
|
|
|
|
|
_metadataProviders = metadataProviders.ToArray();
|
|
|
|
|
_externalIds = externalIds.OrderBy(i => i.ProviderName).ToArray();
|
|
|
|
@ -313,7 +308,7 @@ namespace MediaBrowser.Providers.Manager
|
|
|
|
|
var typeOptions = libraryOptions.GetTypeOptions(item.GetType().Name);
|
|
|
|
|
var fetcherOrder = typeOptions?.ImageFetcherOrder ?? options.ImageFetcherOrder;
|
|
|
|
|
|
|
|
|
|
return ImageProviders.Where(i => CanRefresh(i, item, libraryOptions, refreshOptions, includeDisabled))
|
|
|
|
|
return _imageProviders.Where(i => CanRefresh(i, item, libraryOptions, refreshOptions, includeDisabled))
|
|
|
|
|
.OrderBy(i => GetConfiguredOrder(fetcherOrder, i.Name))
|
|
|
|
|
.ThenBy(GetOrder);
|
|
|
|
|
}
|
|
|
|
@ -758,7 +753,7 @@ namespace MediaBrowser.Providers.Manager
|
|
|
|
|
where TItemType : BaseItem, new()
|
|
|
|
|
where TLookupType : ItemLookupInfo
|
|
|
|
|
{
|
|
|
|
|
BaseItem referenceItem = null;
|
|
|
|
|
BaseItem? referenceItem = null;
|
|
|
|
|
|
|
|
|
|
if (!searchInfo.ItemId.Equals(default))
|
|
|
|
|
{
|
|
|
|
@ -768,7 +763,7 @@ namespace MediaBrowser.Providers.Manager
|
|
|
|
|
return GetRemoteSearchResults<TItemType, TLookupType>(searchInfo, referenceItem, cancellationToken);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async Task<IEnumerable<RemoteSearchResult>> GetRemoteSearchResults<TItemType, TLookupType>(RemoteSearchQuery<TLookupType> searchInfo, BaseItem referenceItem, CancellationToken cancellationToken)
|
|
|
|
|
private async Task<IEnumerable<RemoteSearchResult>> GetRemoteSearchResults<TItemType, TLookupType>(RemoteSearchQuery<TLookupType> searchInfo, BaseItem? referenceItem, CancellationToken cancellationToken)
|
|
|
|
|
where TItemType : BaseItem, new()
|
|
|
|
|
where TLookupType : ItemLookupInfo
|
|
|
|
|
{
|
|
|
|
@ -930,7 +925,8 @@ namespace MediaBrowser.Providers.Manager
|
|
|
|
|
i.UrlFormatString,
|
|
|
|
|
value)
|
|
|
|
|
};
|
|
|
|
|
}).Where(i => i != null).Concat(item.GetRelatedUrls());
|
|
|
|
|
}).Where(i => i != null)
|
|
|
|
|
.Concat(item.GetRelatedUrls())!; // We just filtered out all the nulls
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
|