AlbumsService.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using MediaBrowser.Controller.Dto;
  2. using MediaBrowser.Controller.Entities;
  3. using MediaBrowser.Controller.Entities.Audio;
  4. using MediaBrowser.Controller.Library;
  5. using MediaBrowser.Controller.Net;
  6. using MediaBrowser.Controller.Persistence;
  7. using MediaBrowser.Model.Querying;
  8. using ServiceStack;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. namespace MediaBrowser.Api.Music
  13. {
  14. [Route("/Albums/{Id}/Similar", "GET", Summary = "Finds albums similar to a given album.")]
  15. public class GetSimilarAlbums : BaseGetSimilarItemsFromItem
  16. {
  17. }
  18. [Route("/Artists/{Id}/Similar", "GET", Summary = "Finds albums similar to a given album.")]
  19. public class GetSimilarArtists : BaseGetSimilarItemsFromItem
  20. {
  21. }
  22. [Authenticated]
  23. public class AlbumsService : BaseApiService
  24. {
  25. /// <summary>
  26. /// The _user manager
  27. /// </summary>
  28. private readonly IUserManager _userManager;
  29. /// <summary>
  30. /// The _user data repository
  31. /// </summary>
  32. private readonly IUserDataManager _userDataRepository;
  33. /// <summary>
  34. /// The _library manager
  35. /// </summary>
  36. private readonly ILibraryManager _libraryManager;
  37. private readonly IItemRepository _itemRepo;
  38. private readonly IDtoService _dtoService;
  39. public AlbumsService(IUserManager userManager, IUserDataManager userDataRepository, ILibraryManager libraryManager, IItemRepository itemRepo, IDtoService dtoService)
  40. {
  41. _userManager = userManager;
  42. _userDataRepository = userDataRepository;
  43. _libraryManager = libraryManager;
  44. _itemRepo = itemRepo;
  45. _dtoService = dtoService;
  46. }
  47. public object Get(GetSimilarArtists request)
  48. {
  49. var result = GetSimilarItemsResult(
  50. request,
  51. SimilarItemsHelper.GetSimiliarityScore);
  52. return ToOptimizedSerializedResultUsingCache(result);
  53. }
  54. /// <summary>
  55. /// Gets the specified request.
  56. /// </summary>
  57. /// <param name="request">The request.</param>
  58. /// <returns>System.Object.</returns>
  59. public object Get(GetSimilarAlbums request)
  60. {
  61. var dtoOptions = GetDtoOptions(request);
  62. var result = SimilarItemsHelper.GetSimilarItemsResult(dtoOptions, _userManager,
  63. _itemRepo,
  64. _libraryManager,
  65. _userDataRepository,
  66. _dtoService,
  67. Logger,
  68. request, item => item is MusicAlbum,
  69. GetAlbumSimilarityScore);
  70. return ToOptimizedSerializedResultUsingCache(result);
  71. }
  72. private ItemsResult GetSimilarItemsResult(BaseGetSimilarItemsFromItem request, Func<BaseItem, List<PersonInfo>, List<PersonInfo>, BaseItem, int> getSimilarityScore)
  73. {
  74. var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null;
  75. var item = string.IsNullOrEmpty(request.Id) ?
  76. (!string.IsNullOrWhiteSpace(request.UserId) ? user.RootFolder :
  77. _libraryManager.RootFolder) : _libraryManager.GetItemById(request.Id);
  78. var inputItems = _libraryManager.GetArtists(user.RootFolder.GetRecursiveChildren(user, i => i is IHasArtist).OfType<IHasArtist>());
  79. var list = inputItems.ToList();
  80. var items = SimilarItemsHelper.GetSimilaritems(item, _libraryManager, list, getSimilarityScore).ToList();
  81. IEnumerable<BaseItem> returnItems = items;
  82. if (request.Limit.HasValue)
  83. {
  84. returnItems = returnItems.Take(request.Limit.Value);
  85. }
  86. var dtoOptions = GetDtoOptions(request);
  87. var result = new ItemsResult
  88. {
  89. Items = _dtoService.GetBaseItemDtos(returnItems, dtoOptions, user).ToArray(),
  90. TotalRecordCount = items.Count
  91. };
  92. return result;
  93. }
  94. /// <summary>
  95. /// Gets the album similarity score.
  96. /// </summary>
  97. /// <param name="item1">The item1.</param>
  98. /// <param name="item1People">The item1 people.</param>
  99. /// <param name="allPeople">All people.</param>
  100. /// <param name="item2">The item2.</param>
  101. /// <returns>System.Int32.</returns>
  102. private int GetAlbumSimilarityScore(BaseItem item1, List<PersonInfo> item1People, List<PersonInfo> allPeople, BaseItem item2)
  103. {
  104. var points = SimilarItemsHelper.GetSimiliarityScore(item1, item1People, allPeople, item2);
  105. var album1 = (MusicAlbum)item1;
  106. var album2 = (MusicAlbum)item2;
  107. var artists1 = album1
  108. .AllArtists
  109. .DistinctNames()
  110. .ToList();
  111. var artists2 = album2
  112. .AllArtists
  113. .DistinctNames()
  114. .ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);
  115. return points + artists1.Where(artists2.ContainsKey).Sum(i => 5);
  116. }
  117. }
  118. }