瀏覽代碼

Merge pull request #1898 from Bond-009/jsonfix

Fix Json serialization error

(cherry picked from commit 91600b1c81872e1745401942633a87085dc706b5)
Signed-off-by: Joshua Boniface <joshua@boniface.me>
Joshua M. Boniface 5 年之前
父節點
當前提交
6e59671cf6
共有 44 個文件被更改,包括 364 次插入377 次删除
  1. 4 4
      Emby.Server.Implementations/Playlists/ManualPlaylistsFolder.cs
  2. 9 10
      Emby.Server.Implementations/Services/ServicePath.cs
  3. 3 3
      MediaBrowser.Controller/Channels/Channel.cs
  4. 4 4
      MediaBrowser.Controller/Entities/AggregateFolder.cs
  5. 11 11
      MediaBrowser.Controller/Entities/Audio/Audio.cs
  6. 9 9
      MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
  7. 11 11
      MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
  8. 6 6
      MediaBrowser.Controller/Entities/Audio/MusicGenre.cs
  9. 6 6
      MediaBrowser.Controller/Entities/AudioBook.cs
  10. 91 91
      MediaBrowser.Controller/Entities/BaseItem.cs
  11. 4 4
      MediaBrowser.Controller/Entities/BasePluginFolder.cs
  12. 5 5
      MediaBrowser.Controller/Entities/Book.cs
  13. 7 8
      MediaBrowser.Controller/Entities/CollectionFolder.cs
  14. 17 17
      MediaBrowser.Controller/Entities/Folder.cs
  15. 5 5
      MediaBrowser.Controller/Entities/Genre.cs
  16. 2 2
      MediaBrowser.Controller/Entities/ItemImageInfo.cs
  17. 2 2
      MediaBrowser.Controller/Entities/LinkedChild.cs
  18. 6 6
      MediaBrowser.Controller/Entities/Movies/BoxSet.cs
  19. 3 3
      MediaBrowser.Controller/Entities/Movies/Movie.cs
  20. 2 2
      MediaBrowser.Controller/Entities/MusicVideo.cs
  21. 5 5
      MediaBrowser.Controller/Entities/Person.cs
  22. 5 5
      MediaBrowser.Controller/Entities/Photo.cs
  23. 4 4
      MediaBrowser.Controller/Entities/PhotoAlbum.cs
  24. 5 5
      MediaBrowser.Controller/Entities/Studio.cs
  25. 18 18
      MediaBrowser.Controller/Entities/TV/Episode.cs
  26. 12 12
      MediaBrowser.Controller/Entities/TV/Season.cs
  27. 7 7
      MediaBrowser.Controller/Entities/TV/Series.cs
  28. 2 2
      MediaBrowser.Controller/Entities/Trailer.cs
  29. 9 9
      MediaBrowser.Controller/Entities/User.cs
  30. 2 2
      MediaBrowser.Controller/Entities/UserItemData.cs
  31. 5 5
      MediaBrowser.Controller/Entities/UserRootFolder.cs
  32. 5 5
      MediaBrowser.Controller/Entities/UserView.cs
  33. 18 18
      MediaBrowser.Controller/Entities/Video.cs
  34. 4 4
      MediaBrowser.Controller/Entities/Year.cs
  35. 13 13
      MediaBrowser.Controller/LiveTv/LiveTvChannel.cs
  36. 19 19
      MediaBrowser.Controller/LiveTv/LiveTvProgram.cs
  37. 3 3
      MediaBrowser.Controller/LiveTv/TimerInfo.cs
  38. 11 11
      MediaBrowser.Controller/Playlists/Playlist.cs
  39. 2 2
      MediaBrowser.Controller/Session/SessionInfo.cs
  40. 2 2
      MediaBrowser.Model/Dto/BaseItemPerson.cs
  41. 3 3
      MediaBrowser.Model/Dto/MediaSourceInfo.cs
  42. 1 0
      MediaBrowser.Model/MediaBrowser.Model.csproj
  43. 0 12
      MediaBrowser.Model/Serialization/IgnoreDataMemberAttribute.cs
  44. 2 2
      MediaBrowser.Model/Updates/PackageVersionInfo.cs

+ 4 - 4
Emby.Server.Implementations/Playlists/ManualPlaylistsFolder.cs

@@ -1,9 +1,9 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Text.Json.Serialization;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Playlists;
 using MediaBrowser.Model.Querying;
