< Summary - Jellyfin

Information
Class: Emby.Server.Implementations.Library.SimilarItems.LiveTvProgramSimilarItemsProvider
Assembly: Emby.Server.Implementations
File(s): /srv/git/jellyfin/Emby.Server.Implementations/Library/SimilarItems/LiveTvProgramSimilarItemsProvider.cs
Line coverage
9%
Covered lines: 3
Uncovered lines: 30
Coverable lines: 33
Total lines: 94
Line coverage: 9%
Branch coverage
0%
Covered branches: 0
Total branches: 8
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% (3/33) Branch coverage: 0% (0/8) Total lines: 94 5/16/2026 - 12:15:55 AM Line coverage: 9% (3/33) Branch coverage: 0% (0/8) Total lines: 94

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_Name()100%210%
get_Type()100%210%
GetSimilarItemsAsync(...)0%7280%

File(s)

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

#LineLine coverage
 1using System.Collections.Generic;
 2using System.Threading;
 3using System.Threading.Tasks;
 4using Jellyfin.Data.Enums;
 5using Jellyfin.Database.Implementations.Enums;
 6using MediaBrowser.Controller.Configuration;
 7using MediaBrowser.Controller.Dto;
 8using MediaBrowser.Controller.Entities;
 9using MediaBrowser.Controller.Library;
 10using MediaBrowser.Controller.LiveTv;
 11using MediaBrowser.Model.Configuration;
 12
 13namespace Emby.Server.Implementations.Library.SimilarItems;
 14
 15/// <summary>
 16/// Provides similar items for Live TV programs.
 17/// </summary>
 18public class LiveTvProgramSimilarItemsProvider : ILocalSimilarItemsProvider<LiveTvProgram>
 19{
 20    private readonly ILibraryManager _libraryManager;
 21    private readonly IServerConfigurationManager _serverConfigurationManager;
 22
 23    /// <summary>
 24    /// Initializes a new instance of the <see cref="LiveTvProgramSimilarItemsProvider"/> class.
 25    /// </summary>
 26    /// <param name="libraryManager">The library manager.</param>
 27    /// <param name="serverConfigurationManager">The server configuration manager.</param>
 28    public LiveTvProgramSimilarItemsProvider(
 29        ILibraryManager libraryManager,
 30        IServerConfigurationManager serverConfigurationManager)
 31    {
 2132        _libraryManager = libraryManager;
 2133        _serverConfigurationManager = serverConfigurationManager;
 2134    }
 35
 36    /// <inheritdoc/>
 037    public string Name => "Local Genre/Tag";
 38
 39    /// <inheritdoc/>
 040    public MetadataPluginType Type => MetadataPluginType.LocalSimilarityProvider;
 41
 42    /// <inheritdoc/>
 43    public Task<IReadOnlyList<BaseItem>> GetSimilarItemsAsync(LiveTvProgram item, SimilarItemsQuery query, CancellationT
 44    {
 45        BaseItemKind[] includeItemTypes;
 46        bool enableGroupByMetadataKey;
 47        bool enableTotalRecordCount;
 48
 049        if (item.IsMovie)
 50        {
 51            // Movie-like program
 052            var itemTypes = new List<BaseItemKind> { BaseItemKind.Movie };
 53
 054            if (_serverConfigurationManager.Configuration.EnableExternalContentInSuggestions)
 55            {
 056                itemTypes.Add(BaseItemKind.Trailer);
 057                itemTypes.Add(BaseItemKind.LiveTvProgram);
 58            }
 59
 060            includeItemTypes = [.. itemTypes];
 061            enableGroupByMetadataKey = true;
 062            enableTotalRecordCount = false;
 63        }
 064        else if (item.IsSeries)
 65        {
 66            // Series-like program
 067            includeItemTypes = [BaseItemKind.Series];
 068            enableGroupByMetadataKey = false;
 069            enableTotalRecordCount = true;
 70        }
 71        else
 72        {
 73            // Default - match same type
 074            includeItemTypes = [item.GetBaseItemKind()];
 075            enableGroupByMetadataKey = false;
 076            enableTotalRecordCount = true;
 77        }
 78
 079        var internalQuery = new InternalItemsQuery(query.User)
 080        {
 081            Genres = item.Genres,
 082            Tags = item.Tags,
 083            Limit = query.Limit,
 084            DtoOptions = query.DtoOptions ?? new DtoOptions(),
 085            ExcludeItemIds = [.. query.ExcludeItemIds],
 086            IncludeItemTypes = includeItemTypes,
 087            EnableGroupByMetadataKey = enableGroupByMetadataKey,
 088            EnableTotalRecordCount = enableTotalRecordCount,
 089            OrderBy = [(ItemSortBy.Random, SortOrder.Ascending)]
 090        };
 91
 092        return Task.FromResult(_libraryManager.GetItemList(internalQuery));
 93    }
 94}