mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-11-03 19:17:24 -05:00 
			
		
		
		
	Use Guid as API parameter type where possible
This commit is contained in:
		
							parent
							
								
									f660969e6c
								
							
						
					
					
						commit
						c083b29e29
					
				@ -538,20 +538,20 @@ namespace Emby.Server.Implementations.Channels
 | 
				
			|||||||
            return _libraryManager.GetItemIds(
 | 
					            return _libraryManager.GetItemIds(
 | 
				
			||||||
                new InternalItemsQuery
 | 
					                new InternalItemsQuery
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    IncludeItemTypes = new[] { nameof(Channel) },
 | 
					                    IncludeItemTypes = new[] {nameof(Channel)},
 | 
				
			||||||
                    OrderBy = new[] { (ItemSortBy.SortName, SortOrder.Ascending) }
 | 
					                    OrderBy = new[] {(ItemSortBy.SortName, SortOrder.Ascending)}
 | 
				
			||||||
                }).Select(i => GetChannelFeatures(i.ToString("N", CultureInfo.InvariantCulture))).ToArray();
 | 
					                }).Select(i => GetChannelFeatures(i)).ToArray();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <inheritdoc />
 | 
					        /// <inheritdoc />
 | 
				
			||||||
        public ChannelFeatures GetChannelFeatures(string id)
 | 
					        public ChannelFeatures GetChannelFeatures(Guid? id)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (string.IsNullOrEmpty(id))
 | 
					            if (!id.HasValue)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                throw new ArgumentNullException(nameof(id));
 | 
					                throw new ArgumentNullException(nameof(id));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var channel = GetChannel(id);
 | 
					            var channel = GetChannel(id.Value);
 | 
				
			||||||
            var channelProvider = GetChannelProvider(channel);
 | 
					            var channelProvider = GetChannelProvider(channel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return GetChannelFeaturesDto(channel, channelProvider, channelProvider.GetChannelFeatures());
 | 
					            return GetChannelFeaturesDto(channel, channelProvider, channelProvider.GetChannelFeatures());
 | 
				
			||||||
 | 
				
			|||||||
@ -2474,6 +2474,21 @@ namespace Emby.Server.Implementations.Library
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            return RootFolder;
 | 
					            return RootFolder;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        public BaseItem GetParentItem(Guid? parentId, Guid? userId)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (parentId.HasValue)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return GetItemById(parentId.Value);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (userId.HasValue && userId != Guid.Empty)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return GetUserRootFolder();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return RootFolder;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <inheritdoc />
 | 
					        /// <inheritdoc />
 | 
				
			||||||
        public bool IsVideoFile(string path)
 | 
					        public bool IsVideoFile(string path)
 | 
				
			||||||
 | 
				
			|||||||
@ -156,8 +156,8 @@ namespace Emby.Server.Implementations.Library
 | 
				
			|||||||
                ExcludeItemTypes = excludeItemTypes.ToArray(),
 | 
					                ExcludeItemTypes = excludeItemTypes.ToArray(),
 | 
				
			||||||
                IncludeItemTypes = includeItemTypes.ToArray(),
 | 
					                IncludeItemTypes = includeItemTypes.ToArray(),
 | 
				
			||||||
                Limit = query.Limit,
 | 
					                Limit = query.Limit,
 | 
				
			||||||
                IncludeItemsByName = string.IsNullOrEmpty(query.ParentId),
 | 
					                IncludeItemsByName = query.ParentId.HasValue,
 | 
				
			||||||
                ParentId = string.IsNullOrEmpty(query.ParentId) ? Guid.Empty : new Guid(query.ParentId),
 | 
					                ParentId = query.ParentId ?? Guid.Empty,
 | 
				
			||||||
                OrderBy = new[] { (ItemSortBy.SortName, SortOrder.Ascending) },
 | 
					                OrderBy = new[] { (ItemSortBy.SortName, SortOrder.Ascending) },
 | 
				
			||||||
                Recursive = true,
 | 
					                Recursive = true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -56,13 +56,11 @@ namespace Emby.Server.Implementations.TV
 | 
				
			|||||||
                return GetResult(GetNextUpEpisodes(request, user, new[] { presentationUniqueKey }, dtoOptions), request);
 | 
					                return GetResult(GetNextUpEpisodes(request, user, new[] { presentationUniqueKey }, dtoOptions), request);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var parentIdGuid = string.IsNullOrEmpty(request.ParentId) ? (Guid?)null : new Guid(request.ParentId);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            BaseItem[] parents;
 | 
					            BaseItem[] parents;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (parentIdGuid.HasValue)
 | 
					            if (request.ParentId.HasValue)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                var parent = _libraryManager.GetItemById(parentIdGuid.Value);
 | 
					                var parent = _libraryManager.GetItemById(request.ParentId.Value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (parent != null)
 | 
					                if (parent != null)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,6 @@ using System.ComponentModel.DataAnnotations;
 | 
				
			|||||||
using System.Linq;
 | 
					using System.Linq;
 | 
				
			||||||
using Jellyfin.Api.Constants;
 | 
					using Jellyfin.Api.Constants;
 | 
				
			||||||
using Jellyfin.Api.Extensions;
 | 
					using Jellyfin.Api.Extensions;
 | 
				
			||||||
using Jellyfin.Api.Helpers;
 | 
					 | 
				
			||||||
using Jellyfin.Api.ModelBinders;
 | 
					using Jellyfin.Api.ModelBinders;
 | 
				
			||||||
using Jellyfin.Data.Entities;
 | 
					using Jellyfin.Data.Entities;
 | 
				
			||||||
using MediaBrowser.Controller.Dto;
 | 
					using MediaBrowser.Controller.Dto;
 | 
				
			||||||
@ -87,7 +86,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            [FromQuery] int? startIndex,
 | 
					            [FromQuery] int? startIndex,
 | 
				
			||||||
            [FromQuery] int? limit,
 | 
					            [FromQuery] int? limit,
 | 
				
			||||||
            [FromQuery] string? searchTerm,
 | 
					            [FromQuery] string? searchTerm,
 | 
				
			||||||
            [FromQuery] string? parentId,
 | 
					            [FromQuery] Guid? parentId,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
				
			||||||
@ -124,11 +123,11 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            if (userId.HasValue && !userId.Equals(Guid.Empty))
 | 
					            if (userId.HasValue && !userId.Equals(Guid.Empty))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                user = _userManager.GetUserById(userId.Value);
 | 
					                user = _userManager.GetUserById(userId.Value);
 | 
				
			||||||
                parentItem = string.IsNullOrEmpty(parentId) ? _libraryManager.GetUserRootFolder() : _libraryManager.GetItemById(parentId);
 | 
					                parentItem = parentId.HasValue ? _libraryManager.GetItemById(parentId.Value) : _libraryManager.GetUserRootFolder();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                parentItem = string.IsNullOrEmpty(parentId) ? _libraryManager.RootFolder : _libraryManager.GetItemById(parentId);
 | 
					                parentItem = parentId.HasValue ? _libraryManager.GetItemById(parentId.Value) : _libraryManager.RootFolder;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var query = new InternalItemsQuery(user)
 | 
					            var query = new InternalItemsQuery(user)
 | 
				
			||||||
@ -157,15 +156,15 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
                EnableTotalRecordCount = enableTotalRecordCount
 | 
					                EnableTotalRecordCount = enableTotalRecordCount
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (!string.IsNullOrWhiteSpace(parentId))
 | 
					            if (parentId.HasValue)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (parentItem is Folder)
 | 
					                if (parentItem is Folder)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    query.AncestorIds = new[] { new Guid(parentId) };
 | 
					                    query.AncestorIds = new[] { parentId.Value };
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                else
 | 
					                else
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    query.ItemIds = new[] { new Guid(parentId) };
 | 
					                    query.ItemIds = new[] { parentId.Value };
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -291,7 +290,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            [FromQuery] int? startIndex,
 | 
					            [FromQuery] int? startIndex,
 | 
				
			||||||
            [FromQuery] int? limit,
 | 
					            [FromQuery] int? limit,
 | 
				
			||||||
            [FromQuery] string? searchTerm,
 | 
					            [FromQuery] string? searchTerm,
 | 
				
			||||||
            [FromQuery] string? parentId,
 | 
					            [FromQuery] Guid? parentId,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
				
			||||||
@ -328,11 +327,11 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            if (userId.HasValue && !userId.Equals(Guid.Empty))
 | 
					            if (userId.HasValue && !userId.Equals(Guid.Empty))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                user = _userManager.GetUserById(userId.Value);
 | 
					                user = _userManager.GetUserById(userId.Value);
 | 
				
			||||||
                parentItem = string.IsNullOrEmpty(parentId) ? _libraryManager.GetUserRootFolder() : _libraryManager.GetItemById(parentId);
 | 
					                parentItem = parentId.HasValue ? _libraryManager.GetItemById(parentId.Value) : _libraryManager.GetUserRootFolder();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                parentItem = string.IsNullOrEmpty(parentId) ? _libraryManager.RootFolder : _libraryManager.GetItemById(parentId);
 | 
					                parentItem = parentId.HasValue ? _libraryManager.GetItemById(parentId.Value) : _libraryManager.RootFolder;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var query = new InternalItemsQuery(user)
 | 
					            var query = new InternalItemsQuery(user)
 | 
				
			||||||
@ -361,15 +360,15 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
                EnableTotalRecordCount = enableTotalRecordCount
 | 
					                EnableTotalRecordCount = enableTotalRecordCount
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (!string.IsNullOrWhiteSpace(parentId))
 | 
					            if (parentId.HasValue)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (parentItem is Folder)
 | 
					                if (parentItem is Folder)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    query.AncestorIds = new[] { new Guid(parentId) };
 | 
					                    query.AncestorIds = new[] { parentId.Value };
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                else
 | 
					                else
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    query.ItemIds = new[] { new Guid(parentId) };
 | 
					                    query.ItemIds = new[] { parentId.Value };
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -92,7 +92,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
        /// <response code="200">Channel features returned.</response>
 | 
					        /// <response code="200">Channel features returned.</response>
 | 
				
			||||||
        /// <returns>An <see cref="OkResult"/> containing the channel features.</returns>
 | 
					        /// <returns>An <see cref="OkResult"/> containing the channel features.</returns>
 | 
				
			||||||
        [HttpGet("{channelId}/Features")]
 | 
					        [HttpGet("{channelId}/Features")]
 | 
				
			||||||
        public ActionResult<ChannelFeatures> GetChannelFeatures([FromRoute, Required] string channelId)
 | 
					        public ActionResult<ChannelFeatures> GetChannelFeatures([FromRoute, Required] Guid channelId)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return _channelManager.GetChannelFeatures(channelId);
 | 
					            return _channelManager.GetChannelFeatures(channelId);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -50,13 +50,13 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
        [ProducesResponseType(StatusCodes.Status200OK)]
 | 
					        [ProducesResponseType(StatusCodes.Status200OK)]
 | 
				
			||||||
        public ActionResult<QueryFiltersLegacy> GetQueryFiltersLegacy(
 | 
					        public ActionResult<QueryFiltersLegacy> GetQueryFiltersLegacy(
 | 
				
			||||||
            [FromQuery] Guid? userId,
 | 
					            [FromQuery] Guid? userId,
 | 
				
			||||||
            [FromQuery] string? parentId,
 | 
					            [FromQuery] Guid? parentId,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] mediaTypes)
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] mediaTypes)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var parentItem = string.IsNullOrEmpty(parentId)
 | 
					            var parentItem = parentId.HasValue
 | 
				
			||||||
                ? null
 | 
					                ? _libraryManager.GetItemById(parentId.Value)
 | 
				
			||||||
                : _libraryManager.GetItemById(parentId);
 | 
					                : null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var user = userId.HasValue && !userId.Equals(Guid.Empty)
 | 
					            var user = userId.HasValue && !userId.Equals(Guid.Empty)
 | 
				
			||||||
                ? _userManager.GetUserById(userId.Value)
 | 
					                ? _userManager.GetUserById(userId.Value)
 | 
				
			||||||
