#nullable disable #pragma warning disable CA1721, CA1819, CS1591 using System; using System.Collections.Generic; using System.Linq; using System.Text.Json.Serialization; using Jellyfin.Data.Entities; using Jellyfin.Data.Enums; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Querying; namespace MediaBrowser.Controller.Entities.Movies { /// /// Class BoxSet. /// public class BoxSet : Folder, IHasTrailers, IHasDisplayOrder, IHasLookupInfo { public BoxSet() { DisplayOrder = "PremiereDate"; } [JsonIgnore] protected override bool FilterLinkedChildrenPerUser => true; [JsonIgnore] public override bool SupportsInheritedParentImages => false; [JsonIgnore] public override bool SupportsPeople => true; /// [JsonIgnore] public IReadOnlyList LocalTrailers => GetExtras() .Where(extra => extra.ExtraType == Model.Entities.ExtraType.Trailer) .ToArray(); /// /// Gets or sets the display order. /// /// The display order. public string DisplayOrder { get; set; } [JsonIgnore] private bool IsLegacyBoxSet { get { if (string.IsNullOrEmpty(Path)) { return false; } if (LinkedChildren.Length > 0) { return false; } return !FileSystem.ContainsSubPath(ConfigurationManager.ApplicationPaths.DataPath, Path); } } [JsonIgnore] public override bool IsPreSorted => true; public Guid[] LibraryFolderIds { get; set; } protected override bool GetBlockUnratedValue(User user) { return user.GetPreferenceValues(PreferenceKind.BlockUnratedItems).Contains(UnratedItem.Movie); } public override double GetDefaultPrimaryImageAspectRatio() => 2.0 / 3; public override UnratedItem GetBlockUnratedType() { return UnratedItem.Movie; } protected override IEnumerable GetNonCachedChildren(IDirectoryService directoryService) { if (IsLegacyBoxSet) { return base.GetNonCachedChildren(directoryService); } return Enumerable.Empty(); } protected override List LoadChildren() { if (IsLegacyBoxSet) { return base.LoadChildren(); } // Save a trip to the database return new List(); } public override bool IsAuthorizedToDelete(User user, List allCollectionFolders) { return user.HasPermission(PermissionKind.IsAdministrator) || user.HasPermission(PermissionKind.EnableCollectionManagement); } public override bool IsSaveLocalMetadataEnabled() { return true; } public override List GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery query) { var children = base.GetChildren(user, includeLinkedChildren, query); if (string.Equals(DisplayOrder, "SortName", StringComparison.OrdinalIgnoreCase)) { // Sort by name return LibraryManager.Sort(children, user, new[] { ItemSortBy.SortName }, SortOrder.Ascending).ToList(); } if (string.Equals(DisplayOrder, "PremiereDate", StringComparison.OrdinalIgnoreCase)) { // Sort by release date return LibraryManager.Sort(children, user, new[] { ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName }, SortOrder.Ascending).ToList(); } // Default sorting return LibraryManager.Sort(children, user, new[] { ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName }, SortOrder.Ascending).ToList(); } public override IEnumerable GetRecursiveChildren(User user, InternalItemsQuery query) { var children = base.GetRecursiveChildren(user, query); if (string.Equals(DisplayOrder, "PremiereDate", StringComparison.OrdinalIgnoreCase)) { // Sort by release date return LibraryManager.Sort(children, user, new[] { ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName }, SortOrder.Ascending).ToList(); } return children; } public BoxSetInfo GetLookupInfo() { return GetItemLookupInfo(); } public override bool IsVisible(User user) { if (IsLegacyBoxSet) { return base.IsVisible(user); } if (base.IsVisible(user)) { if (LinkedChildren.Length == 0) { return true; } var userLibraryFolderIds = GetLibraryFolderIds(user); var libraryFolderIds = LibraryFolderIds ?? GetLibraryFolderIds(); if (libraryFolderIds.Length == 0) { return true; } return userLibraryFolderIds.Any(i => libraryFolderIds.Contains(i)); } return false; } public override bool IsVisibleStandalone(User user) { if (IsLegacyBoxSet) { return base.IsVisibleStandalone(user); } return IsVisible(user); } private Guid[] GetLibraryFolderIds(User user) { return LibraryManager.GetUserRootFolder().GetChildren(user, true) .Select(i => i.Id) .ToArray(); } public Guid[] GetLibraryFolderIds() { var expandedFolders = new List(); return FlattenItems(this, expandedFolders) .SelectMany(i => LibraryManager.GetCollectionFolders(i)) .Select(i => i.Id) .Distinct() .ToArray(); } private IEnumerable FlattenItems(IEnumerable items, List expandedFolders) { return items .SelectMany(i => FlattenItems(i, expandedFolders)); } private IEnumerable FlattenItems(BaseItem item, List expandedFolders) { if (item is BoxSet boxset) { if (!expandedFolders.Contains(item.Id)) { expandedFolders.Add(item.Id); return FlattenItems(boxset.GetLinkedChildren(), expandedFolders); } return Array.Empty(); } return new[] { item }; } } }