FilterService.cs 4.6 KB

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