aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api/UserLibrary/PersonsService.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Api/UserLibrary/PersonsService.cs')
-rw-r--r--MediaBrowser.Api/UserLibrary/PersonsService.cs103
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);
+ }
+ }
+}