diff options
Diffstat (limited to 'MediaBrowser.Controller/Entities/Movies/BoxSet.cs')
| -rw-r--r-- | MediaBrowser.Controller/Entities/Movies/BoxSet.cs | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs new file mode 100644 index 000000000..5918bf981 --- /dev/null +++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs @@ -0,0 +1,263 @@ +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Configuration; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Querying; +using MediaBrowser.Model.Users; +using System; +using System.Collections.Generic; +using System.Linq; +using MediaBrowser.Model.Serialization; +using MediaBrowser.Model.Extensions; + +namespace MediaBrowser.Controller.Entities.Movies +{ + /// <summary> + /// Class BoxSet + /// </summary> + public class BoxSet : Folder, IHasTrailers, IHasDisplayOrder, IHasLookupInfo<BoxSetInfo> + { + public BoxSet() + { + RemoteTrailers = EmptyMediaUrlArray; + LocalTrailerIds = new Guid[] { }; + RemoteTrailerIds = new Guid[] { }; + + DisplayOrder = ItemSortBy.PremiereDate; + } + + [IgnoreDataMember] + protected override bool FilterLinkedChildrenPerUser + { + get + { + return true; + } + } + + [IgnoreDataMember] + public override bool SupportsInheritedParentImages + { + get + { + return false; + } + } + + [IgnoreDataMember] + public override bool SupportsPeople + { + get { return true; } + } + + public Guid[] LocalTrailerIds { get; set; } + public Guid[] RemoteTrailerIds { get; set; } + + /// <summary> + /// Gets or sets the remote trailers. + /// </summary> + /// <value>The remote trailers.</value> + public MediaUrl[] RemoteTrailers { get; set; } + + /// <summary> + /// Gets or sets the display order. + /// </summary> + /// <value>The display order.</value> + public string DisplayOrder { get; set; } + + protected override bool GetBlockUnratedValue(UserPolicy config) + { + return config.BlockUnratedItems.Contains(UnratedItem.Movie); + } + + public override double GetDefaultPrimaryImageAspectRatio() + { + double value = 2; + value /= 3; + + return value; + } + + public override UnratedItem GetBlockUnratedType() + { + return UnratedItem.Movie; + } + + protected override IEnumerable<BaseItem> GetNonCachedChildren(IDirectoryService directoryService) + { + if (IsLegacyBoxSet) + { + return base.GetNonCachedChildren(directoryService); + } + return new List<BaseItem>(); + } + + protected override List<BaseItem> LoadChildren() + { + if (IsLegacyBoxSet) + { + return base.LoadChildren(); + } + + // Save a trip to the database + return new List<BaseItem>(); + } + + [IgnoreDataMember] + private bool IsLegacyBoxSet + { + get + { + if (string.IsNullOrEmpty(Path)) + { + return false; + } + + if (LinkedChildren.Length > 0) + { + return false; + } + + return !FileSystem.ContainsSubPath(ConfigurationManager.ApplicationPaths.DataPath, Path); + } + } + + [IgnoreDataMember] + public override bool IsPreSorted + { + get + { + return 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 new BaseItem[] { }; + } + + return new[] { item }; + } + } +} |
