2020-11-21 13:26:03 +00:00
using System ;
2020-09-05 23:07:25 +00:00
using System.ComponentModel.DataAnnotations ;
2020-06-29 14:34:00 +00:00
using System.Linq ;
using Jellyfin.Api.Constants ;
using Jellyfin.Api.Extensions ;
2021-02-11 00:09:23 +00:00
using Jellyfin.Api.Helpers ;
2020-10-14 19:03:36 +00:00
using Jellyfin.Api.ModelBinders ;
2020-06-29 14:34:00 +00:00
using Jellyfin.Data.Entities ;
2021-02-11 00:09:23 +00:00
using Jellyfin.Data.Enums ;
2020-06-29 14:34:00 +00:00
using MediaBrowser.Controller.Dto ;
using MediaBrowser.Controller.Entities ;
using MediaBrowser.Controller.Library ;
using MediaBrowser.Model.Dto ;
2020-10-09 23:52:39 +00:00
using MediaBrowser.Model.Entities ;
2020-06-29 14:34:00 +00:00
using MediaBrowser.Model.Querying ;
using Microsoft.AspNetCore.Authorization ;
using Microsoft.AspNetCore.Http ;
using Microsoft.AspNetCore.Mvc ;
namespace Jellyfin.Api.Controllers
{
/// <summary>
/// The artists controller.
/// </summary>
2020-08-04 14:27:54 +00:00
[Route("Artists")]
2020-08-04 14:30:03 +00:00
[Authorize(Policy = Policies.DefaultAuthorization)]
2020-06-29 14:34:00 +00:00
public class ArtistsController : BaseJellyfinApiController
{
private readonly ILibraryManager _libraryManager ;
private readonly IUserManager _userManager ;
private readonly IDtoService _dtoService ;
/// <summary>
/// Initializes a new instance of the <see cref="ArtistsController"/> class.
/// </summary>
/// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
/// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param>
/// <param name="dtoService">Instance of the <see cref="IDtoService"/> interface.</param>
public ArtistsController (
ILibraryManager libraryManager ,
IUserManager userManager ,
IDtoService dtoService )
{
_libraryManager = libraryManager ;
_userManager = userManager ;
_dtoService = dtoService ;
}
/// <summary>
/// Gets all artists from a given item, folder, or the entire library.
/// </summary>
/// <param name="minCommunityRating">Optional filter by minimum community rating.</param>
/// <param name="startIndex">Optional. The record index to start at. All items with a lower index will be dropped from the results.</param>
/// <param name="limit">Optional. The maximum number of records to return.</param>
/// <param name="searchTerm">Optional. Search term.</param>
/// <param name="parentId">Specify this to localize the search to a specific item or folder. Omit to use the root.</param>
2020-10-09 23:35:08 +00:00
/// <param name="fields">Optional. Specify additional fields of information to return in the output.</param>
2020-06-29 14:34:00 +00:00
/// <param name="excludeItemTypes">Optional. If specified, results will be filtered out based on item type. This allows multiple, comma delimited.</param>
/// <param name="includeItemTypes">Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimited.</param>
2020-10-09 23:41:17 +00:00
/// <param name="filters">Optional. Specify additional filters to apply.</param>
2020-06-29 14:34:00 +00:00
/// <param name="isFavorite">Optional filter by items that are marked as favorite, or not.</param>
/// <param name="mediaTypes">Optional filter by MediaType. Allows multiple, comma delimited.</param>
/// <param name="genres">Optional. If specified, results will be filtered based on genre. This allows multiple, pipe delimited.</param>
/// <param name="genreIds">Optional. If specified, results will be filtered based on genre id. This allows multiple, pipe delimited.</param>
/// <param name="officialRatings">Optional. If specified, results will be filtered based on OfficialRating. This allows multiple, pipe delimited.</param>
/// <param name="tags">Optional. If specified, results will be filtered based on tag. This allows multiple, pipe delimited.</param>
/// <param name="years">Optional. If specified, results will be filtered based on production year. This allows multiple, comma delimited.</param>
/// <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>
/// <param name="person">Optional. If specified, results will be filtered to include only those containing the specified person.</param>
/// <param name="personIds">Optional. If specified, results will be filtered to include only those containing the specified person ids.</param>
/// <param name="personTypes">Optional. If specified, along with Person, results will be filtered to include only those containing the specified person and PersonType. Allows multiple, comma-delimited.</param>
/// <param name="studios">Optional. If specified, results will be filtered based on studio. This allows multiple, pipe delimited.</param>
/// <param name="studioIds">Optional. If specified, results will be filtered based on studio id. This allows multiple, pipe delimited.</param>
/// <param name="userId">User id.</param>
/// <param name="nameStartsWithOrGreater">Optional filter by items whose name is sorted equally or greater than a given input string.</param>
/// <param name="nameStartsWith">Optional filter by items whose name is sorted equally than a given input string.</param>
/// <param name="nameLessThan">Optional filter by items whose name is equally or lesser than a given input string.</param>
2021-04-29 00:33:30 +00:00
/// <param name="sortBy">Optional. Specify one or more sort orders, comma delimited.</param>
/// <param name="sortOrder">Sort Order - Ascending,Descending.</param>
2020-06-29 14:34:00 +00:00
/// <param name="enableImages">Optional, include image information in output.</param>
/// <param name="enableTotalRecordCount">Total record count.</param>
/// <response code="200">Artists returned.</response>
/// <returns>An <see cref="OkResult"/> containing the artists.</returns>
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
public ActionResult < QueryResult < BaseItemDto > > GetArtists (
[FromQuery] double? minCommunityRating ,
[FromQuery] int? startIndex ,
[FromQuery] int? limit ,
2020-07-07 15:10:51 +00:00
[FromQuery] string? searchTerm ,
2020-12-01 18:07:41 +00:00
[FromQuery] Guid ? parentId ,
2020-11-09 21:59:04 +00:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields [ ] fields ,
2021-02-11 00:09:23 +00:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind [ ] excludeItemTypes ,
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind [ ] includeItemTypes ,
2020-10-14 19:03:36 +00:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFilter [ ] filters ,
2020-06-29 14:34:00 +00:00
[FromQuery] bool? isFavorite ,
2020-11-17 03:29:46 +00:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string [ ] mediaTypes ,
[FromQuery, ModelBinder(typeof(PipeDelimitedArrayModelBinder))] string [ ] genres ,
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] Guid [ ] genreIds ,
[FromQuery, ModelBinder(typeof(PipeDelimitedArrayModelBinder))] string [ ] officialRatings ,
[FromQuery, ModelBinder(typeof(PipeDelimitedArrayModelBinder))] string [ ] tags ,
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] int [ ] years ,
2020-06-29 14:34:00 +00:00
[FromQuery] bool? enableUserData ,
[FromQuery] int? imageTypeLimit ,
2020-11-09 21:53:23 +00:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ImageType [ ] enableImageTypes ,
2020-07-07 15:10:51 +00:00
[FromQuery] string? person ,
2020-11-17 03:29:46 +00:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] Guid [ ] personIds ,
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string [ ] personTypes ,
2020-11-17 03:37:43 +00:00
[FromQuery, ModelBinder(typeof(PipeDelimitedArrayModelBinder))] string [ ] studios ,
2020-11-17 03:29:46 +00:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] Guid [ ] studioIds ,
2020-07-07 15:10:51 +00:00
[FromQuery] Guid ? userId ,
[FromQuery] string? nameStartsWithOrGreater ,
[FromQuery] string? nameStartsWith ,
[FromQuery] string? nameLessThan ,
2021-04-29 00:33:30 +00:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string [ ] sortBy ,
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] SortOrder [ ] sortOrder ,
2020-06-29 14:34:00 +00:00
[FromQuery] bool? enableImages = true ,
[FromQuery] bool enableTotalRecordCount = true )
{
2020-10-29 17:36:45 +00:00
var dtoOptions = new DtoOptions { Fields = fields }
2020-06-29 14:34:00 +00:00
. AddClientFields ( Request )
. AddAdditionalDtoOptions ( enableImages , enableUserData , imageTypeLimit , enableImageTypes ) ;
User ? user = null ;
2020-12-01 23:16:17 +00:00
BaseItem parentItem = _libraryManager . GetParentItem ( parentId , userId ) ;
2020-06-29 14:34:00 +00:00
2020-07-07 15:10:51 +00:00
if ( userId . HasValue & & ! userId . Equals ( Guid . Empty ) )
2020-06-29 14:34:00 +00:00
{
2020-07-07 15:10:51 +00:00
user = _userManager . GetUserById ( userId . Value ) ;
2020-06-29 14:34:00 +00:00
}
var query = new InternalItemsQuery ( user )
{
2021-02-11 00:09:23 +00:00
ExcludeItemTypes = RequestHelpers . GetItemTypeStrings ( excludeItemTypes ) ,
IncludeItemTypes = RequestHelpers . GetItemTypeStrings ( includeItemTypes ) ,
2020-11-17 03:29:46 +00:00
MediaTypes = mediaTypes ,
2020-06-29 14:34:00 +00:00
StartIndex = startIndex ,
Limit = limit ,
IsFavorite = isFavorite ,
NameLessThan = nameLessThan ,
NameStartsWith = nameStartsWith ,
NameStartsWithOrGreater = nameStartsWithOrGreater ,
2020-11-17 03:29:46 +00:00
Tags = tags ,
OfficialRatings = officialRatings ,
Genres = genres ,
GenreIds = genreIds ,
StudioIds = studioIds ,
2020-06-29 14:34:00 +00:00
Person = person ,
2020-11-17 03:29:46 +00:00
PersonIds = personIds ,
PersonTypes = personTypes ,
Years = years ,
2020-06-29 14:34:00 +00:00
MinCommunityRating = minCommunityRating ,
DtoOptions = dtoOptions ,
SearchTerm = searchTerm ,
2021-04-29 00:33:30 +00:00
EnableTotalRecordCount = enableTotalRecordCount ,
OrderBy = RequestHelpers . GetOrderBy ( sortBy , sortOrder )
2020-06-29 14:34:00 +00:00
} ;
2020-12-01 18:07:41 +00:00
if ( parentId . HasValue )
2020-06-29 14:34:00 +00:00
{
if ( parentItem is Folder )
{
2020-12-01 18:07:41 +00:00
query . AncestorIds = new [ ] { parentId . Value } ;
2020-06-29 14:34:00 +00:00
}
else
{
2020-12-01 18:07:41 +00:00
query . ItemIds = new [ ] { parentId . Value } ;
2020-06-29 14:34:00 +00:00
}
}
// Studios
2020-11-17 03:37:43 +00:00
if ( studios . Length ! = 0 )
2020-06-29 14:34:00 +00:00
{
2020-11-17 03:37:43 +00:00
query . StudioIds = studios . Select ( i = >
2020-06-29 14:34:00 +00:00
{
try
{
return _libraryManager . GetStudio ( i ) ;
}
catch
{
return null ;
}
} ) . Where ( i = > i ! = null ) . Select ( i = > i ! . Id ) . ToArray ( ) ;
}
2020-10-09 23:41:17 +00:00
foreach ( var filter in filters )
2020-06-29 14:34:00 +00:00
{
switch ( filter )
{
case ItemFilter . Dislikes :
query . IsLiked = false ;
break ;
case ItemFilter . IsFavorite :
query . IsFavorite = true ;
break ;
case ItemFilter . IsFavoriteOrLikes :
query . IsFavoriteOrLiked = true ;
break ;
case ItemFilter . IsFolder :
query . IsFolder = true ;
break ;
case ItemFilter . IsNotFolder :
query . IsFolder = false ;
break ;
case ItemFilter . IsPlayed :
query . IsPlayed = true ;
break ;
case ItemFilter . IsResumable :
query . IsResumable = true ;
break ;
case ItemFilter . IsUnplayed :
query . IsPlayed = false ;
break ;
case ItemFilter . Likes :
query . IsLiked = true ;
break ;
}
}
var result = _libraryManager . GetArtists ( query ) ;
var dtos = result . Items . Select ( i = >
{
var ( baseItem , itemCounts ) = i ;
var dto = _dtoService . GetItemByNameDto ( baseItem , dtoOptions , null , user ) ;
2020-11-17 03:29:46 +00:00
if ( includeItemTypes . Length ! = 0 )
2020-06-29 14:34:00 +00:00
{
dto . ChildCount = itemCounts . ItemCount ;
dto . ProgramCount = itemCounts . ProgramCount ;
dto . SeriesCount = itemCounts . SeriesCount ;
dto . EpisodeCount = itemCounts . EpisodeCount ;
dto . MovieCount = itemCounts . MovieCount ;
dto . TrailerCount = itemCounts . TrailerCount ;
dto . AlbumCount = itemCounts . AlbumCount ;
dto . SongCount = itemCounts . SongCount ;
dto . ArtistCount = itemCounts . ArtistCount ;
}
return dto ;
} ) ;
return new QueryResult < BaseItemDto >
{
Items = dtos . ToArray ( ) ,
TotalRecordCount = result . TotalRecordCount
} ;
}
/// <summary>
/// Gets all album artists from a given item, folder, or the entire library.
/// </summary>
/// <param name="minCommunityRating">Optional filter by minimum community rating.</param>
/// <param name="startIndex">Optional. The record index to start at. All items with a lower index will be dropped from the results.</param>
/// <param name="limit">Optional. The maximum number of records to return.</param>
/// <param name="searchTerm">Optional. Search term.</param>
/// <param name="parentId">Specify this to localize the search to a specific item or folder. Omit to use the root.</param>
2020-10-09 23:35:08 +00:00
/// <param name="fields">Optional. Specify additional fields of information to return in the output.</param>
2020-06-29 14:34:00 +00:00
/// <param name="excludeItemTypes">Optional. If specified, results will be filtered out based on item type. This allows multiple, comma delimited.</param>
/// <param name="includeItemTypes">Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimited.</param>
2020-10-09 23:41:17 +00:00
/// <param name="filters">Optional. Specify additional filters to apply.</param>
2020-06-29 14:34:00 +00:00
/// <param name="isFavorite">Optional filter by items that are marked as favorite, or not.</param>
/// <param name="mediaTypes">Optional filter by MediaType. Allows multiple, comma delimited.</param>
/// <param name="genres">Optional. If specified, results will be filtered based on genre. This allows multiple, pipe delimited.</param>
/// <param name="genreIds">Optional. If specified, results will be filtered based on genre id. This allows multiple, pipe delimited.</param>
/// <param name="officialRatings">Optional. If specified, results will be filtered based on OfficialRating. This allows multiple, pipe delimited.</param>
/// <param name="tags">Optional. If specified, results will be filtered based on tag. This allows multiple, pipe delimited.</param>
/// <param name="years">Optional. If specified, results will be filtered based on production year. This allows multiple, comma delimited.</param>
/// <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>
/// <param name="person">Optional. If specified, results will be filtered to include only those containing the specified person.</param>
/// <param name="personIds">Optional. If specified, results will be filtered to include only those containing the specified person ids.</param>
/// <param name="personTypes">Optional. If specified, along with Person, results will be filtered to include only those containing the specified person and PersonType. Allows multiple, comma-delimited.</param>
/// <param name="studios">Optional. If specified, results will be filtered based on studio. This allows multiple, pipe delimited.</param>
/// <param name="studioIds">Optional. If specified, results will be filtered based on studio id. This allows multiple, pipe delimited.</param>
/// <param name="userId">User id.</param>
/// <param name="nameStartsWithOrGreater">Optional filter by items whose name is sorted equally or greater than a given input string.</param>
/// <param name="nameStartsWith">Optional filter by items whose name is sorted equally than a given input string.</param>
/// <param name="nameLessThan">Optional filter by items whose name is equally or lesser than a given input string.</param>
2021-05-23 14:38:05 +00:00
/// <param name="sortBy">Optional. Specify one or more sort orders, comma delimited.</param>
/// <param name="sortOrder">Sort Order - Ascending,Descending.</param>
2020-06-29 14:34:00 +00:00
/// <param name="enableImages">Optional, include image information in output.</param>
/// <param name="enableTotalRecordCount">Total record count.</param>
/// <response code="200">Album artists returned.</response>
/// <returns>An <see cref="OkResult"/> containing the album artists.</returns>
2020-06-30 12:15:17 +00:00
[HttpGet("AlbumArtists")]
2020-06-29 14:34:00 +00:00
[ProducesResponseType(StatusCodes.Status200OK)]
public ActionResult < QueryResult < BaseItemDto > > GetAlbumArtists (
[FromQuery] double? minCommunityRating ,
[FromQuery] int? startIndex ,
[FromQuery] int? limit ,
2020-07-07 15:10:51 +00:00
[FromQuery] string? searchTerm ,
2020-12-01 18:07:41 +00:00
[FromQuery] Guid ? parentId ,
2020-11-09 21:59:04 +00:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields [ ] fields ,
2021-02-11 00:09:23 +00:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind [ ] excludeItemTypes ,
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind [ ] includeItemTypes ,
2020-10-14 19:03:36 +00:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFilter [ ] filters ,
2020-06-29 14:34:00 +00:00
[FromQuery] bool? isFavorite ,
2020-11-17 03:29:46 +00:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string [ ] mediaTypes ,
[FromQuery, ModelBinder(typeof(PipeDelimitedArrayModelBinder))] string [ ] genres ,
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] Guid [ ] genreIds ,
[FromQuery, ModelBinder(typeof(PipeDelimitedArrayModelBinder))] string [ ] officialRatings ,
[FromQuery, ModelBinder(typeof(PipeDelimitedArrayModelBinder))] string [ ] tags ,
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] int [ ] years ,
2020-06-29 14:34:00 +00:00
[FromQuery] bool? enableUserData ,
[FromQuery] int? imageTypeLimit ,
2020-11-09 21:53:23 +00:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ImageType [ ] enableImageTypes ,
2020-07-07 15:10:51 +00:00
[FromQuery] string? person ,
2020-11-17 03:29:46 +00:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] Guid [ ] personIds ,
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string [ ] personTypes ,
2020-11-17 03:37:43 +00:00
[FromQuery, ModelBinder(typeof(PipeDelimitedArrayModelBinder))] string [ ] studios ,
2020-11-17 03:29:46 +00:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] Guid [ ] studioIds ,
2020-07-07 15:10:51 +00:00
[FromQuery] Guid ? userId ,
[FromQuery] string? nameStartsWithOrGreater ,
[FromQuery] string? nameStartsWith ,
[FromQuery] string? nameLessThan ,
2021-05-23 14:38:05 +00:00
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string [ ] sortBy ,
[FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] SortOrder [ ] sortOrder ,
2020-06-29 14:34:00 +00:00
[FromQuery] bool? enableImages = true ,
[FromQuery] bool enableTotalRecordCount = true )
{
2020-10-29 17:36:45 +00:00
var dtoOptions = new DtoOptions { Fields = fields }
2020-06-29 14:34:00 +00:00
. AddClientFields ( Request )
. AddAdditionalDtoOptions ( enableImages , enableUserData , imageTypeLimit , enableImageTypes ) ;
User ? user = null ;
2020-12-01 23:16:17 +00:00
BaseItem parentItem = _libraryManager . GetParentItem ( parentId , userId ) ;
2020-06-29 14:34:00 +00:00
2020-07-07 15:10:51 +00:00
if ( userId . HasValue & & ! userId . Equals ( Guid . Empty ) )
2020-06-29 14:34:00 +00:00
{
2020-07-07 15:10:51 +00:00
user = _userManager . GetUserById ( userId . Value ) ;
2020-06-29 14:34:00 +00:00
}
var query = new InternalItemsQuery ( user )
{
2021-02-11 00:09:23 +00:00
ExcludeItemTypes = RequestHelpers . GetItemTypeStrings ( excludeItemTypes ) ,
IncludeItemTypes = RequestHelpers . GetItemTypeStrings ( includeItemTypes ) ,
2020-11-17 03:29:46 +00:00
MediaTypes = mediaTypes ,
2020-06-29 14:34:00 +00:00
StartIndex = startIndex ,
Limit = limit ,
IsFavorite = isFavorite ,
NameLessThan = nameLessThan ,
NameStartsWith = nameStartsWith ,
NameStartsWithOrGreater = nameStartsWithOrGreater ,
2020-11-17 03:29:46 +00:00
Tags = tags ,
OfficialRatings = officialRatings ,
Genres = genres ,
GenreIds = genreIds ,
StudioIds = studioIds ,
2020-06-29 14:34:00 +00:00
Person = person ,
2020-11-17 03:29:46 +00:00
PersonIds = personIds ,
PersonTypes = personTypes ,
Years = years ,
2020-06-29 14:34:00 +00:00
MinCommunityRating = minCommunityRating ,
DtoOptions = dtoOptions ,
SearchTerm = searchTerm ,
2021-05-23 14:38:05 +00:00
EnableTotalRecordCount = enableTotalRecordCount ,
OrderBy = RequestHelpers . GetOrderBy ( sortBy , sortOrder )
2020-06-29 14:34:00 +00:00
} ;
2020-12-01 18:07:41 +00:00
if ( parentId . HasValue )
2020-06-29 14:34:00 +00:00
{
if ( parentItem is Folder )
{
2020-12-01 18:07:41 +00:00
query . AncestorIds = new [ ] { parentId . Value } ;
2020-06-29 14:34:00 +00:00
}
else
{
2020-12-01 18:07:41 +00:00
query . ItemIds = new [ ] { parentId . Value } ;
2020-06-29 14:34:00 +00:00
}
}
// Studios
2020-11-17 03:37:43 +00:00
if ( studios . Length ! = 0 )
2020-06-29 14:34:00 +00:00
{
2020-11-17 03:37:43 +00:00
query . StudioIds = studios . Select ( i = >
2020-06-29 14:34:00 +00:00
{
try
{
return _libraryManager . GetStudio ( i ) ;
}
catch
{
return null ;
}
} ) . Where ( i = > i ! = null ) . Select ( i = > i ! . Id ) . ToArray ( ) ;
}
2020-10-09 23:41:17 +00:00
foreach ( var filter in filters )
2020-06-29 14:34:00 +00:00
{
switch ( filter )
{
case ItemFilter . Dislikes :
query . IsLiked = false ;
break ;
case ItemFilter . IsFavorite :
query . IsFavorite = true ;
break ;
case ItemFilter . IsFavoriteOrLikes :
query . IsFavoriteOrLiked = true ;
break ;
case ItemFilter . IsFolder :
query . IsFolder = true ;
break ;
case ItemFilter . IsNotFolder :
query . IsFolder = false ;
break ;
case ItemFilter . IsPlayed :
query . IsPlayed = true ;
break ;
case ItemFilter . IsResumable :
query . IsResumable = true ;
break ;
case ItemFilter . IsUnplayed :
query . IsPlayed = false ;
break ;
case ItemFilter . Likes :
query . IsLiked = true ;
break ;
}
}
var result = _libraryManager . GetAlbumArtists ( query ) ;
var dtos = result . Items . Select ( i = >
{
var ( baseItem , itemCounts ) = i ;
var dto = _dtoService . GetItemByNameDto ( baseItem , dtoOptions , null , user ) ;
2020-11-17 03:29:46 +00:00
if ( includeItemTypes . Length ! = 0 )
2020-06-29 14:34:00 +00:00
{
dto . ChildCount = itemCounts . ItemCount ;
dto . ProgramCount = itemCounts . ProgramCount ;
dto . SeriesCount = itemCounts . SeriesCount ;
dto . EpisodeCount = itemCounts . EpisodeCount ;
dto . MovieCount = itemCounts . MovieCount ;
dto . TrailerCount = itemCounts . TrailerCount ;
dto . AlbumCount = itemCounts . AlbumCount ;
dto . SongCount = itemCounts . SongCount ;
dto . ArtistCount = itemCounts . ArtistCount ;
}
return dto ;
} ) ;
return new QueryResult < BaseItemDto >
{
Items = dtos . ToArray ( ) ,
TotalRecordCount = result . TotalRecordCount
} ;
}
/// <summary>
/// Gets an artist by name.
/// </summary>
/// <param name="name">Studio name.</param>
/// <param name="userId">Optional. Filter by user id, and attach user data.</param>
/// <response code="200">Artist returned.</response>
/// <returns>An <see cref="OkResult"/> containing the artist.</returns>
[HttpGet("{name}")]
[ProducesResponseType(StatusCodes.Status200OK)]
2020-09-06 15:07:27 +00:00
public ActionResult < BaseItemDto > GetArtistByName ( [ FromRoute , Required ] string name , [ FromQuery ] Guid ? userId )
2020-06-29 14:34:00 +00:00
{
var dtoOptions = new DtoOptions ( ) . AddClientFields ( Request ) ;
var item = _libraryManager . GetArtist ( name , dtoOptions ) ;
2020-07-07 15:10:51 +00:00
if ( userId . HasValue & & ! userId . Equals ( Guid . Empty ) )
2020-06-29 14:34:00 +00:00
{
2020-07-07 15:10:51 +00:00
var user = _userManager . GetUserById ( userId . Value ) ;
2020-06-29 14:34:00 +00:00
return _dtoService . GetBaseItemDto ( item , dtoOptions , user ) ;
}
return _dtoService . GetBaseItemDto ( item , dtoOptions ) ;
}
}
}