AlbumsService.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using MediaBrowser.Controller.Configuration;
  5. using MediaBrowser.Controller.Dto;
  6. using MediaBrowser.Controller.Entities;
  7. using MediaBrowser.Controller.Entities.Audio;
  8. using MediaBrowser.Controller.Library;
  9. using MediaBrowser.Controller.Net;
  10. using MediaBrowser.Controller.Persistence;
  11. using MediaBrowser.Model.Services;
  12. using Microsoft.Extensions.Logging;
  13. namespace MediaBrowser.Api.Music
  14. {
  15. [Route("/Albums/{Id}/Similar", "GET", Summary = "Finds albums similar to a given album.")]
  16. public class GetSimilarAlbums : BaseGetSimilarItemsFromItem
  17. {
  18. }
  19. [Route("/Artists/{Id}/Similar", "GET", Summary = "Finds albums similar to a given album.")]
  20. public class GetSimilarArtists : BaseGetSimilarItemsFromItem
  21. {
  22. }
  23. [Authenticated]
  24. public class AlbumsService : BaseApiService
  25. {
  26. /// <summary>
  27. /// The _user manager
  28. /// </summary>
  29. private readonly IUserManager _userManager;
  30. /// <summary>
  31. /// The _user data repository
  32. /// </summary>
  33. private readonly IUserDataManager _userDataRepository;
  34. /// <summary>
  35. /// The _library manager
  36. /// </summary>
  37. private readonly ILibraryManager _libraryManager;
  38. private readonly IItemRepository _itemRepo;
  39. private readonly IDtoService _dtoService;
  40. private readonly IAuthorizationContext _authContext;
  41. public AlbumsService(
  42. ILogger<AlbumsService> logger,
  43. IServerConfigurationManager serverConfigurationManager,
  44. IHttpResultFactory httpResultFactory,
  45. IUserManager userManager,
  46. IUserDataManager userDataRepository,
  47. ILibraryManager libraryManager,
  48. IItemRepository itemRepo,
  49. IDtoService dtoService,
  50. IAuthorizationContext authContext)
  51. : base(logger, serverConfigurationManager, httpResultFactory)
  52. {
  53. _userManager = userManager;
  54. _userDataRepository = userDataRepository;
  55. _libraryManager = libraryManager;
  56. _itemRepo = itemRepo;
  57. _dtoService = dtoService;
  58. _authContext = authContext;
  59. }
  60. public object Get(GetSimilarArtists request)
  61. {
  62. var dtoOptions = GetDtoOptions(_authContext, request);
  63. var result = SimilarItemsHelper.GetSimilarItemsResult(dtoOptions, _userManager,
  64. _itemRepo,
  65. _libraryManager,
  66. _userDataRepository,
  67. _dtoService,
  68. Logger,
  69. request, new[] { typeof(MusicArtist) },
  70. SimilarItemsHelper.GetSimiliarityScore);
  71. return ToOptimizedResult(result);
  72. }
  73. /// <summary>
  74. /// Gets the specified request.
  75. /// </summary>
  76. /// <param name="request">The request.</param>
  77. /// <returns>System.Object.</returns>
  78. public object Get(GetSimilarAlbums request)
  79. {
  80. var dtoOptions = GetDtoOptions(_authContext, request);
  81. var result = SimilarItemsHelper.GetSimilarItemsResult(dtoOptions, _userManager,
  82. _itemRepo,
  83. _libraryManager,
  84. _userDataRepository,
  85. _dtoService,
  86. Logger,
  87. request, new[] { typeof(MusicAlbum) },
  88. GetAlbumSimilarityScore);
  89. return ToOptimizedResult(result);
  90. }
  91. /// <summary>
  92. /// Gets the album similarity score.
  93. /// </summary>
  94. /// <param name="item1">The item1.</param>
  95. /// <param name="item1People">The item1 people.</param>
  96. /// <param name="allPeople">All people.</param>
  97. /// <param name="item2">The item2.</param>
  98. /// <returns>System.Int32.</returns>
  99. private int GetAlbumSimilarityScore(BaseItem item1, List<PersonInfo> item1People, List<PersonInfo> allPeople, BaseItem item2)
  100. {
  101. var points = SimilarItemsHelper.GetSimiliarityScore(item1, item1People, allPeople, item2);
  102. var album1 = (MusicAlbum)item1;
  103. var album2 = (MusicAlbum)item2;
  104. var artists1 = album1
  105. .GetAllArtists()
  106. .DistinctNames()
  107. .ToList();
  108. var artists2 = new HashSet<string>(
  109. album2.GetAllArtists().DistinctNames(),
  110. StringComparer.OrdinalIgnoreCase);
  111. return points + artists1.Where(artists2.Contains).Sum(i => 5);
  112. }
  113. }
  114. }