diff options
Diffstat (limited to 'MediaBrowser.Api/UserLibrary/PersonsService.cs')
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/PersonsService.cs | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/MediaBrowser.Api/UserLibrary/PersonsService.cs b/MediaBrowser.Api/UserLibrary/PersonsService.cs new file mode 100644 index 000000000..71dc32b32 --- /dev/null +++ b/MediaBrowser.Api/UserLibrary/PersonsService.cs @@ -0,0 +1,103 @@ +using MediaBrowser.Common.Net; +using MediaBrowser.Controller; +using MediaBrowser.Controller.Entities; +using ServiceStack.ServiceHost; +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.Linq; +using System.Threading.Tasks; + +namespace MediaBrowser.Api.UserLibrary +{ + /// <summary> + /// Class GetPersons + /// </summary> + [Route("/Users/{UserId}/Items/{Id}/Persons", "GET")] + [Route("/Users/{UserId}/Items/Root/Persons", "GET")] + public class GetPersons : GetItemsByName + { + /// <summary> + /// Gets or sets the person types. + /// </summary> + /// <value>The person types.</value> + public string PersonTypes { get; set; } + } + + /// <summary> + /// Class PersonsService + /// </summary> + [Export(typeof(IRestfulService))] + public class PersonsService : BaseItemsByNameService<Person> + { + /// <summary> + /// Gets the specified request. + /// </summary> + /// <param name="request">The request.</param> + /// <returns>System.Object.</returns> + public object Get(GetPersons request) + { + var result = GetResult(request).Result; + + return ToOptimizedResult(result); + } + + /// <summary> + /// Gets all items. + /// </summary> + /// <param name="request">The request.</param> + /// <param name="items">The items.</param> + /// <param name="user">The user.</param> + /// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns> + protected override IEnumerable<Tuple<string, Func<int>>> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items, User user) + { + var inputPersonTypes = ((GetPersons) request).PersonTypes; + var personTypes = string.IsNullOrEmpty(inputPersonTypes) ? new string[] { } : inputPersonTypes.Split(','); + + var itemsList = items.Where(i => i.People != null).ToList(); + + // Either get all people, or all people filtered by a specific person type + var allPeople = GetAllPeople(itemsList, personTypes); + + return allPeople + .Select(i => i.Name) + .Distinct(StringComparer.OrdinalIgnoreCase) + + .Select(name => new Tuple<string, Func<int>>(name, () => + { + if (personTypes.Length == 0) + { + return itemsList.Count(i => i.People.Any(p => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase))); + } + + return itemsList.Count(i => i.People.Any(p => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase) && personTypes.Contains(p.Type ?? string.Empty, StringComparer.OrdinalIgnoreCase))); + }) + ); + } + + /// <summary> + /// Gets all people. + /// </summary> + /// <param name="itemsList">The items list.</param> + /// <param name="personTypes">The person types.</param> + /// <returns>IEnumerable{PersonInfo}.</returns> + private IEnumerable<PersonInfo> GetAllPeople(IEnumerable<BaseItem> itemsList, string[] personTypes) + { + return personTypes.Length == 0 ? + itemsList.SelectMany(i => i.People) : + itemsList.SelectMany(i => i.People.Where(p => personTypes.Contains(p.Type ?? string.Empty, StringComparer.OrdinalIgnoreCase))); + } + + /// <summary> + /// Gets the entity. + /// </summary> + /// <param name="name">The name.</param> + /// <returns>Task{Genre}.</returns> + protected override Task<Person> GetEntity(string name) + { + var kernel = (Kernel)Kernel; + + return kernel.LibraryManager.GetPerson(name); + } + } +} |