-using MediaBrowser.Model.Serialization;
 
 namespace Emby.Server.Implementations.Playlists
 {
@@ -24,13 +24,13 @@ namespace Emby.Server.Implementations.Playlists
             return base.GetEligibleChildrenForRecursiveChildren(user).OfType<Playlist>();
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool IsHidden => true;
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool SupportsInheritedParentImages => false;
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override string CollectionType => MediaBrowser.Model.Entities.CollectionType.Playlists;
 
         protected override QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query)

+ 9 - 10
Emby.Server.Implementations/Services/ServicePath.cs

@@ -4,6 +4,7 @@ using System.IO;
 using System.Linq;
 using System.Reflection;
 using System.Text;
+using System.Text.Json.Serialization;
 
 namespace Emby.Server.Implementations.Services
 {
@@ -28,6 +29,13 @@ namespace Emby.Server.Implementations.Services
         private readonly bool[] isWildcard;
         private readonly int wildcardCount = 0;
 
+        internal static string[] IgnoreAttributesNamed = new[]
+        {
+            nameof(JsonIgnoreAttribute)
+        };
+
+        private static Type _excludeType = typeof(Stream);
+
         public int VariableArgsCount { get; set; }
 
         /// <summary>
@@ -190,21 +198,12 @@ namespace Emby.Server.Implementations.Services
                     StringComparer.OrdinalIgnoreCase);
         }
 
-        internal static string[] IgnoreAttributesNamed = new[]
-        {
-            "IgnoreDataMemberAttribute",
-            "JsonIgnoreAttribute"
-        };
-
-
-        private static Type excludeType = typeof(Stream);
-
         internal static IEnumerable<PropertyInfo> GetSerializableProperties(Type type)
         {
             foreach (var prop in GetPublicProperties(type))
             {
                 if (prop.GetMethod == null
-                    || excludeType == prop.PropertyType)
+                    || _excludeType == prop.PropertyType)
                 {
                     continue;
                 }

+ 3 - 3
MediaBrowser.Controller/Channels/Channel.cs

@@ -1,11 +1,11 @@
 using System;
 using System.Globalization;
 using System.Linq;
+using System.Text.Json.Serialization;
 using System.Threading;
 using MediaBrowser.Common.Progress;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Model.Querying;
-using MediaBrowser.Model.Serialization;
 
 namespace MediaBrowser.Controller.Channels
 {
@@ -31,10 +31,10 @@ namespace MediaBrowser.Controller.Channels
             return base.IsVisible(user);
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool SupportsInheritedParentImages => false;
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override SourceType SourceType => SourceType.Channel;
 
         protected override QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query)

+ 4 - 4
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; }

+ 11 - 11
MediaBrowser.Controller/Entities/Audio/Audio.cs

@@ -1,12 +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
 {
@@ -21,11 +21,11 @@ namespace MediaBrowser.Controller.Entities.Audio
         IHasMediaSources
     {
         /// <inheritdoc />
-        [IgnoreDataMember]
+        [JsonIgnore]
         public IReadOnlyList<string> Artists { get; set; }
 
         /// <inheritdoc />
-        [IgnoreDataMember]
+        [JsonIgnore]
         public IReadOnlyList<string> AlbumArtists { get; set; }
 
         public Audio()
@@ -39,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()
@@ -62,14 +62,14 @@ namespace MediaBrowser.Controller.Entities.Audio
             return IsFileProtocol;
         }
 
-        [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>

+ 9 - 9
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
@@ -30,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)
@@ -58,23 +58,23 @@ namespace MediaBrowser.Controller.Entities.Audio
             return null;
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool SupportsPlayedStatus => false;
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool SupportsCumulativeRunTimeTicks => true;
 
-        [IgnoreDataMember]
+        [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)

+ 11 - 11
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)

+ 6 - 6
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)

+ 6 - 6
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()

+ 91 - 91
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)
@@ -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
@@ -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
@@ -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()
@@ -1629,7 +1629,7 @@ namespace MediaBrowser.Controller.Entities
             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()
@@ -2066,7 +2066,7 @@ namespace MediaBrowser.Controller.Entities
             return null;
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public virtual bool EnableRememberingTrackSelections => true;
 
         /// <summary>
