AlbumsService.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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(
  64. dtoOptions,
  65. _userManager,
  66. _itemRepo,
  67. _libraryManager,
  68. _userDataRepository,
  69. _dtoService,
  70. request, new[] { typeof(MusicArtist) },
  71. SimilarItemsHelper.GetSimiliarityScore);
  72. return ToOptimizedResult(result);
  73. }
  74. /// <summary>
  75. /// Gets the specified request.
  76. /// </summary>
  77. /// <param name="request">The request.</param>
  78. /// <returns>System.Object.</returns>
  79. public object Get(GetSimilarAlbums request)
  80. {
  81. var dtoOptions = GetDtoOptions(_authContext, request);
  82. var result = SimilarItemsHelper.GetSimilarItemsResult(
  83. dtoOptions,
  84. _userManager,
  85. _itemRepo,
  86. _libraryManager,
  87. _userDataRepository,
  88. _dtoService,
  89. request, new[] { typeof(MusicAlbum) },
  90. GetAlbumSimilarityScore);
  91. return ToOptimizedResult(result);
  92. }
  93. /// <summary>
  94. /// Gets the album similarity score.
  95. /// </summary>
  96. /// <param name="item1">The item1.</param>
  97. /// <param name="item1People">The item1 people.</param>
  98. /// <param name="allPeople">All people.</param>
  99. /// <param name="item2">The item2.</param>
  100. /// <returns>System.Int32.</returns>
  101. private int GetAlbumSimilarityScore(BaseItem item1, List<PersonInfo> item1People, List<PersonInfo> allPeople, BaseItem item2)
  102. {
  103. var points = SimilarItemsHelper.GetSimiliarityScore(item1, item1People, allPeople, item2);
  104. var album1 = (MusicAlbum)item1;
  105. var album2 = (MusicAlbum)item2;
  106. var artists1 = album1
  107. .GetAllArtists()
  108. .DistinctNames()
  109. .ToList();
  110. var artists2 = new HashSet<string>(
  111. album2.GetAllArtists().DistinctNames(),
  112. StringComparer.OrdinalIgnoreCase);
  113. return points + artists1.Where(artists2.Contains).Sum(i => 5);
  114. }
  115. }
  116. }