aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Api/Controllers/FilterController.cs
diff options
context:
space:
mode:
authorShadowghost <Ghost_of_Stone@web.de>2023-02-15 22:40:07 +0100
committerShadowghost <Ghost_of_Stone@web.de>2023-02-15 22:40:07 +0100
commit3a91c37283eb633e7e55df78b8017a5a492923b6 (patch)
tree4e22db9a5234c63370195992a28c64891d7a6cc1 /Jellyfin.Api/Controllers/FilterController.cs
parent4eba16c6726564b159e395e188ec89f69d990e52 (diff)
parent3fe64f69b747f39a6505e4fad1bbd6eaf63cecc4 (diff)
Merge branch 'master' into network-rewrite
Diffstat (limited to 'Jellyfin.Api/Controllers/FilterController.cs')
-rw-r--r--Jellyfin.Api/Controllers/FilterController.cs360
1 files changed, 179 insertions, 181 deletions
diff --git a/Jellyfin.Api/Controllers/FilterController.cs b/Jellyfin.Api/Controllers/FilterController.cs
index 17d136384..dd64ff903 100644
--- a/Jellyfin.Api/Controllers/FilterController.cs
+++ b/Jellyfin.Api/Controllers/FilterController.cs
@@ -1,6 +1,5 @@
using System;
using System.Linq;
-using Jellyfin.Api.Constants;
using Jellyfin.Api.ModelBinders;
using Jellyfin.Data.Enums;
using MediaBrowser.Controller.Dto;
@@ -12,205 +11,204 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
-namespace Jellyfin.Api.Controllers
+namespace Jellyfin.Api.Controllers;
+
+/// <summary>
+/// Filters controller.
+/// </summary>
+[Route("")]
+[Authorize]
+public class FilterController : BaseJellyfinApiController
{
+ private readonly ILibraryManager _libraryManager;
+ private readonly IUserManager _userManager;
+
/// <summary>
- /// Filters controller.
+ /// Initializes a new instance of the <see cref="FilterController"/> class.
/// </summary>
- [Route("")]
- [Authorize(Policy = Policies.DefaultAuthorization)]
- public class FilterController : BaseJellyfinApiController
+ /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
+ /// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param>
+ public FilterController(ILibraryManager libraryManager, IUserManager userManager)
{
- private readonly ILibraryManager _libraryManager;
- private readonly IUserManager _userManager;
-
- /// <summary>
- /// Initializes a new instance of the <see cref="FilterController"/> class.
- /// </summary>
- /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
- /// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param>
- public FilterController(ILibraryManager libraryManager, IUserManager userManager)
+ _libraryManager = libraryManager;
+ _userManager = userManager;
+ }
+
+ /// <summary>
+ /// Gets legacy query filters.
+ /// </summary>
+ /// <param name="userId">Optional. User id.</param>
+ /// <param name="parentId">Optional. Parent id.</param>
+ /// <param name="includeItemTypes">Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimited.</param>
+ /// <param name="mediaTypes">Optional. Filter by MediaType. Allows multiple, comma delimited.</param>
+ /// <response code="200">Legacy filters retrieved.</response>
+ /// <returns>Legacy query filters.</returns>
+ [HttpGet("Items/Filters")]
+ [ProducesResponseType(StatusCodes.Status200OK)]
+ public ActionResult<QueryFiltersLegacy> GetQueryFiltersLegacy(
+ [FromQuery] Guid? userId,
+ [FromQuery] Guid? parentId,
+ [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] includeItemTypes,
+ [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] mediaTypes)
+ {
+ var user = userId is null || userId.Value.Equals(default)
+ ? null
+ : _userManager.GetUserById(userId.Value);
+
+ BaseItem? item = null;
+ if (includeItemTypes.Length != 1
+ || !(includeItemTypes[0] == BaseItemKind.BoxSet
+ || includeItemTypes[0] == BaseItemKind.Playlist
+ || includeItemTypes[0] == BaseItemKind.Trailer
+ || includeItemTypes[0] == BaseItemKind.Program))
{
- _libraryManager = libraryManager;
- _userManager = userManager;
+ item = _libraryManager.GetParentItem(parentId, user?.Id);
}
- /// <summary>
- /// Gets legacy query filters.
- /// </summary>
- /// <param name="userId">Optional. User id.</param>
- /// <param name="parentId">Optional. Parent id.</param>
- /// <param name="includeItemTypes">Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimited.</param>
- /// <param name="mediaTypes">Optional. Filter by MediaType. Allows multiple, comma delimited.</param>
- /// <response code="200">Legacy filters retrieved.</response>
- /// <returns>Legacy query filters.</returns>
- [HttpGet("Items/Filters")]
- [ProducesResponseType(StatusCodes.Status200OK)]
- public ActionResult<QueryFiltersLegacy> GetQueryFiltersLegacy(
- [FromQuery] Guid? userId,
- [FromQuery] Guid? parentId,
- [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] includeItemTypes,
- [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] mediaTypes)
+ var query = new InternalItemsQuery
{
- var user = userId is null || userId.Value.Equals(default)
- ? null
- : _userManager.GetUserById(userId.Value);
-
- BaseItem? item = null;
- if (includeItemTypes.Length != 1
- || !(includeItemTypes[0] == BaseItemKind.BoxSet
- || includeItemTypes[0] == BaseItemKind.Playlist
- || includeItemTypes[0] == BaseItemKind.Trailer
- || includeItemTypes[0] == BaseItemKind.Program))
- {
- item = _libraryManager.GetParentItem(parentId, user?.Id);
- }
-
- var query = new InternalItemsQuery
- {
- User = user,
- MediaTypes = mediaTypes,
- IncludeItemTypes = includeItemTypes,
- Recursive = true,
- EnableTotalRecordCount = false,
- DtoOptions = new DtoOptions
- {
- Fields = new[] { ItemFields.Genres, ItemFields.Tags },
- EnableImages = false,
- EnableUserData = false
- }
- };
-
- if (item is not Folder folder)
+ User = user,
+ MediaTypes = mediaTypes,
+ IncludeItemTypes = includeItemTypes,
+ Recursive = true,
+ EnableTotalRecordCount = false,
+ DtoOptions = new DtoOptions
{
- return new QueryFiltersLegacy();
+ Fields = new[] { ItemFields.Genres, ItemFields.Tags },
+ EnableImages = false,
+ EnableUserData = false
}
+ };
- var itemList = folder.GetItemList(query);
- return new QueryFiltersLegacy
- {
- Years = itemList.Select(i => i.ProductionYear ?? -1)
- .Where(i => i > 0)
- .Distinct()
- .Order()
- .ToArray(),
-
- Genres = itemList.SelectMany(i => i.Genres)
- .DistinctNames()
- .Order()
- .ToArray(),
-
- Tags = itemList
- .SelectMany(i => i.Tags)
- .Distinct(StringComparer.OrdinalIgnoreCase)
- .Order()
- .ToArray(),
-
- OfficialRatings = itemList
- .Select(i => i.OfficialRating)
- .Where(i => !string.IsNullOrWhiteSpace(i))
- .Distinct(StringComparer.OrdinalIgnoreCase)
- .Order()
- .ToArray()
- };
+ if (item is not Folder folder)
+ {
+ return new QueryFiltersLegacy();
}
- /// <summary>
- /// Gets query filters.
- /// </summary>
- /// <param name="userId">Optional. User id.</param>
- /// <param name="parentId">Optional. Specify this to localize the search to a specific item or folder. Omit to use the root.</param>
- /// <param name="includeItemTypes">Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimited.</param>
- /// <param name="isAiring">Optional. Is item airing.</param>
- /// <param name="isMovie">Optional. Is item movie.</param>
- /// <param name="isSports">Optional. Is item sports.</param>
- /// <param name="isKids">Optional. Is item kids.</param>
- /// <param name="isNews">Optional. Is item news.</param>
- /// <param name="isSeries">Optional. Is item series.</param>
- /// <param name="recursive">Optional. Search recursive.</param>
- /// <response code="200">Filters retrieved.</response>
- /// <returns>Query filters.</returns>
- [HttpGet("Items/Filters2")]
- [ProducesResponseType(StatusCodes.Status200OK)]
- public ActionResult<QueryFilters> GetQueryFilters(
- [FromQuery] Guid? userId,
- [FromQuery] Guid? parentId,
- [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] includeItemTypes,
- [FromQuery] bool? isAiring,
- [FromQuery] bool? isMovie,
- [FromQuery] bool? isSports,
- [FromQuery] bool? isKids,
- [FromQuery] bool? isNews,
- [FromQuery] bool? isSeries,
- [FromQuery] bool? recursive)
+ var itemList = folder.GetItemList(query);
+ return new QueryFiltersLegacy
{
- var user = userId is null || userId.Value.Equals(default)
- ? null
- : _userManager.GetUserById(userId.Value);
-
- BaseItem? parentItem = null;
- if (includeItemTypes.Length == 1
- && (includeItemTypes[0] == BaseItemKind.BoxSet
- || includeItemTypes[0] == BaseItemKind.Playlist
- || includeItemTypes[0] == BaseItemKind.Trailer
- || includeItemTypes[0] == BaseItemKind.Program))
- {
- parentItem = null;
- }
- else if (parentId.HasValue)
- {
- parentItem = _libraryManager.GetItemById(parentId.Value);
- }
+ Years = itemList.Select(i => i.ProductionYear ?? -1)
+ .Where(i => i > 0)
+ .Distinct()
+ .Order()
+ .ToArray(),
+
+ Genres = itemList.SelectMany(i => i.Genres)
+ .DistinctNames()
+ .Order()
+ .ToArray(),
+
+ Tags = itemList
+ .SelectMany(i => i.Tags)
+ .Distinct(StringComparer.OrdinalIgnoreCase)
+ .Order()
+ .ToArray(),
+
+ OfficialRatings = itemList
+ .Select(i => i.OfficialRating)
+ .Where(i => !string.IsNullOrWhiteSpace(i))
+ .Distinct(StringComparer.OrdinalIgnoreCase)
+ .Order()
+ .ToArray()
+ };
+ }
- var filters = new QueryFilters();
- var genreQuery = new InternalItemsQuery(user)
- {
- IncludeItemTypes = includeItemTypes,
- DtoOptions = new DtoOptions
- {
- Fields = Array.Empty<ItemFields>(),
- EnableImages = false,
- EnableUserData = false
- },
- IsAiring = isAiring,
- IsMovie = isMovie,
- IsSports = isSports,
- IsKids = isKids,
- IsNews = isNews,
- IsSeries = isSeries
- };
-
- if ((recursive ?? true) || parentItem is UserView || parentItem is ICollectionFolder)
- {
- genreQuery.AncestorIds = parentItem is null ? Array.Empty<Guid>() : new[] { parentItem.Id };
- }
- else
+ /// <summary>
+ /// Gets query filters.
+ /// </summary>
+ /// <param name="userId">Optional. User id.</param>
+ /// <param name="parentId">Optional. Specify this to localize the search to a specific item or folder. Omit to use the root.</param>
+ /// <param name="includeItemTypes">Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimited.</param>
+ /// <param name="isAiring">Optional. Is item airing.</param>
+ /// <param name="isMovie">Optional. Is item movie.</param>
+ /// <param name="isSports">Optional. Is item sports.</param>
+ /// <param name="isKids">Optional. Is item kids.</param>
+ /// <param name="isNews">Optional. Is item news.</param>
+ /// <param name="isSeries">Optional. Is item series.</param>
+ /// <param name="recursive">Optional. Search recursive.</param>
+ /// <response code="200">Filters retrieved.</response>
+ /// <returns>Query filters.</returns>
+ [HttpGet("Items/Filters2")]
+ [ProducesResponseType(StatusCodes.Status200OK)]
+ public ActionResult<QueryFilters> GetQueryFilters(
+ [FromQuery] Guid? userId,
+ [FromQuery] Guid? parentId,
+ [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] includeItemTypes,
+ [FromQuery] bool? isAiring,
+ [FromQuery] bool? isMovie,
+ [FromQuery] bool? isSports,
+ [FromQuery] bool? isKids,
+ [FromQuery] bool? isNews,
+ [FromQuery] bool? isSeries,
+ [FromQuery] bool? recursive)
+ {
+ var user = userId is null || userId.Value.Equals(default)
+ ? null
+ : _userManager.GetUserById(userId.Value);
+
+ BaseItem? parentItem = null;
+ if (includeItemTypes.Length == 1
+ && (includeItemTypes[0] == BaseItemKind.BoxSet
+ || includeItemTypes[0] == BaseItemKind.Playlist
+ || includeItemTypes[0] == BaseItemKind.Trailer
+ || includeItemTypes[0] == BaseItemKind.Program))
+ {
+ parentItem = null;
+ }
+ else if (parentId.HasValue)
+ {
+ parentItem = _libraryManager.GetItemById(parentId.Value);
+ }
+
+ var filters = new QueryFilters();
+ var genreQuery = new InternalItemsQuery(user)
+ {
+ IncludeItemTypes = includeItemTypes,
+ DtoOptions = new DtoOptions
{
- genreQuery.Parent = parentItem;
- }
+ Fields = Array.Empty<ItemFields>(),
+ EnableImages = false,
+ EnableUserData = false
+ },
+ IsAiring = isAiring,
+ IsMovie = isMovie,
+ IsSports = isSports,
+ IsKids = isKids,
+ IsNews = isNews,
+ IsSeries = isSeries
+ };
+
+ if ((recursive ?? true) || parentItem is UserView || parentItem is ICollectionFolder)
+ {
+ genreQuery.AncestorIds = parentItem is null ? Array.Empty<Guid>() : new[] { parentItem.Id };
+ }
+ else
+ {
+ genreQuery.Parent = parentItem;
+ }
- if (includeItemTypes.Length == 1
- && (includeItemTypes[0] == BaseItemKind.MusicAlbum
- || includeItemTypes[0] == BaseItemKind.MusicVideo
- || includeItemTypes[0] == BaseItemKind.MusicArtist
- || includeItemTypes[0] == BaseItemKind.Audio))
+ if (includeItemTypes.Length == 1
+ && (includeItemTypes[0] == BaseItemKind.MusicAlbum
+ || includeItemTypes[0] == BaseItemKind.MusicVideo
+ || includeItemTypes[0] == BaseItemKind.MusicArtist
+ || includeItemTypes[0] == BaseItemKind.Audio))
+ {
+ filters.Genres = _libraryManager.GetMusicGenres(genreQuery).Items.Select(i => new NameGuidPair
{
- filters.Genres = _libraryManager.GetMusicGenres(genreQuery).Items.Select(i => new NameGuidPair
- {
- Name = i.Item.Name,
- Id = i.Item.Id
- }).ToArray();
- }
- else
+ Name = i.Item.Name,
+ Id = i.Item.Id
+ }).ToArray();
+ }
+ else
+ {
+ filters.Genres = _libraryManager.GetGenres(genreQuery).Items.Select(i => new NameGuidPair
{
- filters.Genres = _libraryManager.GetGenres(genreQuery).Items.Select(i => new NameGuidPair
- {
- Name = i.Item.Name,
- Id = i.Item.Id
- }).ToArray();
- }
-
- return filters;
+ Name = i.Item.Name,
+ Id = i.Item.Id
+ }).ToArray();
}
+
+ return filters;
}
}