FilterService.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. using MediaBrowser.Controller.Entities;
  2. using MediaBrowser.Controller.Library;
  3. using MediaBrowser.Controller.Net;
  4. using MediaBrowser.Model.Querying;
  5. using MediaBrowser.Model.Dto;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Threading.Tasks;
  10. using MediaBrowser.Model.Services;
  11. namespace MediaBrowser.Api
  12. {
  13. [Route("/Items/Filters", "GET", Summary = "Gets branding configuration")]
  14. public class GetQueryFiltersLegacy : IReturn<QueryFiltersLegacy>
  15. {
  16. /// <summary>
  17. /// Gets or sets the user id.
  18. /// </summary>
  19. /// <value>The user id.</value>
  20. [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
  21. public Guid UserId { get; set; }
  22. [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")]
  23. public string ParentId { get; set; }
  24. [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)]
  25. public string IncludeItemTypes { get; set; }
  26. [ApiMember(Name = "MediaTypes", Description = "Optional filter by MediaType. Allows multiple, comma delimited.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
  27. public string MediaTypes { get; set; }
  28. public string[] GetMediaTypes()
  29. {
  30. return (MediaTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  31. }
  32. public string[] GetIncludeItemTypes()
  33. {
  34. return (IncludeItemTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  35. }
  36. }
  37. [Route("/Items/Filters2", "GET", Summary = "Gets branding configuration")]
  38. public class GetQueryFilters : IReturn<QueryFilters>
  39. {
  40. /// <summary>
  41. /// Gets or sets the user id.
  42. /// </summary>
  43. /// <value>The user id.</value>
  44. [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
  45. public Guid UserId { get; set; }
  46. [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")]
  47. public string ParentId { get; set; }
  48. [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)]
  49. public string IncludeItemTypes { get; set; }
  50. [ApiMember(Name = "MediaTypes", Description = "Optional filter by MediaType. Allows multiple, comma delimited.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
  51. public string MediaTypes { get; set; }
  52. public string[] GetMediaTypes()
  53. {
  54. return (MediaTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  55. }
  56. public string[] GetIncludeItemTypes()
  57. {
  58. return (IncludeItemTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  59. }
  60. public bool? IsAiring { get; set; }
  61. public bool? IsMovie { get; set; }
  62. public bool? IsSports { get; set; }
  63. public bool? IsKids { get; set; }
  64. public bool? IsNews { get; set; }
  65. public bool? IsSeries { get; set; }
  66. public bool? Recursive { get; set; }
  67. }
  68. [Authenticated]
  69. public class FilterService : BaseApiService
  70. {
  71. private readonly ILibraryManager _libraryManager;
  72. private readonly IUserManager _userManager;
  73. public FilterService(ILibraryManager libraryManager, IUserManager userManager)
  74. {
  75. _libraryManager = libraryManager;
  76. _userManager = userManager;
  77. }
  78. public object Get(GetQueryFilters request)
  79. {
  80. var parentItem = string.IsNullOrEmpty(request.ParentId) ? null : _libraryManager.GetItemById(request.ParentId);
  81. var user = !request.UserId.Equals(Guid.Empty) ? _userManager.GetUserById(request.UserId) : null;
  82. if (string.Equals(request.IncludeItemTypes, "BoxSet", StringComparison.OrdinalIgnoreCase) ||
  83. string.Equals(request.IncludeItemTypes, "Playlist", StringComparison.OrdinalIgnoreCase) ||
  84. string.Equals(request.IncludeItemTypes, typeof(Trailer).Name, StringComparison.OrdinalIgnoreCase) ||
  85. string.Equals(request.IncludeItemTypes, "Program", StringComparison.OrdinalIgnoreCase))
  86. {
  87. parentItem = null;
  88. }
  89. var filters = new QueryFilters();
  90. var genreQuery = new InternalItemsQuery(user)
  91. {
  92. IncludeItemTypes = request.GetIncludeItemTypes(),
  93. DtoOptions = new Controller.Dto.DtoOptions
  94. {
  95. Fields = new ItemFields[] { },
  96. EnableImages = false,
  97. EnableUserData = false
  98. },
  99. IsAiring = request.IsAiring,
  100. IsMovie = request.IsMovie,
  101. IsSports = request.IsSports,
  102. IsKids = request.IsKids,
  103. IsNews = request.IsNews,
  104. IsSeries = request.IsSeries
  105. };
  106. // Non recursive not yet supported for library folders
  107. if ((request.Recursive ?? true) || parentItem is UserView || parentItem is ICollectionFolder)
  108. {
  109. genreQuery.AncestorIds = parentItem == null ? Array.Empty<Guid>() : new Guid[] { parentItem.Id };
  110. }
  111. else
  112. {
  113. genreQuery.Parent = parentItem;
  114. }
  115. if (string.Equals(request.IncludeItemTypes, "MusicAlbum", StringComparison.OrdinalIgnoreCase) ||
  116. string.Equals(request.IncludeItemTypes, "MusicVideo", StringComparison.OrdinalIgnoreCase) ||
  117. string.Equals(request.IncludeItemTypes, "MusicArtist", StringComparison.OrdinalIgnoreCase) ||
  118. string.Equals(request.IncludeItemTypes, "Audio", StringComparison.OrdinalIgnoreCase))
  119. {
  120. filters.Genres = _libraryManager.GetMusicGenres(genreQuery).Items.Select(i => new NameGuidPair
  121. {
  122. Name = i.Item1.Name,
  123. Id = i.Item1.Id
  124. }).ToArray();
  125. }
  126. else if (string.Equals(request.IncludeItemTypes, "Game", StringComparison.OrdinalIgnoreCase) ||
  127. string.Equals(request.IncludeItemTypes, "GameSystem", StringComparison.OrdinalIgnoreCase))
  128. {
  129. filters.Genres = _libraryManager.GetGameGenres(genreQuery).Items.Select(i => new NameGuidPair
  130. {
  131. Name = i.Item1.Name,
  132. Id = i.Item1.Id
  133. }).ToArray();
  134. }
  135. else
  136. {
  137. filters.Genres = _libraryManager.GetGenres(genreQuery).Items.Select(i => new NameGuidPair
  138. {
  139. Name = i.Item1.Name,
  140. Id = i.Item1.Id
  141. }).ToArray();
  142. }
  143. return ToOptimizedResult(filters);
  144. }
  145. public object Get(GetQueryFiltersLegacy request)
  146. {
  147. var parentItem = string.IsNullOrEmpty(request.ParentId) ? null : _libraryManager.GetItemById(request.ParentId);
  148. var user = !request.UserId.Equals(Guid.Empty) ? _userManager.GetUserById(request.UserId) : null;
  149. if (string.Equals(request.IncludeItemTypes, "BoxSet", StringComparison.OrdinalIgnoreCase) ||
  150. string.Equals(request.IncludeItemTypes, "Playlist", StringComparison.OrdinalIgnoreCase) ||
  151. string.Equals(request.IncludeItemTypes, typeof(Trailer).Name, StringComparison.OrdinalIgnoreCase) ||
  152. string.Equals(request.IncludeItemTypes, "Program", StringComparison.OrdinalIgnoreCase))
  153. {
  154. parentItem = null;
  155. }
  156. var item = string.IsNullOrEmpty(request.ParentId) ?
  157. user == null ? _libraryManager.RootFolder : _libraryManager.GetUserRootFolder() :
  158. parentItem;
  159. var result = ((Folder)item).GetItemList(GetItemsQuery(request, user));
  160. var filters = GetFilters(result);
  161. return ToOptimizedResult(filters);
  162. }
  163. private QueryFiltersLegacy GetFilters(BaseItem[] items)
  164. {
  165. var result = new QueryFiltersLegacy();
  166. result.Years = items.Select(i => i.ProductionYear ?? -1)
  167. .Where(i => i > 0)
  168. .Distinct()
  169. .OrderBy(i => i)
  170. .ToArray();
  171. result.Genres = items.SelectMany(i => i.Genres)
  172. .DistinctNames()
  173. .OrderBy(i => i)
  174. .ToArray();
  175. result.Tags = items
  176. .SelectMany(i => i.Tags)
  177. .Distinct(StringComparer.OrdinalIgnoreCase)
  178. .OrderBy(i => i)
  179. .ToArray();
  180. result.OfficialRatings = items
  181. .Select(i => i.OfficialRating)
  182. .Where(i => !string.IsNullOrWhiteSpace(i))
  183. .Distinct(StringComparer.OrdinalIgnoreCase)
  184. .OrderBy(i => i)
  185. .ToArray();
  186. return result;
  187. }
  188. private InternalItemsQuery GetItemsQuery(GetQueryFiltersLegacy request, User user)
  189. {
  190. var query = new InternalItemsQuery
  191. {
  192. User = user,
  193. MediaTypes = request.GetMediaTypes(),
  194. IncludeItemTypes = request.GetIncludeItemTypes(),
  195. Recursive = true,
  196. EnableTotalRecordCount = false,
  197. DtoOptions = new Controller.Dto.DtoOptions
  198. {
  199. Fields = new ItemFields[] { ItemFields.Genres, ItemFields.Tags },
  200. EnableImages = false,
  201. EnableUserData = false
  202. }
  203. };
  204. return query;
  205. }
  206. }
  207. }