2
0

AlbumsController.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Jellyfin.Api.Extensions;
  5. using Jellyfin.Api.Helpers;
  6. using MediaBrowser.Controller.Dto;
  7. using MediaBrowser.Controller.Entities;
  8. using MediaBrowser.Controller.Entities.Audio;
  9. using MediaBrowser.Controller.Library;
  10. using MediaBrowser.Model.Dto;
  11. using MediaBrowser.Model.Querying;
  12. using Microsoft.AspNetCore.Mvc;
  13. namespace Jellyfin.Api.Controllers
  14. {
  15. /// <summary>
  16. /// The albums controller.
  17. /// </summary>
  18. public class AlbumsController : BaseJellyfinApiController
  19. {
  20. private readonly IUserManager _userManager;
  21. private readonly ILibraryManager _libraryManager;
  22. private readonly IDtoService _dtoService;
  23. /// <summary>
  24. /// Initializes a new instance of the <see cref="AlbumsController"/> class.
  25. /// </summary>
  26. /// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param>
  27. /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
  28. /// <param name="dtoService">Instance of the <see cref="IDtoService"/> interface.</param>
  29. public AlbumsController(
  30. IUserManager userManager,
  31. ILibraryManager libraryManager,
  32. IDtoService dtoService)
  33. {
  34. _userManager = userManager;
  35. _libraryManager = libraryManager;
  36. _dtoService = dtoService;
  37. }
  38. /// <summary>
  39. /// Finds albums similar to a given album.
  40. /// </summary>
  41. /// <param name="albumId">The album id.</param>
  42. /// <param name="userId">Optional. Filter by user id, and attach user data.</param>
  43. /// <param name="excludeArtistIds">Optional. Ids of artists to exclude.</param>
  44. /// <param name="limit">Optional. The maximum number of records to return.</param>
  45. /// <returns>A <see cref="QueryResult{BaseItemDto}"/> with similar albums.</returns>
  46. [HttpGet("/Albums/{albumId}/Similar")]
  47. public ActionResult<QueryResult<BaseItemDto>> GetSimilarAlbums(
  48. [FromRoute] string albumId,
  49. [FromQuery] Guid userId,
  50. [FromQuery] string excludeArtistIds,
  51. [FromQuery] int? limit)
  52. {
  53. var dtoOptions = new DtoOptions().AddClientFields(Request);
  54. return SimilarItemsHelper.GetSimilarItemsResult(
  55. dtoOptions,
  56. _userManager,
  57. _libraryManager,
  58. _dtoService,
  59. userId,
  60. albumId,
  61. excludeArtistIds,
  62. limit,
  63. new[] { typeof(MusicAlbum) },
  64. GetAlbumSimilarityScore);
  65. }
  66. /// <summary>
  67. /// Finds artists similar to a given artist.
  68. /// </summary>
  69. /// <param name="artistId">The artist id.</param>
  70. /// <param name="userId">Optional. Filter by user id, and attach user data.</param>
  71. /// <param name="excludeArtistIds">Optional. Ids of artists to exclude.</param>
  72. /// <param name="limit">Optional. The maximum number of records to return.</param>
  73. /// <returns>A <see cref="QueryResult{BaseItemDto}"/> with similar artists.</returns>
  74. [HttpGet("/Artists/{artistId}/Similar")]
  75. public ActionResult<QueryResult<BaseItemDto>> GetSimilarArtists(
  76. [FromRoute] string artistId,
  77. [FromQuery] Guid userId,
  78. [FromQuery] string excludeArtistIds,
  79. [FromQuery] int? limit)
  80. {
  81. var dtoOptions = new DtoOptions().AddClientFields(Request);
  82. return SimilarItemsHelper.GetSimilarItemsResult(
  83. dtoOptions,
  84. _userManager,
  85. _libraryManager,
  86. _dtoService,
  87. userId,
  88. artistId,
  89. excludeArtistIds,
  90. limit,
  91. new[] { typeof(MusicArtist) },
  92. SimilarItemsHelper.GetSimiliarityScore);
  93. }
  94. /// <summary>
  95. /// Gets a similairty score of two albums.
  96. /// </summary>
  97. /// <param name="item1">The first item.</param>
  98. /// <param name="item1People">The item1 people.</param>
  99. /// <param name="allPeople">All people.</param>
  100. /// <param name="item2">The second item.</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. .GetAllArtists()
  109. .DistinctNames()
  110. .ToList();
  111. var artists2 = new HashSet<string>(
  112. album2.GetAllArtists().DistinctNames(),
  113. StringComparer.OrdinalIgnoreCase);
  114. return points + artists1.Where(artists2.Contains).Sum(i => 5);
  115. }
  116. }
  117. }