aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/Entities
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Controller/Entities')
-rw-r--r--MediaBrowser.Controller/Entities/AggregateFolder.cs8
-rw-r--r--MediaBrowser.Controller/Entities/Audio/Audio.cs59
-rw-r--r--MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs27
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs56
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicArtist.cs22
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicGenre.cs12
-rw-r--r--MediaBrowser.Controller/Entities/AudioBook.cs12
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs233
-rw-r--r--MediaBrowser.Controller/Entities/BasePluginFolder.cs8
-rw-r--r--MediaBrowser.Controller/Entities/Book.cs10
-rw-r--r--MediaBrowser.Controller/Entities/CollectionFolder.cs15
-rw-r--r--MediaBrowser.Controller/Entities/Extensions.cs9
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs57
-rw-r--r--MediaBrowser.Controller/Entities/Genre.cs10
-rw-r--r--MediaBrowser.Controller/Entities/IHasTrailers.cs70
-rw-r--r--MediaBrowser.Controller/Entities/ItemImageInfo.cs4
-rw-r--r--MediaBrowser.Controller/Entities/LinkedChild.cs9
-rw-r--r--MediaBrowser.Controller/Entities/Movies/BoxSet.cs22
-rw-r--r--MediaBrowser.Controller/Entities/Movies/Movie.cs13
-rw-r--r--MediaBrowser.Controller/Entities/MusicVideo.cs11
-rw-r--r--MediaBrowser.Controller/Entities/Person.cs10
-rw-r--r--MediaBrowser.Controller/Entities/Photo.cs10
-rw-r--r--MediaBrowser.Controller/Entities/PhotoAlbum.cs8
-rw-r--r--MediaBrowser.Controller/Entities/Studio.cs10
-rw-r--r--MediaBrowser.Controller/Entities/TV/Episode.cs43
-rw-r--r--MediaBrowser.Controller/Entities/TV/Season.cs24
-rw-r--r--MediaBrowser.Controller/Entities/TV/Series.cs24
-rw-r--r--MediaBrowser.Controller/Entities/Trailer.cs4
-rw-r--r--MediaBrowser.Controller/Entities/User.cs87
-rw-r--r--MediaBrowser.Controller/Entities/UserItemData.cs4
-rw-r--r--MediaBrowser.Controller/Entities/UserRootFolder.cs10
-rw-r--r--MediaBrowser.Controller/Entities/UserView.cs10
-rw-r--r--MediaBrowser.Controller/Entities/UserViewBuilder.cs3
-rw-r--r--MediaBrowser.Controller/Entities/Video.cs36
-rw-r--r--MediaBrowser.Controller/Entities/Year.cs8
35 files changed, 488 insertions, 470 deletions
diff --git a/MediaBrowser.Controller/Entities/AggregateFolder.cs b/MediaBrowser.Controller/Entities/AggregateFolder.cs
index 054df21e52..cacda81406 100644
--- a/MediaBrowser.Controller/Entities/AggregateFolder.cs
+++ b/MediaBrowser.Controller/Entities/AggregateFolder.cs
@@ -2,13 +2,13 @@ using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
+using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Serialization;
namespace MediaBrowser.Controller.Entities
{
@@ -23,7 +23,7 @@ namespace MediaBrowser.Controller.Entities
PhysicalLocationsList = Array.Empty<string>();
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool IsPhysicalRoot => true;
public override bool CanDelete()
@@ -31,7 +31,7 @@ namespace MediaBrowser.Controller.Entities
return false;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPlayedStatus => false;
/// <summary>
@@ -45,7 +45,7 @@ namespace MediaBrowser.Controller.Entities
/// <value>The virtual children.</value>
public ConcurrentBag<BaseItem> VirtualChildren => _virtualChildren;
- [IgnoreDataMember]
+ [JsonIgnore]
public override string[] PhysicalLocations => PhysicalLocationsList;
public string[] PhysicalLocationsList { get; set; }
diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs
index 13a6fe44a9..a700d0be48 100644
--- a/MediaBrowser.Controller/Entities/Audio/Audio.cs
+++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs
@@ -1,11 +1,12 @@
using System;
using System.Collections.Generic;
+using System.Linq;
+using System.Text.Json.Serialization;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Serialization;
namespace MediaBrowser.Controller.Entities.Audio
{
@@ -19,15 +20,13 @@ namespace MediaBrowser.Controller.Entities.Audio
IHasLookupInfo<SongInfo>,
IHasMediaSources
{
- /// <summary>
- /// Gets or sets the artist.
- /// </summary>
- /// <value>The artist.</value>
- [IgnoreDataMember]
- public string[] Artists { get; set; }
+ /// <inheritdoc />
+ [JsonIgnore]
+ public IReadOnlyList<string> Artists { get; set; }
- [IgnoreDataMember]
- public string[] AlbumArtists { get; set; }
+ /// <inheritdoc />
+ [JsonIgnore]
+ public IReadOnlyList<string> AlbumArtists { get; set; }
public Audio()
{
@@ -40,22 +39,22 @@ namespace MediaBrowser.Controller.Entities.Audio
return 1;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPlayedStatus => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPeople => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsAddingToPlaylist => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsInheritedParentImages => true;
- [IgnoreDataMember]
+ [JsonIgnore]
protected override bool SupportsOwnedItems => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public override Folder LatestItemsIndexContainer => AlbumEntity;
public override bool CanDownload()
@@ -63,38 +62,14 @@ namespace MediaBrowser.Controller.Entities.Audio
return IsFileProtocol;
}
- [IgnoreDataMember]
- public string[] AllArtists
- {
- get
- {
- var list = new string[AlbumArtists.Length + Artists.Length];
-
- var index = 0;
- foreach (var artist in AlbumArtists)
- {
- list[index] = artist;
- index++;
- }
- foreach (var artist in Artists)
- {
- list[index] = artist;
- index++;
- }
-
- return list;
-
- }
- }
-
- [IgnoreDataMember]
+ [JsonIgnore]
public MusicAlbum AlbumEntity => FindParent<MusicAlbum>();
/// <summary>
/// Gets the type of the media.
/// </summary>
/// <value>The type of the media.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public override string MediaType => Model.Entities.MediaType.Audio;
/// <summary>
@@ -125,7 +100,7 @@ namespace MediaBrowser.Controller.Entities.Audio
songKey = Album + "-" + songKey;
}
- var albumArtist = AlbumArtists.Length == 0 ? null : AlbumArtists[0];
+ var albumArtist = AlbumArtists.FirstOrDefault();
if (!string.IsNullOrEmpty(albumArtist))
{
songKey = albumArtist + "-" + songKey;
diff --git a/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs b/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs
index a269b34863..056f31f780 100644
--- a/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs
+++ b/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs
@@ -1,14 +1,35 @@
+using System.Collections.Generic;
+
namespace MediaBrowser.Controller.Entities.Audio
{
public interface IHasAlbumArtist
{
- string[] AlbumArtists { get; set; }
+ IReadOnlyList<string> AlbumArtists { get; set; }
}
public interface IHasArtist
{
- string[] AllArtists { get; }
+ /// <summary>
+ /// Gets or sets the artists.
+ /// </summary>
+ /// <value>The artists.</value>
+ IReadOnlyList<string> Artists { get; set; }
+ }
+
+ public static class Extentions
+ {
+ public static IEnumerable<string> GetAllArtists<T>(this T item)
+ where T : IHasArtist, IHasAlbumArtist
+ {
+ foreach (var i in item.AlbumArtists)
+ {
+ yield return i;
+ }
- string[] Artists { get; set; }
+ foreach (var i in item.Artists)
+ {
+ yield return i;
+ }
+ }
}
}
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
index 5b2939b759..c216176e7f 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Dto;
@@ -8,7 +9,6 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Users;
namespace MediaBrowser.Controller.Entities.Audio
@@ -18,8 +18,11 @@ namespace MediaBrowser.Controller.Entities.Audio
/// </summary>
public class MusicAlbum : Folder, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasLookupInfo<AlbumInfo>, IMetadataContainer
{
- public string[] AlbumArtists { get; set; }
- public string[] Artists { get; set; }
+ /// <inheritdoc />
+ public IReadOnlyList<string> AlbumArtists { get; set; }
+
+ /// <inheritdoc />
+ public IReadOnlyList<string> Artists { get; set; }
public MusicAlbum()
{
@@ -27,13 +30,13 @@ namespace MediaBrowser.Controller.Entities.Audio
AlbumArtists = Array.Empty<string>();
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsAddingToPlaylist => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsInheritedParentImages => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public MusicArtist MusicArtist => GetMusicArtist(new DtoOptions(true));
public MusicArtist GetMusicArtist(DtoOptions options)
@@ -41,8 +44,7 @@ namespace MediaBrowser.Controller.Entities.Audio
var parents = GetParents();
foreach (var parent in parents)
{
- var artist = parent as MusicArtist;
- if (artist != null)
+ if (parent is MusicArtist artist)
{
return artist;
}
@@ -56,46 +58,23 @@ namespace MediaBrowser.Controller.Entities.Audio
return null;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPlayedStatus => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsCumulativeRunTimeTicks => true;
- [IgnoreDataMember]
- public string[] AllArtists
- {
- get
- {
- var list = new string[AlbumArtists.Length + Artists.Length];
-
- var index = 0;
- foreach (var artist in AlbumArtists)
- {
- list[index] = artist;
- index++;
- }
- foreach (var artist in Artists)
- {
- list[index] = artist;
- index++;
- }
-
- return list;
- }
- }
-
- [IgnoreDataMember]
- public string AlbumArtist => AlbumArtists.Length == 0 ? null : AlbumArtists[0];
+ [JsonIgnore]
+ public string AlbumArtist => AlbumArtists.FirstOrDefault();
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPeople => false;
/// <summary>
/// Gets the tracks.
/// </summary>
/// <value>The tracks.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public IEnumerable<Audio> Tracks => GetRecursiveChildren(i => i is Audio).Cast<Audio>();
protected override IEnumerable<BaseItem> GetEligibleChildrenForRecursiveChildren(User user)
@@ -216,8 +195,7 @@ namespace MediaBrowser.Controller.Entities.Audio
private async Task RefreshArtists(MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken)
{
- var all = AllArtists;
- foreach (var i in all)
+ foreach (var i in this.GetAllArtists())
{
// This should not be necessary but we're seeing some cases of it
if (string.IsNullOrEmpty(i))
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
index 2d464bd321..efe0d3cf70 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
@@ -1,13 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Extensions;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Users;
using Microsoft.Extensions.Logging;
@@ -18,25 +18,25 @@ namespace MediaBrowser.Controller.Entities.Audio
/// </summary>
public class MusicArtist : Folder, IItemByName, IHasMusicGenres, IHasDualAccess, IHasLookupInfo<ArtistInfo>
{
- [IgnoreDataMember]
+ [JsonIgnore]
public bool IsAccessedByName => ParentId.Equals(Guid.Empty);
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool IsFolder => !IsAccessedByName;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsInheritedParentImages => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsCumulativeRunTimeTicks => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool IsDisplayedAsFolder => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsAddingToPlaylist => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPlayedStatus => false;
public override double GetDefaultPrimaryImageAspectRatio()
@@ -60,7 +60,7 @@ namespace MediaBrowser.Controller.Entities.Audio
return LibraryManager.GetItemList(query);
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override IEnumerable<BaseItem> Children
{
get
@@ -117,7 +117,7 @@ namespace MediaBrowser.Controller.Entities.Audio
/// If the item is a folder, it returns the folder itself
/// </summary>
/// <value>The containing folder path.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public override string ContainingFolderPath => Path;
/// <summary>
@@ -164,7 +164,7 @@ namespace MediaBrowser.Controller.Entities.Audio
return info;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPeople => false;
public static string GetPath(string name)
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs
index d26aaf2bb1..537e9630be 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs
@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
+using System.Text.Json.Serialization;
using MediaBrowser.Controller.Extensions;
-using MediaBrowser.Model.Serialization;
using Microsoft.Extensions.Logging;
namespace MediaBrowser.Controller.Entities.Audio
@@ -23,13 +23,13 @@ namespace MediaBrowser.Controller.Entities.Audio
return GetUserDataKeys()[0];
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsAddingToPlaylist => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsAncestors => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool IsDisplayedAsFolder => true;
/// <summary>
@@ -37,7 +37,7 @@ namespace MediaBrowser.Controller.Entities.Audio
/// If the item is a folder, it returns the folder itself
/// </summary>
/// <value>The containing folder path.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public override string ContainingFolderPath => Path;
public override double GetDefaultPrimaryImageAspectRatio()
@@ -55,7 +55,7 @@ namespace MediaBrowser.Controller.Entities.Audio
return true;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPeople => false;
public IList<BaseItem> GetTaggedItems(InternalItemsQuery query)
diff --git a/MediaBrowser.Controller/Entities/AudioBook.cs b/MediaBrowser.Controller/Entities/AudioBook.cs
index 65c8a5fdd0..a13873bf96 100644
--- a/MediaBrowser.Controller/Entities/AudioBook.cs
+++ b/MediaBrowser.Controller/Entities/AudioBook.cs
@@ -1,23 +1,23 @@
using System;
+using System.Text.Json.Serialization;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
-using MediaBrowser.Model.Serialization;
namespace MediaBrowser.Controller.Entities
{
public class AudioBook : Audio.Audio, IHasSeries, IHasLookupInfo<SongInfo>
{
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPositionTicksResume => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPlayedStatus => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public string SeriesPresentationUniqueKey { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public string SeriesName { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public Guid SeriesId { get; set; }
public string FindSeriesSortName()
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 10a603e42c..599d41bb27 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;
}
diff --git a/MediaBrowser.Controller/Entities/BasePluginFolder.cs b/MediaBrowser.Controller/Entities/BasePluginFolder.cs
index 8cdb9695cc..62d172fcc1 100644
--- a/MediaBrowser.Controller/Entities/BasePluginFolder.cs
+++ b/MediaBrowser.Controller/Entities/BasePluginFolder.cs
@@ -1,4 +1,4 @@
-using MediaBrowser.Model.Serialization;
+using System.Text.Json.Serialization;
namespace MediaBrowser.Controller.Entities
{
@@ -8,7 +8,7 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
public abstract class BasePluginFolder : Folder, ICollectionFolder
{
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual string CollectionType => null;
public override bool CanDelete()
@@ -21,10 +21,10 @@ namespace MediaBrowser.Controller.Entities
return true;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsInheritedParentImages => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPeople => false;
//public override double? GetDefaultPrimaryImageAspectRatio()
diff --git a/MediaBrowser.Controller/Entities/Book.cs b/MediaBrowser.Controller/Entities/Book.cs
index 7a23d9a663..44c35374d7 100644
--- a/MediaBrowser.Controller/Entities/Book.cs
+++ b/MediaBrowser.Controller/Entities/Book.cs
@@ -1,21 +1,21 @@
using System;
using System.Linq;
+using System.Text.Json.Serialization;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
-using MediaBrowser.Model.Serialization;
namespace MediaBrowser.Controller.Entities
{
public class Book : BaseItem, IHasLookupInfo<BookInfo>, IHasSeries
{
- [IgnoreDataMember]
+ [JsonIgnore]
public override string MediaType => Model.Entities.MediaType.Book;
- [IgnoreDataMember]
+ [JsonIgnore]
public string SeriesPresentationUniqueKey { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public string SeriesName { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public Guid SeriesId { get; set; }
public string FindSeriesSortName()
diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs
index 275052d48a..bc5e7467e3 100644
--- a/MediaBrowser.Controller/Entities/CollectionFolder.cs
+++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs
@@ -2,14 +2,13 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
+using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
-
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
-using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Serialization;
@@ -33,10 +32,10 @@ namespace MediaBrowser.Controller.Entities
PhysicalFolderIds = Array.Empty<Guid>();
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPlayedStatus => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsInheritedParentImages => false;
public override bool CanDelete()
@@ -144,10 +143,10 @@ namespace MediaBrowser.Controller.Entities
/// Allow different display preferences for each collection folder
/// </summary>
/// <value>The display prefs id.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public override Guid DisplayPreferencesId => Id;
- [IgnoreDataMember]
+ [JsonIgnore]
public override string[] PhysicalLocations => PhysicalLocationsList;
public override bool IsSaveLocalMetadataEnabled()
@@ -311,7 +310,7 @@ namespace MediaBrowser.Controller.Entities
/// Our children are actually just references to the ones in the physical root...
/// </summary>
/// <value>The actual children.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public override IEnumerable<BaseItem> Children => GetActualChildren();
public IEnumerable<BaseItem> GetActualChildren()
@@ -361,7 +360,7 @@ namespace MediaBrowser.Controller.Entities
return result;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPeople => false;
}
}
diff --git a/MediaBrowser.Controller/Entities/Extensions.cs b/MediaBrowser.Controller/Entities/Extensions.cs
index f3bddd29ca..d2ca11740e 100644
--- a/MediaBrowser.Controller/Entities/Extensions.cs
+++ b/MediaBrowser.Controller/Entities/Extensions.cs
@@ -1,5 +1,6 @@
using System;
using System.Linq;
+using MediaBrowser.Common.Extensions;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Controller.Entities
@@ -28,13 +29,17 @@ namespace MediaBrowser.Controller.Entities
Url = url
};
- if (item.RemoteTrailers.Length == 0)
+ if (item.RemoteTrailers.Count == 0)
{
item.RemoteTrailers = new[] { mediaUrl };
}
else
{
- item.RemoteTrailers = item.RemoteTrailers.Concat(new[] { mediaUrl }).ToArray();
+ var oldIds = item.RemoteTrailers;
+ var newIds = new MediaUrl[oldIds.Count + 1];
+ oldIds.CopyTo(newIds);
+ newIds[oldIds.Count] = mediaUrl;
+ item.RemoteTrailers = newIds;
}
}
}
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index c056bc0b4e..61cc208d7b 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -1,7 +1,9 @@
using System;
using System.Collections.Generic;
+using System.Globalization;
using System.IO;
using System.Linq;
+using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Common.Progress;
@@ -17,7 +19,6 @@ using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Querying;
-using MediaBrowser.Model.Serialization;
using Microsoft.Extensions.Logging;
namespace MediaBrowser.Controller.Entities
@@ -38,7 +39,7 @@ namespace MediaBrowser.Controller.Entities
public LinkedChild[] LinkedChildren { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public DateTime? DateLastMediaAdded { get; set; }
public Folder()
@@ -46,35 +47,35 @@ namespace MediaBrowser.Controller.Entities
LinkedChildren = Array.Empty<LinkedChild>();
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsThemeMedia => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool IsPreSorted => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool IsPhysicalRoot => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsInheritedParentImages => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPlayedStatus => true;
/// <summary>
/// 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 override bool IsFolder => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool IsDisplayedAsFolder => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool SupportsCumulativeRunTimeTicks => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool SupportsDateLastMediaAdded => false;
public override bool CanDelete()
@@ -99,7 +100,7 @@ namespace MediaBrowser.Controller.Entities
return baseResult;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override string FileNameWithoutExtension
{
get
@@ -126,7 +127,7 @@ namespace MediaBrowser.Controller.Entities
return true;
}
- [IgnoreDataMember]
+ [JsonIgnore]
protected virtual bool SupportsShortcutChildren => false;
/// <summary>
@@ -161,14 +162,14 @@ namespace MediaBrowser.Controller.Entities
/// Gets the actual children.
/// </summary>
/// <value>The actual children.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual IEnumerable<BaseItem> Children => LoadChildren();
/// <summary>
/// thread-safe access to all recursive children of this folder - without regard to user
/// </summary>
/// <value>The recursive children.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public IEnumerable<BaseItem> RecursiveChildren => GetRecursiveChildren();
public override bool IsVisible(User user)
@@ -177,7 +178,7 @@ namespace MediaBrowser.Controller.Entities
{
if (user.Policy.BlockedMediaFolders != null)
{
- if (user.Policy.BlockedMediaFolders.Contains(Id.ToString("N"), StringComparer.OrdinalIgnoreCase) ||
+ if (user.Policy.BlockedMediaFolders.Contains(Id.ToString("N", CultureInfo.InvariantCulture), StringComparer.OrdinalIgnoreCase) ||
// Backwards compatibility
user.Policy.BlockedMediaFolders.Contains(Name, StringComparer.OrdinalIgnoreCase))
@@ -187,7 +188,7 @@ namespace MediaBrowser.Controller.Entities
}
else
{
- if (!user.Policy.EnableAllFolders && !user.Policy.EnabledFolders.Contains(Id.ToString("N"), StringComparer.OrdinalIgnoreCase))
+ if (!user.Policy.EnableAllFolders && !user.Policy.EnabledFolders.Contains(Id.ToString("N", CultureInfo.InvariantCulture), StringComparer.OrdinalIgnoreCase))
{
return false;
}
@@ -665,36 +666,36 @@ namespace MediaBrowser.Controller.Entities
query.StartIndex = null;
query.Limit = null;
- var itemsList = LibraryManager.GetItemList(query);
+ IEnumerable<BaseItem> itemsList = LibraryManager.GetItemList(query);
var user = query.User;
if (user != null)
{
// needed for boxsets
- itemsList = itemsList.Where(i => i.IsVisibleStandalone(query.User)).ToList();
+ itemsList = itemsList.Where(i => i.IsVisibleStandalone(query.User));
}
- BaseItem[] returnItems;
+ IEnumerable<BaseItem> returnItems;
int totalCount = 0;
if (query.EnableTotalRecordCount)
{
- var itemsArray = itemsList.ToArray();
- totalCount = itemsArray.Length;
- returnItems = itemsArray;
+ var itemArray = itemsList.ToArray();
+ totalCount = itemArray.Length;
+ returnItems = itemArray;
}
else
{
- returnItems = itemsList.ToArray();
+ returnItems = itemsList;
}
if (limit.HasValue)
{
- returnItems = returnItems.Skip(startIndex ?? 0).Take(limit.Value).ToArray();
+ returnItems = returnItems.Skip(startIndex ?? 0).Take(limit.Value);
}
else if (startIndex.HasValue)
{
- returnItems = returnItems.Skip(startIndex.Value).ToArray();
+ returnItems = returnItems.Skip(startIndex.Value);
}
return new QueryResult<BaseItem>
@@ -1427,7 +1428,7 @@ namespace MediaBrowser.Controller.Entities
.Where(i => i.Item2 != null);
}
- [IgnoreDataMember]
+ [JsonIgnore]
protected override bool SupportsOwnedItems => base.SupportsOwnedItems || SupportsShortcutChildren;
protected override async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, List<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken)
@@ -1594,7 +1595,7 @@ namespace MediaBrowser.Controller.Entities
return !IsPlayed(user);
}
- [IgnoreDataMember]
+ [JsonIgnore]
public virtual bool SupportsUserDataFromChildren
{
get
diff --git a/MediaBrowser.Controller/Entities/Genre.cs b/MediaBrowser.Controller/Entities/Genre.cs
index 44cb62d225..773c7df341 100644
--- a/MediaBrowser.Controller/Entities/Genre.cs
+++ b/MediaBrowser.Controller/Entities/Genre.cs
@@ -1,8 +1,8 @@
using System;
using System.Collections.Generic;
+using System.Text.Json.Serialization;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Extensions;
-using MediaBrowser.Model.Serialization;
using Microsoft.Extensions.Logging;
namespace MediaBrowser.Controller.Entities
@@ -34,13 +34,13 @@ namespace MediaBrowser.Controller.Entities
/// If the item is a folder, it returns the folder itself
/// </summary>
/// <value>The containing folder path.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public override string ContainingFolderPath => Path;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool IsDisplayedAsFolder => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsAncestors => false;
public override bool IsSaveLocalMetadataEnabled()
@@ -61,7 +61,7 @@ namespace MediaBrowser.Controller.Entities
return LibraryManager.GetItemList(query);
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPeople => false;
public static string GetPath(string name)
diff --git a/MediaBrowser.Controller/Entities/IHasTrailers.cs b/MediaBrowser.Controller/Entities/IHasTrailers.cs
index 3bdb9b64aa..dd8e3c45f5 100644
--- a/MediaBrowser.Controller/Entities/IHasTrailers.cs
+++ b/MediaBrowser.Controller/Entities/IHasTrailers.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using System.Linq;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Controller.Entities
@@ -11,29 +10,82 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the remote trailers.
/// </summary>
/// <value>The remote trailers.</value>
- MediaUrl[] RemoteTrailers { get; set; }
+ IReadOnlyList<MediaUrl> RemoteTrailers { get; set; }
/// <summary>
/// Gets or sets the local trailer ids.
/// </summary>
/// <value>The local trailer ids.</value>
- Guid[] LocalTrailerIds { get; set; }
- Guid[] RemoteTrailerIds { get; set; }
+ IReadOnlyList<Guid> LocalTrailerIds { get; set; }
+
+ /// <summary>
+ /// Gets or sets the remote trailer ids.
+ /// </summary>
+ /// <value>The remote trailer ids.</value>
+ IReadOnlyList<Guid> RemoteTrailerIds { get; set; }
+
Guid Id { get; set; }
}
+ /// <summary>
+ /// Class providing extension methods for working with <see cref="IHasTrailers" />.
+ /// </summary>
public static class HasTrailerExtensions
{
/// <summary>
+ /// Gets the trailer count.
+ /// </summary>
+ /// <returns><see cref="IReadOnlyList{Guid}" />.</returns>
+ public static int GetTrailerCount(this IHasTrailers item)
+ => item.LocalTrailerIds.Count + item.RemoteTrailerIds.Count;
+
+ /// <summary>
/// Gets the trailer ids.
/// </summary>
- /// <returns>List&lt;Guid&gt;.</returns>
- public static List<Guid> GetTrailerIds(this IHasTrailers item)
+ /// <returns><see cref="IReadOnlyList{Guid}" />.</returns>
+ public static IReadOnlyList<Guid> GetTrailerIds(this IHasTrailers item)
{
- var list = item.LocalTrailerIds.ToList();
- list.AddRange(item.RemoteTrailerIds);
- return list;
+ var localIds = item.LocalTrailerIds;
+ var remoteIds = item.RemoteTrailerIds;
+
+ var all = new Guid[localIds.Count + remoteIds.Count];
+ var index = 0;
+ foreach (var id in localIds)
+ {
+ all[index++] = id;
+ }
+
+ foreach (var id in remoteIds)
+ {
+ all[index++] = id;
+ }
+
+ return all;
}
+ /// <summary>
+ /// Gets the trailers.
+ /// </summary>
+ /// <returns><see cref="IReadOnlyList{BaseItem}" />.</returns>
+ public static IReadOnlyList<BaseItem> GetTrailers(this IHasTrailers item)
+ {
+ var localIds = item.LocalTrailerIds;
+ var remoteIds = item.RemoteTrailerIds;
+ var libraryManager = BaseItem.LibraryManager;
+
+ var all = new BaseItem[localIds.Count + remoteIds.Count];
+ var index = 0;
+ foreach (var id in localIds)
+ {
+ all[index++] = libraryManager.GetItemById(id);
+ }
+
+ foreach (var id in remoteIds)
+ {
+ all[index++] = libraryManager.GetItemById(id);
+ }
+
+ return all;
+ }
}
}
diff --git a/MediaBrowser.Controller/Entities/ItemImageInfo.cs b/MediaBrowser.Controller/Entities/ItemImageInfo.cs
index 8484938642..fc46dec2ef 100644
--- a/MediaBrowser.Controller/Entities/ItemImageInfo.cs
+++ b/MediaBrowser.Controller/Entities/ItemImageInfo.cs
@@ -1,6 +1,6 @@
using System;
+using System.Text.Json.Serialization;
using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Serialization;
namespace MediaBrowser.Controller.Entities
{
@@ -28,7 +28,7 @@ namespace MediaBrowser.Controller.Entities
public int Height { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public bool IsLocalFile => Path == null || !Path.StartsWith("http", StringComparison.OrdinalIgnoreCase);
}
}
diff --git a/MediaBrowser.Controller/Entities/LinkedChild.cs b/MediaBrowser.Controller/Entities/LinkedChild.cs
index bb2d03246a..d88c31007a 100644
--- a/MediaBrowser.Controller/Entities/LinkedChild.cs
+++ b/MediaBrowser.Controller/Entities/LinkedChild.cs
@@ -1,7 +1,8 @@
using System;
using System.Collections.Generic;
+using System.Globalization;
+using System.Text.Json.Serialization;
using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Serialization;
namespace MediaBrowser.Controller.Entities
{
@@ -11,7 +12,7 @@ namespace MediaBrowser.Controller.Entities
public LinkedChildType Type { get; set; }
public string LibraryItemId { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public string Id { get; set; }
/// <summary>
@@ -29,7 +30,7 @@ namespace MediaBrowser.Controller.Entities
if (string.IsNullOrEmpty(child.Path))
{
- child.LibraryItemId = item.Id.ToString("N");
+ child.LibraryItemId = item.Id.ToString("N", CultureInfo.InvariantCulture);
}
return child;
@@ -37,7 +38,7 @@ namespace MediaBrowser.Controller.Entities
public LinkedChild()
{
- Id = Guid.NewGuid().ToString("N");
+ Id = Guid.NewGuid().ToString("N", CultureInfo.InvariantCulture);
}
}
diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
index a532b5ee9e..feaf8c45ac 100644
--- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
+++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
@@ -1,11 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Text.Json.Serialization;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
-using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Users;
namespace MediaBrowser.Controller.Entities.Movies
@@ -24,17 +24,20 @@ namespace MediaBrowser.Controller.Entities.Movies
DisplayOrder = ItemSortBy.PremiereDate;
}
- [IgnoreDataMember]
+ [JsonIgnore]
protected override bool FilterLinkedChildrenPerUser => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsInheritedParentImages => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPeople => true;
- public Guid[] LocalTrailerIds { get; set; }
- public Guid[] RemoteTrailerIds { get; set; }
+ /// <inheritdoc />
+ public IReadOnlyList<Guid> LocalTrailerIds { get; set; }
+
+ /// <inheritdoc />
+ public IReadOnlyList<Guid> RemoteTrailerIds { get; set; }
/// <summary>
/// Gets or sets the display order.
@@ -61,7 +64,8 @@ namespace MediaBrowser.Controller.Entities.Movies
{
return base.GetNonCachedChildren(directoryService);
}
- return new List<BaseItem>();
+
+ return Enumerable.Empty<BaseItem>();
}
protected override List<BaseItem> LoadChildren()
@@ -75,7 +79,7 @@ namespace MediaBrowser.Controller.Entities.Movies
return new List<BaseItem>();
}
- [IgnoreDataMember]
+ [JsonIgnore]
private bool IsLegacyBoxSet
{
get
@@ -94,7 +98,7 @@ namespace MediaBrowser.Controller.Entities.Movies
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool IsPreSorted => true;
public override bool IsAuthorizedToDelete(User user, List<Folder> allCollectionFolders)
diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs
index 20c5b35219..11dc472b61 100644
--- a/MediaBrowser.Controller/Entities/Movies/Movie.cs
+++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Providers;
@@ -8,7 +9,6 @@ using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Providers;
-using MediaBrowser.Model.Serialization;
namespace MediaBrowser.Controller.Entities.Movies
{
@@ -27,8 +27,11 @@ namespace MediaBrowser.Controller.Entities.Movies
RemoteTrailerIds = Array.Empty<Guid>();
}
- public Guid[] LocalTrailerIds { get; set; }
- public Guid[] RemoteTrailerIds { get; set; }
+ /// <inheritdoc />
+ public IReadOnlyList<Guid> LocalTrailerIds { get; set; }
+
+ /// <inheritdoc />
+ public IReadOnlyList<Guid> RemoteTrailerIds { get; set; }
/// <summary>
/// Gets or sets the name of the TMDB collection.
@@ -36,7 +39,7 @@ namespace MediaBrowser.Controller.Entities.Movies
/// <value>The name of the TMDB collection.</value>
public string TmdbCollectionName { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public string CollectionName
{
get => TmdbCollectionName;
@@ -183,7 +186,7 @@ namespace MediaBrowser.Controller.Entities.Movies
return list;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool StopRefreshIfLocalMetadataFound => false;
}
}
diff --git a/MediaBrowser.Controller/Entities/MusicVideo.cs b/MediaBrowser.Controller/Entities/MusicVideo.cs
index 5bf082b7ee..6032420635 100644
--- a/MediaBrowser.Controller/Entities/MusicVideo.cs
+++ b/MediaBrowser.Controller/Entities/MusicVideo.cs
@@ -1,24 +1,23 @@
using System;
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
-using MediaBrowser.Model.Serialization;
namespace MediaBrowser.Controller.Entities
{
public class MusicVideo : Video, IHasArtist, IHasMusicGenres, IHasLookupInfo<MusicVideoInfo>
{
- [IgnoreDataMember]
- public string[] Artists { get; set; }
+ /// <inheritdoc />
+ [JsonIgnore]
+ public IReadOnlyList<string> Artists { get; set; }
public MusicVideo()
{
Artists = Array.Empty<string>();
}
- [IgnoreDataMember]
- public string[] AllArtists => Artists;
-
public override UnratedItem GetBlockUnratedType()
{
return UnratedItem.Music;
diff --git a/MediaBrowser.Controller/Entities/Person.cs b/MediaBrowser.Controller/Entities/Person.cs
index dd01834898..d9b4b22067 100644
--- a/MediaBrowser.Controller/Entities/Person.cs
+++ b/MediaBrowser.Controller/Entities/Person.cs
@@ -1,9 +1,9 @@
using System;
using System.Collections.Generic;
+using System.Text.Json.Serialization;
using MediaBrowser.Controller.Extensions;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Serialization;
using Microsoft.Extensions.Logging;
namespace MediaBrowser.Controller.Entities
@@ -50,7 +50,7 @@ namespace MediaBrowser.Controller.Entities
/// If the item is a folder, it returns the folder itself
/// </summary>
/// <value>The containing folder path.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public override string ContainingFolderPath => Path;
public override bool CanDelete()
@@ -63,13 +63,13 @@ namespace MediaBrowser.Controller.Entities
return true;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool EnableAlphaNumericSorting => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPeople => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsAncestors => false;
public static string GetPath(string name)
diff --git a/MediaBrowser.Controller/Entities/Photo.cs b/MediaBrowser.Controller/Entities/Photo.cs
index 60c8321893..86d62add97 100644
--- a/MediaBrowser.Controller/Entities/Photo.cs
+++ b/MediaBrowser.Controller/Entities/Photo.cs
@@ -1,21 +1,21 @@
+using System.Text.Json.Serialization;
using MediaBrowser.Model.Drawing;
-using MediaBrowser.Model.Serialization;
namespace MediaBrowser.Controller.Entities
{
public class Photo : BaseItem
{
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsLocalMetadata => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public override string MediaType => Model.Entities.MediaType.Photo;
- [IgnoreDataMember]
+ [JsonIgnore]
public override Folder LatestItemsIndexContainer => AlbumEntity;
- [IgnoreDataMember]
+ [JsonIgnore]
public PhotoAlbum AlbumEntity
{
get
diff --git a/MediaBrowser.Controller/Entities/PhotoAlbum.cs b/MediaBrowser.Controller/Entities/PhotoAlbum.cs
index 4cd0c8b668..b86f1ac2ae 100644
--- a/MediaBrowser.Controller/Entities/PhotoAlbum.cs
+++ b/MediaBrowser.Controller/Entities/PhotoAlbum.cs
@@ -1,16 +1,16 @@
-using MediaBrowser.Model.Serialization;
+using System.Text.Json.Serialization;
namespace MediaBrowser.Controller.Entities
{
public class PhotoAlbum : Folder
{
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool AlwaysScanInternalMetadataPath => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPlayedStatus => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsInheritedParentImages => false;
}
}
diff --git a/MediaBrowser.Controller/Entities/Studio.cs b/MediaBrowser.Controller/Entities/Studio.cs
index d6da0d48c7..068032317d 100644
--- a/MediaBrowser.Controller/Entities/Studio.cs
+++ b/MediaBrowser.Controller/Entities/Studio.cs
@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
+using System.Text.Json.Serialization;
using MediaBrowser.Controller.Extensions;
-using MediaBrowser.Model.Serialization;
using Microsoft.Extensions.Logging;
namespace MediaBrowser.Controller.Entities
@@ -28,13 +28,13 @@ namespace MediaBrowser.Controller.Entities
/// If the item is a folder, it returns the folder itself
/// </summary>
/// <value>The containing folder path.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public override string ContainingFolderPath => Path;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool IsDisplayedAsFolder => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsAncestors => false;
public override double GetDefaultPrimaryImageAspectRatio()
@@ -62,7 +62,7 @@ namespace MediaBrowser.Controller.Entities
return LibraryManager.GetItemList(query);
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPeople => false;
public static string GetPath(string name)
diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs
index fb29c07b0d..49229fa4be 100644
--- a/MediaBrowser.Controller/Entities/TV/Episode.cs
+++ b/MediaBrowser.Controller/Entities/TV/Episode.cs
@@ -2,11 +2,11 @@ using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
+using System.Text.Json.Serialization;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Serialization;
using Microsoft.Extensions.Logging;
namespace MediaBrowser.Controller.Entities.TV
@@ -23,8 +23,11 @@ namespace MediaBrowser.Controller.Entities.TV
RemoteTrailerIds = Array.Empty<Guid>();
}
- public Guid[] LocalTrailerIds { get; set; }
- public Guid[] RemoteTrailerIds { get; set; }
+ /// <inheritdoc />
+ public IReadOnlyList<Guid> LocalTrailerIds { get; set; }
+
+ /// <inheritdoc />
+ public IReadOnlyList<Guid> RemoteTrailerIds { get; set; }
/// <summary>
/// Gets the season in which it aired.
@@ -46,25 +49,25 @@ namespace MediaBrowser.Controller.Entities.TV
return series == null ? SeriesName : series.SortName;
}
- [IgnoreDataMember]
+ [JsonIgnore]
protected override bool SupportsOwnedItems => IsStacked || MediaSourceCount > 1;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsInheritedParentImages => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPeople => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public int? AiredSeasonNumber => AirsAfterSeasonNumber ?? AirsBeforeSeasonNumber ?? ParentIndexNumber;
- [IgnoreDataMember]
+ [JsonIgnore]
public override Folder LatestItemsIndexContainer => Series;
- [IgnoreDataMember]
+ [JsonIgnore]
public override Guid DisplayParentId => SeasonId;
- [IgnoreDataMember]
+ [JsonIgnore]
protected override bool EnableDefaultVideoUserDataKeys => false;
public override double GetDefaultPrimaryImageAspectRatio()
@@ -101,7 +104,7 @@ namespace MediaBrowser.Controller.Entities.TV
/// This Episode's Series Instance
/// </summary>
/// <value>The series.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public Series Series
{
get
@@ -115,7 +118,7 @@ namespace MediaBrowser.Controller.Entities.TV
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
public Season Season
{
get
@@ -129,16 +132,16 @@ namespace MediaBrowser.Controller.Entities.TV
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
public bool IsInSeasonFolder => FindParent<Season>() != null;
- [IgnoreDataMember]
+ [JsonIgnore]
public string SeriesPresentationUniqueKey { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public string SeriesName { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public string SeasonName { get; set; }
public string FindSeriesPresentationUniqueKey()
@@ -221,7 +224,7 @@ namespace MediaBrowser.Controller.Entities.TV
return false;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsRemoteImageDownloading
{
get
@@ -235,12 +238,12 @@ namespace MediaBrowser.Controller.Entities.TV
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
public bool IsMissingEpisode => LocationType == LocationType.Virtual;
- [IgnoreDataMember]
+ [JsonIgnore]
public Guid SeasonId { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public Guid SeriesId { get; set; }
public Guid FindSeriesId()
diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs
index 5d7c260d15..9c8a469e26 100644
--- a/MediaBrowser.Controller/Entities/TV/Season.cs
+++ b/MediaBrowser.Controller/Entities/TV/Season.cs
@@ -1,11 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Text.Json.Serialization;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Querying;
-using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Users;
namespace MediaBrowser.Controller.Entities.TV
@@ -15,22 +15,22 @@ namespace MediaBrowser.Controller.Entities.TV
/// </summary>
public class Season : Folder, IHasSeries, IHasLookupInfo<SeasonInfo>
{
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsAddingToPlaylist => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool IsPreSorted => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsDateLastMediaAdded => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPeople => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsInheritedParentImages => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override Guid DisplayParentId => SeriesId;
public override double GetDefaultPrimaryImageAspectRatio()
@@ -71,7 +71,7 @@ namespace MediaBrowser.Controller.Entities.TV
/// This Episode's Series Instance
/// </summary>
/// <value>The series.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public Series Series
{
get
@@ -85,7 +85,7 @@ namespace MediaBrowser.Controller.Entities.TV
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
public string SeriesPath
{
get
@@ -179,13 +179,13 @@ namespace MediaBrowser.Controller.Entities.TV
return UnratedItem.Series;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public string SeriesPresentationUniqueKey { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public string SeriesName { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public Guid SeriesId { get; set; }
public string FindSeriesPresentationUniqueKey()
diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs
index eae834f6f0..76cb9a6514 100644
--- a/MediaBrowser.Controller/Entities/TV/Series.cs
+++ b/MediaBrowser.Controller/Entities/TV/Series.cs
@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
+using System.Globalization;
using System.Linq;
+using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Dto;
@@ -9,7 +11,6 @@ using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Providers;
using MediaBrowser.Model.Querying;
-using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Users;
namespace MediaBrowser.Controller.Entities.TV
@@ -30,23 +31,26 @@ namespace MediaBrowser.Controller.Entities.TV
public DayOfWeek[] AirDays { get; set; }
public string AirTime { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsAddingToPlaylist => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool IsPreSorted => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsDateLastMediaAdded => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsInheritedParentImages => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPeople => true;
- public Guid[] LocalTrailerIds { get; set; }
- public Guid[] RemoteTrailerIds { get; set; }
+ /// <inheritdoc />
+ public IReadOnlyList<Guid> LocalTrailerIds { get; set; }
+
+ /// <inheritdoc />
+ public IReadOnlyList<Guid> RemoteTrailerIds { get; set; }
/// <summary>
/// airdate, dvd or absolute
@@ -91,7 +95,7 @@ namespace MediaBrowser.Controller.Entities.TV
}
var folders = LibraryManager.GetCollectionFolders(this)
- .Select(i => i.Id.ToString("N"))
+ .Select(i => i.Id.ToString("N", CultureInfo.InvariantCulture))
.ToArray();
if (folders.Length == 0)
@@ -500,7 +504,7 @@ namespace MediaBrowser.Controller.Entities.TV
return list;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool StopRefreshIfLocalMetadataFound => false;
}
}
diff --git a/MediaBrowser.Controller/Entities/Trailer.cs b/MediaBrowser.Controller/Entities/Trailer.cs
index 5bf22d7bc8..0b8be90cd1 100644
--- a/MediaBrowser.Controller/Entities/Trailer.cs
+++ b/MediaBrowser.Controller/Entities/Trailer.cs
@@ -1,10 +1,10 @@
using System;
using System.Collections.Generic;
+using System.Text.Json.Serialization;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Providers;
-using MediaBrowser.Model.Serialization;
namespace MediaBrowser.Controller.Entities
{
@@ -93,7 +93,7 @@ namespace MediaBrowser.Controller.Entities
return list;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool StopRefreshIfLocalMetadataFound => false;
}
}
diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs
index 9952ba418b..c70ecccf13 100644
--- a/MediaBrowser.Controller/Entities/User.cs
+++ b/MediaBrowser.Controller/Entities/User.cs
@@ -1,11 +1,12 @@
using System;
+using System.Globalization;
using System.IO;
+using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
-using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Users;
namespace MediaBrowser.Controller.Entities
@@ -16,13 +17,6 @@ namespace MediaBrowser.Controller.Entities
public class User : BaseItem
{
public static IUserManager UserManager { get; set; }
- public static IXmlSerializer XmlSerializer { get; set; }
-
- /// <summary>
- /// From now on all user paths will be Id-based.
- /// This is for backwards compatibility.
- /// </summary>
- public bool UsesIdForConfigurationPath { get; set; }
/// <summary>
/// Gets or sets the password.
@@ -30,9 +24,8 @@ namespace MediaBrowser.Controller.Entities
/// <value>The password.</value>
public string Password { get; set; }
public string EasyPassword { get; set; }
- public string Salt { get; set; }
- // Strictly to remove IgnoreDataMember
+ // Strictly to remove JsonIgnore
public override ItemImageInfo[] ImageInfos
{
get => base.ImageInfos;
@@ -43,7 +36,7 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the path.
/// </summary>
/// <value>The path.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public override string Path
{
get => ConfigurationDirectoryPath;
@@ -72,14 +65,14 @@ namespace MediaBrowser.Controller.Entities
/// If the item is a folder, it returns the folder itself
/// </summary>
/// <value>The containing folder path.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public override string ContainingFolderPath => Path;
/// <summary>
/// Gets the root folder.
/// </summary>
/// <value>The root folder.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public Folder RootFolder => LibraryManager.GetUserRootFolder();
/// <summary>
@@ -95,7 +88,7 @@ namespace MediaBrowser.Controller.Entities
private volatile UserConfiguration _config;
private readonly object _configSyncLock = new object();
- [IgnoreDataMember]
+ [JsonIgnore]
public UserConfiguration Configuration
{
get
@@ -118,7 +111,7 @@ namespace MediaBrowser.Controller.Entities
private volatile UserPolicy _policy;
private readonly object _policySyncLock = new object();
- [IgnoreDataMember]
+ [JsonIgnore]
public UserPolicy Policy
{
get
@@ -147,46 +140,23 @@ namespace MediaBrowser.Controller.Entities
/// <exception cref="ArgumentNullException"></exception>
public Task Rename(string newName)
{
- if (string.IsNullOrEmpty(newName))
- {
- throw new ArgumentNullException(nameof(newName));
- }
-
- // If only the casing is changing, leave the file system alone
- if (!UsesIdForConfigurationPath && !string.Equals(newName, Name, StringComparison.OrdinalIgnoreCase))
+ if (string.IsNullOrWhiteSpace(newName))
{
- UsesIdForConfigurationPath = true;
-
- // Move configuration
- var newConfigDirectory = GetConfigurationDirectoryPath(newName);
- var oldConfigurationDirectory = ConfigurationDirectoryPath;
-
- // Exceptions will be thrown if these paths already exist
- if (Directory.Exists(newConfigDirectory))
- {
- Directory.Delete(newConfigDirectory, true);
- }
-
- if (Directory.Exists(oldConfigurationDirectory))
- {
- Directory.Move(oldConfigurationDirectory, newConfigDirectory);
- }
- else
- {
- Directory.CreateDirectory(newConfigDirectory);
- }
+ throw new ArgumentException("Username can't be empty", nameof(newName));
}
Name = newName;
- return RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(Logger, FileSystem))
- {
- ReplaceAllMetadata = true,
- ImageRefreshMode = MetadataRefreshMode.FullRefresh,
- MetadataRefreshMode = MetadataRefreshMode.FullRefresh,
- ForceSave = true
+ return RefreshMetadata(
+ new MetadataRefreshOptions(new DirectoryService(Logger, FileSystem))
+ {
+ ReplaceAllMetadata = true,
+ ImageRefreshMode = MetadataRefreshMode.FullRefresh,
+ MetadataRefreshMode = MetadataRefreshMode.FullRefresh,
+ ForceSave = true
- }, CancellationToken.None);
+ },
+ CancellationToken.None);
}
public override void UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken)
@@ -198,7 +168,7 @@ namespace MediaBrowser.Controller.Entities
/// Gets the path to the user's configuration directory
/// </summary>
/// <value>The configuration directory path.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public string ConfigurationDirectoryPath => GetConfigurationDirectoryPath(Name);
public override double GetDefaultPrimaryImageAspectRatio()
@@ -215,22 +185,9 @@ namespace MediaBrowser.Controller.Entities
{
var parentPath = ConfigurationManager.ApplicationPaths.UserConfigurationDirectoryPath;
- // Legacy
- if (!UsesIdForConfigurationPath)
- {
- if (string.IsNullOrEmpty(username))
- {
- throw new ArgumentNullException(nameof(username));
- }
-
- var safeFolderName = FileSystem.GetValidFilename(username);
-
- return System.IO.Path.Combine(ConfigurationManager.ApplicationPaths.UserConfigurationDirectoryPath, safeFolderName);
- }
-
// TODO: Remove idPath and just use usernamePath for future releases
var usernamePath = System.IO.Path.Combine(parentPath, username);
- var idPath = System.IO.Path.Combine(parentPath, Id.ToString("N"));
+ var idPath = System.IO.Path.Combine(parentPath, Id.ToString("N", CultureInfo.InvariantCulture));
if (!Directory.Exists(usernamePath) && Directory.Exists(idPath))
{
Directory.Move(idPath, usernamePath);
@@ -295,7 +252,7 @@ namespace MediaBrowser.Controller.Entities
return false;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPeople => false;
public long InternalId { get; set; }
diff --git a/MediaBrowser.Controller/Entities/UserItemData.cs b/MediaBrowser.Controller/Entities/UserItemData.cs
index f7136bdf2e..ab425ee0f9 100644
--- a/MediaBrowser.Controller/Entities/UserItemData.cs
+++ b/MediaBrowser.Controller/Entities/UserItemData.cs
@@ -1,5 +1,5 @@
using System;
-using MediaBrowser.Model.Serialization;
+using System.Text.Json.Serialization;
namespace MediaBrowser.Controller.Entities
{
@@ -93,7 +93,7 @@ namespace MediaBrowser.Controller.Entities
/// This should never be serialized.
/// </summary>
/// <value><c>null</c> if [likes] contains no value, <c>true</c> if [likes]; otherwise, <c>false</c>.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public bool? Likes
{
get
diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs
index 7fe8df8af3..7fcf48a48f 100644
--- a/MediaBrowser.Controller/Entities/UserRootFolder.cs
+++ b/MediaBrowser.Controller/Entities/UserRootFolder.cs
@@ -1,12 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Library;
using MediaBrowser.Model.Querying;
-using MediaBrowser.Model.Serialization;
namespace MediaBrowser.Controller.Entities
{
@@ -33,10 +33,10 @@ namespace MediaBrowser.Controller.Entities
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsInheritedParentImages => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPlayedStatus => false;
private void ClearCache()
@@ -75,10 +75,10 @@ namespace MediaBrowser.Controller.Entities
return GetChildren(user, true).Count;
}
- [IgnoreDataMember]
+ [JsonIgnore]
protected override bool SupportsShortcutChildren => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool IsPreSorted => true;
protected override IEnumerable<BaseItem> GetEligibleChildrenForRecursiveChildren(User user)
diff --git a/MediaBrowser.Controller/Entities/UserView.cs b/MediaBrowser.Controller/Entities/UserView.cs
index 4a6d32dcec..fd045f0dda 100644
--- a/MediaBrowser.Controller/Entities/UserView.cs
+++ b/MediaBrowser.Controller/Entities/UserView.cs
@@ -1,10 +1,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Text.Json.Serialization;
using System.Threading.Tasks;
using MediaBrowser.Controller.TV;
using MediaBrowser.Model.Querying;
-using MediaBrowser.Model.Serialization;
namespace MediaBrowser.Controller.Entities
{
@@ -17,7 +17,7 @@ namespace MediaBrowser.Controller.Entities
public static ITVSeriesManager TVSeriesManager;
- [IgnoreDataMember]
+ [JsonIgnore]
public string CollectionType => ViewType;
public override IEnumerable<Guid> GetIdsForAncestorQuery()
@@ -40,10 +40,10 @@ namespace MediaBrowser.Controller.Entities
return list;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsInheritedParentImages => false;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPlayedStatus => false;
public override int GetChildCount(User user)
@@ -167,7 +167,7 @@ namespace MediaBrowser.Controller.Entities
return Task.CompletedTask;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPeople => false;
}
}
diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
index e483c8f349..454bdc4ae2 100644
--- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs
+++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Globalization;
using System.Linq;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities.Movies;
@@ -987,7 +988,7 @@ namespace MediaBrowser.Controller.Entities
private UserView GetUserViewWithName(string name, string type, string sortName, BaseItem parent)
{
- return _userViewManager.GetUserSubView(parent.Id, parent.Id.ToString("N"), type, sortName);
+ return _userViewManager.GetUserSubView(parent.Id, parent.Id.ToString("N", CultureInfo.InvariantCulture), type, sortName);
}
private UserView GetUserView(string type, string localizationKey, string sortName, BaseItem parent)
diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs
index 8379dcc090..60906bdb08 100644
--- a/MediaBrowser.Controller/Entities/Video.cs
+++ b/MediaBrowser.Controller/Entities/Video.cs
@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
+using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Library;
@@ -13,7 +14,6 @@ using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.MediaInfo;
-using MediaBrowser.Model.Serialization;
namespace MediaBrowser.Controller.Entities
{
@@ -25,23 +25,23 @@ namespace MediaBrowser.Controller.Entities
ISupportsPlaceHolders,
IHasMediaSources
{
- [IgnoreDataMember]
+ [JsonIgnore]
public string PrimaryVersionId { get; set; }
public string[] AdditionalParts { get; set; }
public string[] LocalAlternateVersions { get; set; }
public LinkedChild[] LinkedAlternateVersions { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPlayedStatus => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPeople => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsInheritedParentImages => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPositionTicksResume
{
get
@@ -90,7 +90,7 @@ namespace MediaBrowser.Controller.Entities
return base.CreatePresentationUniqueKey();
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsThemeMedia => true;
/// <summary>
@@ -180,10 +180,10 @@ namespace MediaBrowser.Controller.Entities
return IsFileProtocol;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsAddingToPlaylist => true;
- [IgnoreDataMember]
+ [JsonIgnore]
public int MediaSourceCount
{
get
@@ -200,10 +200,10 @@ namespace MediaBrowser.Controller.Entities
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
public bool IsStacked => AdditionalParts.Length > 0;
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool HasLocalAlternateVersions => LocalAlternateVersions.Length > 0;
public IEnumerable<Guid> GetAdditionalPartIds()
@@ -218,7 +218,7 @@ namespace MediaBrowser.Controller.Entities
public static ILiveTvManager LiveTvManager { get; set; }
- [IgnoreDataMember]
+ [JsonIgnore]
public override SourceType SourceType
{
get
@@ -247,7 +247,7 @@ namespace MediaBrowser.Controller.Entities
return base.CanDelete();
}
- [IgnoreDataMember]
+ [JsonIgnore]
public bool IsCompleteMedia
{
get
@@ -261,7 +261,7 @@ namespace MediaBrowser.Controller.Entities
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
protected virtual bool EnableDefaultVideoUserDataKeys => true;
public override List<string> GetUserDataKeys()
@@ -338,7 +338,7 @@ namespace MediaBrowser.Controller.Entities
.OrderBy(i => i.SortName);
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override string ContainingFolderPath
{
get
@@ -360,7 +360,7 @@ namespace MediaBrowser.Controller.Entities
}
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override string FileNameWithoutExtension
{
get
@@ -432,14 +432,14 @@ namespace MediaBrowser.Controller.Entities
/// Gets a value indicating whether [is3 D].
/// </summary>
/// <value><c>true</c> if [is3 D]; otherwise, <c>false</c>.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public bool Is3D => Video3DFormat.HasValue;
/// <summary>
/// Gets the type of the media.
/// </summary>
/// <value>The type of the media.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public override string MediaType => Model.Entities.MediaType.Video;
protected override async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, List<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken)
diff --git a/MediaBrowser.Controller/Entities/Year.cs b/MediaBrowser.Controller/Entities/Year.cs
index 13e82fada3..a01ef5c316 100644
--- a/MediaBrowser.Controller/Entities/Year.cs
+++ b/MediaBrowser.Controller/Entities/Year.cs
@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
-using MediaBrowser.Model.Serialization;
+using System.Text.Json.Serialization;
using Microsoft.Extensions.Logging;
namespace MediaBrowser.Controller.Entities
@@ -24,7 +24,7 @@ namespace MediaBrowser.Controller.Entities
/// If the item is a folder, it returns the folder itself
/// </summary>
/// <value>The containing folder path.</value>
- [IgnoreDataMember]
+ [JsonIgnore]
public override string ContainingFolderPath => Path;
public override double GetDefaultPrimaryImageAspectRatio()
@@ -35,7 +35,7 @@ namespace MediaBrowser.Controller.Entities
return value;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsAncestors => false;
public override bool CanDelete()
@@ -72,7 +72,7 @@ namespace MediaBrowser.Controller.Entities
return null;
}
- [IgnoreDataMember]
+ [JsonIgnore]
public override bool SupportsPeople => false;
public static string GetPath(string name)