aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/Entities/BaseItem.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Controller/Entities/BaseItem.cs')
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs233
1 files changed, 124 insertions, 109 deletions
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 10a603e42..599d41bb2 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -4,6 +4,7 @@ using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
+using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Common.Extensions;
@@ -25,7 +26,6 @@ using MediaBrowser.Model.Library;
using MediaBrowser.Model.LiveTv;
using MediaBrowser.Model.MediaInfo;
using MediaBrowser.Model.Providers;
-using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Users;
using Microsoft.Extensions.Logging;
@@ -40,7 +40,7 @@ namespace MediaBrowser.Controller.Entities
/// The supported image extensions
/// </summary>
public static readonly string[] SupportedImageExtensions
- = new [] { ".png", ".jpg", ".jpeg", ".tbn", ".gif" };
+ = new[] { ".png", ".jpg", ".jpeg", ".tbn", ".gif" };
private static readonly List<string> _supportedExtensions = new List<string>(SupportedImageExtensions)
{
@@ -98,62 +98,62 @@ namespace MediaBrowser.Controller.Entities
SampleFolderName
};
- [IgnoreDataMember]
+ [JsonIgnore]
public Guid[] ThemeSongIds { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public Guid[] ThemeVideoIds { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public string PreferredMetadataCountryCode { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public string PreferredMetadataLanguage { get; set; }
public long? Size { get; set; }
public string Container { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public string Tagline { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual ItemImageInfo[] ImageInfos { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public bool IsVirtualItem { get; set; }
/// <summary>
/// Gets or sets the album.
/// </summary>
/// <value>The album.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public string Album { get; set; }
/// <summary>
/// Gets or sets the channel identifier.
/// </summary>
/// <value>The channel identifier.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public Guid ChannelId { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool SupportsAddingToPlaylist => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool AlwaysScanInternalMetadataPath => false;
/// <summary>
/// Gets a value indicating whether this instance is in mixed folder.
/// </summary>
/// <value><c>true</c> if this instance is in mixed folder; otherwise, <c>false</c>.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public bool IsInMixedFolder { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool SupportsPlayedStatus => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool SupportsPositionTicksResume => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool SupportsRemoteImageDownloading => true;
private string _name;
@@ -161,7 +161,7 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual string Name
{
get => _name;
@@ -174,35 +174,35 @@ namespace MediaBrowser.Controller.Entities
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
public bool IsUnaired => PremiereDate.HasValue && PremiereDate.Value.ToLocalTime().Date >= DateTime.Now.Date;
- [IgnoreDataMember]
+ [JsonIgnore]
public int? TotalBitrate { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public ExtraType? ExtraType { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public bool IsThemeMedia => ExtraType.HasValue && (ExtraType.Value == Model.Entities.ExtraType.ThemeSong || ExtraType.Value == Model.Entities.ExtraType.ThemeVideo);
- [IgnoreDataMember]
+ [JsonIgnore]
public string OriginalTitle { get; set; }
/// <summary>
/// Gets or sets the id.
/// </summary>
/// <value>The id.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public Guid Id { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public Guid OwnerId { get; set; }
/// <summary>
/// Gets or sets the audio.
/// </summary>
/// <value>The audio.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public ProgramAudio? Audio { get; set; }
/// <summary>
@@ -210,7 +210,7 @@ namespace MediaBrowser.Controller.Entities
/// Default is based on the type for everything except actual generic folders.
/// </summary>
/// <value>The display prefs id.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual Guid DisplayPreferencesId
{
get
@@ -224,10 +224,10 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the path.
/// </summary>
/// <value>The path.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual string Path { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual SourceType SourceType
{
get
@@ -245,7 +245,7 @@ namespace MediaBrowser.Controller.Entities
/// Returns the folder containing the item.
/// If the item is a folder, it returns the folder itself
/// </summary>
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual string ContainingFolderPath
{
get
@@ -263,26 +263,26 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the name of the service.
/// </summary>
/// <value>The name of the service.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public string ServiceName { get; set; }
/// <summary>
/// If this content came from an external service, the id of the content on that service
/// </summary>
- [IgnoreDataMember]
+ [JsonIgnore]
public string ExternalId { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public string ExternalSeriesId { get; set; }
/// <summary>
/// Gets or sets the etag.
/// </summary>
/// <value>The etag.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public string ExternalEtag { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool IsHidden => false;
public BaseItem GetOwner()
@@ -295,7 +295,7 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the type of the location.
/// </summary>
/// <value>The type of the location.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual LocationType LocationType
{
get
@@ -320,7 +320,7 @@ namespace MediaBrowser.Controller.Entities
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
public MediaProtocol? PathProtocol
{
get
@@ -343,13 +343,13 @@ namespace MediaBrowser.Controller.Entities
return current.HasValue && current.Value == protocol;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public bool IsFileProtocol => IsPathProtocol(MediaProtocol.File);
- [IgnoreDataMember]
+ [JsonIgnore]
public bool HasPathProtocol => PathProtocol.HasValue;
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool SupportsLocalMetadata
{
get
@@ -363,7 +363,7 @@ namespace MediaBrowser.Controller.Entities
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual string FileNameWithoutExtension
{
get
@@ -377,7 +377,7 @@ namespace MediaBrowser.Controller.Entities
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool EnableAlphaNumericSorting => true;
private List<Tuple<StringBuilder, bool>> GetSortChunks(string s1)
@@ -418,7 +418,7 @@ namespace MediaBrowser.Controller.Entities
/// This is just a helper for convenience
/// </summary>
/// <value>The primary image path.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public string PrimaryImagePath => this.GetImagePath(ImageType.Primary);
public bool IsMetadataFetcherEnabled(LibraryOptions libraryOptions, string name)
@@ -503,7 +503,7 @@ namespace MediaBrowser.Controller.Entities
foreach (var folder in collectionFolders)
{
- if (allowed.Contains(folder.Id.ToString("N"), StringComparer.OrdinalIgnoreCase))
+ if (allowed.Contains(folder.Id.ToString("N", CultureInfo.InvariantCulture), StringComparer.OrdinalIgnoreCase))
{
return true;
}
@@ -544,20 +544,20 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the date created.
/// </summary>
/// <value>The date created.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public DateTime DateCreated { get; set; }
/// <summary>
/// Gets or sets the date modified.
/// </summary>
/// <value>The date modified.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public DateTime DateModified { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public DateTime DateLastSaved { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public DateTime DateLastRefreshed { get; set; }
/// <summary>
@@ -583,24 +583,24 @@ namespace MediaBrowser.Controller.Entities
return Name;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public bool IsLocked { get; set; }
/// <summary>
/// Gets or sets the locked fields.
/// </summary>
/// <value>The locked fields.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public MetadataFields[] LockedFields { get; set; }
/// <summary>
/// Gets the type of the media.
/// </summary>
/// <value>The type of the media.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual string MediaType => null;
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual string[] PhysicalLocations
{
get
@@ -619,7 +619,7 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the name of the forced sort.
/// </summary>
/// <value>The name of the forced sort.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public string ForcedSortName
{
get => _forcedSortName;
@@ -631,7 +631,7 @@ namespace MediaBrowser.Controller.Entities
/// Gets the name of the sort.
/// </summary>
/// <value>The name of the sort.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public string SortName
{
get
@@ -664,10 +664,10 @@ namespace MediaBrowser.Controller.Entities
{
if (SourceType == SourceType.Channel)
{
- return System.IO.Path.Combine(basePath, "channels", ChannelId.ToString("N"), Id.ToString("N"));
+ return System.IO.Path.Combine(basePath, "channels", ChannelId.ToString("N", CultureInfo.InvariantCulture), Id.ToString("N", CultureInfo.InvariantCulture));
}
- var idString = Id.ToString("N");
+ var idString = Id.ToString("N", CultureInfo.InvariantCulture);
basePath = System.IO.Path.Combine(basePath, "library");
@@ -744,7 +744,7 @@ namespace MediaBrowser.Controller.Entities
return builder.ToString().RemoveDiacritics();
}
- [IgnoreDataMember]
+ [JsonIgnore]
public bool EnableMediaSourceDisplay
{
get
@@ -758,14 +758,14 @@ namespace MediaBrowser.Controller.Entities
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
public Guid ParentId { get; set; }
/// <summary>
/// Gets or sets the parent.
/// </summary>
/// <value>The parent.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public Folder Parent
{
get => GetParent() as Folder;
@@ -822,7 +822,7 @@ namespace MediaBrowser.Controller.Entities
return null;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual Guid DisplayParentId
{
get
@@ -832,7 +832,7 @@ namespace MediaBrowser.Controller.Entities
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
public BaseItem DisplayParent
{
get
@@ -850,97 +850,97 @@ namespace MediaBrowser.Controller.Entities
/// When the item first debuted. For movies this could be premiere date, episodes would be first aired
/// </summary>
/// <value>The premiere date.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public DateTime? PremiereDate { get; set; }
/// <summary>
/// Gets or sets the end date.
/// </summary>
/// <value>The end date.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public DateTime? EndDate { get; set; }
/// <summary>
/// Gets or sets the official rating.
/// </summary>
/// <value>The official rating.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public string OfficialRating { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public int InheritedParentalRatingValue { get; set; }
/// <summary>
/// Gets or sets the critic rating.
/// </summary>
/// <value>The critic rating.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public float? CriticRating { get; set; }
/// <summary>
/// Gets or sets the custom rating.
/// </summary>
/// <value>The custom rating.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public string CustomRating { get; set; }
/// <summary>
/// Gets or sets the overview.
/// </summary>
/// <value>The overview.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public string Overview { get; set; }
/// <summary>
/// Gets or sets the studios.
/// </summary>
/// <value>The studios.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public string[] Studios { get; set; }
/// <summary>
/// Gets or sets the genres.
/// </summary>
/// <value>The genres.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public string[] Genres { get; set; }
/// <summary>
/// Gets or sets the tags.
/// </summary>
/// <value>The tags.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public string[] Tags { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public string[] ProductionLocations { get; set; }
/// <summary>
/// Gets or sets the home page URL.
/// </summary>
/// <value>The home page URL.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public string HomePageUrl { get; set; }
/// <summary>
/// Gets or sets the community rating.
/// </summary>
/// <value>The community rating.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public float? CommunityRating { get; set; }
/// <summary>
/// Gets or sets the run time ticks.
/// </summary>
/// <value>The run time ticks.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public long? RunTimeTicks { get; set; }
/// <summary>
/// Gets or sets the production year.
/// </summary>
/// <value>The production year.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public int? ProductionYear { get; set; }
/// <summary>
@@ -948,20 +948,20 @@ namespace MediaBrowser.Controller.Entities
/// This could be episode number, album track number, etc.
/// </summary>
/// <value>The index number.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public int? IndexNumber { get; set; }
/// <summary>
/// For an episode this could be the season number, or for a song this could be the disc number.
/// </summary>
/// <value>The parent index number.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public int? ParentIndexNumber { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool HasLocalAlternateVersions => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public string OfficialRatingForComparison
{
get
@@ -982,7 +982,7 @@ namespace MediaBrowser.Controller.Entities
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
public string CustomRatingForComparison
{
get
@@ -1095,7 +1095,7 @@ namespace MediaBrowser.Controller.Entities
var info = new MediaSourceInfo
{
- Id = item.Id.ToString("N"),
+ Id = item.Id.ToString("N", CultureInfo.InvariantCulture),
Protocol = protocol ?? MediaProtocol.File,
MediaStreams = MediaSourceManager.GetMediaStreams(item.Id),
Name = GetMediaSourceName(item),
@@ -1113,7 +1113,7 @@ namespace MediaBrowser.Controller.Entities
if (info.Protocol == MediaProtocol.File)
{
- info.ETag = item.DateModified.Ticks.ToString(CultureInfo.InvariantCulture).GetMD5().ToString("N");
+ info.ETag = item.DateModified.Ticks.ToString(CultureInfo.InvariantCulture).GetMD5().ToString("N", CultureInfo.InvariantCulture);
}
var video = item as Video;
@@ -1407,13 +1407,13 @@ namespace MediaBrowser.Controller.Entities
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
protected virtual bool SupportsOwnedItems => !ParentId.Equals(Guid.Empty) && IsFileProtocol;
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool SupportsPeople => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool SupportsThemeMedia => false;
/// <summary>
@@ -1613,10 +1613,10 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the provider ids.
/// </summary>
/// <value>The provider ids.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public Dictionary<string, string> ProviderIds { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual Folder LatestItemsIndexContainer => null;
public virtual double GetDefaultPrimaryImageAspectRatio()
@@ -1626,10 +1626,10 @@ namespace MediaBrowser.Controller.Entities
public virtual string CreatePresentationUniqueKey()
{
- return Id.ToString("N");
+ return Id.ToString("N", CultureInfo.InvariantCulture);
}
- [IgnoreDataMember]
+ [JsonIgnore]
public string PresentationUniqueKey { get; set; }
public string GetPresentationUniqueKey()
@@ -1934,7 +1934,7 @@ namespace MediaBrowser.Controller.Entities
return IsVisibleStandaloneInternal(user, true);
}
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool SupportsInheritedParentImages => false;
protected bool IsVisibleStandaloneInternal(User user, bool checkFolders)
@@ -1977,10 +1977,10 @@ namespace MediaBrowser.Controller.Entities
/// Gets a value indicating whether this instance is folder.
/// </summary>
/// <value><c>true</c> if this instance is folder; otherwise, <c>false</c>.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool IsFolder => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool IsDisplayedAsFolder => false;
public virtual string GetClientTypeName()
@@ -2045,7 +2045,7 @@ namespace MediaBrowser.Controller.Entities
if (itemByPath == null)
{
- //Logger.LogWarning("Unable to find linked item at path {0}", info.Path);
+ Logger.LogWarning("Unable to find linked item at path {0}", info.Path);
}
return itemByPath;
@@ -2057,7 +2057,7 @@ namespace MediaBrowser.Controller.Entities
if (item == null)
{
- //Logger.LogWarning("Unable to find linked item at path {0}", info.Path);
+ Logger.LogWarning("Unable to find linked item at path {0}", info.Path);
}
return item;
@@ -2066,7 +2066,7 @@ namespace MediaBrowser.Controller.Entities
return null;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool EnableRememberingTrackSelections => true;
/// <summary>
@@ -2085,14 +2085,17 @@ namespace MediaBrowser.Controller.Entities
if (!current.Contains(name, StringComparer.OrdinalIgnoreCase))
{
- if (current.Length == 0)
+ int curLen = current.Length;
+ if (curLen == 0)
{
Studios = new[] { name };
}
else
{
- var list =
- Studios = current.Concat(new[] { name }).ToArray();
+ var newArr = new string[curLen + 1];
+ current.CopyTo(newArr, 0);
+ newArr[curLen] = name;
+ Studios = newArr;
}
}
}
@@ -2231,8 +2234,12 @@ namespace MediaBrowser.Controller.Entities
else
{
- var currentCount = ImageInfos.Length;
- ImageInfos = ImageInfos.Concat(new[] { image }).ToArray();
+ var current = ImageInfos;
+ var currentCount = current.Length;
+ var newArr = new ItemImageInfo[currentCount + 1];
+ current.CopyTo(newArr, 0);
+ newArr[currentCount] = image;
+ ImageInfos = newArr;
}
}
@@ -2736,7 +2743,7 @@ namespace MediaBrowser.Controller.Entities
{
var list = GetEtagValues(user);
- return string.Join("|", list.ToArray()).GetMD5().ToString("N");
+ return string.Join("|", list.ToArray()).GetMD5().ToString("N", CultureInfo.InvariantCulture);
}
protected virtual List<string> GetEtagValues(User user)
@@ -2769,7 +2776,7 @@ namespace MediaBrowser.Controller.Entities
return null;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool IsTopParent
{
get
@@ -2797,10 +2804,10 @@ namespace MediaBrowser.Controller.Entities
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool SupportsAncestors => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool StopRefreshIfLocalMetadataFound => true;
public virtual IEnumerable<Guid> GetIdsForAncestorQuery()
@@ -2871,16 +2878,24 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the remote trailers.
/// </summary>
/// <value>The remote trailers.</value>
- public MediaUrl[] RemoteTrailers { get; set; }
+ public IReadOnlyList<MediaUrl> RemoteTrailers { get; set; }
public IEnumerable<BaseItem> GetExtras()
{
return ExtraIds.Select(LibraryManager.GetItemById).Where(i => i != null).OrderBy(i => i.SortName);
}
- public IEnumerable<BaseItem> GetExtras(ExtraType[] extraTypes)
+ public IEnumerable<BaseItem> GetExtras(IReadOnlyCollection<ExtraType> extraTypes)
{
- return ExtraIds.Select(LibraryManager.GetItemById).Where(i => i != null && extraTypes.Contains(i.ExtraType.Value)).OrderBy(i => i.SortName);
+ return ExtraIds.Select(LibraryManager.GetItemById).Where(i => i != null && extraTypes.Contains(i.ExtraType.Value));
+ }
+
+ public IEnumerable<BaseItem> GetTrailers()
+ {
+ if (this is IHasTrailers)
+ return ((IHasTrailers)this).LocalTrailerIds.Select(LibraryManager.GetItemById).Where(i => i != null).OrderBy(i => i.SortName);
+ else
+ return Array.Empty<BaseItem>();
}
public IEnumerable<BaseItem> GetDisplayExtras()
@@ -2900,7 +2915,7 @@ namespace MediaBrowser.Controller.Entities
}
// Possible types of extra videos
- public static ExtraType[] DisplayExtraTypes = new[] { Model.Entities.ExtraType.BehindTheScenes, Model.Entities.ExtraType.Clip, Model.Entities.ExtraType.DeletedScene, Model.Entities.ExtraType.Interview, Model.Entities.ExtraType.Sample, Model.Entities.ExtraType.Scene };
+ public static readonly IReadOnlyCollection<ExtraType> DisplayExtraTypes = new[] { Model.Entities.ExtraType.BehindTheScenes, Model.Entities.ExtraType.Clip, Model.Entities.ExtraType.DeletedScene, Model.Entities.ExtraType.Interview, Model.Entities.ExtraType.Sample, Model.Entities.ExtraType.Scene };
public virtual bool SupportsExternalTransfer => false;
}