From 2e2a594e19038bc2fcea5fdbeda9d37e8394fff7 Mon Sep 17 00:00:00 2001
From: Joe Rogers <1337joe@gmail.com>
Date: Tue, 30 Nov 2021 23:53:34 +0100
Subject: Move Get*Providers definitions to interface
---
MediaBrowser.Controller/Providers/IProviderManager.cs | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
(limited to 'MediaBrowser.Controller')
diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs
index 44bc4a50cb..32a7951f62 100644
--- a/MediaBrowser.Controller/Providers/IProviderManager.cs
+++ b/MediaBrowser.Controller/Providers/IProviderManager.cs
@@ -131,6 +131,24 @@ namespace MediaBrowser.Controller.Providers
/// IEnumerable{ImageProviderInfo}.
IEnumerable GetRemoteImageProviderInfo(BaseItem item);
+ ///
+ /// Gets the image providers for the provided item.
+ ///
+ /// The item.
+ /// The image refresh options.
+ /// The image providers for the item.
+ IEnumerable GetImageProviders(BaseItem item, ImageRefreshOptions refreshOptions);
+
+ ///
+ /// Gets the metadata providers for the provided item.
+ ///
+ /// The item.
+ /// The library options.
+ /// The type of metadata provider.
+ /// The metadata providers.
+ IEnumerable> GetMetadataProviders(BaseItem item, LibraryOptions libraryOptions)
+ where T : BaseItem;
+
///
/// Gets all metadata plugins.
///
--
cgit v1.2.3
From a7c009e2eb3e21b7b5c07984866419bb8136423f Mon Sep 17 00:00:00 2001
From: Joe Rogers <1337joe@gmail.com>
Date: Sat, 18 Dec 2021 21:40:27 +0100
Subject: Pass TypeOptions instead of full LibraryOptions
---
.../BaseItemManager/BaseItemManager.cs | 14 ++++------
.../BaseItemManager/IBaseItemManager.cs | 8 +++---
MediaBrowser.Providers/Manager/ProviderManager.cs | 12 ++++----
.../BaseItemManagerTests.cs | 32 ++++++++--------------
.../Manager/ProviderManagerTests.cs | 6 ++--
5 files changed, 31 insertions(+), 41 deletions(-)
(limited to 'MediaBrowser.Controller')
diff --git a/MediaBrowser.Controller/BaseItemManager/BaseItemManager.cs b/MediaBrowser.Controller/BaseItemManager/BaseItemManager.cs
index d273b54fc6..61539cae56 100644
--- a/MediaBrowser.Controller/BaseItemManager/BaseItemManager.cs
+++ b/MediaBrowser.Controller/BaseItemManager/BaseItemManager.cs
@@ -35,7 +35,7 @@ namespace MediaBrowser.Controller.BaseItemManager
public SemaphoreSlim MetadataRefreshThrottler { get; private set; }
///
- public bool IsMetadataFetcherEnabled(BaseItem baseItem, LibraryOptions libraryOptions, string name)
+ public bool IsMetadataFetcherEnabled(BaseItem baseItem, TypeOptions? libraryTypeOptions, string name)
{
if (baseItem is Channel)
{
@@ -49,10 +49,9 @@ namespace MediaBrowser.Controller.BaseItemManager
return !baseItem.EnableMediaSourceDisplay;
}
- var typeOptions = libraryOptions.GetTypeOptions(baseItem.GetType().Name);
- if (typeOptions != null)
+ if (libraryTypeOptions != null)
{
- return typeOptions.MetadataFetchers.Contains(name.AsSpan(), StringComparison.OrdinalIgnoreCase);
+ return libraryTypeOptions.MetadataFetchers.Contains(name.AsSpan(), StringComparison.OrdinalIgnoreCase);
}
var itemConfig = _serverConfigurationManager.Configuration.MetadataOptions.FirstOrDefault(i => string.Equals(i.ItemType, baseItem.GetType().Name, StringComparison.OrdinalIgnoreCase));
@@ -61,7 +60,7 @@ namespace MediaBrowser.Controller.BaseItemManager
}
///
- public bool IsImageFetcherEnabled(BaseItem baseItem, LibraryOptions libraryOptions, string name)
+ public bool IsImageFetcherEnabled(BaseItem baseItem, TypeOptions? libraryTypeOptions, string name)
{
if (baseItem is Channel)
{
@@ -75,10 +74,9 @@ namespace MediaBrowser.Controller.BaseItemManager
return !baseItem.EnableMediaSourceDisplay;
}
- var typeOptions = libraryOptions.GetTypeOptions(baseItem.GetType().Name);
- if (typeOptions != null)
+ if (libraryTypeOptions != null)
{
- return typeOptions.ImageFetchers.Contains(name.AsSpan(), StringComparison.OrdinalIgnoreCase);
+ return libraryTypeOptions.ImageFetchers.Contains(name.AsSpan(), StringComparison.OrdinalIgnoreCase);
}
var itemConfig = _serverConfigurationManager.Configuration.MetadataOptions.FirstOrDefault(i => string.Equals(i.ItemType, baseItem.GetType().Name, StringComparison.OrdinalIgnoreCase));
diff --git a/MediaBrowser.Controller/BaseItemManager/IBaseItemManager.cs b/MediaBrowser.Controller/BaseItemManager/IBaseItemManager.cs
index e18994214e..b07c80879d 100644
--- a/MediaBrowser.Controller/BaseItemManager/IBaseItemManager.cs
+++ b/MediaBrowser.Controller/BaseItemManager/IBaseItemManager.cs
@@ -18,18 +18,18 @@ namespace MediaBrowser.Controller.BaseItemManager
/// Is metadata fetcher enabled.
///
/// The base item.
- /// The library options.
+ /// The type options for baseItem from the library (if defined).
/// The metadata fetcher name.
/// true if metadata fetcher is enabled, else false.
- bool IsMetadataFetcherEnabled(BaseItem baseItem, LibraryOptions libraryOptions, string name);
+ bool IsMetadataFetcherEnabled(BaseItem baseItem, TypeOptions? libraryTypeOptions, string name);
///
/// Is image fetcher enabled.
///
/// The base item.
- /// The library options.
+ /// The type options for baseItem from the library (if defined).
/// The image fetcher name.
/// true if image fetcher is enabled, else false.
- bool IsImageFetcherEnabled(BaseItem baseItem, LibraryOptions libraryOptions, string name);
+ bool IsImageFetcherEnabled(BaseItem baseItem, TypeOptions? libraryTypeOptions, string name);
}
}
diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs
index 82d633e234..d1a5831f98 100644
--- a/MediaBrowser.Providers/Manager/ProviderManager.cs
+++ b/MediaBrowser.Providers/Manager/ProviderManager.cs
@@ -321,7 +321,7 @@ namespace MediaBrowser.Providers.Manager
var typeOptions = libraryOptions.GetTypeOptions(item.GetType().Name);
var fetcherOrder = typeOptions?.ImageFetcherOrder ?? options.ImageFetcherOrder;
- return _imageProviders.Where(i => CanRefreshImages(i, item, libraryOptions, refreshOptions, includeDisabled))
+ return _imageProviders.Where(i => CanRefreshImages(i, item, typeOptions, refreshOptions, includeDisabled))
.OrderBy(i => GetConfiguredOrder(fetcherOrder, i.Name))
.ThenBy(GetDefaultOrder);
}
@@ -343,7 +343,7 @@ namespace MediaBrowser.Providers.Manager
var metadataFetcherOrder = typeOptions?.MetadataFetcherOrder ?? globalMetadataOptions.MetadataFetcherOrder;
return _metadataProviders.OfType>()
- .Where(i => CanRefreshMetadata(i, item, libraryOptions, includeDisabled, forceEnableInternetMetadata))
+ .Where(i => CanRefreshMetadata(i, item, typeOptions, includeDisabled, forceEnableInternetMetadata))
.OrderBy(i =>
{
// local and remote providers will be interleaved in the final order
@@ -361,7 +361,7 @@ namespace MediaBrowser.Providers.Manager
private bool CanRefreshMetadata(
IMetadataProvider provider,
BaseItem item,
- LibraryOptions libraryOptions,
+ TypeOptions? libraryTypeOptions,
bool includeDisabled,
bool forceEnableInternetMetadata)
{
@@ -375,7 +375,7 @@ namespace MediaBrowser.Providers.Manager
if (provider is IRemoteMetadataProvider)
{
- if (!forceEnableInternetMetadata && !_baseItemManager.IsMetadataFetcherEnabled(item, libraryOptions, provider.Name))
+ if (!forceEnableInternetMetadata && !_baseItemManager.IsMetadataFetcherEnabled(item, libraryTypeOptions, provider.Name))
{
return false;
}
@@ -402,7 +402,7 @@ namespace MediaBrowser.Providers.Manager
private bool CanRefreshImages(
IImageProvider provider,
BaseItem item,
- LibraryOptions libraryOptions,
+ TypeOptions? libraryTypeOptions,
ImageRefreshOptions refreshOptions,
bool includeDisabled)
{
@@ -419,7 +419,7 @@ namespace MediaBrowser.Providers.Manager
if (provider is IRemoteImageProvider || provider is IDynamicImageProvider)
{
- if (!_baseItemManager.IsImageFetcherEnabled(item, libraryOptions, provider.Name))
+ if (!_baseItemManager.IsImageFetcherEnabled(item, libraryTypeOptions, provider.Name))
{
return false;
}
diff --git a/tests/Jellyfin.Controller.Tests/BaseItemManagerTests.cs b/tests/Jellyfin.Controller.Tests/BaseItemManagerTests.cs
index 463e17ad36..f67e6d1ef0 100644
--- a/tests/Jellyfin.Controller.Tests/BaseItemManagerTests.cs
+++ b/tests/Jellyfin.Controller.Tests/BaseItemManagerTests.cs
@@ -20,17 +20,13 @@ namespace Jellyfin.Controller.Tests
{
BaseItem item = (BaseItem)Activator.CreateInstance(itemType)!;
- var libraryOptions = new LibraryOptions
- {
- TypeOptions = new[]
+ var libraryTypeOptions = itemType == typeof(Book)
+ ? new TypeOptions
{
- new TypeOptions
- {
- Type = "Book",
- MetadataFetchers = new[] { "LibraryEnabled" }
- }
+ Type = "Book",
+ MetadataFetchers = new[] { "LibraryEnabled" }
}
- };
+ : null;
var serverConfiguration = new ServerConfiguration();
foreach (var typeConfig in serverConfiguration.MetadataOptions)
@@ -43,7 +39,7 @@ namespace Jellyfin.Controller.Tests
.Returns(serverConfiguration);
var baseItemManager = new BaseItemManager(serverConfigurationManager.Object);
- var actual = baseItemManager.IsMetadataFetcherEnabled(item, libraryOptions, fetcherName);
+ var actual = baseItemManager.IsMetadataFetcherEnabled(item, libraryTypeOptions, fetcherName);
Assert.Equal(expected, actual);
}
@@ -57,17 +53,13 @@ namespace Jellyfin.Controller.Tests
{
BaseItem item = (BaseItem)Activator.CreateInstance(itemType)!;
- var libraryOptions = new LibraryOptions
- {
- TypeOptions = new[]
+ var libraryTypeOptions = itemType == typeof(Book)
+ ? new TypeOptions
{
- new TypeOptions
- {
- Type = "Book",
- ImageFetchers = new[] { "LibraryEnabled" }
- }
+ Type = "Book",
+ ImageFetchers = new[] { "LibraryEnabled" }
}
- };
+ : null;
var serverConfiguration = new ServerConfiguration();
foreach (var typeConfig in serverConfiguration.MetadataOptions)
@@ -80,7 +72,7 @@ namespace Jellyfin.Controller.Tests
.Returns(serverConfiguration);
var baseItemManager = new BaseItemManager(serverConfigurationManager.Object);
- var actual = baseItemManager.IsImageFetcherEnabled(item, libraryOptions, fetcherName);
+ var actual = baseItemManager.IsImageFetcherEnabled(item, libraryTypeOptions, fetcherName);
Assert.Equal(expected, actual);
}
diff --git a/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs b/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs
index ba91f5ed2d..560b50f091 100644
--- a/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs
+++ b/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs
@@ -131,7 +131,7 @@ namespace Jellyfin.Providers.Tests.Manager
};
var baseItemManager = new Mock(MockBehavior.Strict);
- baseItemManager.Setup(i => i.IsImageFetcherEnabled(item, It.IsAny(), providerName))
+ baseItemManager.Setup(i => i.IsImageFetcherEnabled(item, It.IsAny(), providerName))
.Returns(baseItemEnabled);
using var providerManager = GetProviderManager(baseItemManager: baseItemManager.Object);
@@ -219,7 +219,7 @@ namespace Jellyfin.Providers.Tests.Manager
metadataFetcherOrder: serverRemoteOrder?.Select(nameProvider).ToArray());
var baseItemManager = new Mock(MockBehavior.Strict);
- baseItemManager.Setup(i => i.IsMetadataFetcherEnabled(item, It.IsAny(), It.IsAny()))
+ baseItemManager.Setup(i => i.IsMetadataFetcherEnabled(item, It.IsAny(), It.IsAny()))
.Returns(true);
using var providerManager = GetProviderManager(serverConfiguration: serverConfiguration, baseItemManager: baseItemManager.Object);
@@ -302,7 +302,7 @@ namespace Jellyfin.Providers.Tests.Manager
var provider = MockIMetadataProviderMapper(providerType.Name, providerName, forced: providerForced);
var baseItemManager = new Mock(MockBehavior.Strict);
- baseItemManager.Setup(i => i.IsMetadataFetcherEnabled(item, It.IsAny(), providerName))
+ baseItemManager.Setup(i => i.IsMetadataFetcherEnabled(item, It.IsAny(), providerName))
.Returns(baseItemEnabled);
using var providerManager = GetProviderManager(baseItemManager: baseItemManager.Object);
--
cgit v1.2.3
From ee5bd0daa62e68f4f93e7603017c1f028781e387 Mon Sep 17 00:00:00 2001
From: Joe Rogers <1337joe@gmail.com>
Date: Tue, 21 Dec 2021 00:24:07 +0100
Subject: Implement tests on ProviderManager.RefreshSingleItem
---
.../Providers/IMetadataService.cs | 5 +
.../Manager/ProviderManagerTests.cs | 110 ++++++++++++++++++++-
2 files changed, 113 insertions(+), 2 deletions(-)
(limited to 'MediaBrowser.Controller')
diff --git a/MediaBrowser.Controller/Providers/IMetadataService.cs b/MediaBrowser.Controller/Providers/IMetadataService.cs
index 05fbb18ee4..f0f1d18624 100644
--- a/MediaBrowser.Controller/Providers/IMetadataService.cs
+++ b/MediaBrowser.Controller/Providers/IMetadataService.cs
@@ -23,6 +23,11 @@ namespace MediaBrowser.Controller.Providers
/// true if this instance can refresh the specified item.
bool CanRefresh(BaseItem item);
+ ///
+ /// Determines whether this instance primarily targets the specified type.
+ ///
+ /// The type.
+ /// true if this instance primarily targets the specified type.
bool CanRefreshPrimary(Type type);
///
diff --git a/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs b/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs
index 8100dcfa6f..5845b31be8 100644
--- a/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs
+++ b/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs
@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
using MediaBrowser.Controller.BaseItemManager;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
@@ -9,6 +11,7 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Providers.Manager;
+using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Moq;
using Xunit;
@@ -17,6 +20,95 @@ namespace Jellyfin.Providers.Tests.Manager
{
public class ProviderManagerTests
{
+ private static readonly ILogger _logger = new NullLogger();
+
+ private static TheoryData[], int> RefreshSingleItemOrderData()
+ => new ()
+ {
+ // no order set, uses provided order
+ {
+ new[]
+ {
+ MockIMetadataService(true, true),
+ MockIMetadataService(true, true)
+ },
+ 0
+ },
+ // sort order sets priority when all match
+ {
+ new[]
+ {
+ MockIMetadataService(true, true, 1),
+ MockIMetadataService(true, true, 0),
+ MockIMetadataService(true, true, 2)
+ },
+ 1
+ },
+ // CanRefreshPrimary prioritized
+ {
+ new[]
+ {
+ MockIMetadataService(false, true),
+ MockIMetadataService(true, true),
+ },
+ 1
+ },
+ // falls back to CanRefresh
+ {
+ new[]
+ {
+ MockIMetadataService(false, false),
+ MockIMetadataService(false, true)
+ },
+ 1
+ },
+ };
+
+ [Theory]
+ [MemberData(nameof(RefreshSingleItemOrderData))]
+ public void RefreshSingleItem_ServiceOrdering_FollowsPriority(Mock[] servicesList, int expectedIndex)
+ {
+ var item = new Movie();
+
+ using var providerManager = GetProviderManager();
+ AddParts(providerManager, metadataServices: servicesList.Select(s => s.Object).ToArray());
+
+ var refreshOptions = new MetadataRefreshOptions(Mock.Of(MockBehavior.Strict));
+ var actual = providerManager.RefreshSingleItem(item, refreshOptions, CancellationToken.None);
+
+ Assert.Equal(ItemUpdateType.MetadataDownload, actual.Result);
+ for (var i = 0; i < servicesList.Length; i++)
+ {
+ if (i == expectedIndex)
+ {
+ servicesList[i].Verify(mock => mock.RefreshMetadata(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once());
+ }
+ else
+ {
+ servicesList[i].Verify(mock => mock.RefreshMetadata(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never());
+ }
+ }
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void RefreshSingleItem_RefreshMetadata_WhenServiceFound(bool serviceFound)
+ {
+ var item = new Movie();
+
+ var servicesList = new[] { MockIMetadataService(false, serviceFound) };
+
+ using var providerManager = GetProviderManager();
+ AddParts(providerManager, metadataServices: servicesList.Select(s => s.Object).ToArray());
+
+ var refreshOptions = new MetadataRefreshOptions(Mock.Of(MockBehavior.Strict));
+ var actual = providerManager.RefreshSingleItem(item, refreshOptions, CancellationToken.None);
+
+ var expectedResult = serviceFound ? ItemUpdateType.MetadataDownload : ItemUpdateType.None;
+ Assert.Equal(expectedResult, actual.Result);
+ }
+
private static TheoryData GetImageProvidersOrderData()
=> new ()
{
@@ -313,6 +405,20 @@ namespace Jellyfin.Providers.Tests.Manager
Assert.Equal(expected ? 1 : 0, actualProviders.Length);
}
+ private static Mock MockIMetadataService(bool refreshPrimary, bool canRefresh, int order = 0)
+ {
+ var service = new Mock(MockBehavior.Strict);
+ service.Setup(s => s.Order)
+ .Returns(order);
+ service.Setup(s => s.CanRefreshPrimary(It.IsAny()))
+ .Returns(refreshPrimary);
+ service.Setup(s => s.CanRefresh(It.IsAny()))
+ .Returns(canRefresh);
+ service.Setup(s => s.RefreshMetadata(It.IsAny(), It.IsAny(), It.IsAny()))
+ .Returns(Task.FromResult(ItemUpdateType.MetadataDownload));
+ return service;
+ }
+
private static IImageProvider MockIImageProvider(string name, BaseItem expectedType, bool supports = true, int? order = null, bool errorOnSupported = false)
where TProviderType : class, IImageProvider
{
@@ -460,11 +566,11 @@ namespace Jellyfin.Providers.Tests.Manager
null,
serverConfigurationManager.Object,
null,
- new NullLogger(),
+ _logger,
null,
null,
libraryManager.Object,
- baseItemManager);
+ baseItemManager!);
return providerManager;
}
--
cgit v1.2.3