mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-11-16 10:29:01 -07:00
113 lines
4.3 KiB
C#
113 lines
4.3 KiB
C#
using MediaBrowser.Controller.Entities;
|
|
using MediaBrowser.Controller.Library;
|
|
using MediaBrowser.Controller.Net;
|
|
using MediaBrowser.Model.Querying;
|
|
using ServiceStack;
|
|
using System;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace MediaBrowser.Api
|
|
{
|
|
[Route("/Items/Filters", "GET", Summary = "Gets branding configuration")]
|
|
public class GetQueryFilters : IReturn<QueryFilters>
|
|
{
|
|
/// <summary>
|
|
/// Gets or sets the user id.
|
|
/// </summary>
|
|
/// <value>The user id.</value>
|
|
[ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
|
|
public string UserId { get; set; }
|
|
|
|
[ApiMember(Name = "ParentId", Description = "Specify this to localize the search to a specific item or folder. Omit to use the root", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
|
|
public string ParentId { get; set; }
|
|
|
|
[ApiMember(Name = "IncludeItemTypes", Description = "Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
|
|
public string IncludeItemTypes { get; set; }
|
|
|
|
[ApiMember(Name = "MediaTypes", Description = "Optional filter by MediaType. Allows multiple, comma delimited.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
|
|
public string MediaTypes { get; set; }
|
|
|
|
public string[] GetMediaTypes()
|
|
{
|
|
return (MediaTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
|
|
}
|
|
|
|
public string[] GetIncludeItemTypes()
|
|
{
|
|
return (IncludeItemTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
|
|
}
|
|
}
|
|
|
|
[Authenticated]
|
|
public class FilterService : BaseApiService
|
|
{
|
|
private readonly ILibraryManager _libraryManager;
|
|
private readonly IUserManager _userManager;
|
|
|
|
public FilterService(ILibraryManager libraryManager, IUserManager userManager)
|
|
{
|
|
_libraryManager = libraryManager;
|
|
_userManager = userManager;
|
|
}
|
|
|
|
public async Task<object> Get(GetQueryFilters request)
|
|
{
|
|
var parentItem = string.IsNullOrEmpty(request.ParentId) ? null : _libraryManager.GetItemById(request.ParentId);
|
|
var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null;
|
|
|
|
var item = string.IsNullOrEmpty(request.ParentId) ?
|
|
user == null ? _libraryManager.RootFolder : user.RootFolder :
|
|
parentItem;
|
|
|
|
var result = await ((Folder)item).GetItems(GetItemsQuery(request, user));
|
|
|
|
return ToOptimizedResult(GetFilters(result.Items));
|
|
}
|
|
|
|
private QueryFilters GetFilters(BaseItem[] items)
|
|
{
|
|
var result = new QueryFilters();
|
|
|
|
result.Years = items.Select(i => i.ProductionYear ?? -1)
|
|
.Where(i => i > 0)
|
|
.Distinct()
|
|
.OrderBy(i => i)
|
|
.ToArray();
|
|
|
|
result.Genres = items.SelectMany(i => i.Genres)
|
|
.Distinct(StringComparer.OrdinalIgnoreCase)
|
|
.OrderBy(i => i)
|
|
.ToArray();
|
|
|
|
result.Tags = items.OfType<IHasTags>()
|
|
.SelectMany(i => i.Tags)
|
|
.Distinct(StringComparer.OrdinalIgnoreCase)
|
|
.OrderBy(i => i)
|
|
.ToArray();
|
|
|
|
result.OfficialRatings = items
|
|
.Select(i => i.OfficialRating)
|
|
.Where(i => !string.IsNullOrWhiteSpace(i))
|
|
.Distinct(StringComparer.OrdinalIgnoreCase)
|
|
.OrderBy(i => i)
|
|
.ToArray();
|
|
|
|
return result;
|
|
}
|
|
|
|
private InternalItemsQuery GetItemsQuery(GetQueryFilters request, User user)
|
|
{
|
|
var query = new InternalItemsQuery
|
|
{
|
|
User = user,
|
|
MediaTypes = request.GetMediaTypes(),
|
|
IncludeItemTypes = request.GetIncludeItemTypes(),
|
|
Recursive = true
|
|
};
|
|
|
|
return query;
|
|
}
|
|
}
|
|
}
|