diff --git a/MediaBrowser.Api/AlbumsService.cs b/MediaBrowser.Api/AlbumsService.cs new file mode 100644 index 000000000..7ffe8b600 --- /dev/null +++ b/MediaBrowser.Api/AlbumsService.cs @@ -0,0 +1,87 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Persistence; +using ServiceStack.ServiceHost; +using System; +using System.Linq; + +namespace MediaBrowser.Api +{ + [Route("/Albums/{Id}/Similar", "GET")] + [Api(Description = "Finds albums similar to a given album.")] + public class GetSimilarAlbums : BaseGetSimilarItems + { + } + + public class AlbumsService : BaseApiService + { + /// + /// The _user manager + /// + private readonly IUserManager _userManager; + + /// + /// The _user data repository + /// + private readonly IUserDataRepository _userDataRepository; + /// + /// The _library manager + /// + private readonly ILibraryManager _libraryManager; + + public AlbumsService(IUserManager userManager, IUserDataRepository userDataRepository, ILibraryManager libraryManager) + { + _userManager = userManager; + _userDataRepository = userDataRepository; + _libraryManager = libraryManager; + } + + /// + /// Gets the specified request. + /// + /// The request. + /// System.Object. + public object Get(GetSimilarAlbums request) + { + var result = SimilarItemsHelper.GetSimilarItems(_userManager, + _libraryManager, + _userDataRepository, + Logger, + request, item => item is MusicAlbum, + GetAlbumSimilarityScore); + + return ToOptimizedResult(result); + } + + /// + /// Gets the album similarity score. + /// + /// The item1. + /// The item2. + /// System.Int32. + private int GetAlbumSimilarityScore(BaseItem item1, BaseItem item2) + { + var points = SimilarItemsHelper.GetSimiliarityScore(item1, item2); + + var album1 = (MusicAlbum)item1; + var album2 = (MusicAlbum)item2; + + var artists1 = album1.RecursiveChildren + .OfType