< Summary - Jellyfin

Information
Class: Emby.Server.Implementations.Images.CollectionFolderImageProvider
Assembly: Emby.Server.Implementations
File(s): /srv/git/jellyfin/Emby.Server.Implementations/Images/CollectionFolderImageProvider.cs
Line coverage
89%
Covered lines: 33
Uncovered lines: 4
Coverable lines: 37
Total lines: 101
Line coverage: 89.1%
Branch coverage
50%
Covered branches: 3
Total branches: 6
Branch coverage: 50%
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: 57.1% (24/42) Branch coverage: 31.2% (5/16) Total lines: 1086/30/2026 - 12:15:32 AM Line coverage: 84% (21/25) Branch coverage: 50% (2/4) Total lines: 747/21/2026 - 12:16:33 AM Line coverage: 81.4% (22/27) Branch coverage: 50% (3/6) Total lines: 8010/29/2026 - 12:17:11 AM Line coverage: 89.1% (33/37) Branch coverage: 50% (3/6) Total lines: 101 5/12/2026 - 12:15:57 AM Line coverage: 57.1% (24/42) Branch coverage: 31.2% (5/16) Total lines: 1086/30/2026 - 12:15:32 AM Line coverage: 84% (21/25) Branch coverage: 50% (2/4) Total lines: 747/21/2026 - 12:16:33 AM Line coverage: 81.4% (22/27) Branch coverage: 50% (3/6) Total lines: 8010/29/2026 - 12:17:11 AM Line coverage: 89.1% (33/37) Branch coverage: 50% (3/6) Total lines: 101

Coverage delta

Coverage delta 27 -27

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GetItemsWithImages(...)50%2293.75%
GetArtistsWithImages(...)100%11100%
Supports(...)100%11100%
CreateImage(...)50%5466.66%
HasChangedByDate(...)100%210%

File(s)

/srv/git/jellyfin/Emby.Server.Implementations/Images/CollectionFolderImageProvider.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.Api.Extensions;
 10using Jellyfin.Data.Enums;
 11using Jellyfin.Database.Implementations.Enums;
 12using MediaBrowser.Common.Configuration;
 13using MediaBrowser.Controller.Drawing;
 14using MediaBrowser.Controller.Dto;
 15using MediaBrowser.Controller.Entities;
 16using MediaBrowser.Controller.Library;
 17using MediaBrowser.Controller.Providers;
 18using MediaBrowser.Model.Entities;
 19using MediaBrowser.Model.IO;
 20
 21namespace Emby.Server.Implementations.Images
 22{
 23    public class CollectionFolderImageProvider : BaseDynamicImageProvider<CollectionFolder>
 24    {
 25        private readonly ILibraryManager _libraryManager;
 26
 2827        public CollectionFolderImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths
 28        {
 2829            _libraryManager = libraryManager;
 2830        }
 31
 32        protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem item)
 33        {
 4534            var view = (CollectionFolder)item;
 4535            var viewType = view.CollectionType;
 4536            var includeItemTypes = DtoExtensions.GetBaseItemKindsForCollectionType(viewType);
 4537            var recursive = viewType != CollectionType.playlists;
 38
 4539            if (viewType == CollectionType.music)
 40            {
 41                // Music albums usually don't have dedicated backdrops, so use artist instead.
 42                // Artists carry no library of their own, so an item query for them is not
 43                // restricted to this library and would collage the artists of every music
 44                // library. Resolve them through the tracks that credit them instead.
 145                return GetArtistsWithImages(view);
 46            }
 47
 4448            return view.GetItemList(new InternalItemsQuery
 4449            {
 4450                CollapseBoxSetItems = false,
 4451                Recursive = recursive,
 4452                DtoOptions = new DtoOptions(false),
 4453                ImageTypes = [ImageType.Primary],
 4454                Limit = 8,
 4455                OrderBy = [(ItemSortBy.Random, SortOrder.Ascending)],
 4456                IncludeItemTypes = includeItemTypes
 4457            });
 58        }
 59
 60        private IReadOnlyList<BaseItem> GetArtistsWithImages(CollectionFolder view)
 61        {
 162            return _libraryManager.GetAllArtists(new InternalItemsQuery
 163            {
 164                AncestorIds = [view.Id],
 165                DtoOptions = new DtoOptions(false),
 166                EnableTotalRecordCount = false,
 167                ImageTypes = [ImageType.Primary],
 168                Limit = 8,
 169                OrderBy = [(ItemSortBy.Random, SortOrder.Ascending)]
 170            }).Items.Select(i => i.Item).ToArray();
 71        }
 72
 73        protected override bool Supports(BaseItem item)
 74        {
 4475            return item is CollectionFolder;
 76        }
 77
 78        protected override string CreateImage(BaseItem item, IReadOnlyCollection<BaseItem> itemsWithImages, string outpu
 79        {
 780            var outputPath = Path.ChangeExtension(outputPathWithoutExtension, ".png");
 81
 782            if (imageType == ImageType.Primary)
 83            {
 784                if (itemsWithImages.Count == 0)
 85                {
 786                    return null;
 87                }
 88
 089                return CreateThumbCollage(item, itemsWithImages, outputPath, 960, 540);
 90            }
 91
 092            return base.CreateImage(item, itemsWithImages, outputPath, imageType, imageIndex);
 93        }
 94
 95        protected override bool HasChangedByDate(BaseItem item, ItemImageInfo image)
 96        {
 097            var age = DateTime.UtcNow - image.DateModified;
 098            return age.TotalDays > 7;
 99        }
 100    }
 101}