SuggestionsService.cs 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using System;
  2. using System.Linq;
  3. using MediaBrowser.Controller.Dto;
  4. using MediaBrowser.Controller.Entities;
  5. using MediaBrowser.Controller.Library;
  6. using MediaBrowser.Controller.Net;
  7. using MediaBrowser.Model.Dto;
  8. using MediaBrowser.Model.Entities;
  9. using MediaBrowser.Model.Querying;
  10. using MediaBrowser.Model.Services;
  11. namespace MediaBrowser.Api
  12. {
  13. [Route("/Users/{UserId}/Suggestions", "GET", Summary = "Gets items based on a query.")]
  14. public class GetSuggestedItems : IReturn<QueryResult<BaseItemDto>>
  15. {
  16. public string MediaType { get; set; }
  17. public string Type { get; set; }
  18. public Guid UserId { get; set; }
  19. public bool EnableTotalRecordCount { get; set; }
  20. public int? StartIndex { get; set; }
  21. public int? Limit { get; set; }
  22. public string[] GetMediaTypes()
  23. {
  24. return (MediaType ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  25. }
  26. public string[] GetIncludeItemTypes()
  27. {
  28. return (Type ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  29. }
  30. }
  31. public class SuggestionsService : BaseApiService
  32. {
  33. private readonly IDtoService _dtoService;
  34. private readonly IAuthorizationContext _authContext;
  35. private readonly IUserManager _userManager;
  36. private readonly ILibraryManager _libraryManager;
  37. public SuggestionsService(IDtoService dtoService, IAuthorizationContext authContext, IUserManager userManager, ILibraryManager libraryManager)
  38. {
  39. _dtoService = dtoService;
  40. _authContext = authContext;
  41. _userManager = userManager;
  42. _libraryManager = libraryManager;
  43. }
  44. public object Get(GetSuggestedItems request)
  45. {
  46. return GetResultItems(request);
  47. }
  48. private QueryResult<BaseItemDto> GetResultItems(GetSuggestedItems request)
  49. {
  50. var user = !request.UserId.Equals(Guid.Empty) ? _userManager.GetUserById(request.UserId) : null;
  51. var dtoOptions = GetDtoOptions(_authContext, request);
  52. var result = GetItems(request, user, dtoOptions);
  53. var dtoList = _dtoService.GetBaseItemDtos(result.Items, dtoOptions, user);
  54. if (dtoList == null)
  55. {
  56. throw new InvalidOperationException("GetBaseItemDtos returned null");
  57. }
  58. return new QueryResult<BaseItemDto>
  59. {
  60. TotalRecordCount = result.TotalRecordCount,
  61. Items = dtoList
  62. };
  63. }
  64. private QueryResult<BaseItem> GetItems(GetSuggestedItems request, User user, DtoOptions dtoOptions)
  65. {
  66. return _libraryManager.GetItemsResult(new InternalItemsQuery(user)
  67. {
  68. OrderBy = new[] { ItemSortBy.Random }.Select(i => new ValueTuple<string, SortOrder>(i, SortOrder.Descending)).ToArray(),
  69. MediaTypes = request.GetMediaTypes(),
  70. IncludeItemTypes = request.GetIncludeItemTypes(),
  71. IsVirtualItem = false,
  72. StartIndex = request.StartIndex,
  73. Limit = request.Limit,
  74. DtoOptions = dtoOptions,
  75. EnableTotalRecordCount = request.EnableTotalRecordCount,
  76. Recursive = true
  77. });
  78. }
  79. }
  80. }