< 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
3%
Covered lines: 3
Uncovered lines: 82
Coverable lines: 85
Total lines: 276
Line coverage: 3.5%
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 1/23/2026 - 12:11:06 AM Line coverage: 4.3% (3/69) Branch coverage: 0% (0/30) Total lines: 2355/4/2026 - 12:15:16 AM Line coverage: 3.5% (3/85) Branch coverage: 0% (0/46) Total lines: 276 1/23/2026 - 12:11:06 AM Line coverage: 4.3% (3/69) Branch coverage: 0% (0/30) Total lines: 2355/4/2026 - 12:15:16 AM Line coverage: 3.5% (3/85) Branch coverage: 0% (0/46) Total lines: 276

Coverage delta

Coverage delta 1 -1

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([Model.Entities.ExtraType.Trailer]).ToArray();
 41
 42        /// <summary>
 43        /// Gets or sets the display order.
 44        /// </summary>
 45        /// <value>The display order.</value>
 46        public string DisplayOrder { get; set; }
 47
 48        [JsonIgnore]
 49        private bool IsLegacyBoxSet
 50        {
 51            get
 52            {
 053                if (string.IsNullOrEmpty(Path))
 54                {
 055                    return false;
 56                }
 57
 058                if (LinkedChildren.Length > 0)
 59                {
 060                    return false;
 61                }
 62
 063                return !FileSystem.ContainsSubPath(ConfigurationManager.ApplicationPaths.DataPath, Path);
 64            }
 65        }
 66
 67        [JsonIgnore]
 068        public override bool IsPreSorted => true;
 69
 70        public Guid[] LibraryFolderIds { get; set; }
 71
 72        protected override bool GetBlockUnratedValue(User user)
 73        {
 074            return user.GetPreferenceValues<UnratedItem>(PreferenceKind.BlockUnratedItems).Contains(UnratedItem.Movie);
 75        }
 76
 77        public override double GetDefaultPrimaryImageAspectRatio()
 078            => 2.0 / 3;
 79
 80        public override UnratedItem GetBlockUnratedType()
 81        {
 082            return UnratedItem.Movie;
 83        }
 84
 85        protected override IEnumerable<BaseItem> GetNonCachedChildren(IDirectoryService directoryService)
 86        {
 087            if (IsLegacyBoxSet)
 88            {
 089                return base.GetNonCachedChildren(directoryService);
 90            }
 91
 092            return Enumerable.Empty<BaseItem>();
 93        }
 94
 95        protected override IReadOnlyList<BaseItem> LoadChildren()
 96        {
 097            if (IsLegacyBoxSet)
 98            {
 099                return base.LoadChildren();
 100            }
 101
 102            // Save a trip to the database
 0103            return [];
 104        }
 105
 106        public override bool IsAuthorizedToDelete(User user, List<Folder> allCollectionFolders)
 107        {
 0108            return user.HasPermission(PermissionKind.IsAdministrator) || user.HasPermission(PermissionKind.EnableCollect
 109        }
 110
 111        public override bool IsSaveLocalMetadataEnabled()
 112        {
 0113            return true;
 114        }
 115
 116        private IEnumerable<BaseItem> Sort(IEnumerable<BaseItem> items, User user)
 117        {
 0118            if (!Enum.TryParse<ItemSortBy>(DisplayOrder, out var sortBy))
 119            {
 0120                sortBy = ItemSortBy.PremiereDate;
 121            }
 122
 0123            if (sortBy == ItemSortBy.Default)
 124            {
 0125                return items;
 126            }
 127
 0128            return LibraryManager.Sort(items, user, new[] { sortBy }, SortOrder.Ascending);
 129        }
 130
 131        public override IReadOnlyList<BaseItem> GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery qu
 132        {
 0133            var children = base.GetChildren(user, includeLinkedChildren, query);
 0134            return Sort(children, user).ToArray();
 135        }
 136
 137        public override IReadOnlyList<BaseItem> GetChildren(User user, bool includeLinkedChildren, out int totalItemCoun
 138        {
 0139            var children = base.GetChildren(user, includeLinkedChildren, out totalItemCount, query);
 0140            return Sort(children, user).ToArray();
 141        }
 142
 143        public override IReadOnlyList<BaseItem> GetRecursiveChildren(User user, InternalItemsQuery query, out int totalC
 144        {
 0145            var children = base.GetRecursiveChildren(user, query, out totalCount);
 0146            return Sort(children, user).ToArray();
 147        }
 148
 149        public BoxSetInfo GetLookupInfo()
 150        {
 0151            return GetItemLookupInfo<BoxSetInfo>();
 152        }
 153
 154        public override bool IsVisible(User user, bool skipAllowedTagsCheck = false)
 155        {
 0156            if (IsLegacyBoxSet)
 157            {
 0158                return base.IsVisible(user, skipAllowedTagsCheck);
 159            }
 160
 0161            if (!IsParentalAllowed(user, skipAllowedTagsCheck))
 162            {
 0163                return false;
 164            }
 165
 0166            if (LinkedChildren.Length == 0)
 167            {
 0168                return true;
 169            }
 170
 0171            var userLibraryFolderIds = GetLibraryFolderIds(user);
 0172            var libraryFolderIds = LibraryFolderIds ?? GetLibraryFolderIds();
 173
 0174            if (libraryFolderIds.Length == 0)
 175            {
 0176                return true;
 177            }
 178
 0179            if (!userLibraryFolderIds.Any(i => libraryFolderIds.Contains(i)))
 180            {
 0181                return false;
 182            }
 183
 184            // If user has parental controls, hide the BoxSet when all children are restricted
 0185            if (user.MaxParentalRatingScore.HasValue)
 186            {
 0187                var linkedItems = GetLinkedChildren();
 0188                if (linkedItems.Count > 0 && linkedItems.All(child => !child.IsParentalAllowed(user, true)))
 189                {
 0190                    return false;
 191                }
 192            }
 193
 0194            return true;
 195        }
 196
 197        public override void MarkPlayed(User user, DateTime? datePlayed, bool resetPosition)
 198        {
 0199            if (IsLegacyBoxSet)
 200            {
 0201                base.MarkPlayed(user, datePlayed, resetPosition);
 0202                return;
 203            }
 204
 0205            foreach (var item in GetLinkedChildren(user))
 206            {
 0207                item.MarkPlayed(user, datePlayed, resetPosition);
 208            }
 0209        }
 210
 211        public override void MarkUnplayed(User user)
 212        {
 0213            if (IsLegacyBoxSet)
 214            {
 0215                base.MarkUnplayed(user);
 0216                return;
 217            }
 218
 0219            foreach (var item in GetLinkedChildren(user))
 220            {
 0221                item.MarkUnplayed(user);
 222            }
 0223        }
 224
 225        public override bool IsVisibleStandalone(User user)
 226        {
 0227            if (IsLegacyBoxSet)
 228            {
 0229                return base.IsVisibleStandalone(user);
 230            }
 231
 0232            return IsVisible(user);
 233        }
 234
 235        private Guid[] GetLibraryFolderIds(User user)
 236        {
 0237            return LibraryManager.GetUserRootFolder().GetChildren(user, true)
 0238                .Select(i => i.Id)
 0239                .ToArray();
 240        }
 241
 242        public Guid[] GetLibraryFolderIds()
 243        {
 0244            var expandedFolders = new List<Guid>();
 245
 0246            return FlattenItems(this, expandedFolders)
 0247                .SelectMany(LibraryManager.GetCollectionFolders)
 0248                .Select(i => i.Id)
 0249                .Distinct()
 0250                .ToArray();
 251        }
 252
 253        private IEnumerable<BaseItem> FlattenItems(IEnumerable<BaseItem> items, List<Guid> expandedFolders)
 254        {
 0255            return items
 0256                .SelectMany(i => FlattenItems(i, expandedFolders));
 257        }
 258
 259        private IEnumerable<BaseItem> FlattenItems(BaseItem item, List<Guid> expandedFolders)
 260        {
 0261            if (item is BoxSet boxset)
 262            {
 0263                if (!expandedFolders.Contains(item.Id))
 264                {
 0265                    expandedFolders.Add(item.Id);
 266
 0267                    return FlattenItems(boxset.GetLinkedChildren(), expandedFolders);
 268                }
 269
 0270                return Array.Empty<BaseItem>();
 271            }
 272
 0273            return new[] { item };
 274        }
 275    }
 276}

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)
MarkPlayed(Jellyfin.Database.Implementations.Entities.User,System.Nullable`1<System.DateTime>,System.Boolean)
MarkUnplayed(Jellyfin.Database.Implementations.Entities.User)
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>)