@ -71,11 +71,11 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
                parentItem = null;
 | 
					                parentItem = null;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var item = string.IsNullOrEmpty(parentId)
 | 
					            var item = parentId.HasValue
 | 
				
			||||||
                ? user == null
 | 
					                ? parentItem
 | 
				
			||||||
 | 
					                : user == null
 | 
				
			||||||
                    ? _libraryManager.RootFolder
 | 
					                    ? _libraryManager.RootFolder
 | 
				
			||||||
                    : _libraryManager.GetUserRootFolder()
 | 
					                    : _libraryManager.GetUserRootFolder();
 | 
				
			||||||
                : parentItem;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var query = new InternalItemsQuery
 | 
					            var query = new InternalItemsQuery
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@ -140,7 +140,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
        [ProducesResponseType(StatusCodes.Status200OK)]
 | 
					        [ProducesResponseType(StatusCodes.Status200OK)]
 | 
				
			||||||
        public ActionResult<QueryFilters> GetQueryFilters(
 | 
					        public ActionResult<QueryFilters> GetQueryFilters(
 | 
				
			||||||
            [FromQuery] Guid? userId,
 | 
					            [FromQuery] Guid? userId,
 | 
				
			||||||
            [FromQuery] string? parentId,
 | 
					            [FromQuery] Guid? parentId,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
				
			||||||
            [FromQuery] bool? isAiring,
 | 
					            [FromQuery] bool? isAiring,
 | 
				
			||||||
            [FromQuery] bool? isMovie,
 | 
					            [FromQuery] bool? isMovie,
 | 
				
			||||||
@ -150,9 +150,9 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            [FromQuery] bool? isSeries,
 | 
					            [FromQuery] bool? isSeries,
 | 
				
			||||||
            [FromQuery] bool? recursive)
 | 
					            [FromQuery] bool? recursive)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var parentItem = string.IsNullOrEmpty(parentId)
 | 
					            var parentItem = parentId.HasValue
 | 
				
			||||||
                ? null
 | 
					                ? _libraryManager.GetItemById(parentId.Value)
 | 
				
			||||||
                : _libraryManager.GetItemById(parentId);
 | 
					                : null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var user = userId.HasValue && !userId.Equals(Guid.Empty)
 | 
					            var user = userId.HasValue && !userId.Equals(Guid.Empty)
 | 
				
			||||||
                ? _userManager.GetUserById(userId.Value)
 | 
					                ? _userManager.GetUserById(userId.Value)
 | 
				
			||||||
 | 
				
			|||||||
