mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-06-08 08:48:48 +01:00
Merge remote-tracking branch 'upstream/master' into search-rebased
This commit is contained in:
@@ -58,6 +58,8 @@ namespace MediaBrowser.Controller.Entities
|
||||
VideoTypes = [];
|
||||
Years = [];
|
||||
SkipDeserialization = false;
|
||||
AudioLanguages = [];
|
||||
SubtitleLanguages = [];
|
||||
}
|
||||
|
||||
public InternalItemsQuery(User? user)
|
||||
@@ -387,6 +389,10 @@ namespace MediaBrowser.Controller.Entities
|
||||
|
||||
public bool IncludeExtras { get; set; }
|
||||
|
||||
public IReadOnlyList<string> AudioLanguages { get; set; }
|
||||
|
||||
public IReadOnlyList<string> SubtitleLanguages { get; set; }
|
||||
|
||||
public void SetUser(User user)
|
||||
{
|
||||
var maxRating = user.MaxParentalRatingScore;
|
||||
|
||||
@@ -784,5 +784,12 @@ namespace MediaBrowser.Controller.Library
|
||||
/// <param name="query">The query filter.</param>
|
||||
/// <returns>Aggregated filter values.</returns>
|
||||
QueryFiltersLegacy GetQueryFiltersLegacy(InternalItemsQuery query);
|
||||
|
||||
/// <summary>
|
||||
/// Gets a list of all language codes of the provided stream type.
|
||||
/// </summary>
|
||||
/// <param name="mediaStreamType">The stream type.</param>
|
||||
/// <returns>List of language codes.</returns>
|
||||
IReadOnlyList<string> GetMediaStreamLanguages(MediaStreamType mediaStreamType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
using System;
|
||||
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.
|
||||
/// Returns fully resolved BaseItems directly - no additional resolution needed.
|
||||
/// </summary>
|
||||
public interface ILocalSimilarItemsProvider : ISimilarItemsProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// Determines whether the provider can handle items of the specified type.
|
||||
/// </summary>
|
||||
/// <param name="itemType">The item type.</param>
|
||||
/// <returns><c>true</c> if the provider handles this item type; otherwise <c>false</c>.</returns>
|
||||
bool Supports(Type itemType);
|
||||
|
||||
/// <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(
|
||||
BaseItem item,
|
||||
SimilarItemsQuery query,
|
||||
CancellationToken cancellationToken);
|
||||
}
|
||||
|
||||
/// <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> : ILocalSimilarItemsProvider
|
||||
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);
|
||||
|
||||
bool ILocalSimilarItemsProvider.Supports(Type itemType)
|
||||
=> typeof(TItemType).IsAssignableFrom(itemType);
|
||||
|
||||
Task<IReadOnlyList<BaseItem>> ILocalSimilarItemsProvider.GetSimilarItemsAsync(
|
||||
BaseItem item,
|
||||
SimilarItemsQuery query,
|
||||
CancellationToken cancellationToken)
|
||||
=> GetSimilarItemsAsync((TItemType)item, query, cancellationToken);
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
|
||||
namespace MediaBrowser.Controller.Library;
|
||||
|
||||
/// <summary>
|
||||
/// Provides similar item references from remote/external sources.
|
||||
/// Returns lightweight references with ProviderIds that the manager resolves to library items.
|
||||
/// </summary>
|
||||
public interface IRemoteSimilarItemsProvider : ISimilarItemsProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// Determines whether the provider can handle items of the specified type.
|
||||
/// </summary>
|
||||
/// <param name="itemType">The item type.</param>
|
||||
/// <returns><c>true</c> if the provider handles this item type; otherwise <c>false</c>.</returns>
|
||||
bool Supports(Type itemType);
|
||||
|
||||
/// <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(
|
||||
BaseItem item,
|
||||
SimilarItemsQuery query,
|
||||
CancellationToken cancellationToken);
|
||||
}
|
||||
|
||||
/// <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> : IRemoteSimilarItemsProvider
|
||||
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);
|
||||
|
||||
bool IRemoteSimilarItemsProvider.Supports(Type itemType)
|
||||
=> typeof(TItemType).IsAssignableFrom(itemType);
|
||||
|
||||
IAsyncEnumerable<SimilarItemReference> IRemoteSimilarItemsProvider.GetSimilarItemsAsync(
|
||||
BaseItem item,
|
||||
SimilarItemsQuery query,
|
||||
CancellationToken cancellationToken)
|
||||
=> GetSimilarItemsAsync((TItemType)item, query, cancellationToken);
|
||||
}
|
||||
50
MediaBrowser.Controller/Library/ISimilarItemsManager.cs
Normal file
50
MediaBrowser.Controller/Library/ISimilarItemsManager.cs
Normal 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);
|
||||
}
|
||||
26
MediaBrowser.Controller/Library/ISimilarItemsProvider.cs
Normal file
26
MediaBrowser.Controller/Library/ISimilarItemsProvider.cs
Normal 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;
|
||||
}
|
||||
22
MediaBrowser.Controller/Library/SimilarItemReference.cs
Normal file
22
MediaBrowser.Controller/Library/SimilarItemReference.cs
Normal 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; }
|
||||
}
|
||||
37
MediaBrowser.Controller/Library/SimilarItemsQuery.cs
Normal file
37
MediaBrowser.Controller/Library/SimilarItemsQuery.cs
Normal 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; } = [];
|
||||
}
|
||||
@@ -209,6 +209,11 @@ namespace MediaBrowser.Controller.Net
|
||||
var (connection, cts, state) = tuple;
|
||||
var cancellationToken = cts.Token;
|
||||
|
||||
// Restore the culture context captured when the connection was established
|
||||
// so that GetDataToSendForConnection produces a localized payload matching
|
||||
// the client's Accept-Language preference rather than the server default.
|
||||
connection.ApplyRequestCulture();
|
||||
|
||||
var data = await GetDataToSendForConnection(connection).ConfigureAwait(false);
|
||||
if (data is null)
|
||||
{
|
||||
|
||||
@@ -77,5 +77,14 @@ namespace MediaBrowser.Controller.Net
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns>Task.</returns>
|
||||
Task ReceiveAsync(CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// Applies the culture context captured when the connection was established
|
||||
/// (from the upgrade request's <c>Accept-Language</c> header) to the current
|
||||
/// async flow. Server-initiated message senders should call this before
|
||||
/// localising any payload so that the response uses the client's preferred
|
||||
/// language rather than the server default.
|
||||
/// </summary>
|
||||
void ApplyRequestCulture();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,13 @@ public interface IMediaStreamRepository
|
||||
/// <returns>IEnumerable{MediaStream}.</returns>
|
||||
IReadOnlyList<MediaStream> GetMediaStreams(MediaStreamQuery filter);
|
||||
|
||||
/// <summary>
|
||||
/// Gets all language codes of the provided stream type.
|
||||
/// </summary>
|
||||
/// <param name="mediaStreamType">The type of the media stream.</param>
|
||||
/// <returns>IEnumerable{string}.</returns>
|
||||
IReadOnlyList<string> GetMediaStreamLanguages(MediaStreamType mediaStreamType);
|
||||
|
||||
/// <summary>
|
||||
/// Saves the media streams.
|
||||
/// </summary>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user