Files
jellyfin/MediaBrowser.Controller/Entities/Movies/BoxSet.cs

230 lines
6.6 KiB
C#
Raw Normal View History

#nullable disable
2021-07-23 16:36:27 -07:00
#pragma warning disable CA1721, CA1819, CS1591
using System;
using System.Collections.Generic;
2024-10-09 10:36:08 +00:00
using System.Collections.Immutable;
using System.Linq;
2019-10-15 17:49:49 +02:00
using System.Text.Json.Serialization;
using Jellyfin.Data;
2020-05-20 13:07:53 -04:00
using Jellyfin.Data.Entities;
2020-05-12 22:10:35 -04:00
using Jellyfin.Data.Enums;
2025-03-25 15:30:22 +00:00
using Jellyfin.Database.Implementations.Enums;
using MediaBrowser.Controller.Providers;
2018-12-27 18:27:57 -05:00
using MediaBrowser.Model.Querying;
namespace MediaBrowser.Controller.Entities.Movies
{
/// <summary>
/// Class BoxSet.
2018-12-27 18:27:57 -05:00
/// </summary>
public class BoxSet : Folder, IHasTrailers, IHasDisplayOrder, IHasLookupInfo<BoxSetInfo>
{
public BoxSet()
{
DisplayOrder = "PremiereDate";
2018-12-27 18:27:57 -05:00
}
2019-10-15 17:49:49 +02:00
[JsonIgnore]
protected override bool FilterLinkedChildrenPerUser => true;
2018-12-27 18:27:57 -05:00
2019-10-15 17:49:49 +02:00
[JsonIgnore]
public override bool SupportsInheritedParentImages => false;
2018-12-27 18:27:57 -05:00
2019-10-15 17:49:49 +02:00
[JsonIgnore]
public override bool SupportsPeople => true;
2018-12-27 18:27:57 -05:00
/// <inheritdoc />
[JsonIgnore]
2021-12-07 15:18:17 +01:00
public IReadOnlyList<BaseItem> LocalTrailers => GetExtras()
.Where(extra => extra.ExtraType == Model.Entities.ExtraType.Trailer)
.ToArray();
2018-12-27 18:27:57 -05:00
/// <summary>
/// Gets or sets the display order.
/// </summary>
/// <value>The display order.</value>
public string DisplayOrder { get; set; }
2021-07-23 16:36:27 -07:00
[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; }
2020-05-20 13:07:53 -04:00
protected override bool GetBlockUnratedValue(User user)
2018-12-27 18:27:57 -05:00
{
2020-12-13 08:15:26 -07:00
return user.GetPreferenceValues<UnratedItem>(PreferenceKind.BlockUnratedItems).Contains(UnratedItem.Movie);
2018-12-27 18:27:57 -05:00
}
public override double GetDefaultPrimaryImageAspectRatio()
=> 2.0 / 3;
2018-12-27 18:27:57 -05:00
public override UnratedItem GetBlockUnratedType()
{
return UnratedItem.Movie;
}
protected override IEnumerable<BaseItem> GetNonCachedChildren(IDirectoryService directoryService)
{
if (IsLegacyBoxSet)
{
return base.GetNonCachedChildren(directoryService);
}
return Enumerable.Empty<BaseItem>();
2018-12-27 18:27:57 -05:00
}
2024-10-09 10:36:08 +00:00
protected override IReadOnlyList<BaseItem> LoadChildren()
2018-12-27 18:27:57 -05:00
{
if (IsLegacyBoxSet)
{
return base.LoadChildren();
}
// Save a trip to the database
2024-10-09 10:36:08 +00:00
return [];
2018-12-27 18:27:57 -05:00
}
2020-05-20 13:07:53 -04:00
public override bool IsAuthorizedToDelete(User user, List<Folder> allCollectionFolders)
2018-12-27 18:27:57 -05:00
{
return user.HasPermission(PermissionKind.IsAdministrator) || user.HasPermission(PermissionKind.EnableCollectionManagement);
2018-12-27 18:27:57 -05:00
}
public override bool IsSaveLocalMetadataEnabled()
{
return true;
}
2024-08-19 11:47:34 +02:00
private IEnumerable<BaseItem> Sort(IEnumerable<BaseItem> items, User user)
2018-12-27 18:27:57 -05:00
{
2024-08-19 11:47:34 +02:00
if (!Enum.TryParse<ItemSortBy>(DisplayOrder, out var sortBy))
2018-12-27 18:27:57 -05:00
{
2024-08-19 11:47:34 +02:00
sortBy = ItemSortBy.PremiereDate;
2024-08-17 09:14:45 +02:00
}
2024-08-16 18:31:40 +02:00
2024-08-17 09:14:45 +02:00
if (sortBy == ItemSortBy.Default)
{
return items;
2018-12-27 18:27:57 -05:00
}
2024-08-17 09:14:45 +02:00
return LibraryManager.Sort(items, user, new[] { sortBy }, SortOrder.Ascending);
}
2024-10-09 10:36:08 +00:00
public override IReadOnlyList<BaseItem> GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery query)
{
var children = base.GetChildren(user, includeLinkedChildren, query);
2024-11-17 11:03:43 +00:00
return Sort(children, user).ToArray();
2018-12-27 18:27:57 -05:00
}
2024-10-09 10:36:08 +00:00
public override IReadOnlyList<BaseItem> GetRecursiveChildren(User user, InternalItemsQuery query)
2018-12-27 18:27:57 -05:00
{
var children = base.GetRecursiveChildren(user, query);
2024-11-17 11:03:43 +00:00
return Sort(children, user).ToArray();
2018-12-27 18:27:57 -05:00
}
public BoxSetInfo GetLookupInfo()
{
return GetItemLookupInfo<BoxSetInfo>();
}
public override bool IsVisible(User user, bool skipAllowedTagsCheck = false)
2018-12-27 18:27:57 -05:00
{
if (IsLegacyBoxSet)
{
return base.IsVisible(user, skipAllowedTagsCheck);
2018-12-27 18:27:57 -05:00
}
if (base.IsVisible(user, skipAllowedTagsCheck))
2018-12-27 18:27:57 -05:00
{
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;
}
2020-05-20 13:07:53 -04:00
public override bool IsVisibleStandalone(User user)
2018-12-27 18:27:57 -05:00
{
if (IsLegacyBoxSet)
{
return base.IsVisibleStandalone(user);
}
return IsVisible(user);
}
2020-05-20 13:07:53 -04:00
private Guid[] GetLibraryFolderIds(User user)
2018-12-27 18:27:57 -05:00
{
return LibraryManager.GetUserRootFolder().GetChildren(user, true)
.Select(i => i.Id)
.ToArray();
}
public Guid[] GetLibraryFolderIds()
{
2020-07-04 11:54:25 -04:00
var expandedFolders = new List<Guid>();
2018-12-27 18:27:57 -05:00
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)
{
if (item is BoxSet boxset)
2018-12-27 18:27:57 -05:00
{
if (!expandedFolders.Contains(item.Id))
{
expandedFolders.Add(item.Id);
return FlattenItems(boxset.GetLinkedChildren(), expandedFolders);
}
2018-12-27 22:43:48 +01:00
return Array.Empty<BaseItem>();
2018-12-27 18:27:57 -05:00
}
return new[] { item };
}
}
}