aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShadowghost <Shadowghost@users.noreply.github.com>2026-09-15 11:16:07 -0400
committerCody Robibero <cody@robibe.ro>2026-09-15 11:16:07 -0400
commit70b8e4272de9a3537491f3d02c5033655c41fe48 (patch)
tree3f3cf4ee3dfba5e97b3c0c1e57f76da4d87932aa
parent93fc178db56835b08943825ea6873025c4cfd44b (diff)
Backport pull request #17939 from jellyfin/release-12.z
Fix metadata provider order needing a restart to apply Original-merge: 53a991d36a6394cef4b154272a95e6181982dd32 Merged-by: crobibero <cody@robibe.ro> Backported-by: Cody Robibero <cody@robibe.ro>
-rw-r--r--MediaBrowser.Providers/Manager/ProviderManager.cs18
-rw-r--r--tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs2
2 files changed, 15 insertions, 5 deletions
diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs
index e7b15305b3..8387f24bc9 100644
--- a/MediaBrowser.Providers/Manager/ProviderManager.cs
+++ b/MediaBrowser.Providers/Manager/ProviderManager.cs
@@ -76,7 +76,8 @@ namespace MediaBrowser.Providers.Manager
/// <summary>
/// Cache for ordered metadata providers per library/item type combination.
- /// Key: (LibraryPath, ItemTypeName, IncludeDisabled, ForceEnableInternetMetadata).
+ /// Key: (LibraryPath, ItemTypeName, IncludeDisabled, ForceEnableInternetMetadata), where
+ /// LibraryPath is the collection folder path the library options are stored against.
/// Value: Array of ordered metadata providers (before per-item filtering).
/// </summary>
private readonly ConcurrentDictionary<MetadataProviderCacheKey, IMetadataProvider[]> _metadataProviderCache = new();
@@ -136,6 +137,7 @@ namespace MediaBrowser.Providers.Manager
_similarItemsManager = similarItemsManager;
CollectionFolder.LibraryOptionsUpdated += OnLibraryOptionsUpdated;
+ _configurationManager.ConfigurationUpdated += OnConfigurationUpdated;
}
/// <inheritdoc/>
@@ -476,15 +478,15 @@ namespace MediaBrowser.Providers.Manager
return GetMetadataProvidersInternal<T>(item, libraryOptions, globalMetadataOptions, includeDisabled, false, libraryPath);
}
- private static string GetLibraryPathForItem(BaseItem item)
+ private string GetLibraryPathForItem(BaseItem item)
{
if (item is CollectionFolder collectionFolder)
{
return collectionFolder.Path ?? string.Empty;
}
- var topParent = item.GetTopParent();
- return topParent?.Path ?? string.Empty;
+ return _libraryManager.GetCollectionFolders(item)
+ .Find(folder => folder is CollectionFolder)?.Path ?? string.Empty;
}
/// <inheritdoc />
@@ -1314,6 +1316,7 @@ namespace MediaBrowser.Providers.Manager
if (disposing)
{
CollectionFolder.LibraryOptionsUpdated -= OnLibraryOptionsUpdated;
+ _configurationManager.ConfigurationUpdated -= OnConfigurationUpdated;
if (!_disposeCancellationTokenSource.IsCancellationRequested)
{
@@ -1341,6 +1344,11 @@ namespace MediaBrowser.Providers.Manager
_logger.LogDebug("Invalidated metadata provider cache for library: {LibraryPath}", e.LibraryPath);
}
+ private void OnConfigurationUpdated(object? sender, EventArgs e)
+ {
+ ClearMetadataProviderCache();
+ }
+
internal void ClearMetadataProviderCache()
{
_metadataProviderCache.Clear();
@@ -1350,7 +1358,7 @@ namespace MediaBrowser.Providers.Manager
/// <summary>
/// Cache key for metadata provider lookups.
/// </summary>
- /// <param name="LibraryPath">The library path for the collection folder.</param>
+ /// <param name="LibraryPath">The path of the collection folder providing the library options.</param>
/// <param name="ItemTypeName">The item type name.</param>
/// <param name="IncludeDisabled">Whether to include disabled providers.</param>
/// <param name="ForceEnableInternetMetadata">Whether internet metadata is force-enabled.</param>
diff --git a/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs b/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs
index 248b236df8..d3b82cefcd 100644
--- a/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs
+++ b/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs
@@ -677,6 +677,8 @@ namespace Jellyfin.Providers.Tests.Manager
var libraryManagerMock = new Mock<ILibraryManager>(MockBehavior.Strict);
libraryManagerMock.Setup(i => i.GetLibraryOptions(It.IsAny<BaseItem>()))
.Returns(libraryOptions ?? new LibraryOptions());
+ libraryManagerMock.Setup(i => i.GetCollectionFolders(It.IsAny<BaseItem>()))
+ .Returns(new List<Folder>());
libraryManager = libraryManagerMock.Object;
}