@ -72,7 +72,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            [FromQuery] int? startIndex,
 | 
					            [FromQuery] int? startIndex,
 | 
				
			||||||
            [FromQuery] int? limit,
 | 
					            [FromQuery] int? limit,
 | 
				
			||||||
            [FromQuery] string? searchTerm,
 | 
					            [FromQuery] string? searchTerm,
 | 
				
			||||||
            [FromQuery] string? parentId,
 | 
					            [FromQuery] Guid? parentId,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
				
			||||||
@ -109,15 +109,15 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
                EnableTotalRecordCount = enableTotalRecordCount
 | 
					                EnableTotalRecordCount = enableTotalRecordCount
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (!string.IsNullOrWhiteSpace(parentId))
 | 
					            if (parentId.HasValue)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (parentItem is Folder)
 | 
					                if (parentItem is Folder)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    query.AncestorIds = new[] { new Guid(parentId) };
 | 
					                    query.AncestorIds = new[] { parentId.Value };
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                else
 | 
					                else
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    query.ItemIds = new[] { new Guid(parentId) };
 | 
					                    query.ItemIds = new[] { parentId.Value };
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -176,7 +176,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            [FromQuery] bool? recursive,
 | 
					            [FromQuery] bool? recursive,
 | 
				
			||||||
            [FromQuery] string? searchTerm,
 | 
					            [FromQuery] string? searchTerm,
 | 
				
			||||||
            [FromQuery] string? sortOrder,
 | 
					            [FromQuery] string? sortOrder,
 | 
				
			||||||
            [FromQuery] string? parentId,
 | 
					            [FromQuery] Guid? parentId,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
				
			||||||