@@ -2776,7 +2776,7 @@ namespace MediaBrowser.Controller.Entities
             return null;
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public virtual bool IsTopParent
         {
             get
@@ -2804,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()

+ 4 - 4
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()

+ 5 - 5
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()

+ 7 - 8
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;
     }
 }

+ 17 - 17
MediaBrowser.Controller/Entities/Folder.cs

@@ -3,6 +3,7 @@ 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;
@@ -18,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
@@ -39,7 +39,7 @@ namespace MediaBrowser.Controller.Entities
 
         public LinkedChild[] LinkedChildren { get; set; }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public DateTime? DateLastMediaAdded { get; set; }
 
         public Folder()
@@ -47,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()
@@ -100,7 +100,7 @@ namespace MediaBrowser.Controller.Entities
             return baseResult;
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override string FileNameWithoutExtension
         {
             get
@@ -127,7 +127,7 @@ namespace MediaBrowser.Controller.Entities
             return true;
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         protected virtual bool SupportsShortcutChildren => false;
 
         /// <summary>
@@ -162,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)
@@ -1428,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)
@@ -1595,7 +1595,7 @@ namespace MediaBrowser.Controller.Entities
             return !IsPlayed(user);
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public virtual bool SupportsUserDataFromChildren
         {
             get

+ 5 - 5
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)

+ 2 - 2
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);
     }
 }

+ 2 - 2
MediaBrowser.Controller/Entities/LinkedChild.cs

@@ -1,8 +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
 {
@@ -12,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>

+ 6 - 6
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,13 +24,13 @@ 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;
 
         /// <inheritdoc />
@@ -79,7 +79,7 @@ namespace MediaBrowser.Controller.Entities.Movies
             return new List<BaseItem>();
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         private bool IsLegacyBoxSet
         {
             get
@@ -98,7 +98,7 @@ namespace MediaBrowser.Controller.Entities.Movies
             }
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool IsPreSorted => true;
 
         public override bool IsAuthorizedToDelete(User user, List<Folder> allCollectionFolders)

+ 3 - 3
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
 {
@@ -39,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;
@@ -186,7 +186,7 @@ namespace MediaBrowser.Controller.Entities.Movies
             return list;
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool StopRefreshIfLocalMetadataFound => false;
     }
 }

+ 2 - 2
MediaBrowser.Controller/Entities/MusicVideo.cs

@@ -1,16 +1,16 @@
 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>
     {
         /// <inheritdoc />
-        [IgnoreDataMember]
+        [JsonIgnore]
         public IReadOnlyList<string> Artists { get; set; }
 
         public MusicVideo()

+ 5 - 5
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)

+ 5 - 5
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

+ 4 - 4
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;
     }
 }

+ 5 - 5
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)

+ 18 - 18
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
@@ -49,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()
@@ -104,7 +104,7 @@ namespace MediaBrowser.Controller.Entities.TV
         /// This Episode's Series Instance
         /// </summary>
         /// <value>The series.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public Series Series
         {
             get
@@ -118,7 +118,7 @@ namespace MediaBrowser.Controller.Entities.TV
             }
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public Season Season
         {
             get
@@ -132,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()
@@ -224,7 +224,7 @@ namespace MediaBrowser.Controller.Entities.TV
             return false;
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool SupportsRemoteImageDownloading
         {
             get
@@ -238,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()

+ 12 - 12
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()

+ 7 - 7
MediaBrowser.Controller/Entities/TV/Series.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.Dto;
@@ -10,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
@@ -31,19 +31,19 @@ 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;
 
         /// <inheritdoc />
@@ -504,7 +504,7 @@ namespace MediaBrowser.Controller.Entities.TV
             return list;
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool StopRefreshIfLocalMetadataFound => false;
     }
 }

+ 2 - 2
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;
     }
 }

+ 9 - 9
MediaBrowser.Controller/Entities/User.cs

@@ -1,12 +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
@@ -25,7 +25,7 @@ namespace MediaBrowser.Controller.Entities
         public string Password { get; set; }
         public string EasyPassword { get; set; }
 
