< Summary - Jellyfin

Information
Class: Emby.Server.Implementations.Library.SimilarItems.MovieSimilarItemsProvider
Assembly: Emby.Server.Implementations
File(s): /srv/git/jellyfin/Emby.Server.Implementations/Library/SimilarItems/MovieSimilarItemsProvider.cs
Line coverage
9%
Covered lines: 3
Uncovered lines: 28
Coverable lines: 31
Total lines: 91
Line coverage: 9.6%
Branch coverage
0%
Covered branches: 0
Total branches: 10
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 5/16/2026 - 12:15:55 AM Line coverage: 9.6% (3/31) Branch coverage: 0% (0/10) Total lines: 91 5/16/2026 - 12:15:55 AM Line coverage: 9.6% (3/31) Branch coverage: 0% (0/10) Total lines: 91

Metrics

File(s)

/srv/git/jellyfin/Emby.Server.Implementations/Library/SimilarItems/MovieSimilarItemsProvider.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Threading;
 4using System.Threading.Tasks;
 5using Jellyfin.Data.Enums;
 6using Jellyfin.Database.Implementations.Enums;
 7using MediaBrowser.Controller.Configuration;
 8using MediaBrowser.Controller.Dto;
 9using MediaBrowser.Controller.Entities;
 10using MediaBrowser.Controller.Entities.Movies;
 11using MediaBrowser.Controller.Library;
 12using MediaBrowser.Model.Configuration;
 13
 14namespace Emby.Server.Implementations.Library.SimilarItems;
 15
 16/// <summary>
 17/// Provides similar items for movies and trailers.
 18/// </summary>
 19public sealed class MovieSimilarItemsProvider : ILocalSimilarItemsProvider<Movie>, ILocalSimilarItemsProvider<Trailer>
 20{
 21    private readonly ILibraryManager _libraryManager;
 22    private readonly IServerConfigurationManager _serverConfigurationManager;
 23
 24    /// <summary>
 25    /// Initializes a new instance of the <see cref="MovieSimilarItemsProvider"/> class.
 26    /// </summary>
 27    /// <param name="libraryManager">The library manager.</param>
 28    /// <param name="serverConfigurationManager">The server configuration manager.</param>
 29    public MovieSimilarItemsProvider(
 30        ILibraryManager libraryManager,
 31        IServerConfigurationManager serverConfigurationManager)
 32    {
 2133        _libraryManager = libraryManager;
 2134        _serverConfigurationManager = serverConfigurationManager;
 2135    }
 36
 37    /// <inheritdoc/>
 038    public string Name => "Local Genre/Tag";
 39
 40    /// <inheritdoc/>
 041    public MetadataPluginType Type => MetadataPluginType.LocalSimilarityProvider;
 42
 43    /// <inheritdoc/>
 44    public Task<IReadOnlyList<BaseItem>> GetSimilarItemsAsync(Movie item, SimilarItemsQuery query, CancellationToken can
 45    {
 046        return Task.FromResult(GetSimilarMovieItems(item, query));
 47    }
 48
 49    /// <inheritdoc/>
 50    public Task<IReadOnlyList<BaseItem>> GetSimilarItemsAsync(Trailer item, SimilarItemsQuery query, CancellationToken c
 51    {
 052        return Task.FromResult(GetSimilarMovieItems(item, query));
 53    }
 54
 55    bool ILocalSimilarItemsProvider.Supports(Type itemType)
 056        => typeof(Movie).IsAssignableFrom(itemType) || typeof(Trailer).IsAssignableFrom(itemType);
 57
 58    Task<IReadOnlyList<BaseItem>> ILocalSimilarItemsProvider.GetSimilarItemsAsync(BaseItem item, SimilarItemsQuery query
 059        => item switch
 060        {
 061            Movie movie => GetSimilarItemsAsync(movie, query, cancellationToken),
 062            Trailer trailer => GetSimilarItemsAsync(trailer, query, cancellationToken),
 063            _ => throw new ArgumentException($"Unsupported item type {item.GetType()}", nameof(item))
 064        };
 65
 66    private IReadOnlyList<BaseItem> GetSimilarMovieItems(BaseItem item, SimilarItemsQuery query)
 67    {
 068        var includeItemTypes = new List<BaseItemKind> { BaseItemKind.Movie };
 69
 070        if (_serverConfigurationManager.Configuration.EnableExternalContentInSuggestions)
 71        {
 072            includeItemTypes.Add(BaseItemKind.Trailer);
 073            includeItemTypes.Add(BaseItemKind.LiveTvProgram);
 74        }
 75
 076        var internalQuery = new InternalItemsQuery(query.User)
 077        {
 078            Genres = item.Genres,
 079            Tags = item.Tags,
 080            Limit = query.Limit,
 081            DtoOptions = query.DtoOptions ?? new DtoOptions(),
 082            ExcludeItemIds = [.. query.ExcludeItemIds],
 083            IncludeItemTypes = [.. includeItemTypes],
 084            EnableGroupByMetadataKey = true,
 085            EnableTotalRecordCount = false,
 086            OrderBy = [(ItemSortBy.Random, SortOrder.Ascending)]
 087        };
 88
 089        return _libraryManager.GetItemList(internalQuery);
 90    }
 91}