using System; using System.Collections.Generic; using System.Linq; using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Services; namespace MediaBrowser.Api.Music { [Route("/Albums/{Id}/Similar", "GET", Summary = "Finds albums similar to a given album.")] public class GetSimilarAlbums : BaseGetSimilarItemsFromItem { } [Route("/Artists/{Id}/Similar", "GET", Summary = "Finds albums similar to a given album.")] public class GetSimilarArtists : BaseGetSimilarItemsFromItem { } [Authenticated] public class AlbumsService : BaseApiService { /// /// The _user manager /// private readonly IUserManager _userManager; /// /// The _user data repository /// private readonly IUserDataManager _userDataRepository; /// /// The _library manager /// private readonly ILibraryManager _libraryManager; private readonly IItemRepository _itemRepo; private readonly IDtoService _dtoService; private readonly IAuthorizationContext _authContext; public AlbumsService(IUserManager userManager, IUserDataManager userDataRepository, ILibraryManager libraryManager, IItemRepository itemRepo, IDtoService dtoService, IAuthorizationContext authContext) { _userManager = userManager; _userDataRepository = userDataRepository; _libraryManager = libraryManager; _itemRepo = itemRepo; _dtoService = dtoService; _authContext = authContext; } public object Get(GetSimilarArtists request) { var dtoOptions = GetDtoOptions(_authContext, request); var result = SimilarItemsHelper.GetSimilarItemsResult(dtoOptions, _userManager, _itemRepo, _libraryManager, _userDataRepository, _dtoService, Logger, request, new[] { typeof(MusicArtist) }, SimilarItemsHelper.GetSimiliarityScore); return ToOptimizedResult(result); } /// /// Gets the specified request. /// /// The request. /// System.Object. public object Get(GetSimilarAlbums request) { var dtoOptions = GetDtoOptions(_authContext, request); var result = SimilarItemsHelper.GetSimilarItemsResult(dtoOptions, _userManager, _itemRepo, _libraryManager, _userDataRepository, _dtoService, Logger, request, new[] { typeof(MusicAlbum) }, GetAlbumSimilarityScore); return ToOptimizedResult(result); } /// /// Gets the album similarity score. /// /// The item1. /// The item1 people. /// All people. /// The item2. /// System.Int32. private int GetAlbumSimilarityScore(BaseItem item1, List item1People, List allPeople, BaseItem item2) { var points = SimilarItemsHelper.GetSimiliarityScore(item1, item1People, allPeople, item2); var album1 = (MusicAlbum)item1; var album2 = (MusicAlbum)item2; var artists1 = album1 .AllArtists .DistinctNames() .ToList(); var artists2 = album2 .AllArtists .DistinctNames() .ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); return points + artists1.Where(artists2.ContainsKey).Sum(i => 5); } } }