< 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: 64
Coverable lines: 67
Total lines: 226
Line coverage: 4.4%
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

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.Linq;
 8using System.Text.Json.Serialization;
 9using Jellyfin.Data.Entities;
 10using Jellyfin.Data.Enums;
 11using MediaBrowser.Controller.Providers;
 12using MediaBrowser.Model.Querying;
 13
 14namespace MediaBrowser.Controller.Entities.Movies
 15{
 16    /// <summary>
 17    /// Class BoxSet.
 18    /// </summary>
 19    public class BoxSet : Folder, IHasTrailers, IHasDisplayOrder, IHasLookupInfo<BoxSetInfo>
 20    {
 221        public BoxSet()
 22        {
 223            DisplayOrder = "PremiereDate";
 224        }
 25
 26        [JsonIgnore]
 027        protected override bool FilterLinkedChildrenPerUser => true;
 28
 29        [JsonIgnore]
 030        public override bool SupportsInheritedParentImages => false;
 31
 32        [JsonIgnore]
 033        public override bool SupportsPeople => true;
 34
 35        /// <inheritdoc />
 36        [JsonIgnore]
 037        public IReadOnlyList<BaseItem> LocalTrailers => GetExtras()
 038            .Where(extra => extra.ExtraType == Model.Entities.ExtraType.Trailer)
 039            .ToArray();
 40
 41        /// <summary>
 42        /// Gets or sets the display order.
 43        /// </summary>
 44        /// <value>The display order.</value>
 45        public string DisplayOrder { get; set; }
 46
 47        [JsonIgnore]
 48        private bool IsLegacyBoxSet
 49        {
 50            get
 51            {
 052                if (string.IsNullOrEmpty(Path))
 53                {
 054                    return false;
 55                }
 56
 057                if (LinkedChildren.Length > 0)
 58                {
 059                    return false;
 60                }
 61
 062                return !FileSystem.ContainsSubPath(ConfigurationManager.ApplicationPaths.DataPath, Path);
 63            }
 64        }
 65
 66        [JsonIgnore]
 067        public override bool IsPreSorted => true;
 68
 69        public Guid[] LibraryFolderIds { get; set; }
 70
 71        protected override bool GetBlockUnratedValue(User user)
 72        {
 073            return user.GetPreferenceValues<UnratedItem>(PreferenceKind.BlockUnratedItems).Contains(UnratedItem.Movie);
 74        }
 75
 76        public override double GetDefaultPrimaryImageAspectRatio()
 077            => 2.0 / 3;
 78
 79        public override UnratedItem GetBlockUnratedType()
 80        {
 081            return UnratedItem.Movie;
 82        }
 83
 84        protected override IEnumerable<BaseItem> GetNonCachedChildren(IDirectoryService directoryService)
 85        {
 086            if (IsLegacyBoxSet)
 87            {
 088                return base.GetNonCachedChildren(directoryService);
 89            }
 90
 091            return Enumerable.Empty<BaseItem>();
 92        }
 93
 94        protected override List<BaseItem> LoadChildren()
 95        {
 096            if (IsLegacyBoxSet)
 97            {
 098                return base.LoadChildren();
 99            }
 100
 101            // Save a trip to the database
 0102            return new List<BaseItem>();
 103        }
 104
 105        public override bool IsAuthorizedToDelete(User user, List<Folder> allCollectionFolders)
 106        {
 0107            return user.HasPermission(PermissionKind.IsAdministrator) || user.HasPermission(PermissionKind.EnableCollect
 108        }
 109
 110        public override bool IsSaveLocalMetadataEnabled()
 111        {
 0112            return true;
 113        }
 114
 115        private IEnumerable<BaseItem> Sort(IEnumerable<BaseItem> items, User user)
 116        {
 0117            if (!Enum.TryParse<ItemSortBy>(DisplayOrder, out var sortBy))
 118            {
 0119                sortBy = ItemSortBy.PremiereDate;
 120            }
 121
 0122            if (sortBy == ItemSortBy.Default)
 123            {
 0124              return items;
 125            }
 126
 0127            return LibraryManager.Sort(items, user, new[] { sortBy }, SortOrder.Ascending);
 128        }
 129
 130        public override List<BaseItem> GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery query)
 131        {
 0132            var children = base.GetChildren(user, includeLinkedChildren, query);
 0133            return Sort(children, user).ToList();
 134        }
 135
 136        public override IEnumerable<BaseItem> GetRecursiveChildren(User user, InternalItemsQuery query)
 137        {
 0138            var children = base.GetRecursiveChildren(user, query);
 0139            return Sort(children, user).ToList();
 140        }
 141
 142        public BoxSetInfo GetLookupInfo()
 143        {
 0144            return GetItemLookupInfo<BoxSetInfo>();
 145        }
 146
 147        public override bool IsVisible(User user)
 148        {
 0149            if (IsLegacyBoxSet)
 150            {
 0151                return base.IsVisible(user);
 152            }
 153
 0154            if (base.IsVisible(user))
 155            {
 0156                if (LinkedChildren.Length == 0)
 157                {
 0158                    return true;
 159                }
 160
 0161                var userLibraryFolderIds = GetLibraryFolderIds(user);
 0162                var libraryFolderIds = LibraryFolderIds ?? GetLibraryFolderIds();
 163
 0164                if (libraryFolderIds.Length == 0)
 165                {
 0166                    return true;
 167                }
 168
 0169                return userLibraryFolderIds.Any(i => libraryFolderIds.Contains(i));
 170            }
 171
 0172            return false;
 173        }
 174
 175        public override bool IsVisibleStandalone(User user)
 176        {
 0177            if (IsLegacyBoxSet)
 178            {
 0179                return base.IsVisibleStandalone(user);
 180            }
 181
 0182            return IsVisible(user);
 183        }
 184
 185        private Guid[] GetLibraryFolderIds(User user)
 186        {
 0187            return LibraryManager.GetUserRootFolder().GetChildren(user, true)
 0188                .Select(i => i.Id)
 0189                .ToArray();
 190        }
 191
 192        public Guid[] GetLibraryFolderIds()
 193        {
 0194            var expandedFolders = new List<Guid>();
 195
 0196            return FlattenItems(this, expandedFolders)
 0197                .SelectMany(i => LibraryManager.GetCollectionFolders(i))
 0198                .Select(i => i.Id)
 0199                .Distinct()
 0200                .ToArray();
 201        }
 202
 203        private IEnumerable<BaseItem> FlattenItems(IEnumerable<BaseItem> items, List<Guid> expandedFolders)
 204        {
 0205            return items
 0206                .SelectMany(i => FlattenItems(i, expandedFolders));
 207        }
 208
 209        private IEnumerable<BaseItem> FlattenItems(BaseItem item, List<Guid> expandedFolders)
 210        {
 0211            if (item is BoxSet boxset)
 212            {
 0213                if (!expandedFolders.Contains(item.Id))
 214                {
 0215                    expandedFolders.Add(item.Id);
 216
 0217                    return FlattenItems(boxset.GetLinkedChildren(), expandedFolders);
 218                }
 219
 0220                return Array.Empty<BaseItem>();
 221            }
 222
 0223            return new[] { item };
 224        }
 225    }
 226}