@ -241,9 +241,9 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            BaseItem? item = null;
 | 
					            BaseItem? item = null;
 | 
				
			||||||
            QueryResult<BaseItem> result;
 | 
					            QueryResult<BaseItem> result;
 | 
				
			||||||
            if (!string.IsNullOrEmpty(parentId))
 | 
					            if (parentId.HasValue)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                item = _libraryManager.GetItemById(parentId);
 | 
					                item = _libraryManager.GetItemById(parentId.Value);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            item ??= _libraryManager.GetUserRootFolder();
 | 
					            item ??= _libraryManager.GetUserRootFolder();
 | 
				
			||||||
@ -343,7 +343,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
                    ItemIds = ids,
 | 
					                    ItemIds = ids,
 | 
				
			||||||
                    MinCommunityRating = minCommunityRating,
 | 
					                    MinCommunityRating = minCommunityRating,
 | 
				
			||||||
                    MinCriticRating = minCriticRating,
 | 
					                    MinCriticRating = minCriticRating,
 | 
				
			||||||
                    ParentId = string.IsNullOrWhiteSpace(parentId) ? Guid.Empty : new Guid(parentId),
 | 
					                    ParentId = parentId ?? Guid.Empty,
 | 
				
			||||||
                    ParentIndexNumber = parentIndexNumber,
 | 
					                    ParentIndexNumber = parentIndexNumber,
 | 
				
			||||||
                    EnableTotalRecordCount = enableTotalRecordCount,
 | 
					                    EnableTotalRecordCount = enableTotalRecordCount,
 | 
				
			||||||
                    ExcludeItemIds = excludeItemIds,
 | 
					                    ExcludeItemIds = excludeItemIds,
 | 
				
			||||||
@ -615,7 +615,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            [FromQuery] bool? recursive,
 | 
					            [FromQuery] bool? recursive,
 | 
				
			||||||
            [FromQuery] string? searchTerm,
 | 
					            [FromQuery] string? searchTerm,
 | 
				
			||||||
            [FromQuery] string? sortOrder,
 | 
					            [FromQuery] string? sortOrder,
 | 
				
			||||||
            [FromQuery] string? parentId,
 | 
					            [FromQuery] Guid? parentId,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
				
			||||||
@ -773,7 +773,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            [FromQuery] int? startIndex,
 | 
					            [FromQuery] int? startIndex,
 | 
				
			||||||
            [FromQuery] int? limit,
 | 
					            [FromQuery] int? limit,
 | 
				
			||||||
            [FromQuery] string? searchTerm,
 | 
					            [FromQuery] string? searchTerm,
 | 
				
			||||||
            [FromQuery] string? parentId,
 | 
					            [FromQuery] Guid? parentId,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] mediaTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] mediaTypes,
 | 
				
			||||||
            [FromQuery] bool? enableUserData,
 | 
					            [FromQuery] bool? enableUserData,
 | 
				
			||||||
@ -785,7 +785,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            [FromQuery] bool? enableImages = true)
 | 
					            [FromQuery] bool? enableImages = true)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var user = _userManager.GetUserById(userId);
 | 
					            var user = _userManager.GetUserById(userId);
 | 
				
			||||||
            var parentIdGuid = string.IsNullOrWhiteSpace(parentId) ? Guid.Empty : new Guid(parentId);
 | 
					            var parentIdGuid = parentId ?? Guid.Empty;
 | 
				
			||||||
            var dtoOptions = new DtoOptions { Fields = fields }
 | 
					            var dtoOptions = new DtoOptions { Fields = fields }
 | 
				
			||||||
                .AddClientFields(Request)
 | 
					                .AddClientFields(Request)
 | 
				
			||||||
                .AddAdditionalDtoOptions(enableImages, enableUserData, imageTypeLimit, enableImageTypes);
 | 
					                .AddAdditionalDtoOptions(enableImages, enableUserData, imageTypeLimit, enableImageTypes);
 | 
				
			||||||
 | 
				
			|||||||
