2020-07-01 02:26:53 +02:00
using System ;
2020-09-06 01:07:25 +02:00
using System.ComponentModel.DataAnnotations ;
2020-07-01 02:26:53 +02:00
using System.Linq ;
2020-08-06 16:17:45 +02:00
using Jellyfin.Api.Constants ;
2020-07-01 02:26:53 +02:00
using Jellyfin.Api.Extensions ;
using Jellyfin.Api.Helpers ;
2020-10-14 21:03:36 +02:00
using Jellyfin.Api.ModelBinders ;
2020-07-01 02:26:53 +02:00
using Jellyfin.Data.Entities ;
using MediaBrowser.Controller.Dto ;
using MediaBrowser.Controller.Entities ;
using MediaBrowser.Controller.Library ;
using MediaBrowser.Model.Dto ;
2020-10-10 01:52:39 +02:00
using MediaBrowser.Model.Entities ;
2020-07-01 02:26:53 +02:00
using MediaBrowser.Model.Querying ;
2020-08-06 16:17:45 +02:00
using Microsoft.AspNetCore.Authorization ;
2020-07-01 02:26:53 +02:00
using Microsoft.AspNetCore.Http ;
using Microsoft.AspNetCore.Mvc ;
namespace Jellyfin.Api.Controllers
{
/// <summary>
/// Persons controller.
/// </summary>
2020-08-06 16:17:45 +02:00
[Authorize(Policy = Policies.DefaultAuthorization)]
2020-07-01 02:26:53 +02:00
public class PersonsController : BaseJellyfinApiController
{
private readonly ILibraryManager _libraryManager ;
private readonly IDtoService _dtoService ;
private readonly IUserManager _userManager ;
2020-11-05 12:27:22 +01:00
private readonly IUserDataManager _userDataManager ;
2020-07-01 02:26:53 +02:00
/// <summary>
/// Initializes a new instance of the <see cref="PersonsController"/> class.
/// </summary>
/// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
/// <param name="dtoService">Instance of the <see cref="IDtoService"/> interface.</param>
/// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param>
2020-11-05 12:27:22 +01:00
/// <param name="userDataManager">Instance of the <see cref="IUserDataManager"/> interface.</param>
2020-07-01 02:26:53 +02:00
public PersonsController (
ILibraryManager libraryManager ,
IDtoService dtoService ,
2020-11-05 12:27:22 +01:00
IUserManager userManager ,
IUserDataManager userDataManager )
2020-07-01 02:26:53 +02:00
{
_libraryManager = libraryManager ;
_dtoService = dtoService ;
_userManager = userManager ;
2020-11-05 12:27:22 +01:00
_userDataManager = userDataManager ;
2020-07-01 02:26:53 +02:00
}
/// <summary>
2020-11-05 12:27:22 +01:00
/// Gets all persons.
2020-07-01 02:26:53 +02:00
/// </summary>
/// <param name="limit">Optional. The maximum number of records to return.</param>
/// <param name="searchTerm">The search term.</param>
2020-10-10 01:35:08 +02:00
/// <param name="fields">Optional. Specify additional fields of information to return in the output.</param>
2020-07-01 02:26:53 +02:00
/// <param name="filters">Optional. Specify additional filters to apply. This allows multiple, comma delimited. Options: IsFolder, IsNotFolder, IsUnplayed, IsPlayed, IsFavorite, IsResumable, Likes, Dislikes.</param>
2020-11-05 12:27:22 +01:00
/// <param name="isFavorite">Optional filter by items that are marked as favorite, or not. userId is required.</param>
2020-07-01 02:26:53 +02:00
/// <param name="enableUserData">Optional, include user data.</param>
/// <param name="imageTypeLimit">Optional, the max number of images to return, per image type.</param>
/// <param name="enableImageTypes">Optional. The image types to include in the output.</param>
2020-11-05 12:27:22 +01:00
/// <param name="excludePersonTypes">Optional. If specified results will be filtered to exclude those containing the specified PersonType. Allows multiple, comma-delimited.</param>
/// <param name="personTypes">Optional. If specified results will be filtered to include only those containing the specified PersonType. Allows multiple, comma-delimited.</param>
/// <param name="appearsInItemId">Optional. If specified, person results will be filtered on items related to said persons.</param>
2020-07-01 02:26:53 +02:00
/// <param name="userId">User id.</param>
/// <param name="enableImages">Optional, include image information in output.</param>
/// <response code="200">Persons returned.</response>
/// <returns>An <see cref="OkResult"/> containing the queryresult of persons.</returns>
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
public ActionResult < QueryResult < BaseItemDto > > GetPersons (
[FromQuery] int? limit ,
2020-07-07 17:10:51 +02:00
[FromQuery] string? searchTerm ,
2020-11-09 22:59:04 +01:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields [ ] fields ,
2020-10-14 21:03:36 +02:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFilter [ ] filters ,
2020-07-01 02:26:53 +02:00
[FromQuery] bool? isFavorite ,
[FromQuery] bool? enableUserData ,
[FromQuery] int? imageTypeLimit ,
2020-10-10 01:52:39 +02:00
[FromQuery] ImageType [ ] enableImageTypes ,
2020-11-05 12:27:22 +01:00
[FromQuery] string? excludePersonTypes ,
2020-07-07 17:10:51 +02:00
[FromQuery] string? personTypes ,
2020-11-05 12:27:22 +01:00
[FromQuery] string? appearsInItemId ,
2020-07-07 17:10:51 +02:00
[FromQuery] Guid ? userId ,
2020-11-05 12:27:22 +01:00
[FromQuery] bool? enableImages = true )
2020-07-01 02:26:53 +02:00
{
2020-10-29 18:36:45 +01:00
var dtoOptions = new DtoOptions { Fields = fields }
2020-07-01 02:26:53 +02:00
. AddClientFields ( Request )
. AddAdditionalDtoOptions ( enableImages , enableUserData , imageTypeLimit , enableImageTypes ) ;
User ? user = null ;
2020-07-07 17:10:51 +02:00
if ( userId . HasValue & & ! userId . Equals ( Guid . Empty ) )
2020-07-01 02:26:53 +02:00
{
2020-07-07 17:10:51 +02:00
user = _userManager . GetUserById ( userId . Value ) ;
2020-07-01 02:26:53 +02:00
}
2020-11-05 12:27:22 +01:00
var isFavoriteInFilters = filters . Any ( f = > f = = ItemFilter . IsFavorite ) ;
var peopleItems = _libraryManager . GetPeopleItems ( new InternalPeopleQuery
2020-07-01 02:26:53 +02:00
{
PersonTypes = RequestHelpers . Split ( personTypes , ',' , true ) ,
2020-11-05 12:27:22 +01:00
ExcludePersonTypes = RequestHelpers . Split ( excludePersonTypes , ',' , true ) ,
NameContains = searchTerm ,
User = user ,
IsFavorite = ! isFavorite . HasValue & & isFavoriteInFilters ? true : isFavorite ,
AppearsInItemId = string . IsNullOrEmpty ( appearsInItemId ) ? Guid . Empty : Guid . Parse ( appearsInItemId ) ,
Limit = limit ? ? 0
2020-07-01 02:26:53 +02:00
} ) ;
return new QueryResult < BaseItemDto >
{
2020-11-05 12:27:22 +01:00
Items = peopleItems . Select ( person = > _dtoService . GetItemByNameDto ( person , dtoOptions , null , user ) ) . ToArray ( ) ,
TotalRecordCount = peopleItems . Count
2020-07-01 02:26:53 +02:00
} ;
}
/// <summary>
/// Get person by name.
/// </summary>
/// <param name="name">Person name.</param>
/// <param name="userId">Optional. Filter by user id, and attach user data.</param>
/// <response code="200">Person returned.</response>
/// <response code="404">Person not found.</response>
/// <returns>An <see cref="OkResult"/> containing the person on success,
/// or a <see cref="NotFoundResult"/> if person not found.</returns>
[HttpGet("{name}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
2020-09-06 17:07:27 +02:00
public ActionResult < BaseItemDto > GetPerson ( [ FromRoute , Required ] string name , [ FromQuery ] Guid ? userId )
2020-07-01 02:26:53 +02:00
{
var dtoOptions = new DtoOptions ( )
. AddClientFields ( Request ) ;
var item = _libraryManager . GetPerson ( name ) ;
if ( item = = null )
{
return NotFound ( ) ;
}
2020-07-07 17:10:51 +02:00
if ( userId . HasValue & & ! userId . Equals ( Guid . Empty ) )
2020-07-01 02:26:53 +02:00
{
2020-07-07 17:10:51 +02:00
var user = _userManager . GetUserById ( userId . Value ) ;
2020-07-01 02:26:53 +02:00
return _dtoService . GetBaseItemDto ( item , dtoOptions , user ) ;
}
return _dtoService . GetBaseItemDto ( item , dtoOptions ) ;
}
}
}