-        // Strictly to remove IgnoreDataMember
+        // Strictly to remove JsonIgnore
         public override ItemImageInfo[] ImageInfos
         {
             get => base.ImageInfos;
@@ -36,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;
@@ -65,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>
@@ -88,7 +88,7 @@ namespace MediaBrowser.Controller.Entities
 
         private volatile UserConfiguration _config;
         private readonly object _configSyncLock = new object();
-        [IgnoreDataMember]
+        [JsonIgnore]
         public UserConfiguration Configuration
         {
             get
@@ -111,7 +111,7 @@ namespace MediaBrowser.Controller.Entities
 
         private volatile UserPolicy _policy;
         private readonly object _policySyncLock = new object();
-        [IgnoreDataMember]
+        [JsonIgnore]
         public UserPolicy Policy
         {
             get
@@ -168,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()
@@ -252,7 +252,7 @@ namespace MediaBrowser.Controller.Entities
             return false;
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool SupportsPeople => false;
 
         public long InternalId { get; set; }

+ 2 - 2
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

+ 5 - 5
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)

+ 5 - 5
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;
     }
 }

+ 18 - 18
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)

+ 4 - 4
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)

+ 13 - 13
MediaBrowser.Controller/LiveTv/LiveTvChannel.cs

@@ -2,13 +2,13 @@ using System;
 using System.Collections.Generic;
 using System.Globalization;
 using System.Linq;
+using System.Text.Json.Serialization;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.LiveTv;
 using MediaBrowser.Model.MediaInfo;
-using MediaBrowser.Model.Serialization;
 
 namespace MediaBrowser.Controller.LiveTv
 {
@@ -31,13 +31,13 @@ namespace MediaBrowser.Controller.LiveTv
             return UnratedItem.LiveTvChannel;
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool SupportsPositionTicksResume => false;
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override SourceType SourceType => SourceType.LiveTV;
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool EnableRememberingTrackSelections => false;
 
         /// <summary>
@@ -52,7 +52,7 @@ namespace MediaBrowser.Controller.LiveTv
         /// <value>The type of the channel.</value>
         public ChannelType ChannelType { get; set; }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override LocationType LocationType => LocationType.Remote;
 
         protected override string CreateSortName()
@@ -70,7 +70,7 @@ namespace MediaBrowser.Controller.LiveTv
             return (Number ?? string.Empty) + "-" + (Name ?? string.Empty);
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override string MediaType => ChannelType == ChannelType.Radio ? Model.Entities.MediaType.Audio : Model.Entities.MediaType.Video;
 
         public override string GetClientTypeName()
@@ -119,45 +119,45 @@ namespace MediaBrowser.Controller.LiveTv
             return false;
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsMovie { get; set; }
 
         /// <summary>
         /// Gets or sets a value indicating whether this instance is sports.
         /// </summary>
         /// <value><c>true</c> if this instance is sports; otherwise, <c>false</c>.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsSports { get; set; }
 
         /// <summary>
         /// Gets or sets a value indicating whether this instance is series.
         /// </summary>
         /// <value><c>true</c> if this instance is series; otherwise, <c>false</c>.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsSeries { get; set; }
 
         /// <summary>
         /// Gets or sets a value indicating whether this instance is news.
         /// </summary>
         /// <value><c>true</c> if this instance is news; otherwise, <c>false</c>.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsNews { get; set; }
 
         /// <summary>
         /// Gets or sets a value indicating whether this instance is kids.
         /// </summary>
         /// <value><c>true</c> if this instance is kids; otherwise, <c>false</c>.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsKids => Tags.Contains("Kids", StringComparer.OrdinalIgnoreCase);
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsRepeat { get; set; }
 
         /// <summary>
         /// Gets or sets the episode title.
         /// </summary>
         /// <value>The episode title.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public string EpisodeTitle { get; set; }
     }
 }

+ 19 - 19
MediaBrowser.Controller/LiveTv/LiveTvProgram.cs

@@ -2,6 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.Globalization;
 using System.Linq;
+using System.Text.Json.Serialization;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Providers;
@@ -9,7 +10,6 @@ using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.LiveTv;
 using MediaBrowser.Model.Providers;