@ -362,7 +362,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
        [Authorize(Policy = Policies.DefaultAuthorization)]
 | 
					        [Authorize(Policy = Policies.DefaultAuthorization)]
 | 
				
			||||||
        [ProducesResponseType(StatusCodes.Status204NoContent)]
 | 
					        [ProducesResponseType(StatusCodes.Status204NoContent)]
 | 
				
			||||||
        [ProducesResponseType(StatusCodes.Status401Unauthorized)]
 | 
					        [ProducesResponseType(StatusCodes.Status401Unauthorized)]
 | 
				
			||||||
        public ActionResult DeleteItems([FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] ids)
 | 
					        public ActionResult DeleteItems([FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] Guid[] ids)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (ids.Length == 0)
 | 
					            if (ids.Length == 0)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 | 
				
			|||||||
@ -65,7 +65,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
        [HttpGet("Recommendations")]
 | 
					        [HttpGet("Recommendations")]
 | 
				
			||||||
        public ActionResult<IEnumerable<RecommendationDto>> GetMovieRecommendations(
 | 
					        public ActionResult<IEnumerable<RecommendationDto>> GetMovieRecommendations(
 | 
				
			||||||
            [FromQuery] Guid? userId,
 | 
					            [FromQuery] Guid? userId,
 | 
				
			||||||
            [FromQuery] string? parentId,
 | 
					            [FromQuery] Guid? parentId,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
				
			||||||
            [FromQuery] int categoryLimit = 5,
 | 
					            [FromQuery] int categoryLimit = 5,
 | 
				
			||||||
            [FromQuery] int itemLimit = 8)
 | 
					            [FromQuery] int itemLimit = 8)
 | 
				
			||||||
@ -78,7 +78,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            var categories = new List<RecommendationDto>();
 | 
					            var categories = new List<RecommendationDto>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var parentIdGuid = string.IsNullOrWhiteSpace(parentId) ? Guid.Empty : new Guid(parentId);
 | 
					            var parentIdGuid = parentId ?? Guid.Empty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var query = new InternalItemsQuery(user)
 | 
					            var query = new InternalItemsQuery(user)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 | 
				
			|||||||
@ -72,7 +72,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            [FromQuery] int? startIndex,
 | 
					            [FromQuery] int? startIndex,
 | 
				
			||||||
            [FromQuery] int? limit,
 | 
					            [FromQuery] int? limit,
 | 
				
			||||||
            [FromQuery] string? searchTerm,
 | 
					            [FromQuery] string? searchTerm,
 | 
				
			||||||
            [FromQuery] string? parentId,
 | 
					            [FromQuery] Guid? parentId,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
				
			||||||
@ -109,15 +109,15 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
                EnableTotalRecordCount = enableTotalRecordCount
 | 
					                EnableTotalRecordCount = enableTotalRecordCount
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (!string.IsNullOrWhiteSpace(parentId))
 | 
					            if (parentId.HasValue)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (parentItem is Folder)
 | 
					                if (parentItem is Folder)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    query.AncestorIds = new[] { new Guid(parentId) };
 | 
					                    query.AncestorIds = new[] { parentId.Value };
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                else
 | 
					                else
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    query.ItemIds = new[] { new Guid(parentId) };
 | 
					                    query.ItemIds = new[] { parentId.Value };
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -45,13 +45,13 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
        [ProducesResponseType(StatusCodes.Status200OK)]
 | 
					        [ProducesResponseType(StatusCodes.Status200OK)]
 | 
				
			||||||
        public async Task<ActionResult<PackageInfo>> GetPackageInfo(
 | 
					        public async Task<ActionResult<PackageInfo>> GetPackageInfo(
 | 
				
			||||||
            [FromRoute, Required] string name,
 | 
					            [FromRoute, Required] string name,
 | 
				
			||||||
            [FromQuery] string? assemblyGuid)
 | 
					            [FromQuery] Guid? assemblyGuid)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var packages = await _installationManager.GetAvailablePackages().ConfigureAwait(false);
 | 
					            var packages = await _installationManager.GetAvailablePackages().ConfigureAwait(false);
 | 
				
			||||||
            var result = _installationManager.FilterPackages(
 | 
					            var result = _installationManager.FilterPackages(
 | 
				
			||||||
                    packages,
 | 
					                    packages,
 | 
				
			||||||
                    name,
 | 
					                    name,
 | 
				
			||||||
                    string.IsNullOrEmpty(assemblyGuid) ? default : Guid.Parse(assemblyGuid))
 | 
					                    assemblyGuid ?? default)
 | 
				
			||||||
                .FirstOrDefault();
 | 
					                .FirstOrDefault();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (result == null)
 | 
					            if (result == null)
 | 
				
			||||||
