< Summary - Jellyfin

Information
Class: Emby.Server.Implementations.Images.DynamicImageProvider
Assembly: Emby.Server.Implementations
File(s): /srv/git/jellyfin/Emby.Server.Implementations/Images/DynamicImageProvider.cs
Line coverage
89%
Covered lines: 66
Uncovered lines: 8
Coverable lines: 74
Total lines: 137
Line coverage: 89.1%
Branch coverage
60%
Covered branches: 12
Total branches: 20
Branch coverage: 60%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 5/12/2026 - 12:15:57 AM Line coverage: 4% (3/74) Branch coverage: 0% (0/20) Total lines: 13710/29/2026 - 12:17:11 AM Line coverage: 89.1% (66/74) Branch coverage: 60% (12/20) Total lines: 137 5/12/2026 - 12:15:57 AM Line coverage: 4% (3/74) Branch coverage: 0% (0/20) Total lines: 13710/29/2026 - 12:17:11 AM Line coverage: 89.1% (66/74) Branch coverage: 60% (12/20) Total lines: 137

Coverage delta

Coverage delta 86 -86

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GetItemsWithImages(...)58.33%121291.22%
Supports(...)50%2266.66%
IsUsingCollectionStrip(...)75%44100%
CreateImage(...)50%3250%

File(s)

/srv/git/jellyfin/Emby.Server.Implementations/Images/DynamicImageProvider.cs

#LineLine coverage
 1#nullable disable
 2
 3#pragma warning disable CS1591
 4
 5using System;
 6using System.Collections.Generic;
 7using System.IO;
 8using System.Linq;
 9using Jellyfin.Data.Enums;
 10using Jellyfin.Extensions;
 11using MediaBrowser.Common.Configuration;
 12using MediaBrowser.Controller.Drawing;
 13using MediaBrowser.Controller.Dto;
 14using MediaBrowser.Controller.Entities;
 15using MediaBrowser.Controller.Entities.Audio;
 16using MediaBrowser.Controller.Entities.TV;
 17using MediaBrowser.Controller.Library;
 18using MediaBrowser.Controller.Providers;
 19using MediaBrowser.Model.Entities;
 20using MediaBrowser.Model.IO;
 21
 22namespace Emby.Server.Implementations.Images
 23{
 24    public class DynamicImageProvider : BaseDynamicImageProvider<UserView>
 25    {
 26        private readonly IUserManager _userManager;
 27
 28        public DynamicImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicat
 2729            : base(fileSystem, providerManager, applicationPaths, imageProcessor)
 30        {
 2731            _userManager = userManager;
 2732        }
 33
 34        protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem item)
 35        {
 436            var view = (UserView)item;
 37
 438            var isUsingCollectionStrip = IsUsingCollectionStrip(view);
 439            var recursive = isUsingCollectionStrip && view?.ViewType is not null && view.ViewType != CollectionType.boxs
 40
 441            var result = view.GetItemList(new InternalItemsQuery
 442            {
 443                User = view.UserId.HasValue ? _userManager.GetUserById(view.UserId.Value) : null,
 444                CollapseBoxSetItems = false,
 445                Recursive = recursive,
 446                ExcludeItemTypes = new[] { BaseItemKind.UserView, BaseItemKind.CollectionFolder, BaseItemKind.Person },
 447                DtoOptions = new DtoOptions(false)
 448            });
 49
 250            var items = result.Select(i =>
 251            {
 252                if (i is Episode episode)
 253                {
 254                    var series = episode.Series;
 255                    if (series is not null)
 256                    {
 257                        return series;
 258                    }
 259
 260                    return episode;
 261                }
 262
 263                if (i is Season season)
 264                {
 265                    var series = season.Series;
 266                    if (series is not null)
 267                    {
 268                        return series;
 269                    }
 270
 271                    return season;
 272                }
 273
 274                if (i is Audio audio)
 275                {
 276                    var album = audio.AlbumEntity;
 277                    if (album is not null && album.HasImage(ImageType.Primary))
 278                    {
 279                        return album;
 280                    }
 281                }
 282
 283                return i;
 284            }).DistinctBy(x => x.Id);
 85
 86            List<BaseItem> returnItems;
 287            if (isUsingCollectionStrip)
 88            {
 289                returnItems = items
 290                    .Where(i => i.HasImage(ImageType.Primary) || i.HasImage(ImageType.Thumb))
 291                    .ToList();
 292                returnItems.Shuffle();
 293                return returnItems;
 94            }
 95
 096            returnItems = items
 097                .Where(i => i.HasImage(ImageType.Primary))
 098                .ToList();
 099            returnItems.Shuffle();
 0100            return returnItems;
 101        }
 102
 103        protected override bool Supports(BaseItem item)
 104        {
 5105            if (item is UserView view)
 106            {
 5107                return IsUsingCollectionStrip(view);
 108            }
 109
 0110            return false;
 111        }
 112
 113        private static bool IsUsingCollectionStrip(UserView view)
 114        {
 9115            CollectionType[] collectionStripViewTypes =
 9116            {
 9117                CollectionType.movies,
 9118                CollectionType.tvshows,
 9119                CollectionType.playlists
 9120            };
 121
 9122            return view?.ViewType is not null && collectionStripViewTypes.Contains(view.ViewType.Value);
 123        }
 124
 125        protected override string CreateImage(BaseItem item, IReadOnlyCollection<BaseItem> itemsWithImages, string outpu
 126        {
 2127            if (itemsWithImages.Count == 0)
 128            {
 2129                return null;
 130            }
 131
 0132            var outputPath = Path.ChangeExtension(outputPathWithoutExtension, ".png");
 133
 0134            return CreateThumbCollage(item, itemsWithImages, outputPath, 960, 540);
 135        }
 136    }
 137}