diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs index 1f69183cc8..19cb14bbd5 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -48,6 +48,19 @@ namespace MediaBrowser.Api.Images public string Name { get; set; } } + [Route("/Artists/{Name}/Images/{Type}", "GET")] + [Route("/Artists/{Name}/Images/{Type}/{Index}", "GET")] + [Api(Description = "Gets an artist image")] + public class GetArtistImage : ImageRequest + { + /// + /// Gets or sets the name. + /// + /// The name. + [ApiMember(Name = "Name", Description = "Artist name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] + public string Name { get; set; } + } + /// /// Class GetStudioImage /// @@ -233,6 +246,18 @@ namespace MediaBrowser.Api.Images return GetImage(request, item); } + /// + /// Gets the specified request. + /// + /// The request. + /// System.Object. + public object Get(GetArtistImage request) + { + var item = _libraryManager.GetArtist(request.Name).Result; + + return GetImage(request, item); + } + /// /// Gets the specified request. /// diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs index 5b34119dea..c7b4fae5f5 100644 --- a/MediaBrowser.Api/Library/LibraryService.cs +++ b/MediaBrowser.Api/Library/LibraryService.cs @@ -1,10 +1,6 @@ using MediaBrowser.Common; -using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; -using MediaBrowser.Controller.Persistence; -using MediaBrowser.Model.Dto; -using MediaBrowser.Model.Querying; using ServiceStack.ServiceHost; using System; using System.Collections.Generic; @@ -36,66 +32,6 @@ namespace MediaBrowser.Api.Library public bool HasInternetProvider { get; set; } } - /// - /// Class GetPerson - /// - [Route("/Persons/{Name}", "GET")] - [Api(Description = "Gets a person, by name")] - public class GetPerson : IReturn - { - /// - /// Gets or sets the name. - /// - /// The name. - [ApiMember(Name = "Name", Description = "The person name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] - public string Name { get; set; } - } - - /// - /// Class GetStudio - /// - [Route("/Studios/{Name}", "GET")] - [Api(Description = "Gets a studio, by name")] - public class GetStudio : IReturn - { - /// - /// Gets or sets the name. - /// - /// The name. - [ApiMember(Name = "Name", Description = "The studio name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] - public string Name { get; set; } - } - - /// - /// Class GetGenre - /// - [Route("/Genres/{Name}", "GET")] - [Api(Description = "Gets a genre, by name")] - public class GetGenre : IReturn - { - /// - /// Gets or sets the name. - /// - /// The name. - [ApiMember(Name = "Name", Description = "The genre name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] - public string Name { get; set; } - } - - /// - /// Class GetYear - /// - [Route("/Years/{Year}", "GET")] - [Api(Description = "Gets a year")] - public class GetYear : IReturn - { - /// - /// Gets or sets the year. - /// - /// The year. - [ApiMember(Name = "Year", Description = "The year", IsRequired = true, DataType = "int", ParameterType = "path", Verb = "GET")] - public int Year { get; set; } - } - /// /// Class LibraryService /// @@ -106,16 +42,14 @@ namespace MediaBrowser.Api.Library /// private readonly IApplicationHost _appHost; private readonly ILibraryManager _libraryManager; - private readonly IUserDataRepository _userDataRepository; /// /// Initializes a new instance of the class. /// /// The app host. /// The library manager. - /// The user data repository. /// appHost - public LibraryService(IApplicationHost appHost, ILibraryManager libraryManager, IUserDataRepository userDataRepository) + public LibraryService(IApplicationHost appHost, ILibraryManager libraryManager) { if (appHost == null) { @@ -124,75 +58,6 @@ namespace MediaBrowser.Api.Library _appHost = appHost; _libraryManager = libraryManager; - _userDataRepository = userDataRepository; - } - - /// - /// Gets the specified request. - /// - /// The request. - /// System.Object. - public object Get(GetPerson request) - { - var item = _libraryManager.GetPerson(request.Name).Result; - - // Get everything - var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)); - - var result = new DtoBuilder(Logger, _libraryManager, _userDataRepository).GetBaseItemDto(item, fields.ToList()).Result; - - return ToOptimizedResult(result); - } - - /// - /// Gets the specified request. - /// - /// The request. - /// System.Object. - public object Get(GetGenre request) - { - var item = _libraryManager.GetGenre(request.Name).Result; - - // Get everything - var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)); - - var result = new DtoBuilder(Logger, _libraryManager, _userDataRepository).GetBaseItemDto(item, fields.ToList()).Result; - - return ToOptimizedResult(result); - } - - /// - /// Gets the specified request. - /// - /// The request. - /// System.Object. - public object Get(GetStudio request) - { - var item = _libraryManager.GetStudio(request.Name).Result; - - // Get everything - var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)); - - var result = new DtoBuilder(Logger, _libraryManager, _userDataRepository).GetBaseItemDto(item, fields.ToList()).Result; - - return ToOptimizedResult(result); - } - - /// - /// Gets the specified request. - /// - /// The request. - /// System.Object. - public object Get(GetYear request) - { - var item = _libraryManager.GetYear(request.Year).Result; - - // Get everything - var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)); - - var result = new DtoBuilder(Logger, _libraryManager, _userDataRepository).GetBaseItemDto(item, fields.ToList()).Result; - - return ToOptimizedResult(result); } /// diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj index 710c159e7f..32c1bfaf5c 100644 --- a/MediaBrowser.Api/MediaBrowser.Api.csproj +++ b/MediaBrowser.Api/MediaBrowser.Api.csproj @@ -87,6 +87,7 @@ + diff --git a/MediaBrowser.Api/UserLibrary/ArtistsService.cs b/MediaBrowser.Api/UserLibrary/ArtistsService.cs new file mode 100644 index 0000000000..2622f0bd15 --- /dev/null +++ b/MediaBrowser.Api/UserLibrary/ArtistsService.cs @@ -0,0 +1,187 @@ +using MediaBrowser.Controller.Dto; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Persistence; +using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Querying; +using ServiceStack.ServiceHost; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace MediaBrowser.Api.UserLibrary +{ + /// + /// Class GetArtists + /// + [Route("/Artists", "GET")] + [Api(Description = "Gets all artists from a given item, folder, or the entire library")] + public class GetArtists : GetItemsByName + { + } + + /// + /// Class GetArtistsItemCounts + /// + [Route("/Artists/{Name}/Counts", "GET")] + [Api(Description = "Gets item counts of library items that an artist appears in")] + public class GetArtistsItemCounts : IReturn + { + /// + /// Gets or sets the user id. + /// + /// The user id. + [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] + public Guid UserId { get; set; } + + /// + /// Gets or sets the name. + /// + /// The name. + [ApiMember(Name = "Name", Description = "The artist name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] + public string Name { get; set; } + } + + [Route("/Artists/{Name}", "GET")] + [Api(Description = "Gets an artist, by name")] + public class GetArtist : IReturn + { + /// + /// Gets or sets the name. + /// + /// The name. + [ApiMember(Name = "Name", Description = "The artist name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] + public string Name { get; set; } + + /// + /// Gets or sets the user id. + /// + /// The user id. + [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + public Guid? UserId { get; set; } + } + + /// + /// Class ArtistsService + /// + public class ArtistsService : BaseItemsByNameService + { + /// + /// Initializes a new instance of the class. + /// + /// The user manager. + /// The library manager. + /// The user data repository. + public ArtistsService(IUserManager userManager, ILibraryManager libraryManager, IUserDataRepository userDataRepository) + : base(userManager, libraryManager, userDataRepository) + { + } + + /// + /// Gets the specified request. + /// + /// The request. + /// System.Object. + public object Get(GetArtist request) + { + var result = GetItem(request).Result; + + return ToOptimizedResult(result); + } + + /// + /// Gets the item. + /// + /// The request. + /// Task{BaseItemDto}. + private async Task GetItem(GetArtist request) + { + var item = await LibraryManager.GetArtist(request.Name).ConfigureAwait(false); + + // Get everything + var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)); + + var builder = new DtoBuilder(Logger, LibraryManager, UserDataRepository); + + if (request.UserId.HasValue) + { + var user = UserManager.GetUserById(request.UserId.Value); + + return await builder.GetBaseItemDto(item, user, fields.ToList()).ConfigureAwait(false); + } + + return await builder.GetBaseItemDto(item, fields.ToList()).ConfigureAwait(false); + } + + /// + /// Gets the specified request. + /// + /// The request. + /// System.Object. + public object Get(GetArtistsItemCounts request) + { + var items = GetItems(request.UserId).OfType /// The request. /// The items. - /// The user. /// IEnumerable{BaseItem}. - private IEnumerable FilterItems(GetItemsByName request, IEnumerable items, User user) + private IEnumerable FilterItems(GetItemsByName request, IEnumerable items) { // Exclude item types if (!string.IsNullOrEmpty(request.ExcludeItemTypes)) @@ -213,9 +228,8 @@ namespace MediaBrowser.Api.UserLibrary /// /// The request. /// The items. - /// The user. /// IEnumerable{Tuple{System.StringFunc{System.Int32}}}. - protected abstract IEnumerable> GetAllItems(GetItemsByName request, IEnumerable items, User user); + protected abstract IEnumerable> GetAllItems(GetItemsByName request, IEnumerable items); /// /// Gets the dto. @@ -238,18 +252,36 @@ namespace MediaBrowser.Api.UserLibrary return null; } - var dto = await new DtoBuilder(Logger, LibraryManager, UserDataRepository).GetBaseItemDto(item, user, fields).ConfigureAwait(false); + var dto = user == null ? await new DtoBuilder(Logger, LibraryManager, UserDataRepository).GetBaseItemDto(item, fields).ConfigureAwait(false) : + await new DtoBuilder(Logger, LibraryManager, UserDataRepository).GetBaseItemDto(item, user, fields).ConfigureAwait(false); if (fields.Contains(ItemFields.ItemCounts)) { var items = stub.Items; dto.ChildCount = items.Count; - dto.RecentlyAddedItemCount = items.Count(i => i.IsRecentlyAdded(user)); + dto.RecentlyAddedItemCount = items.Count(i => i.IsRecentlyAdded()); } return dto; } + + /// + /// Gets the items. + /// + /// The user id. + /// IEnumerable{BaseItem}. + protected IEnumerable GetItems(Guid? userId) + { + if (userId.HasValue) + { + var user = UserManager.GetUserById(userId.Value); + + return UserManager.GetUserById(userId.Value).RootFolder.GetRecursiveChildren(user); + } + + return LibraryManager.RootFolder.RecursiveChildren; + } } /// @@ -257,12 +289,24 @@ namespace MediaBrowser.Api.UserLibrary /// public class GetItemsByName : BaseItemsRequest, IReturn { + /// + /// Gets or sets the user id. + /// + /// The user id. + [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + public Guid? UserId { get; set; } + /// /// What to sort the results by /// /// The sort by. [ApiMember(Name = "SortBy", Description = "Optional. Options: SortName", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)] public string SortBy { get; set; } + + public GetItemsByName() + { + Recursive = true; + } } public class IbnStub diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs b/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs index afe93a0865..7dcce53b2c 100644 --- a/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs +++ b/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs @@ -9,13 +9,6 @@ namespace MediaBrowser.Api.UserLibrary { public abstract class BaseItemsRequest { - /// - /// Gets or sets the user id. - /// - /// The user id. - [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] - public Guid UserId { get; set; } - /// /// Skips over a given number of items within the results. Use for paging. /// diff --git a/MediaBrowser.Api/UserLibrary/GenresService.cs b/MediaBrowser.Api/UserLibrary/GenresService.cs index 4f87b154e5..30094d4f32 100644 --- a/MediaBrowser.Api/UserLibrary/GenresService.cs +++ b/MediaBrowser.Api/UserLibrary/GenresService.cs @@ -1,11 +1,12 @@ -using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Dto; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Dto; -using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Querying; using ServiceStack.ServiceHost; using System; using System.Collections.Generic; @@ -17,17 +18,13 @@ namespace MediaBrowser.Api.UserLibrary /// /// Class GetGenres /// - [Route("/Users/{UserId}/Items/{ParentId}/Genres", "GET")] - [Route("/Users/{UserId}/Items/Root/Genres", "GET")] + [Route("/Genres", "GET")] [Api(Description = "Gets all genres from a given item, folder, or the entire library")] public class GetGenres : GetItemsByName { } - /// - /// Class GetGenreItemCounts - /// - [Route("/Users/{UserId}/Genres/{Name}/Counts", "GET")] + [Route("/Genres/{Name}/Counts", "GET")] [Api(Description = "Gets item counts of library items that a genre appears in")] public class GetGenreItemCounts : IReturn { @@ -35,8 +32,8 @@ namespace MediaBrowser.Api.UserLibrary /// Gets or sets the user id. /// /// The user id. - [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] - public Guid UserId { get; set; } + [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + public Guid? UserId { get; set; } /// /// Gets or sets the name. @@ -45,6 +42,28 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "Name", Description = "The genre name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] public string Name { get; set; } } + + /// + /// Class GetGenre + /// + [Route("/Genres/{Name}", "GET")] + [Api(Description = "Gets a genre, by name")] + public class GetGenre : IReturn + { + /// + /// Gets or sets the name. + /// + /// The name. + [ApiMember(Name = "Name", Description = "The genre name", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] + public string Name { get; set; } + + /// + /// Gets or sets the user id. + /// + /// The user id. + [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + public Guid? UserId { get; set; } + } /// /// Class GenresService @@ -61,32 +80,37 @@ namespace MediaBrowser.Api.UserLibrary /// /// The request. /// System.Object. - public object Get(GetGenreItemCounts request) + public object Get(GetGenre request) { - var user = UserManager.GetUserById(request.UserId); - - var items = user.RootFolder.GetRecursiveChildren(user).Where(i => i.Genres != null && i.Genres.Contains(request.Name, StringComparer.OrdinalIgnoreCase)).ToList(); + var result = GetItem(request).Result; - var counts = new ItemByNameCounts - { - TotalCount = items.Count, - - TrailerCount = items.OfType().Count(), + return ToOptimizedResult(result); + } - MovieCount = items.OfType().Count(), + /// + /// Gets the item. + /// + /// The request. + /// Task{BaseItemDto}. + private async Task GetItem(GetGenre request) + { + var item = await LibraryManager.GetGenre(request.Name).ConfigureAwait(false); - SeriesCount = items.OfType().Count(), + // Get everything + var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)); - GameCount = items.OfType().Count(), + var builder = new DtoBuilder(Logger, LibraryManager, UserDataRepository); - SongCount = items.OfType /// The request. /// The items. - /// The user. /// IEnumerable{Tuple{System.StringFunc{System.Int32}}}. - protected override IEnumerable> GetAllItems(GetItemsByName request, IEnumerable items, User user) + protected override IEnumerable> GetAllItems(GetItemsByName request, IEnumerable items) { var itemsList = items.Where(i => i.Genres != null).ToList(); @@ -125,5 +148,34 @@ namespace MediaBrowser.Api.UserLibrary { return LibraryManager.GetGenre(name); } + + /// + /// Gets the specified request. + /// + /// The request. + /// System.Object. + public object Get(GetGenreItemCounts request) + { + var items = GetItems(request.UserId).Where(i => i.Genres != null && i.Genres.Contains(request.Name, StringComparer.OrdinalIgnoreCase)).ToList(); + + var counts = new ItemByNameCounts + { + TotalCount = items.Count, + + TrailerCount = items.OfType().Count(), + + MovieCount = items.OfType().Count(), + + SeriesCount = items.OfType().Count(), + + GameCount = items.OfType().Count(), + + SongCount = items.OfType