@ -92,7 +92,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
        [Authorize(Policy = Policies.RequiresElevation)]
 | 
					        [Authorize(Policy = Policies.RequiresElevation)]
 | 
				
			||||||
        public async Task<ActionResult> InstallPackage(
 | 
					        public async Task<ActionResult> InstallPackage(
 | 
				
			||||||
            [FromRoute, Required] string name,
 | 
					            [FromRoute, Required] string name,
 | 
				
			||||||
            [FromQuery] string? assemblyGuid,
 | 
					            [FromQuery] Guid? assemblyGuid,
 | 
				
			||||||
            [FromQuery] string? version,
 | 
					            [FromQuery] string? version,
 | 
				
			||||||
            [FromQuery] string? repositoryUrl)
 | 
					            [FromQuery] string? repositoryUrl)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@ -106,7 +106,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            var package = _installationManager.GetCompatibleVersions(
 | 
					            var package = _installationManager.GetCompatibleVersions(
 | 
				
			||||||
                    packages,
 | 
					                    packages,
 | 
				
			||||||
                    name,
 | 
					                    name,
 | 
				
			||||||
                    string.IsNullOrEmpty(assemblyGuid) ? Guid.Empty : Guid.Parse(assemblyGuid),
 | 
					                    assemblyGuid ?? Guid.Empty,
 | 
				
			||||||
                    specificVersion: string.IsNullOrEmpty(version) ? null : Version.Parse(version))
 | 
					                    specificVersion: string.IsNullOrEmpty(version) ? null : Version.Parse(version))
 | 
				
			||||||
                .FirstOrDefault();
 | 
					                .FirstOrDefault();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -79,7 +79,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ImageType[] enableImageTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ImageType[] enableImageTypes,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludePersonTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludePersonTypes,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] personTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] personTypes,
 | 
				
			||||||
            [FromQuery] string? appearsInItemId,
 | 
					            [FromQuery] Guid? appearsInItemId,
 | 
				
			||||||
            [FromQuery] Guid? userId,
 | 
					            [FromQuery] Guid? userId,
 | 
				
			||||||
            [FromQuery] bool? enableImages = true)
 | 
					            [FromQuery] bool? enableImages = true)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@ -102,7 +102,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
                NameContains = searchTerm,
 | 
					                NameContains = searchTerm,
 | 
				
			||||||
                User = user,
 | 
					                User = user,
 | 
				
			||||||
                IsFavorite = !isFavorite.HasValue && isFavoriteInFilters ? true : isFavorite,
 | 
					                IsFavorite = !isFavorite.HasValue && isFavoriteInFilters ? true : isFavorite,
 | 
				
			||||||
                AppearsInItemId = string.IsNullOrEmpty(appearsInItemId) ? Guid.Empty : Guid.Parse(appearsInItemId),
 | 
					                AppearsInItemId = appearsInItemId ?? Guid.Empty,
 | 
				
			||||||
                Limit = limit ?? 0
 | 
					                Limit = limit ?? 0
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -86,7 +86,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] mediaTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] mediaTypes,
 | 
				
			||||||
            [FromQuery] string? parentId,
 | 
					            [FromQuery] Guid? parentId,
 | 
				
			||||||
            [FromQuery] bool? isMovie,
 | 
					            [FromQuery] bool? isMovie,
 | 
				
			||||||
            [FromQuery] bool? isSeries,
 | 
					            [FromQuery] bool? isSeries,
 | 
				
			||||||
            [FromQuery] bool? isNews,
 | 
					            [FromQuery] bool? isNews,
 | 
				
			||||||
 | 
				
			|||||||
@ -71,7 +71,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            [FromQuery] int? startIndex,
 | 
					            [FromQuery] int? startIndex,
 | 
				
			||||||
            [FromQuery] int? limit,
 | 
					            [FromQuery] int? limit,
 | 
				
			||||||
            [FromQuery] string? searchTerm,
 | 
					            [FromQuery] string? searchTerm,
 | 
				
			||||||
            [FromQuery] string? parentId,
 | 
					            [FromQuery] Guid? parentId,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
				
			||||||
@ -109,15 +109,15 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
                EnableTotalRecordCount = enableTotalRecordCount
 | 
					                EnableTotalRecordCount = enableTotalRecordCount
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (!string.IsNullOrWhiteSpace(parentId))
 | 
					            if (parentId.HasValue)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (parentItem is Folder)
 | 
					                if (parentItem is Folder)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    query.AncestorIds = new[] { new Guid(parentId) };
 | 
					                    query.AncestorIds = new[] { parentId.Value };
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                else
 | 
					                else
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    query.ItemIds = new[] { new Guid(parentId) };
 | 
					                    query.ItemIds = new[] { parentId.Value };
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -145,7 +145,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            [FromQuery] bool? recursive,
 | 
					            [FromQuery] bool? recursive,
 | 
				
			||||||
            [FromQuery] string? searchTerm,
 | 
					            [FromQuery] string? searchTerm,
 | 
				
			||||||
            [FromQuery] string? sortOrder,
 | 
					            [FromQuery] string? sortOrder,
 | 
				
			||||||
            [FromQuery] string? parentId,
 | 
					            [FromQuery] Guid? parentId,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFilter[] filters,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFilter[] filters,
 | 
				
			||||||
 | 
				
			|||||||