-using MediaBrowser.Model.Serialization;
 
 namespace MediaBrowser.Controller.LiveTv
 {
@@ -63,79 +63,79 @@ namespace MediaBrowser.Controller.LiveTv
             }
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override SourceType SourceType => SourceType.LiveTV;
 
         /// <summary>
         /// The start date of the program, in UTC.
         /// </summary>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public DateTime StartDate { get; set; }
 
         /// <summary>
         /// Gets or sets a value indicating whether this instance is repeat.
         /// </summary>
         /// <value><c>true</c> if this instance is repeat; otherwise, <c>false</c>.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsRepeat { get; set; }
 
         /// <summary>
         /// Gets or sets the episode title.
         /// </summary>
         /// <value>The episode title.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public string EpisodeTitle { get; set; }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public string ShowId { get; set; }
 
         /// <summary>
         /// Gets or sets a value indicating whether this instance is movie.
         /// </summary>
         /// <value><c>true</c> if this instance is movie; otherwise, <c>false</c>.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsMovie { get; set; }
 
         /// <summary>
         /// Gets or sets a value indicating whether this instance is sports.
         /// </summary>
         /// <value><c>true</c> if this instance is sports; otherwise, <c>false</c>.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsSports => Tags.Contains("Sports", StringComparer.OrdinalIgnoreCase);
 
         /// <summary>
         /// Gets or sets a value indicating whether this instance is series.
         /// </summary>
         /// <value><c>true</c> if this instance is series; otherwise, <c>false</c>.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsSeries { get; set; }
 
         /// <summary>
         /// Gets or sets a value indicating whether this instance is live.
         /// </summary>
         /// <value><c>true</c> if this instance is live; otherwise, <c>false</c>.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsLive => Tags.Contains("Live", StringComparer.OrdinalIgnoreCase);
 
         /// <summary>
         /// Gets or sets a value indicating whether this instance is news.
         /// </summary>
         /// <value><c>true</c> if this instance is news; otherwise, <c>false</c>.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsNews => Tags.Contains("News", StringComparer.OrdinalIgnoreCase);
 
         /// <summary>
         /// Gets or sets a value indicating whether this instance is kids.
         /// </summary>
         /// <value><c>true</c> if this instance is kids; otherwise, <c>false</c>.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsKids => Tags.Contains("Kids", StringComparer.OrdinalIgnoreCase);
 
         /// <summary>
         /// Gets or sets a value indicating whether this instance is premiere.
         /// </summary>
         /// <value><c>true</c> if this instance is premiere; otherwise, <c>false</c>.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsPremiere => Tags.Contains("Premiere", StringComparer.OrdinalIgnoreCase);
 
         /// <summary>
@@ -143,10 +143,10 @@ namespace MediaBrowser.Controller.LiveTv
         /// 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 string MediaType
         //{
         //    get
