From c831af2fe23b6400ea6ee9a57b938a594b654ad5 Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Wed, 15 May 2024 17:49:29 +0200 Subject: [PATCH 1/6] Pass User instead of UserId inside LatestItemsQuery --- Emby.Server.Implementations/Library/UserViewManager.cs | 4 +--- Jellyfin.Api/Controllers/UserLibraryController.cs | 2 +- MediaBrowser.Model/Querying/LatestItemsQuery.cs | 3 ++- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Emby.Server.Implementations/Library/UserViewManager.cs b/Emby.Server.Implementations/Library/UserViewManager.cs index d9a559014..466f83360 100644 --- a/Emby.Server.Implementations/Library/UserViewManager.cs +++ b/Emby.Server.Implementations/Library/UserViewManager.cs @@ -207,9 +207,7 @@ namespace Emby.Server.Implementations.Library public List>> GetLatestItems(LatestItemsQuery request, DtoOptions options) { - var user = _userManager.GetUserById(request.UserId); - - var libraryItems = GetItemsForLatestItems(user, request, options); + var libraryItems = GetItemsForLatestItems(request.User, request, options); var list = new List>>(); diff --git a/Jellyfin.Api/Controllers/UserLibraryController.cs b/Jellyfin.Api/Controllers/UserLibraryController.cs index 421f1bfb5..e7bf71727 100644 --- a/Jellyfin.Api/Controllers/UserLibraryController.cs +++ b/Jellyfin.Api/Controllers/UserLibraryController.cs @@ -560,7 +560,7 @@ public class UserLibraryController : BaseJellyfinApiController IsPlayed = isPlayed, Limit = limit, ParentId = parentId ?? Guid.Empty, - UserId = requestUserId, + User = user, }, dtoOptions); diff --git a/MediaBrowser.Model/Querying/LatestItemsQuery.cs b/MediaBrowser.Model/Querying/LatestItemsQuery.cs index d2d9f1f9a..251ff5d68 100644 --- a/MediaBrowser.Model/Querying/LatestItemsQuery.cs +++ b/MediaBrowser.Model/Querying/LatestItemsQuery.cs @@ -2,6 +2,7 @@ #pragma warning disable CS1591 using System; +using Jellyfin.Data.Entities; using Jellyfin.Data.Enums; using MediaBrowser.Model.Entities; @@ -18,7 +19,7 @@ namespace MediaBrowser.Model.Querying /// Gets or sets the user to localize search results for. /// /// The user id. - public Guid UserId { get; set; } + public User User { get; set; } /// /// Gets or sets the parent id. From 454933733574dae8fa9b255d62a89cf953f1fe44 Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Wed, 15 May 2024 17:51:40 +0200 Subject: [PATCH 2/6] Change arguments AssertCanUpdateUser to take a user --- Jellyfin.Api/Controllers/ImageController.cs | 13 +++++++---- Jellyfin.Api/Controllers/ItemsController.cs | 18 +++++++++++---- Jellyfin.Api/Controllers/UserController.cs | 25 ++++++++++++--------- Jellyfin.Api/Helpers/RequestHelpers.cs | 13 +++-------- 4 files changed, 41 insertions(+), 28 deletions(-) diff --git a/Jellyfin.Api/Controllers/ImageController.cs b/Jellyfin.Api/Controllers/ImageController.cs index 8e8accab3..8977cfacc 100644 --- a/Jellyfin.Api/Controllers/ImageController.cs +++ b/Jellyfin.Api/Controllers/ImageController.cs @@ -109,7 +109,7 @@ public class ImageController : BaseJellyfinApiController return NotFound(); } - if (!RequestHelpers.AssertCanUpdateUser(_userManager, HttpContext.User, requestUserId, true)) + if (!RequestHelpers.AssertCanUpdateUser(HttpContext.User, user, true)) { return StatusCode(StatusCodes.Status403Forbidden, "User is not allowed to update the image."); } @@ -203,13 +203,18 @@ public class ImageController : BaseJellyfinApiController [FromQuery] Guid? userId) { var requestUserId = RequestHelpers.GetUserId(User, userId); - if (!RequestHelpers.AssertCanUpdateUser(_userManager, HttpContext.User, requestUserId, true)) + var user = _userManager.GetUserById(requestUserId); + if (user is null) + { + return NotFound(); + } + + if (!RequestHelpers.AssertCanUpdateUser(HttpContext.User, user, true)) { return StatusCode(StatusCodes.Status403Forbidden, "User is not allowed to delete the image."); } - var user = _userManager.GetUserById(requestUserId); - if (user?.ProfileImage is null) + if (user.ProfileImage is null) { return NoContent(); } diff --git a/Jellyfin.Api/Controllers/ItemsController.cs b/Jellyfin.Api/Controllers/ItemsController.cs index d33634412..828bd5174 100644 --- a/Jellyfin.Api/Controllers/ItemsController.cs +++ b/Jellyfin.Api/Controllers/ItemsController.cs @@ -972,12 +972,17 @@ public class ItemsController : BaseJellyfinApiController [FromRoute, Required] Guid itemId) { var requestUserId = RequestHelpers.GetUserId(User, userId); - if (!RequestHelpers.AssertCanUpdateUser(_userManager, User, requestUserId, true)) + var user = _userManager.GetUserById(requestUserId); + if (user is null) + { + return NotFound(); + } + + if (!RequestHelpers.AssertCanUpdateUser(User, user, true)) { return StatusCode(StatusCodes.Status403Forbidden, "User is not allowed to view this item user data."); } - var user = _userManager.GetUserById(requestUserId) ?? throw new ResourceNotFoundException(); var item = _libraryManager.GetItemById(itemId, user); if (item is null) { @@ -1023,12 +1028,17 @@ public class ItemsController : BaseJellyfinApiController [FromBody, Required] UpdateUserItemDataDto userDataDto) { var requestUserId = RequestHelpers.GetUserId(User, userId); - if (!RequestHelpers.AssertCanUpdateUser(_userManager, User, requestUserId, true)) + var user = _userManager.GetUserById(requestUserId); + if (user is null) + { + return NotFound(); + } + + if (!RequestHelpers.AssertCanUpdateUser(User, user, true)) { return StatusCode(StatusCodes.Status403Forbidden, "User is not allowed to update this item user data."); } - var user = _userManager.GetUserById(requestUserId) ?? throw new ResourceNotFoundException(); var item = _libraryManager.GetItemById(itemId, user); if (item is null) { diff --git a/Jellyfin.Api/Controllers/UserController.cs b/Jellyfin.Api/Controllers/UserController.cs index c3923a2ad..2df79c80c 100644 --- a/Jellyfin.Api/Controllers/UserController.cs +++ b/Jellyfin.Api/Controllers/UserController.cs @@ -274,16 +274,15 @@ public class UserController : BaseJellyfinApiController [FromBody, Required] UpdateUserPassword request) { var requestUserId = userId ?? User.GetUserId(); - if (!RequestHelpers.AssertCanUpdateUser(_userManager, User, requestUserId, true)) - { - return StatusCode(StatusCodes.Status403Forbidden, "User is not allowed to update the password."); - } - var user = _userManager.GetUserById(requestUserId); - if (user is null) { - return NotFound("User not found"); + return NotFound(); + } + + if (!RequestHelpers.AssertCanUpdateUser(User, user, true)) + { + return StatusCode(StatusCodes.Status403Forbidden, "User is not allowed to update the password."); } if (request.ResetPassword) @@ -386,7 +385,7 @@ public class UserController : BaseJellyfinApiController return NotFound(); } - if (!RequestHelpers.AssertCanUpdateUser(_userManager, User, requestUserId, true)) + if (!RequestHelpers.AssertCanUpdateUser(User, user, true)) { return StatusCode(StatusCodes.Status403Forbidden, "User update not allowed."); } @@ -396,7 +395,7 @@ public class UserController : BaseJellyfinApiController await _userManager.RenameUser(user, updateUser.Name).ConfigureAwait(false); } - await _userManager.UpdateConfigurationAsync(user.Id, updateUser.Configuration).ConfigureAwait(false); + await _userManager.UpdateConfigurationAsync(requestUserId, updateUser.Configuration).ConfigureAwait(false); return NoContent(); } @@ -495,7 +494,13 @@ public class UserController : BaseJellyfinApiController [FromBody, Required] UserConfiguration userConfig) { var requestUserId = userId ?? User.GetUserId(); - if (!RequestHelpers.AssertCanUpdateUser(_userManager, User, requestUserId, true)) + var user = _userManager.GetUserById(requestUserId); + if (user is null) + { + return NotFound(); + } + + if (!RequestHelpers.AssertCanUpdateUser(User, user, true)) { return StatusCode(StatusCodes.Status403Forbidden, "User configuration update not allowed"); } diff --git a/Jellyfin.Api/Helpers/RequestHelpers.cs b/Jellyfin.Api/Helpers/RequestHelpers.cs index a3d7f471e..1d9c189a0 100644 --- a/Jellyfin.Api/Helpers/RequestHelpers.cs +++ b/Jellyfin.Api/Helpers/RequestHelpers.cs @@ -86,18 +86,17 @@ public static class RequestHelpers /// /// Checks if the user can update an entry. /// - /// An instance of the interface. /// The for the current request. - /// The user id. + /// The user id. /// Whether to restrict the user preferences. /// A whether the user can update the entry. - internal static bool AssertCanUpdateUser(IUserManager userManager, ClaimsPrincipal claimsPrincipal, Guid userId, bool restrictUserPreferences) + internal static bool AssertCanUpdateUser(ClaimsPrincipal claimsPrincipal, User user, bool restrictUserPreferences) { var authenticatedUserId = claimsPrincipal.GetUserId(); var isAdministrator = claimsPrincipal.IsInRole(UserRoles.Administrator); // If they're going to update the record of another user, they must be an administrator - if (!userId.Equals(authenticatedUserId) && !isAdministrator) + if (!user.Id.Equals(authenticatedUserId) && !isAdministrator) { return false; } @@ -108,12 +107,6 @@ public static class RequestHelpers return true; } - var user = userManager.GetUserById(userId); - if (user is null) - { - throw new ResourceNotFoundException(); - } - return user.EnableUserPreferenceAccess; } From c680dbb53ecd5d4dc2a5efe00f9bd92761283228 Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Wed, 15 May 2024 18:05:16 +0200 Subject: [PATCH 3/6] Use User overload of UserDataManager.SaveUserData when possible --- MediaBrowser.Controller/Entities/BaseItem.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 4d0e88a22..98edda0f0 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -1844,7 +1844,7 @@ namespace MediaBrowser.Controller.Entities data.LastPlayedDate = datePlayed ?? data.LastPlayedDate ?? DateTime.UtcNow; data.Played = true; - UserDataManager.SaveUserData(user.Id, this, data, UserDataSaveReason.TogglePlayed, CancellationToken.None); + UserDataManager.SaveUserData(user, this, data, UserDataSaveReason.TogglePlayed, CancellationToken.None); } /// @@ -1866,7 +1866,7 @@ namespace MediaBrowser.Controller.Entities data.LastPlayedDate = null; data.Played = false; - UserDataManager.SaveUserData(user.Id, this, data, UserDataSaveReason.TogglePlayed, CancellationToken.None); + UserDataManager.SaveUserData(user, this, data, UserDataSaveReason.TogglePlayed, CancellationToken.None); } /// From 09f447751044f961446aab6b7d825a241398933d Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Wed, 15 May 2024 18:12:42 +0200 Subject: [PATCH 4/6] Replace UserId with User in UserViewQuery --- .../Library/LibraryManager.cs | 2 +- .../Library/UserViewManager.cs | 15 ++++----------- Jellyfin.Api/Controllers/UserViewsController.cs | 6 +++--- .../Entities/UserRootFolder.cs | 2 +- MediaBrowser.Model/Library/UserViewQuery.cs | 7 ++++--- 5 files changed, 13 insertions(+), 19 deletions(-) diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index cbded1ec6..6d71e99a1 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -1530,7 +1530,7 @@ namespace Emby.Server.Implementations.Library { var userViews = UserViewManager.GetUserViews(new UserViewQuery { - UserId = user.Id, + User = user, IncludeHidden = true, IncludeExternalContent = allowExternalContent }); diff --git a/Emby.Server.Implementations/Library/UserViewManager.cs b/Emby.Server.Implementations/Library/UserViewManager.cs index 466f83360..e9cf47d46 100644 --- a/Emby.Server.Implementations/Library/UserViewManager.cs +++ b/Emby.Server.Implementations/Library/UserViewManager.cs @@ -16,7 +16,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.LiveTv; using MediaBrowser.Model.Channels; -using MediaBrowser.Model.Entities; using MediaBrowser.Model.Globalization; using MediaBrowser.Model.Library; using MediaBrowser.Model.Querying; @@ -27,17 +26,15 @@ namespace Emby.Server.Implementations.Library { private readonly ILibraryManager _libraryManager; private readonly ILocalizationManager _localizationManager; - private readonly IUserManager _userManager; private readonly IChannelManager _channelManager; private readonly ILiveTvManager _liveTvManager; private readonly IServerConfigurationManager _config; - public UserViewManager(ILibraryManager libraryManager, ILocalizationManager localizationManager, IUserManager userManager, IChannelManager channelManager, ILiveTvManager liveTvManager, IServerConfigurationManager config) + public UserViewManager(ILibraryManager libraryManager, ILocalizationManager localizationManager, IChannelManager channelManager, ILiveTvManager liveTvManager, IServerConfigurationManager config) { _libraryManager = libraryManager; _localizationManager = localizationManager; - _userManager = userManager; _channelManager = channelManager; _liveTvManager = liveTvManager; _config = config; @@ -45,11 +42,7 @@ namespace Emby.Server.Implementations.Library public Folder[] GetUserViews(UserViewQuery query) { - var user = _userManager.GetUserById(query.UserId); - if (user is null) - { - throw new ArgumentException("User id specified in the query does not exist.", nameof(query)); - } + var user = query.User; var folders = _libraryManager.GetUserRootFolder() .GetChildren(user, true) @@ -125,14 +118,14 @@ namespace Emby.Server.Implementations.Library { var channelResult = _channelManager.GetChannelsInternalAsync(new ChannelQuery { - UserId = query.UserId + UserId = user.Id }).GetAwaiter().GetResult(); var channels = channelResult.Items; list.AddRange(channels); - if (_liveTvManager.GetEnabledUsers().Select(i => i.Id).Contains(query.UserId)) + if (_liveTvManager.GetEnabledUsers().Select(i => i.Id).Contains(user.Id)) { list.Add(_liveTvManager.GetInternalLiveTvFolder(CancellationToken.None)); } diff --git a/Jellyfin.Api/Controllers/UserViewsController.cs b/Jellyfin.Api/Controllers/UserViewsController.cs index 01da50d02..e24f78a88 100644 --- a/Jellyfin.Api/Controllers/UserViewsController.cs +++ b/Jellyfin.Api/Controllers/UserViewsController.cs @@ -8,6 +8,7 @@ using Jellyfin.Api.Helpers; using Jellyfin.Api.ModelBinders; using Jellyfin.Api.Models.UserViewDtos; using Jellyfin.Data.Enums; +using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; @@ -69,8 +70,9 @@ public class UserViewsController : BaseJellyfinApiController [FromQuery] bool includeHidden = false) { userId = RequestHelpers.GetUserId(User, userId); + var user = _userManager.GetUserById(userId.Value) ?? throw new ResourceNotFoundException(); - var query = new UserViewQuery { UserId = userId.Value, IncludeHidden = includeHidden }; + var query = new UserViewQuery { User = user, IncludeHidden = includeHidden }; if (includeExternalContent.HasValue) { @@ -87,8 +89,6 @@ public class UserViewsController : BaseJellyfinApiController var dtoOptions = new DtoOptions().AddClientFields(User); dtoOptions.Fields = [..dtoOptions.Fields, ItemFields.PrimaryImageAspectRatio, ItemFields.DisplayPreferencesId]; - var user = _userManager.GetUserById(userId.Value); - var dtos = Array.ConvertAll(folders, i => _dtoService.GetBaseItemDto(i, dtoOptions, user)); return new QueryResult(dtos); diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs index fc8a29763..a687adedd 100644 --- a/MediaBrowser.Controller/Entities/UserRootFolder.cs +++ b/MediaBrowser.Controller/Entities/UserRootFolder.cs @@ -76,7 +76,7 @@ namespace MediaBrowser.Controller.Entities var result = UserViewManager.GetUserViews(new UserViewQuery { - UserId = query.User.Id, + User = query.User, PresetViews = query.PresetViews }); diff --git a/MediaBrowser.Model/Library/UserViewQuery.cs b/MediaBrowser.Model/Library/UserViewQuery.cs index e20d6af49..643a1f9b1 100644 --- a/MediaBrowser.Model/Library/UserViewQuery.cs +++ b/MediaBrowser.Model/Library/UserViewQuery.cs @@ -1,6 +1,7 @@ #pragma warning disable CS1591 using System; +using Jellyfin.Data.Entities; using Jellyfin.Data.Enums; namespace MediaBrowser.Model.Library @@ -14,10 +15,10 @@ namespace MediaBrowser.Model.Library } /// - /// Gets or sets the user identifier. + /// Gets or sets the user. /// - /// The user identifier. - public Guid UserId { get; set; } + /// The user. + public required User User { get; set; } /// /// Gets or sets a value indicating whether [include external content]. From a90316b4d969eb2ce82bfa4e116e5cc61aa7ad03 Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Wed, 15 May 2024 18:20:46 +0200 Subject: [PATCH 5/6] Replace UserId with User in NextUpQuery --- .../TV/TVSeriesManager.cs | 18 +++--------------- Jellyfin.Api/Controllers/TvShowsController.cs | 13 +++++++------ .../Entities/UserViewBuilder.cs | 2 +- MediaBrowser.Model/Querying/NextUpQuery.cs | 7 ++++--- 4 files changed, 15 insertions(+), 25 deletions(-) diff --git a/Emby.Server.Implementations/TV/TVSeriesManager.cs b/Emby.Server.Implementations/TV/TVSeriesManager.cs index c1a615666..d92d954a6 100644 --- a/Emby.Server.Implementations/TV/TVSeriesManager.cs +++ b/Emby.Server.Implementations/TV/TVSeriesManager.cs @@ -19,14 +19,12 @@ namespace Emby.Server.Implementations.TV { public class TVSeriesManager : ITVSeriesManager { - private readonly IUserManager _userManager; private readonly IUserDataManager _userDataManager; private readonly ILibraryManager _libraryManager; private readonly IServerConfigurationManager _configurationManager; - public TVSeriesManager(IUserManager userManager, IUserDataManager userDataManager, ILibraryManager libraryManager, IServerConfigurationManager configurationManager) + public TVSeriesManager(IUserDataManager userDataManager, ILibraryManager libraryManager, IServerConfigurationManager configurationManager) { - _userManager = userManager; _userDataManager = userDataManager; _libraryManager = libraryManager; _configurationManager = configurationManager; @@ -34,12 +32,7 @@ namespace Emby.Server.Implementations.TV public QueryResult GetNextUp(NextUpQuery query, DtoOptions options) { - var user = _userManager.GetUserById(query.UserId); - - if (user is null) - { - throw new ArgumentException("User not found"); - } + var user = query.User; string? presentationUniqueKey = null; if (!query.SeriesId.IsNullOrEmpty()) @@ -83,12 +76,7 @@ namespace Emby.Server.Implementations.TV public QueryResult GetNextUp(NextUpQuery request, BaseItem[] parentsFolders, DtoOptions options) { - var user = _userManager.GetUserById(request.UserId); - - if (user is null) - { - throw new ArgumentException("User not found"); - } + var user = request.User; string? presentationUniqueKey = null; int? limit = request.Limit; diff --git a/Jellyfin.Api/Controllers/TvShowsController.cs b/Jellyfin.Api/Controllers/TvShowsController.cs index 426402667..914ccd7f9 100644 --- a/Jellyfin.Api/Controllers/TvShowsController.cs +++ b/Jellyfin.Api/Controllers/TvShowsController.cs @@ -90,7 +90,12 @@ public class TvShowsController : BaseJellyfinApiController [FromQuery] bool enableResumable = true, [FromQuery] bool enableRewatching = false) { - userId = RequestHelpers.GetUserId(User, userId); + var user = _userManager.GetUserById(RequestHelpers.GetUserId(User, userId)); + if (user is null) + { + return NotFound(); + } + var options = new DtoOptions { Fields = fields } .AddClientFields(User) .AddAdditionalDtoOptions(enableImages, enableUserData, imageTypeLimit, enableImageTypes); @@ -102,7 +107,7 @@ public class TvShowsController : BaseJellyfinApiController ParentId = parentId, SeriesId = seriesId, StartIndex = startIndex, - UserId = userId.Value, + User = user, EnableTotalRecordCount = enableTotalRecordCount, DisableFirstEpisode = disableFirstEpisode, NextUpDateCutoff = nextUpDateCutoff ?? DateTime.MinValue, @@ -111,10 +116,6 @@ public class TvShowsController : BaseJellyfinApiController }, options); - var user = userId.IsNullOrEmpty() - ? null - : _userManager.GetUserById(userId.Value); - var returnItems = _dtoService.GetBaseItemDtos(result.Items, options, user); return new QueryResult( diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs index 3a1d0c070..2fda7ee6f 100644 --- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs +++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs @@ -337,7 +337,7 @@ namespace MediaBrowser.Controller.Entities { Limit = query.Limit, StartIndex = query.StartIndex, - UserId = query.User.Id + User = query.User }, parentFolders, query.DtoOptions); diff --git a/MediaBrowser.Model/Querying/NextUpQuery.cs b/MediaBrowser.Model/Querying/NextUpQuery.cs index 35353e6fa..622c49526 100644 --- a/MediaBrowser.Model/Querying/NextUpQuery.cs +++ b/MediaBrowser.Model/Querying/NextUpQuery.cs @@ -2,6 +2,7 @@ #pragma warning disable CS1591 using System; +using Jellyfin.Data.Entities; using MediaBrowser.Model.Entities; namespace MediaBrowser.Model.Querying @@ -19,10 +20,10 @@ namespace MediaBrowser.Model.Querying } /// - /// Gets or sets the user id. + /// Gets or sets the user. /// - /// The user id. - public Guid UserId { get; set; } + /// The user. + public User User { get; set; } /// /// Gets or sets the parent identifier. From e221c1d25d640eaac01220b3f5b1422f4c11ed46 Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Wed, 15 May 2024 18:29:13 +0200 Subject: [PATCH 6/6] Enable nullable for NextUpQuery --- MediaBrowser.Model/Querying/NextUpQuery.cs | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/MediaBrowser.Model/Querying/NextUpQuery.cs b/MediaBrowser.Model/Querying/NextUpQuery.cs index 622c49526..8dece28a0 100644 --- a/MediaBrowser.Model/Querying/NextUpQuery.cs +++ b/MediaBrowser.Model/Querying/NextUpQuery.cs @@ -1,4 +1,3 @@ -#nullable disable #pragma warning disable CS1591 using System; @@ -23,7 +22,7 @@ namespace MediaBrowser.Model.Querying /// Gets or sets the user. /// /// The user. - public User User { get; set; } + public required User User { get; set; } /// /// Gets or sets the parent identifier. @@ -49,24 +48,6 @@ namespace MediaBrowser.Model.Querying /// The limit. public int? Limit { get; set; } - /// - /// gets or sets the fields to return within the items, in addition to basic information. - /// - /// The fields. - public ItemFields[] Fields { get; set; } - - /// - /// Gets or sets a value indicating whether [enable images]. - /// - /// null if [enable images] contains no value, true if [enable images]; otherwise, false. - public bool? EnableImages { get; set; } - - /// - /// Gets or sets the image type limit. - /// - /// The image type limit. - public int? ImageTypeLimit { get; set; } - /// /// Gets or sets the enable image types. ///