@ -76,7 +76,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            [FromQuery] int? limit,
 | 
					            [FromQuery] int? limit,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
				
			||||||
            [FromQuery] string? seriesId,
 | 
					            [FromQuery] string? seriesId,
 | 
				
			||||||
            [FromQuery] string? parentId,
 | 
					            [FromQuery] Guid? parentId,
 | 
				
			||||||
            [FromQuery] bool? enableImges,
 | 
					            [FromQuery] bool? enableImges,
 | 
				
			||||||
            [FromQuery] int? imageTypeLimit,
 | 
					            [FromQuery] int? imageTypeLimit,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ImageType[] enableImageTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ImageType[] enableImageTypes,
 | 
				
			||||||
@ -132,7 +132,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            [FromQuery] int? startIndex,
 | 
					            [FromQuery] int? startIndex,
 | 
				
			||||||
            [FromQuery] int? limit,
 | 
					            [FromQuery] int? limit,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
				
			||||||
            [FromQuery] string? parentId,
 | 
					            [FromQuery] Guid? parentId,
 | 
				
			||||||
            [FromQuery] bool? enableImges,
 | 
					            [FromQuery] bool? enableImges,
 | 
				
			||||||
            [FromQuery] int? imageTypeLimit,
 | 
					            [FromQuery] int? imageTypeLimit,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ImageType[] enableImageTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ImageType[] enableImageTypes,
 | 
				
			||||||
