< Summary - Jellyfin

Information
Class: MediaBrowser.Controller.Entities.Movies.BoxSet
Assembly: MediaBrowser.Controller
File(s): /srv/git/jellyfin/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
Line coverage
4%
Covered lines: 3
Uncovered lines: 66
Coverable lines: 69
Total lines: 235
Line coverage: 4.3%
Branch coverage
0%
Covered branches: 0
Total branches: 30
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 9/21/2025 - 12:11:25 AM Line coverage: 4.4% (3/67) Branch coverage: 0% (0/30) Total lines: 22912/29/2025 - 12:13:19 AM Line coverage: 4.3% (3/69) Branch coverage: 0% (0/30) Total lines: 235 9/21/2025 - 12:11:25 AM Line coverage: 4.4% (3/67) Branch coverage: 0% (0/30) Total lines: 22912/29/2025 - 12:13:19 AM Line coverage: 4.3% (3/69) Branch coverage: 0% (0/30) Total lines: 235

Metrics

File(s)

/srv/git/jellyfin/MediaBrowser.Controller/Entities/Movies/BoxSet.cs

#LineLine coverage
 1#nullable disable
 2
 3#pragma warning disable CA1721, CA1819, CS1591
 4
 5using System;
 6using System.Collections.Generic;
 7using System.Collections.Immutable;
 8using System.Linq;
 9using System.Text.Json.Serialization;
 10using Jellyfin.Data;
 11using Jellyfin.Data.Enums;
 12using Jellyfin.Database.Implementations.Entities;
 13using Jellyfin.Database.Implementations.Enums;
 14using MediaBrowser.Controller.Providers;
 15using MediaBrowser.Model.Querying;
 16
 17namespace MediaBrowser.Controller.Entities.Movies
 18{
 19    /// <summary>
 20    /// Class BoxSet.
 21    /// </summary>
 22    public class BoxSet : Folder, IHasTrailers, IHasDisplayOrder, IHasLookupInfo<BoxSetInfo>
 23    {
 224        public BoxSet()
 25        {
 226            DisplayOrder = "PremiereDate";
 227        }
 28
 29        [JsonIgnore]
 030        protected override bool FilterLinkedChildrenPerUser => true;
 31
 32        [JsonIgnore]
 033        public override bool SupportsInheritedParentImages => false;
 34
 35        [JsonIgnore]
 036        public override bool SupportsPeople => true;
 37
 38        /// <inheritdoc />
 39        [JsonIgnore]
 040        public IReadOnlyList<BaseItem> LocalTrailers => GetExtras()
 041            .Where(extra => extra.ExtraType == Model.Entities.ExtraType.Trailer)
 042            .ToArray();
 43
 44        /// <summary>
 45        /// Gets or sets the display order.
 46        /// </summary>
 47        /// <value>The display order.</value>
 48        public string DisplayOrder { get; set; }
 49
 50        [JsonIgnore]
 51        private bool IsLegacyBoxSet
 52        {
 53            get
 54            {
 055                if (string.IsNullOrEmpty(Path))
 56                {
 057                    return false;
 58                }
 59
 060                if (LinkedChildren.Length > 0)
 61                {
 062                    return false;
 63                }
 64
 065                return !FileSystem.ContainsSubPath(ConfigurationManager.ApplicationPaths.DataPath, Path);
 66            }
 67        }
 68
 69        [JsonIgnore]
 070        public override bool IsPreSorted => true;
 71
 72        public Guid[] LibraryFolderIds { get; set; }
 73
 74        protected override bool GetBlockUnratedValue(User user)
 75        {
 076            return user.GetPreferenceValues<UnratedItem>(PreferenceKind.BlockUnratedItems).Contains(UnratedItem.Movie);
 77        }
 78
 79        public override double GetDefaultPrimaryImageAspectRatio()
 080            => 2.0 / 3;
 81
 82        public override UnratedItem GetBlockUnratedType()
 83        {
 084            return UnratedItem.Movie;
 85        }
 86
 87        protected override IEnumerable<BaseItem> GetNonCachedChildren(IDirectoryService directoryService)
 88        {
 089            if (IsLegacyBoxSet)
 90            {
 091                return base.GetNonCachedChildren(directoryService);
 92            }
 93
 094            return Enumerable.Empty<BaseItem>();
 95        }
 96
 97        protected override IReadOnlyList<BaseItem> LoadChildren()
 98        {
 099            if (IsLegacyBoxSet)
 100            {
 0101                return base.LoadChildren();
 102            }
 103
 104            // Save a trip to the database
 0105            return [];
 106        }
 107
 108        public override bool IsAuthorizedToDelete(User user, List<Folder> allCollectionFolders)
 109        {
 0110            return user.HasPermission(PermissionKind.IsAdministrator) || user.HasPermission(PermissionKind.EnableCollect
 111        }
 112
 113        public override bool IsSaveLocalMetadataEnabled()
 114        {
 0115            return true;
 116        }
 117
 118        private IEnumerable<BaseItem> Sort(IEnumerable<BaseItem> items, User user)
 119        {
 0120            if (!Enum.TryParse<ItemSortBy>(DisplayOrder, out var sortBy))
 121            {
 0122                sortBy = ItemSortBy.PremiereDate;
 123            }
 124
 0125            if (sortBy == ItemSortBy.Default)
 126            {
 0127                return items;
 128            }
 129
 0130            return LibraryManager.Sort(items, user, new[] { sortBy }, SortOrder.Ascending);
 131        }
 132
 133        public override IReadOnlyList<BaseItem> GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery qu
 134        {
 0135            var children = base.GetChildren(user, includeLinkedChildren, query);
 0136            return Sort(children, user).ToArray();
 137        }
 138
 139        public override IReadOnlyList<BaseItem> GetChildren(User user, bool includeLinkedChildren, out int totalItemCoun
 140        {
 0141            var children = base.GetChildren(user, includeLinkedChildren, out totalItemCount, query);
 0142            return Sort(children, user).ToArray();
 143        }
 144
 145        public override IReadOnlyList<BaseItem> GetRecursiveChildren(User user, InternalItemsQuery query, out int totalC
 146        {
 0147            var children = base.GetRecursiveChildren(user, query, out totalCount);
 0148            return Sort(children, user).ToArray();
 149        }
 150
 151        public BoxSetInfo GetLookupInfo()
 152        {
 0153            return GetItemLookupInfo<BoxSetInfo>();
 154        }
 155
 156        public override bool IsVisible(User user, bool skipAllowedTagsCheck = false)
 157        {
 0158            if (IsLegacyBoxSet)
 159            {
 0160                return base.IsVisible(user, skipAllowedTagsCheck);
 161            }
 162
 0163            if (base.IsVisible(user, skipAllowedTagsCheck))
 164            {
 0165                if (LinkedChildren.Length == 0)
 166                {
 0167                    return true;
 168                }
 169
 0170                var userLibraryFolderIds = GetLibraryFolderIds(user);
 0171                var libraryFolderIds = LibraryFolderIds ?? GetLibraryFolderIds();
 172
 0173                if (libraryFolderIds.Length == 0)
 174                {
 0175                    return true;
 176                }
 177
 0178                return userLibraryFolderIds.Any(i => libraryFolderIds.Contains(i));
 179            }
 180
 0181            return false;
 182        }
 183
 184        public override bool IsVisibleStandalone(User user)
 185        {
 0186            if (IsLegacyBoxSet)
 187            {
 0188                return base.IsVisibleStandalone(user);
 189            }
 190
 0191            return IsVisible(user);
 192        }
 193
 194        private Guid[] GetLibraryFolderIds(User user)
 195        {
 0196            return LibraryManager.GetUserRootFolder().GetChildren(user, true)
 0197                .Select(i => i.Id)
 0198                .ToArray();
 199        }
 200
 201        public Guid[] GetLibraryFolderIds()
 202        {
 0203            var expandedFolders = new List<Guid>();
 204
 0205            return FlattenItems(this, expandedFolders)
 0206                .SelectMany(LibraryManager.GetCollectionFolders)
 0207                .Select(i => i.Id)
 0208                .Distinct()
 0209                .ToArray();
 210        }
 211
 212        private IEnumerable<BaseItem> FlattenItems(IEnumerable<BaseItem> items, List<Guid> expandedFolders)
 213        {
 0214            return items
 0215                .SelectMany(i => FlattenItems(i, expandedFolders));
 216        }
 217
 218        private IEnumerable<BaseItem> FlattenItems(BaseItem item, List<Guid> expandedFolders)
 219        {
 0220            if (item is BoxSet boxset)
 221            {
 0222                if (!expandedFolders.Contains(item.Id))
 223                {
 0224                    expandedFolders.Add(item.Id);
 225
 0226                    return FlattenItems(boxset.GetLinkedChildren(), expandedFolders);
 227                }
 228
 0229                return Array.Empty<BaseItem>();
 230            }
 231
 0232            return new[] { item };
 233        }
 234    }
 235}

Methods/Properties

.ctor()
get_FilterLinkedChildrenPerUser()
get_SupportsInheritedParentImages()
get_SupportsPeople()
get_LocalTrailers()
get_IsLegacyBoxSet()
get_IsPreSorted()
GetBlockUnratedValue(Jellyfin.Database.Implementations.Entities.User)
GetDefaultPrimaryImageAspectRatio()
GetBlockUnratedType()
GetNonCachedChildren(MediaBrowser.Controller.Providers.IDirectoryService)
LoadChildren()
IsAuthorizedToDelete(Jellyfin.Database.Implementations.Entities.User,System.Collections.Generic.List`1<MediaBrowser.Controller.Entities.Folder>)
IsSaveLocalMetadataEnabled()
Sort(System.Collections.Generic.IEnumerable`1<MediaBrowser.Controller.Entities.BaseItem>,Jellyfin.Database.Implementations.Entities.User)
GetChildren(Jellyfin.Database.Implementations.Entities.User,System.Boolean,MediaBrowser.Controller.Entities.InternalItemsQuery)
GetChildren(Jellyfin.Database.Implementations.Entities.User,System.Boolean,System.Int32&,MediaBrowser.Controller.Entities.InternalItemsQuery)
GetRecursiveChildren(Jellyfin.Database.Implementations.Entities.User,MediaBrowser.Controller.Entities.InternalItemsQuery,System.Int32&)
GetLookupInfo()
IsVisible(Jellyfin.Database.Implementations.Entities.User,System.Boolean)
IsVisibleStandalone(Jellyfin.Database.Implementations.Entities.User)
GetLibraryFolderIds(Jellyfin.Database.Implementations.Entities.User)
GetLibraryFolderIds()
FlattenItems(System.Collections.Generic.IEnumerable`1<MediaBrowser.Controller.Entities.BaseItem>,System.Collections.Generic.List`1<System.Guid>)
FlattenItems(MediaBrowser.Controller.Entities.BaseItem,System.Collections.Generic.List`1<System.Guid>)