< Summary - Jellyfin

Information
Class: MediaBrowser.Providers.Plugins.Tmdb.TV.TmdbSeriesSimilarProvider
Assembly: MediaBrowser.Providers
File(s): /srv/git/jellyfin/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesSimilarProvider.cs
Line coverage
10%
Covered lines: 3
Uncovered lines: 27
Coverable lines: 30
Total lines: 96
Line coverage: 10%
Branch coverage
0%
Covered branches: 0
Total branches: 16
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: 10% (3/30) Branch coverage: 0% (0/16) Total lines: 96 5/16/2026 - 12:15:55 AM Line coverage: 10% (3/30) Branch coverage: 0% (0/16) Total lines: 96

Metrics

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

File(s)

/srv/git/jellyfin/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesSimilarProvider.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Globalization;
 4using System.Runtime.CompilerServices;
 5using System.Threading;
 6using MediaBrowser.Controller.Entities.TV;
 7using MediaBrowser.Controller.Library;
 8using MediaBrowser.Model.Configuration;
 9using MediaBrowser.Model.Entities;
 10using Microsoft.Extensions.Logging;
 11
 12namespace MediaBrowser.Providers.Plugins.Tmdb.TV;
 13
 14/// <summary>
 15/// TMDb-based similar items provider for TV series.
 16/// </summary>
 17public class TmdbSeriesSimilarProvider : IRemoteSimilarItemsProvider<Series>
 18{
 19    private readonly TmdbClientManager _tmdbClientManager;
 20    private readonly ILogger<TmdbSeriesSimilarProvider> _logger;
 21
 22    /// <summary>
 23    /// Initializes a new instance of the <see cref="TmdbSeriesSimilarProvider"/> class.
 24    /// </summary>
 25    /// <param name="tmdbClientManager">The TMDb client manager.</param>
 26    /// <param name="logger">The logger.</param>
 27    public TmdbSeriesSimilarProvider(TmdbClientManager tmdbClientManager, ILogger<TmdbSeriesSimilarProvider> logger)
 28    {
 2129        _tmdbClientManager = tmdbClientManager;
 2130        _logger = logger;
 2131    }
 32
 33    /// <inheritdoc/>
 034    public string Name => TmdbUtils.ProviderName;
 35
 36    /// <inheritdoc/>
 037    public MetadataPluginType Type => MetadataPluginType.SimilarityProvider;
 38
 39    /// <inheritdoc/>
 40    public TimeSpan? CacheDuration
 41    {
 42        get
 43        {
 044            var days = Plugin.Instance?.Configuration.SimilarItemsCacheDays ?? 0;
 045            return days > 0 ? TimeSpan.FromDays(days) : null;
 46        }
 47    }
 48
 49    /// <inheritdoc/>
 50    public async IAsyncEnumerable<SimilarItemReference> GetSimilarItemsAsync(
 51        Series item,
 52        SimilarItemsQuery query,
 53        [EnumeratorCancellation] CancellationToken cancellationToken)
 54    {
 055        if (!item.TryGetProviderId(MetadataProvider.Tmdb, out var tmdbIdStr) || !int.TryParse(tmdbIdStr, CultureInfo.Inv
 56        {
 057            yield break;
 58        }
 59
 060        var providerName = MetadataProvider.Tmdb.ToString();
 061        var page = 1;
 062        var totalPages = 1;
 63
 064        while (page <= totalPages && !cancellationToken.IsCancellationRequested)
 65        {
 66            IReadOnlyList<TMDbLib.Objects.Search.SearchTv> pageResults;
 67            try
 68            {
 069                (pageResults, totalPages) = await _tmdbClientManager
 070                    .GetSeriesSimilarPageAsync(tmdbId, page, TmdbUtils.GetImageLanguagesParam(string.Empty), cancellatio
 071                    .ConfigureAwait(false);
 072            }
 073            catch (Exception ex)
 74            {
 075                _logger.LogWarning(ex, "Failed to get similar TV shows from TMDb for {TmdbId} page {Page}", tmdbId, page
 076                yield break;
 77            }
 78
 079            if (pageResults.Count == 0)
 80            {
 081                yield break;
 82            }
 83
 084            foreach (var similar in pageResults)
 85            {
 086                yield return new SimilarItemReference
 087                {
 088                    ProviderName = providerName,
 089                    ProviderId = similar.Id.ToString(CultureInfo.InvariantCulture)
 090                };
 91            }
 92
 093            page++;
 94        }
 095    }
 96}