@ -144,7 +144,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            var minPremiereDate = DateTime.Now.Date.ToUniversalTime().AddDays(-1);
 | 
					            var minPremiereDate = DateTime.Now.Date.ToUniversalTime().AddDays(-1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var parentIdGuid = string.IsNullOrWhiteSpace(parentId) ? Guid.Empty : new Guid(parentId);
 | 
					            var parentIdGuid = parentId ?? Guid.Empty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var options = new DtoOptions { Fields = fields }
 | 
					            var options = new DtoOptions { Fields = fields }
 | 
				
			||||||
                .AddClientFields(Request)
 | 
					                .AddClientFields(Request)
 | 
				
			||||||
@ -194,14 +194,14 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
        [ProducesResponseType(StatusCodes.Status200OK)]
 | 
					        [ProducesResponseType(StatusCodes.Status200OK)]
 | 
				
			||||||
        [ProducesResponseType(StatusCodes.Status404NotFound)]
 | 
					        [ProducesResponseType(StatusCodes.Status404NotFound)]
 | 
				
			||||||
        public ActionResult<QueryResult<BaseItemDto>> GetEpisodes(
 | 
					        public ActionResult<QueryResult<BaseItemDto>> GetEpisodes(
 | 
				
			||||||
            [FromRoute, Required] string seriesId,
 | 
					            [FromRoute, Required] Guid seriesId,
 | 
				
			||||||
            [FromQuery] Guid? userId,
 | 
					            [FromQuery] Guid? userId,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
				
			||||||
            [FromQuery] int? season,
 | 
					            [FromQuery] int? season,
 | 
				
			||||||
            [FromQuery] string? seasonId,
 | 
					            [FromQuery] Guid? seasonId,
 | 
				
			||||||
            [FromQuery] bool? isMissing,
 | 
					            [FromQuery] bool? isMissing,
 | 
				
			||||||
            [FromQuery] string? adjacentTo,
 | 
					            [FromQuery] string? adjacentTo,
 | 
				
			||||||
            [FromQuery] string? startItemId,
 | 
					            [FromQuery] Guid? startItemId,
 | 
				
			||||||
            [FromQuery] int? startIndex,
 | 
					            [FromQuery] int? startIndex,
 | 
				
			||||||
            [FromQuery] int? limit,
 | 
					            [FromQuery] int? limit,
 | 
				
			||||||
            [FromQuery] bool? enableImages,
 | 
					            [FromQuery] bool? enableImages,
 | 
				
			||||||
@ -220,9 +220,9 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
                .AddClientFields(Request)
 | 
					                .AddClientFields(Request)
 | 
				
			||||||
                .AddAdditionalDtoOptions(enableImages, enableUserData, imageTypeLimit, enableImageTypes!);
 | 
					                .AddAdditionalDtoOptions(enableImages, enableUserData, imageTypeLimit, enableImageTypes!);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (!string.IsNullOrWhiteSpace(seasonId)) // Season id was supplied. Get episodes by season id.
 | 
					            if (seasonId.HasValue) // Season id was supplied. Get episodes by season id.
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                var item = _libraryManager.GetItemById(new Guid(seasonId));
 | 
					                var item = _libraryManager.GetItemById(seasonId.Value);
 | 
				
			||||||
                if (!(item is Season seasonItem))
 | 
					                if (!(item is Season seasonItem))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    return NotFound("No season exists with Id " + seasonId);
 | 
					                    return NotFound("No season exists with Id " + seasonId);
 | 
				
			||||||
@ -264,10 +264,10 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
                    .ToList();
 | 
					                    .ToList();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (!string.IsNullOrWhiteSpace(startItemId))
 | 
					            if (startItemId.HasValue)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                episodes = episodes
 | 
					                episodes = episodes
 | 
				
			||||||
                    .SkipWhile(i => !string.Equals(i.Id.ToString("N", CultureInfo.InvariantCulture), startItemId, StringComparison.OrdinalIgnoreCase))
 | 
					                    .SkipWhile(i => startItemId.Value.Equals(i.Id))
 | 
				
			||||||
                    .ToList();
 | 
					                    .ToList();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -316,7 +316,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
        [ProducesResponseType(StatusCodes.Status200OK)]
 | 
					        [ProducesResponseType(StatusCodes.Status200OK)]
 | 
				
			||||||
        [ProducesResponseType(StatusCodes.Status404NotFound)]
 | 
					        [ProducesResponseType(StatusCodes.Status404NotFound)]
 | 
				
			||||||
        public ActionResult<QueryResult<BaseItemDto>> GetSeasons(
 | 
					        public ActionResult<QueryResult<BaseItemDto>> GetSeasons(
 | 
				
			||||||
            [FromRoute, Required] string seriesId,
 | 
					            [FromRoute, Required] Guid seriesId,
 | 
				
			||||||
            [FromQuery] Guid? userId,
 | 
					            [FromQuery] Guid? userId,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
				
			||||||
            [FromQuery] bool? isSpecialSeason,
 | 
					            [FromQuery] bool? isSpecialSeason,
 | 
				
			||||||
 | 
				
			|||||||
@ -71,7 +71,7 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            [FromQuery] int? startIndex,
 | 
					            [FromQuery] int? startIndex,
 | 
				
			||||||
            [FromQuery] int? limit,
 | 
					            [FromQuery] int? limit,
 | 
				
			||||||
            [FromQuery] string? sortOrder,
 | 
					            [FromQuery] string? sortOrder,
 | 
				
			||||||
            [FromQuery] string? parentId,
 | 
					            [FromQuery] Guid? parentId,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] excludeItemTypes,
 | 
				
			||||||
            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
					            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] includeItemTypes,
 | 
				
			||||||
@ -94,11 +94,11 @@ namespace Jellyfin.Api.Controllers
 | 
				
			|||||||
            if (userId.HasValue && !userId.Equals(Guid.Empty))
 | 
					            if (userId.HasValue && !userId.Equals(Guid.Empty))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                user = _userManager.GetUserById(userId.Value);
 | 
					                user = _userManager.GetUserById(userId.Value);
 | 
				
			||||||
                parentItem = string.IsNullOrEmpty(parentId) ? _libraryManager.GetUserRootFolder() : _libraryManager.GetItemById(parentId);
 | 
					                parentItem = parentId.HasValue ? _libraryManager.GetItemById(parentId.Value) : _libraryManager.GetUserRootFolder();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                parentItem = string.IsNullOrEmpty(parentId) ? _libraryManager.RootFolder : _libraryManager.GetItemById(parentId);
 | 
					                parentItem = parentId.HasValue ? _libraryManager.GetItemById(parentId.Value) : _libraryManager.RootFolder;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            IList<BaseItem> items;
 | 
					            IList<BaseItem> items;
 | 
				
			||||||
 | 
				
			|||||||
@ -24,7 +24,7 @@ namespace MediaBrowser.Controller.Channels
 | 
				
			|||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <param name="id">The identifier.</param>
 | 
					        /// <param name="id">The identifier.</param>
 | 
				
			||||||
        /// <returns>ChannelFeatures.</returns>
 | 
					        /// <returns>ChannelFeatures.</returns>
 | 
				
			||||||
        ChannelFeatures GetChannelFeatures(string id);
 | 
					        ChannelFeatures GetChannelFeatures(Guid? id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Gets all channel features.
 | 
					        /// Gets all channel features.
 | 
				
			||||||
 | 
				
			|||||||
@ -574,5 +574,7 @@ namespace MediaBrowser.Controller.Library
 | 
				
			|||||||
        void RunMetadataSavers(IReadOnlyList<BaseItem> items, ItemUpdateType updateReason);
 | 
					        void RunMetadataSavers(IReadOnlyList<BaseItem> items, ItemUpdateType updateReason);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        BaseItem GetParentItem(string parentId, Guid? userId);
 | 
					        BaseItem GetParentItem(string parentId, Guid? userId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        BaseItem GetParentItem(Guid? parentId, Guid? userId);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -18,7 +18,7 @@ namespace MediaBrowser.Model.Querying
 | 
				
			|||||||
        /// Gets or sets the parent identifier.
 | 
					        /// Gets or sets the parent identifier.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <value>The parent identifier.</value>
 | 
					        /// <value>The parent identifier.</value>
 | 
				
			||||||
        public string ParentId { get; set; }
 | 
					        public Guid? ParentId { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Gets or sets the series id.
 | 
					        /// Gets or sets the series id.
 | 
				
			||||||
 | 
				
			|||||||
@ -47,7 +47,7 @@ namespace MediaBrowser.Model.Search
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        public string[] ExcludeItemTypes { get; set; }
 | 
					        public string[] ExcludeItemTypes { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public string ParentId { get; set; }
 | 
					        public Guid? ParentId { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public bool? IsMovie { get; set; }
 | 
					        public bool? IsMovie { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user