FilterService.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using MediaBrowser.Controller.Entities;
  2. using MediaBrowser.Controller.Library;
  3. using MediaBrowser.Controller.Net;
  4. using MediaBrowser.Model.Querying;
  5. using ServiceStack;
  6. using System;
  7. using System.Linq;
  8. using System.Threading.Tasks;
  9. namespace MediaBrowser.Api
  10. {
  11. [Route("/Items/Filters", "GET", Summary = "Gets branding configuration")]
  12. public class GetQueryFilters : IReturn<QueryFilters>
  13. {
  14. /// <summary>
  15. /// Gets or sets the user id.
  16. /// </summary>
  17. /// <value>The user id.</value>
  18. [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
  19. public string UserId { get; set; }
  20. [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")]
  21. public string ParentId { get; set; }
  22. [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)]
  23. public string IncludeItemTypes { get; set; }
  24. [ApiMember(Name = "MediaTypes", Description = "Optional filter by MediaType. Allows multiple, comma delimited.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
  25. public string MediaTypes { get; set; }
  26. public string[] GetMediaTypes()
  27. {
  28. return (MediaTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  29. }
  30. public string[] GetIncludeItemTypes()
  31. {
  32. return (IncludeItemTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  33. }
  34. }
  35. [Authenticated]
  36. public class FilterService : BaseApiService
  37. {
  38. private readonly ILibraryManager _libraryManager;
  39. private readonly IUserManager _userManager;
  40. public FilterService(ILibraryManager libraryManager, IUserManager userManager)
  41. {
  42. _libraryManager = libraryManager;
  43. _userManager = userManager;
  44. }
  45. public async Task<object> Get(GetQueryFilters request)
  46. {
  47. var parentItem = string.IsNullOrEmpty(request.ParentId) ? null : _libraryManager.GetItemById(request.ParentId);
  48. var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null;
  49. var item = string.IsNullOrEmpty(request.ParentId) ?
  50. user == null ? _libraryManager.RootFolder : user.RootFolder :
  51. parentItem;
  52. var result = await ((Folder)item).GetItems(GetItemsQuery(request, user));
  53. return ToOptimizedResult(GetFilters(result.Items));
  54. }
  55. private QueryFilters GetFilters(BaseItem[] items)
  56. {
  57. var result = new QueryFilters();
  58. result.Years = items.Select(i => i.ProductionYear ?? -1)
  59. .Where(i => i > 0)
  60. .Distinct()
  61. .OrderBy(i => i)
  62. .ToArray();
  63. result.Genres = items.SelectMany(i => i.Genres)
  64. .DistinctNames()
  65. .OrderBy(i => i)
  66. .ToArray();
  67. result.Tags = items.OfType<IHasTags>()
  68. .SelectMany(i => i.Tags)
  69. .Distinct(StringComparer.OrdinalIgnoreCase)
  70. .OrderBy(i => i)
  71. .ToArray();
  72. result.OfficialRatings = items
  73. .Select(i => i.OfficialRating)
  74. .Where(i => !string.IsNullOrWhiteSpace(i))
  75. .Distinct(StringComparer.OrdinalIgnoreCase)
  76. .OrderBy(i => i)
  77. .ToArray();
  78. return result;
  79. }
  80. private InternalItemsQuery GetItemsQuery(GetQueryFilters request, User user)
  81. {
  82. var query = new InternalItemsQuery
  83. {
  84. User = user,
  85. MediaTypes = request.GetMediaTypes(),
  86. IncludeItemTypes = request.GetIncludeItemTypes(),
  87. Recursive = true,
  88. EnableTotalRecordCount = false
  89. };
  90. return query;
  91. }
  92. }
  93. }