123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- #pragma warning disable 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.Entities;
- using MediaBrowser.Model.Querying;
- namespace MediaBrowser.Controller.Entities.Movies
- {
- /// <summary>
- /// Class BoxSet.
- /// </summary>
- public class BoxSet : Folder, IHasTrailers, IHasDisplayOrder, IHasLookupInfo<BoxSetInfo>
- {
- public BoxSet()
- {
- RemoteTrailers = Array.Empty<MediaUrl>();
- LocalTrailerIds = Array.Empty<Guid>();
- RemoteTrailerIds = Array.Empty<Guid>();
- DisplayOrder = ItemSortBy.PremiereDate;
- }
- [JsonIgnore]
- protected override bool FilterLinkedChildrenPerUser => true;
- [JsonIgnore]
- public override bool SupportsInheritedParentImages => false;
- [JsonIgnore]
- public override bool SupportsPeople => true;
- /// <inheritdoc />
- public IReadOnlyList<Guid> LocalTrailerIds { get; set; }
- /// <inheritdoc />
- public IReadOnlyList<Guid> RemoteTrailerIds { get; set; }
- /// <summary>
- /// Gets or sets the display order.
- /// </summary>
- /// <value>The display order.</value>
- public string DisplayOrder { get; set; }
- protected override bool GetBlockUnratedValue(User user)
- {
- return user.GetPreference(PreferenceKind.BlockUnratedItems).Contains(UnratedItem.Movie.ToString());
- }
- public override double GetDefaultPrimaryImageAspectRatio()
- => 2.0 / 3;
- public override UnratedItem GetBlockUnratedType()
- {
- return UnratedItem.Movie;
- }
- protected override IEnumerable<BaseItem> GetNonCachedChildren(IDirectoryService directoryService)
- {
- if (IsLegacyBoxSet)
- {
- return base.GetNonCachedChildren(directoryService);
- }
- return Enumerable.Empty<BaseItem>();
- }
- protected override List<BaseItem> LoadChildren()
- {
- if (IsLegacyBoxSet)
- {
- return base.LoadChildren();
- }
- // Save a trip to the database
- return new List<BaseItem>();
- }
- [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 override bool IsAuthorizedToDelete(User user, List<Folder> allCollectionFolders)
- {
- return true;
- }
- public override bool IsSaveLocalMetadataEnabled()
- {
- return true;
- }
- public override List<BaseItem> GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery query)
- {
- var children = base.GetChildren(user, includeLinkedChildren, query);
- if (string.Equals(DisplayOrder, ItemSortBy.SortName, StringComparison.OrdinalIgnoreCase))
- {
- // Sort by name
- return LibraryManager.Sort(children, user, new[] { ItemSortBy.SortName }, SortOrder.Ascending).ToList();
- }
- if (string.Equals(DisplayOrder, ItemSortBy.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<BaseItem> GetRecursiveChildren(User user, InternalItemsQuery query)
- {
- var children = base.GetRecursiveChildren(user, query);
- if (string.Equals(DisplayOrder, ItemSortBy.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<BoxSetInfo>();
- }
- 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);
- }
- public Guid[] LibraryFolderIds { get; set; }
- private Guid[] GetLibraryFolderIds(User user)
- {
- return LibraryManager.GetUserRootFolder().GetChildren(user, true)
- .Select(i => i.Id)
- .ToArray();
- }
- public Guid[] GetLibraryFolderIds()
- {
- var expandedFolders = new List<Guid>();
- return FlattenItems(this, expandedFolders)
- .SelectMany(i => LibraryManager.GetCollectionFolders(i))
- .Select(i => i.Id)
- .Distinct()
- .ToArray();
- }
- private IEnumerable<BaseItem> FlattenItems(IEnumerable<BaseItem> items, List<Guid> expandedFolders)
- {
- return items
- .SelectMany(i => FlattenItems(i, expandedFolders));
- }
- private IEnumerable<BaseItem> FlattenItems(BaseItem item, List<Guid> expandedFolders)
- {
- var boxset = item as BoxSet;
- if (boxset != null)
- {
- if (!expandedFolders.Contains(item.Id))
- {
- expandedFolders.Add(item.Id);
- return FlattenItems(boxset.GetLinkedChildren(), expandedFolders);
- }
- return Array.Empty<BaseItem>();
- }
- return new[] { item };
- }
- }
- }
|