< Summary - Jellyfin

Information
Class: MediaBrowser.Providers.Plugins.Tmdb.TV.TmdbSeasonProvider
Assembly: MediaBrowser.Providers
File(s): /srv/git/jellyfin/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeasonProvider.cs
Line coverage
4%
Covered lines: 3
Uncovered lines: 69
Coverable lines: 72
Total lines: 170
Line coverage: 4.1%
Branch coverage
0%
Covered branches: 0
Total branches: 46
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/1/2026 - 12:13:05 AM Line coverage: 4.2% (3/71) Branch coverage: 0% (0/44) Total lines: 1718/3/2026 - 12:16:46 AM Line coverage: 4.1% (3/72) Branch coverage: 0% (0/46) Total lines: 170 5/1/2026 - 12:13:05 AM Line coverage: 4.2% (3/71) Branch coverage: 0% (0/44) Total lines: 1718/3/2026 - 12:16:46 AM Line coverage: 4.1% (3/72) Branch coverage: 0% (0/46) Total lines: 170

Coverage delta

Coverage delta 1 -1

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_Name()100%210%
GetMetadata()0%2162460%
GetSearchResults(...)100%210%
GetImageResponse(...)100%210%

File(s)

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

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Globalization;
 4using System.Linq;
 5using System.Net.Http;
 6using System.Threading;
 7using System.Threading.Tasks;
 8using Jellyfin.Data.Enums;
 9using Jellyfin.Extensions;
 10using MediaBrowser.Common.Net;
 11using MediaBrowser.Controller.Entities;
 12using MediaBrowser.Controller.Entities.TV;
 13using MediaBrowser.Controller.Providers;
 14using MediaBrowser.Model.Entities;
 15using MediaBrowser.Model.Providers;
 16
 17namespace MediaBrowser.Providers.Plugins.Tmdb.TV
 18{
 19    /// <summary>
 20    /// TV season provider powered by TheMovieDb.
 21    /// </summary>
 22    public class TmdbSeasonProvider : IRemoteMetadataProvider<Season, SeasonInfo>
 23    {
 24        private readonly IHttpClientFactory _httpClientFactory;
 25        private readonly TmdbClientManager _tmdbClientManager;
 26
 27        /// <summary>
 28        /// Initializes a new instance of the <see cref="TmdbSeasonProvider"/> class.
 29        /// </summary>
 30        /// <param name="httpClientFactory">The <see cref="IHttpClientFactory"/>.</param>
 31        /// <param name="tmdbClientManager">The <see cref="TmdbClientManager"/>.</param>
 32        public TmdbSeasonProvider(IHttpClientFactory httpClientFactory, TmdbClientManager tmdbClientManager)
 33        {
 2234            _httpClientFactory = httpClientFactory;
 2235            _tmdbClientManager = tmdbClientManager;
 2236        }
 37
 38        /// <inheritdoc />
 039        public string Name => TmdbUtils.ProviderName;
 40
 41        /// <inheritdoc />
 42        public async Task<MetadataResult<Season>> GetMetadata(SeasonInfo info, CancellationToken cancellationToken)
 43        {
 044            var result = new MetadataResult<Season>();
 045            var config = Plugin.Instance.Configuration;
 46
 047            info.SeriesProviderIds.TryGetValue(MetadataProvider.Tmdb.ToString(), out string? seriesTmdbId);
 48
 049            var seasonNumber = info.IndexNumber;
 50
 051            if (string.IsNullOrWhiteSpace(seriesTmdbId) || !seasonNumber.HasValue)
 52            {
 053                return result;
 54            }
 55
 056            var seasonResult = await _tmdbClientManager
 057                .GetSeasonAsync(Convert.ToInt32(seriesTmdbId, CultureInfo.InvariantCulture), seasonNumber.Value, info.Me
 058                .ConfigureAwait(false);
 59
 060            if (seasonResult is null)
 61            {
 062                return result;
 63            }
 64
 065            result.HasMetadata = true;
 066            result.Item = new Season
 067            {
 068                IndexNumber = seasonNumber,
 069                Overview = seasonResult.Overview,
 070                PremiereDate = seasonResult.AirDate,
 071                ProductionYear = seasonResult.AirDate?.Year
 072            };
 73
 074            if (config.ImportSeasonName)
 75            {
 076                result.Item.Name = seasonResult.Name;
 77            }
 78
 079            result.Item.TrySetProviderId(MetadataProvider.Tmdb, seasonResult.Id?.ToString(CultureInfo.InvariantCulture))
 080            result.Item.TrySetProviderId(MetadataProvider.Tvdb, seasonResult.ExternalIds?.TvdbId);
 81
 082            var credits = seasonResult.Credits;
 083            if (credits?.Cast is not null)
 84            {
 085                var castQuery = config.HideMissingCastMembers
 086                    ? credits.Cast.Where(a => !string.IsNullOrEmpty(a.ProfilePath)).OrderBy(a => a.Order)
 087                    : credits.Cast.OrderBy(a => a.Order);
 88
 089                foreach (var actor in castQuery.Take(config.MaxCastMembers))
 90                {
 091                    if (string.IsNullOrWhiteSpace(actor.Name))
 92                    {
 93                        continue;
 94                    }
 95
 096                    var personInfo = new PersonInfo
 097                    {
 098                        Name = actor.Name.Trim(),
 099                        Role = actor.Character?.Trim() ?? string.Empty,
 0100                        Type = PersonKind.Actor,
 0101                        SortOrder = actor.Order,
 0102                        ImageUrl = _tmdbClientManager.GetProfileUrl(actor.ProfilePath)
 0103                    };
 104
 0105                    if (actor.Id > 0)
 106                    {
 0107                        personInfo.SetProviderId(MetadataProvider.Tmdb, actor.Id.ToString(CultureInfo.InvariantCulture))
 108                    }
 109
 0110                    result.AddPerson(personInfo);
 111                }
 112            }
 113
 0114            if (credits?.Crew is not null)
 115            {
 0116                var crewQuery = credits.Crew
 0117                    .Select(crewMember => new
 0118                    {
 0119                        CrewMember = crewMember,
 0120                        PersonType = TmdbUtils.MapCrewToPersonType(crewMember)
 0121                    })
 0122                    .Where(entry => TmdbUtils.WantedCrewKinds.Contains(entry.PersonType));
 123
 0124                if (config.HideMissingCrewMembers)
 125                {
 0126                    crewQuery = crewQuery.Where(entry => !string.IsNullOrEmpty(entry.CrewMember.ProfilePath));
 127                }
 128
 0129                foreach (var entry in crewQuery.Take(config.MaxCrewMembers))
 130                {
 0131                    var crewMember = entry.CrewMember;
 132
 0133                    if (string.IsNullOrWhiteSpace(crewMember.Name))
 134                    {
 135                        continue;
 136                    }
 137
 0138                    var personInfo = new PersonInfo
 0139                    {
 0140                        Name = crewMember.Name.Trim(),
 0141                        Role = crewMember.Job?.Trim() ?? string.Empty,
 0142                        Type = entry.PersonType,
 0143                        ImageUrl = _tmdbClientManager.GetProfileUrl(crewMember.ProfilePath)
 0144                    };
 145
 0146                    if (crewMember.Id > 0)
 147                    {
 0148                        personInfo.SetProviderId(MetadataProvider.Tmdb, crewMember.Id.ToString(CultureInfo.InvariantCult
 149                    }
 150
 0151                    result.AddPerson(personInfo);
 152                }
 153            }
 154
 0155            return result;
 0156        }
 157
 158        /// <inheritdoc />
 159        public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(SeasonInfo searchInfo, CancellationToken cancellat
 160        {
 0161            return Task.FromResult(Enumerable.Empty<RemoteSearchResult>());
 162        }
 163
 164        /// <inheritdoc />
 165        public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)
 166        {
 0167            return _httpClientFactory.CreateClient(NamedClient.Default).GetAsync(url, cancellationToken);
 168        }
 169    }
 170}