jellyfin-server/MediaBrowser.Api/FilterService.cs

249 lines
10 KiB
C#
Raw Normal View History

using System;
2019-02-26 19:47:23 +00:00
using System.Collections.Generic;
using System.Linq;
2020-05-20 17:07:53 +00:00
using Jellyfin.Data.Entities;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
2017-12-03 22:15:21 +00:00
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Querying;
2016-10-25 19:02:04 +00:00
using MediaBrowser.Model.Services;
using Microsoft.Extensions.Logging;
namespace MediaBrowser.Api
{
[Route("/Items/Filters", "GET", Summary = "Gets branding configuration")]
2017-12-03 22:15:21 +00:00
public class GetQueryFiltersLegacy : IReturn<QueryFiltersLegacy>
{
/// <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")]
2018-09-12 17:26:21 +00:00
public Guid UserId { get; set; }
2017-12-03 22:15:21 +00:00
[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);
}
}
[Route("/Items/Filters2", "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")]
2018-09-12 17:26:21 +00:00
public Guid 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);
}
2017-12-03 22:15:21 +00:00
public bool? IsAiring { get; set; }
2020-06-15 21:43:52 +00:00
2017-12-03 22:15:21 +00:00
public bool? IsMovie { get; set; }
2020-06-15 21:43:52 +00:00
2017-12-03 22:15:21 +00:00
public bool? IsSports { get; set; }
2020-06-15 21:43:52 +00:00
2017-12-03 22:15:21 +00:00
public bool? IsKids { get; set; }
2020-06-15 21:43:52 +00:00
2017-12-03 22:15:21 +00:00
public bool? IsNews { get; set; }
2020-06-15 21:43:52 +00:00
2017-12-03 22:15:21 +00:00
public bool? IsSeries { get; set; }
2020-06-15 21:43:52 +00:00
2018-09-12 17:26:21 +00:00
public bool? Recursive { get; set; }
}
[Authenticated]
public class FilterService : BaseApiService
{
private readonly ILibraryManager _libraryManager;
private readonly IUserManager _userManager;
public FilterService(
ILogger<FilterService> logger,
IServerConfigurationManager serverConfigurationManager,
IHttpResultFactory httpResultFactory,
ILibraryManager libraryManager,
IUserManager userManager)
: base(logger, serverConfigurationManager, httpResultFactory)
{
_libraryManager = libraryManager;
_userManager = userManager;
}
2017-05-26 06:48:54 +00:00
public object Get(GetQueryFilters request)
{
var parentItem = string.IsNullOrEmpty(request.ParentId) ? null : _libraryManager.GetItemById(request.ParentId);
2018-09-12 17:26:21 +00:00
var user = !request.UserId.Equals(Guid.Empty) ? _userManager.GetUserById(request.UserId) : null;
2017-12-03 22:15:21 +00:00
if (string.Equals(request.IncludeItemTypes, "BoxSet", StringComparison.OrdinalIgnoreCase) ||
string.Equals(request.IncludeItemTypes, "Playlist", StringComparison.OrdinalIgnoreCase) ||
string.Equals(request.IncludeItemTypes, typeof(Trailer).Name, StringComparison.OrdinalIgnoreCase) ||
string.Equals(request.IncludeItemTypes, "Program", StringComparison.OrdinalIgnoreCase))
{
parentItem = null;
}
var filters = new QueryFilters();
var genreQuery = new InternalItemsQuery(user)
{
IncludeItemTypes = request.GetIncludeItemTypes(),
DtoOptions = new Controller.Dto.DtoOptions
{
2020-07-04 15:54:25 +00:00
Fields = Array.Empty<ItemFields>(),
2017-12-03 22:15:21 +00:00
EnableImages = false,
EnableUserData = false
},
IsAiring = request.IsAiring,
IsMovie = request.IsMovie,
IsSports = request.IsSports,
IsKids = request.IsKids,
IsNews = request.IsNews,
IsSeries = request.IsSeries
};
2018-09-12 17:26:21 +00:00
// Non recursive not yet supported for library folders
if ((request.Recursive ?? true) || parentItem is UserView || parentItem is ICollectionFolder)
{
genreQuery.AncestorIds = parentItem == null ? Array.Empty<Guid>() : new[] { parentItem.Id };
2018-09-12 17:26:21 +00:00
}
else
{
genreQuery.Parent = parentItem;
}
2017-12-03 22:15:21 +00:00
if (string.Equals(request.IncludeItemTypes, "MusicAlbum", StringComparison.OrdinalIgnoreCase) ||
string.Equals(request.IncludeItemTypes, "MusicVideo", StringComparison.OrdinalIgnoreCase) ||
string.Equals(request.IncludeItemTypes, "MusicArtist", StringComparison.OrdinalIgnoreCase) ||
string.Equals(request.IncludeItemTypes, "Audio", StringComparison.OrdinalIgnoreCase))
{
2018-09-12 17:26:21 +00:00
filters.Genres = _libraryManager.GetMusicGenres(genreQuery).Items.Select(i => new NameGuidPair
2017-12-03 22:15:21 +00:00
{
Name = i.Item1.Name,
2018-09-12 17:26:21 +00:00
Id = i.Item1.Id
2017-12-03 22:15:21 +00:00
}).ToArray();
}
else
{
2018-09-12 17:26:21 +00:00
filters.Genres = _libraryManager.GetGenres(genreQuery).Items.Select(i => new NameGuidPair
2017-12-03 22:15:21 +00:00
{
Name = i.Item1.Name,
2018-09-12 17:26:21 +00:00
Id = i.Item1.Id
2017-12-03 22:15:21 +00:00
}).ToArray();
}
return ToOptimizedResult(filters);
}
public object Get(GetQueryFiltersLegacy request)
{
var parentItem = string.IsNullOrEmpty(request.ParentId) ? null : _libraryManager.GetItemById(request.ParentId);
2018-09-12 17:26:21 +00:00
var user = !request.UserId.Equals(Guid.Empty) ? _userManager.GetUserById(request.UserId) : null;
2017-12-03 22:15:21 +00:00
if (string.Equals(request.IncludeItemTypes, "BoxSet", StringComparison.OrdinalIgnoreCase) ||
string.Equals(request.IncludeItemTypes, "Playlist", StringComparison.OrdinalIgnoreCase) ||
string.Equals(request.IncludeItemTypes, typeof(Trailer).Name, StringComparison.OrdinalIgnoreCase) ||
string.Equals(request.IncludeItemTypes, "Program", StringComparison.OrdinalIgnoreCase))
{
parentItem = null;
}
var item = string.IsNullOrEmpty(request.ParentId) ?
2018-09-12 17:26:21 +00:00
user == null ? _libraryManager.RootFolder : _libraryManager.GetUserRootFolder() :
parentItem;
2017-08-01 16:45:57 +00:00
var result = ((Folder)item).GetItemList(GetItemsQuery(request, user));
2017-12-03 22:15:21 +00:00
var filters = GetFilters(result);
return ToOptimizedResult(filters);
}
2019-02-26 19:47:23 +00:00
private QueryFiltersLegacy GetFilters(IReadOnlyCollection<BaseItem> items)
{
2017-12-03 22:15:21 +00:00
var result = new QueryFiltersLegacy();
result.Years = items.Select(i => i.ProductionYear ?? -1)
.Where(i => i > 0)
.Distinct()
.OrderBy(i => i)
.ToArray();
result.Genres = items.SelectMany(i => i.Genres)
2015-04-09 21:11:57 +00:00
.DistinctNames()
.OrderBy(i => i)
.ToArray();
2016-06-02 17:43:29 +00:00
result.Tags = items
.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;
}
2020-05-20 17:07:53 +00:00
private InternalItemsQuery GetItemsQuery(GetQueryFiltersLegacy request, User user)
{
var query = new InternalItemsQuery
{
User = user,
MediaTypes = request.GetMediaTypes(),
IncludeItemTypes = request.GetIncludeItemTypes(),
2016-05-18 05:34:10 +00:00
Recursive = true,
2016-10-08 05:57:38 +00:00
EnableTotalRecordCount = false,
2016-10-10 18:18:28 +00:00
DtoOptions = new Controller.Dto.DtoOptions
{
Fields = new[] { ItemFields.Genres, ItemFields.Tags },
2016-10-10 18:18:28 +00:00
EnableImages = false,
EnableUserData = false
}
};
return query;
}
}
}