@@ -155,7 +155,7 @@ namespace MediaBrowser.Controller.LiveTv
         //    }
         //}
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsAiring
         {
             get
@@ -166,7 +166,7 @@ namespace MediaBrowser.Controller.LiveTv
             }
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool HasAired
         {
             get
@@ -197,7 +197,7 @@ namespace MediaBrowser.Controller.LiveTv
             return false;
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool SupportsPeople
         {
             get
@@ -212,7 +212,7 @@ namespace MediaBrowser.Controller.LiveTv
             }
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool SupportsAncestors => false;
 
         private LiveTvOptions GetConfiguration()

+ 3 - 3
MediaBrowser.Controller/LiveTv/TimerInfo.cs

@@ -1,8 +1,8 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Text.Json.Serialization;
 using MediaBrowser.Model.LiveTv;
-using MediaBrowser.Model.Serialization;
 
 namespace MediaBrowser.Controller.LiveTv
 {
@@ -129,10 +129,10 @@ namespace MediaBrowser.Controller.LiveTv
         /// Gets or sets a value indicating whether this instance is live.
         /// </summary>
         /// <value><c>true</c> if this instance is live; otherwise, <c>false</c>.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsLive => Tags.Contains("Live", StringComparer.OrdinalIgnoreCase);
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsPremiere => Tags.Contains("Premiere", StringComparer.OrdinalIgnoreCase);
 
         public int? ProductionYear { get; set; }

+ 11 - 11
MediaBrowser.Controller/Playlists/Playlist.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.Dto;
@@ -10,7 +11,6 @@ using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Querying;
-using MediaBrowser.Model.Serialization;
 
 namespace MediaBrowser.Controller.Playlists
 {
@@ -34,7 +34,7 @@ namespace MediaBrowser.Controller.Playlists
             Shares = Array.Empty<Share>();
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool IsFile => IsPlaylistFile(Path);
 
         public static bool IsPlaylistFile(string path)
@@ -42,7 +42,7 @@ namespace MediaBrowser.Controller.Playlists
             return System.IO.Path.HasExtension(path);
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override string ContainingFolderPath
         {
             get
@@ -58,19 +58,19 @@ namespace MediaBrowser.Controller.Playlists
             }
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         protected override bool FilterLinkedChildrenPerUser => true;
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool SupportsInheritedParentImages => false;
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool SupportsPlayedStatus => string.Equals(MediaType, "Video", StringComparison.OrdinalIgnoreCase);
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool AlwaysScanInternalMetadataPath => true;
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool SupportsCumulativeRunTimeTicks => true;
 
         public override double GetDefaultPrimaryImageAspectRatio()
@@ -193,12 +193,12 @@ namespace MediaBrowser.Controller.Playlists
             return new[] { item };
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override bool IsPreSorted => true;
 
         public string PlaylistMediaType { get; set; }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public override string MediaType => PlaylistMediaType;
 
         public void SetMediaType(string value)
@@ -206,7 +206,7 @@ namespace MediaBrowser.Controller.Playlists
             PlaylistMediaType = value;
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         private bool IsSharedItem
         {
             get

+ 2 - 2
MediaBrowser.Controller/Session/SessionInfo.cs

@@ -1,9 +1,9 @@
 using System;
 using System.Linq;
+using System.Text.Json.Serialization;
 using System.Threading;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Model.Dto;
-using MediaBrowser.Model.Serialization;
 using MediaBrowser.Model.Session;
 using Microsoft.Extensions.Logging;
 
@@ -123,7 +123,7 @@ namespace MediaBrowser.Controller.Session
         /// Gets or sets the session controller.
         /// </summary>
         /// <value>The session controller.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public ISessionController[] SessionControllers { get; set; }
 
         /// <summary>

+ 2 - 2
MediaBrowser.Model/Dto/BaseItemPerson.cs

@@ -1,4 +1,4 @@
-using MediaBrowser.Model.Serialization;
+using System.Text.Json.Serialization;
 
 namespace MediaBrowser.Model.Dto
 {
@@ -41,7 +41,7 @@ namespace MediaBrowser.Model.Dto
         /// Gets a value indicating whether this instance has primary image.
         /// </summary>
         /// <value><c>true</c> if this instance has primary image; otherwise, <c>false</c>.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public bool HasPrimaryImage => PrimaryImageTag != null;
     }
 }

+ 3 - 3
MediaBrowser.Model/Dto/MediaSourceInfo.cs

@@ -1,8 +1,8 @@
 using System;
 using System.Collections.Generic;
+using System.Text.Json.Serialization;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.MediaInfo;
-using MediaBrowser.Model.Serialization;
 using MediaBrowser.Model.Session;
 
 namespace MediaBrowser.Model.Dto
@@ -108,7 +108,7 @@ namespace MediaBrowser.Model.Dto
             }
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public TranscodeReason[] TranscodeReasons { get; set; }
 
         public int? DefaultAudioStreamIndex { get; set; }
@@ -148,7 +148,7 @@ namespace MediaBrowser.Model.Dto
             return null;
         }
 
-        [IgnoreDataMember]
+        [JsonIgnore]
         public MediaStream VideoStream
         {
             get

+ 1 - 0
MediaBrowser.Model/MediaBrowser.Model.csproj

@@ -16,6 +16,7 @@
   <ItemGroup>
     <PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
     <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.2.0" />
+    <PackageReference Include="System.Text.Json" Version="4.6.0" />
   </ItemGroup>
 
   <ItemGroup>

+ 0 - 12
MediaBrowser.Model/Serialization/IgnoreDataMemberAttribute.cs

@@ -1,12 +0,0 @@
-using System;
-
-namespace MediaBrowser.Model.Serialization
-{
-    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
-    public sealed class IgnoreDataMemberAttribute : Attribute
-    {
-        public IgnoreDataMemberAttribute()
-        {
-        }
-    }
-}

+ 2 - 2
MediaBrowser.Model/Updates/PackageVersionInfo.cs

@@ -1,5 +1,5 @@
 using System;
-using MediaBrowser.Model.Serialization;
+using System.Text.Json.Serialization;
 
 namespace MediaBrowser.Model.Updates
 {
@@ -36,7 +36,7 @@ namespace MediaBrowser.Model.Updates
         /// Had to make this an interpreted property since Protobuf can't handle Version
         /// </summary>
         /// <value>The version.</value>
-        [IgnoreDataMember]
+        [JsonIgnore]
         public Version Version
         {
             get