Implement Similarity providers

This commit is contained in:
Shadowghost
2026-05-03 23:43:01 +02:00
parent 622947e374
commit 4ebce39070
36 changed files with 1830 additions and 61 deletions

View File

@@ -351,6 +351,8 @@ namespace MediaBrowser.Controller.Entities
public Dictionary<string, string>? HasAnyProviderId { get; set; }
public Dictionary<string, string[]>? HasAnyProviderIds { get; set; }
public Guid[] AlbumArtistIds { get; set; }
public Guid[] BoxSetLibraryFolders { get; set; }

View File

@@ -0,0 +1,27 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Entities;
namespace MediaBrowser.Controller.Library;
/// <summary>
/// Provides similar items from the local library for a specific item type.
/// Returns fully resolved BaseItems directly - no additional resolution needed.
/// </summary>
/// <typeparam name="TItemType">The type of item this provider handles.</typeparam>
public interface ILocalSimilarItemsProvider<TItemType> : ISimilarItemsProvider
where TItemType : BaseItem
{
/// <summary>
/// Gets similar items from the local library.
/// </summary>
/// <param name="item">The source item to find similar items for.</param>
/// <param name="query">The query options (user, limit, exclusions, etc.).</param>
/// <param name="cancellationToken">Cancellation token.</param>
/// <returns>The list of similar items from the library.</returns>
Task<IReadOnlyList<BaseItem>> GetSimilarItemsAsync(
TItemType item,
SimilarItemsQuery query,
CancellationToken cancellationToken);
}

View File

@@ -0,0 +1,26 @@
using System.Collections.Generic;
using System.Threading;
using MediaBrowser.Controller.Entities;
namespace MediaBrowser.Controller.Library;
/// <summary>
/// Provides similar item references from remote/external sources for a specific item type.
/// Returns lightweight references with ProviderIds that the manager resolves to library items.
/// </summary>
/// <typeparam name="TItemType">The type of item this provider handles.</typeparam>
public interface IRemoteSimilarItemsProvider<TItemType> : ISimilarItemsProvider
where TItemType : BaseItem
{
/// <summary>
/// Gets similar item references from an external source as an async stream.
/// </summary>
/// <param name="item">The source item to find similar items for.</param>
/// <param name="query">The query options (user, limit, exclusions).</param>
/// <param name="cancellationToken">Cancellation token.</param>
/// <returns>An async enumerable of similar item references.</returns>
IAsyncEnumerable<SimilarItemReference> GetSimilarItemsAsync(
TItemType item,
SimilarItemsQuery query,
CancellationToken cancellationToken);
}

View File

@@ -0,0 +1,50 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Configuration;
namespace MediaBrowser.Controller.Library;
/// <summary>
/// Interface for managing similar items providers and operations.
/// </summary>
public interface ISimilarItemsManager
{
/// <summary>
/// Registers similar items providers discovered through dependency injection.
/// </summary>
/// <param name="providers">The similar items providers to register.</param>
void AddParts(IEnumerable<ISimilarItemsProvider> providers);
/// <summary>
/// Gets the similar items providers for a specific item type.
/// </summary>
/// <typeparam name="T">The item type.</typeparam>
/// <returns>The list of similar items providers for that type.</returns>
IReadOnlyList<ISimilarItemsProvider> GetSimilarItemsProviders<T>()
where T : BaseItem;
/// <summary>
/// Gets similar items for the specified item.
/// </summary>
/// <param name="item">The source item to find similar items for.</param>
/// <param name="excludeArtistIds">Artist IDs to exclude from results.</param>
/// <param name="user">The user context.</param>
/// <param name="dtoOptions">The DTO options.</param>
/// <param name="limit">Maximum number of results.</param>
/// <param name="libraryOptions">The library options for provider configuration.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The list of similar items.</returns>
Task<IReadOnlyList<BaseItem>> GetSimilarItemsAsync(
BaseItem item,
IReadOnlyList<Guid> excludeArtistIds,
User? user,
DtoOptions dtoOptions,
int? limit,
LibraryOptions? libraryOptions,
CancellationToken cancellationToken);
}

View File

@@ -0,0 +1,26 @@
using System;
using MediaBrowser.Model.Configuration;
namespace MediaBrowser.Controller.Library;
/// <summary>
/// Base marker interface for similar items providers.
/// </summary>
public interface ISimilarItemsProvider
{
/// <summary>
/// Gets the name of the provider.
/// </summary>
string Name { get; }
/// <summary>
/// Gets the type of the provider.
/// </summary>
MetadataPluginType Type { get; }
/// <summary>
/// Gets the cache duration for results from this provider.
/// If null, results will not be cached.
/// </summary>
TimeSpan? CacheDuration => null;
}

View File

@@ -0,0 +1,22 @@
namespace MediaBrowser.Controller.Library;
/// <summary>
/// A reference to a similar item by provider ID with a similarity score.
/// </summary>
public class SimilarItemReference
{
/// <summary>
/// Gets or sets the provider name (e.g., "Tmdb", "MusicBrainzArtist").
/// </summary>
public required string ProviderName { get; set; }
/// <summary>
/// Gets or sets the provider ID value.
/// </summary>
public required string ProviderId { get; set; }
/// <summary>
/// Gets or sets the similarity score (0.0 to 1.0).
/// </summary>
public float? Score { get; set; }
}

View File

@@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Dto;
namespace MediaBrowser.Controller.Library;
/// <summary>
/// Query options for similar items requests.
/// </summary>
public class SimilarItemsQuery
{
/// <summary>
/// Gets or sets the user context.
/// </summary>
public User? User { get; set; }
/// <summary>
/// Gets or sets the maximum number of results.
/// </summary>
public int? Limit { get; set; }
/// <summary>
/// Gets or sets the DTO options.
/// </summary>
public DtoOptions? DtoOptions { get; set; }
/// <summary>
/// Gets or sets the item IDs to exclude from results.
/// </summary>
public IReadOnlyList<Guid> ExcludeItemIds { get; set; } = [];
/// <summary>
/// Gets or sets the artist IDs to exclude from results.
/// </summary>
public IReadOnlyList<Guid> ExcludeArtistIds { get; set; } = [];
}

View File

@@ -143,6 +143,17 @@ namespace MediaBrowser.Controller.Providers
IEnumerable<IMetadataProvider<T>> GetMetadataProviders<T>(BaseItem item, LibraryOptions libraryOptions)
where T : BaseItem;
/// <summary>
/// Gets the metadata providers for the provided item.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="libraryOptions">The library options.</param>
/// <param name="includeDisabled">Whether to include disabled providers.</param>
/// <typeparam name="T">The type of metadata provider.</typeparam>
/// <returns>The metadata providers.</returns>
IEnumerable<IMetadataProvider<T>> GetMetadataProviders<T>(BaseItem item, LibraryOptions libraryOptions, bool includeDisabled)
where T : BaseItem;
/// <summary>
/// Gets the metadata savers for the provided item.
/// </summary>