diff options
Diffstat (limited to 'MediaBrowser.Api/UserLibrary/UserLibraryService.cs')
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/UserLibraryService.cs | 155 |
1 files changed, 76 insertions, 79 deletions
diff --git a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs index 8414241d5..45a330a50 100644 --- a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs +++ b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs @@ -1,6 +1,5 @@ using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Net; @@ -8,6 +7,7 @@ using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Library; using MediaBrowser.Model.Querying; +using MoreLinq; using ServiceStack; using System; using System.Collections.Generic; @@ -20,8 +20,7 @@ namespace MediaBrowser.Api.UserLibrary /// <summary> /// Class GetItem /// </summary> - [Route("/Users/{UserId}/Items/{Id}", "GET")] - [Api(Description = "Gets an item from a user's library")] + [Route("/Users/{UserId}/Items/{Id}", "GET", Summary = "Gets an item from a user's library")] public class GetItem : IReturn<BaseItemDto> { /// <summary> @@ -56,8 +55,7 @@ namespace MediaBrowser.Api.UserLibrary /// <summary> /// Class GetItem /// </summary> - [Route("/Users/{UserId}/Items/Root", "GET")] - [Api(Description = "Gets the root folder from a user's library")] + [Route("/Users/{UserId}/Items/Root", "GET", Summary = "Gets the root folder from a user's library")] public class GetRootFolder : IReturn<BaseItemDto> { /// <summary> @@ -71,8 +69,7 @@ namespace MediaBrowser.Api.UserLibrary /// <summary> /// Class GetIntros /// </summary> - [Route("/Users/{UserId}/Items/{Id}/Intros", "GET")] - [Api(("Gets intros to play before the main media item plays"))] + [Route("/Users/{UserId}/Items/{Id}/Intros", "GET", Summary = "Gets intros to play before the main media item plays")] public class GetIntros : IReturn<ItemsResult> { /// <summary> @@ -93,8 +90,7 @@ namespace MediaBrowser.Api.UserLibrary /// <summary> /// Class MarkFavoriteItem /// </summary> - [Route("/Users/{UserId}/FavoriteItems/{Id}", "POST")] - [Api(Description = "Marks an item as a favorite")] + [Route("/Users/{UserId}/FavoriteItems/{Id}", "POST", Summary = "Marks an item as a favorite")] public class MarkFavoriteItem : IReturn<UserItemDataDto> { /// <summary> @@ -115,8 +111,7 @@ namespace MediaBrowser.Api.UserLibrary /// <summary> /// Class UnmarkFavoriteItem /// </summary> - [Route("/Users/{UserId}/FavoriteItems/{Id}", "DELETE")] - [Api(Description = "Unmarks an item as a favorite")] + [Route("/Users/{UserId}/FavoriteItems/{Id}", "DELETE", Summary = "Unmarks an item as a favorite")] public class UnmarkFavoriteItem : IReturn<UserItemDataDto> { /// <summary> @@ -137,8 +132,7 @@ namespace MediaBrowser.Api.UserLibrary /// <summary> /// Class ClearUserItemRating /// </summary> - [Route("/Users/{UserId}/Items/{Id}/Rating", "DELETE")] - [Api(Description = "Deletes a user's saved personal rating for an item")] + [Route("/Users/{UserId}/Items/{Id}/Rating", "DELETE", Summary = "Deletes a user's saved personal rating for an item")] public class DeleteUserItemRating : IReturn<UserItemDataDto> { /// <summary> @@ -159,8 +153,7 @@ namespace MediaBrowser.Api.UserLibrary /// <summary> /// Class UpdateUserItemRating /// </summary> - [Route("/Users/{UserId}/Items/{Id}/Rating", "POST")] - [Api(Description = "Updates a user's rating for an item")] + [Route("/Users/{UserId}/Items/{Id}/Rating", "POST", Summary = "Updates a user's rating for an item")] public class UpdateUserItemRating : IReturn<UserItemDataDto> { /// <summary> @@ -188,8 +181,7 @@ namespace MediaBrowser.Api.UserLibrary /// <summary> /// Class GetLocalTrailers /// </summary> - [Route("/Users/{UserId}/Items/{Id}/LocalTrailers", "GET")] - [Api(Description = "Gets local trailers for an item")] + [Route("/Users/{UserId}/Items/{Id}/LocalTrailers", "GET", Summary = "Gets local trailers for an item")] public class GetLocalTrailers : IReturn<List<BaseItemDto>> { /// <summary> @@ -210,8 +202,7 @@ namespace MediaBrowser.Api.UserLibrary /// <summary> /// Class GetSpecialFeatures /// </summary> - [Route("/Users/{UserId}/Items/{Id}/SpecialFeatures", "GET")] - [Api(Description = "Gets special features for an item")] + [Route("/Users/{UserId}/Items/{Id}/SpecialFeatures", "GET", Summary = "Gets special features for an item")] public class GetSpecialFeatures : IReturn<List<BaseItemDto>> { /// <summary> @@ -230,7 +221,7 @@ namespace MediaBrowser.Api.UserLibrary } [Route("/Users/{UserId}/Items/Latest", "GET", Summary = "Gets latest media")] - public class GetLatestMedia : IReturn<List<BaseItemDto>>, IHasItemFields + public class GetLatestMedia : IReturn<List<BaseItemDto>>, IHasDtoOptions { /// <summary> /// Gets or sets the user id. @@ -259,6 +250,15 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "GroupItems", Description = "Whether or not to group items into a parent container.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] public bool GroupItems { get; set; } + + [ApiMember(Name = "EnableImages", Description = "Optional, include image information in output", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "GET")] + public bool? EnableImages { get; set; } + + [ApiMember(Name = "ImageTypeLimit", Description = "Optional, the max number of images to return, per image type", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")] + public int? ImageTypeLimit { get; set; } + + [ApiMember(Name = "EnableImageTypes", Description = "Optional. The image types to include in the output.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + public string EnableImageTypes { get; set; } public GetLatestMedia() { @@ -279,15 +279,6 @@ namespace MediaBrowser.Api.UserLibrary private readonly IDtoService _dtoService; private readonly IUserViewManager _userViewManager; - /// <summary> - /// Initializes a new instance of the <see cref="UserLibraryService" /> class. - /// </summary> - /// <param name="userManager">The user manager.</param> - /// <param name="libraryManager">The library manager.</param> - /// <param name="userDataRepository">The user data repository.</param> - /// <param name="dtoService">The dto service.</param> - /// <param name="userViewManager">The user view manager.</param> - /// <exception cref="System.ArgumentNullException">jsonSerializer</exception> public UserLibraryService(IUserManager userManager, ILibraryManager libraryManager, IUserDataManager userDataRepository, IDtoService dtoService, IUserViewManager userViewManager) { _userManager = userManager; @@ -314,17 +305,20 @@ namespace MediaBrowser.Api.UserLibrary var user = _userManager.GetUserById(request.UserId); // Avoid implicitly captured closure - var libraryItems = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId) - .OrderByDescending(i => i.DateCreated) + var libraryItems = string.IsNullOrEmpty(request.ParentId) && user != null ? + GetItemsConfiguredForLatest(user) : + GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId); + + libraryItems = libraryItems.OrderByDescending(i => i.DateCreated) .Where(i => i.LocationType != LocationType.Virtual); //if (request.IsFolder.HasValue) //{ - //var val = request.IsFolder.Value; - libraryItems = libraryItems.Where(f => f.IsFolder == false); + //var val = request.IsFolder.Value; + libraryItems = libraryItems.Where(f => f.IsFolder == false); //} - + if (!string.IsNullOrEmpty(request.IncludeItemTypes)) { var vals = request.IncludeItemTypes.Split(','); @@ -341,7 +335,7 @@ namespace MediaBrowser.Api.UserLibrary libraryItems = libraryItems.Where(f => f.IsPlayed(currentUser) == val) .Take(takeLimit); } - + // Avoid implicitly captured closure var items = libraryItems .ToList(); @@ -377,7 +371,7 @@ namespace MediaBrowser.Api.UserLibrary } } - var fields = request.GetItemFields().ToList(); + var options = request.GetDtoOptions(); var dtos = list.Select(i => { @@ -390,7 +384,7 @@ namespace MediaBrowser.Api.UserLibrary childCount = i.Item2.Count; } - var dto = _dtoService.GetBaseItemDto(item, fields, user); + var dto = _dtoService.GetBaseItemDto(item, options, user); dto.ChildCount = childCount; @@ -400,13 +394,19 @@ namespace MediaBrowser.Api.UserLibrary return ToOptimizedResult(dtos.ToList()); } + private IEnumerable<BaseItem> GetItemsConfiguredForLatest(User user) + { + return user.RootFolder.GetChildren(user, true) + .OfType<Folder>() + .Where(i => !user.Configuration.LatestItemsExcludes.Contains(i.Id.ToString("N"))) + .SelectMany(i => i.GetRecursiveChildren(user)) + .DistinctBy(i => i.Id); + } + public async Task<object> Get(GetUserViews request) { var user = _userManager.GetUserById(request.UserId); - // Get everything - var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)).ToList(); - var query = new UserViewQuery { UserId = request.UserId @@ -420,7 +420,9 @@ namespace MediaBrowser.Api.UserLibrary var folders = await _userViewManager.GetUserViews(query, CancellationToken.None).ConfigureAwait(false); - var dtos = folders.Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + var dtoOptions = new DtoOptions(); + + var dtos = folders.Select(i => _dtoService.GetBaseItemDto(i, dtoOptions, user)) .ToArray(); var result = new QueryResult<BaseItemDto> @@ -440,30 +442,16 @@ namespace MediaBrowser.Api.UserLibrary user.RootFolder : _libraryManager.GetItemById(request.Id); - // Get everything - var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)).ToList(); - - var movie = item as Movie; - - // Get them from the db - if (movie != null) - { - // Avoid implicitly captured closure - var movie1 = movie; - - var dtos = movie.SpecialFeatureIds - .Select(_libraryManager.GetItemById) - .OrderBy(i => i.SortName) - .Select(i => _dtoService.GetBaseItemDto(i, fields, user, movie1)); - - return dtos.ToList(); - } - var series = item as Series; // Get them from the child tree if (series != null) { + var dtoOptions = new DtoOptions(); + + // Avoid implicitly captured closure + var currentUser = user; + var dtos = series .GetRecursiveChildren() .Where(i => i is Episode && i.ParentIndexNumber.HasValue && i.ParentIndexNumber.Value == 0) @@ -481,7 +469,22 @@ namespace MediaBrowser.Api.UserLibrary return DateTime.MinValue; }) .ThenBy(i => i.SortName) - .Select(i => _dtoService.GetBaseItemDto(i, fields, user)); + .Select(i => _dtoService.GetBaseItemDto(i, dtoOptions, currentUser)); + + return dtos.ToList(); + } + + var movie = item as IHasSpecialFeatures; + + // Get them from the db + if (movie != null) + { + var dtoOptions = new DtoOptions(); + + var dtos = movie.SpecialFeatureIds + .Select(_libraryManager.GetItemById) + .OrderBy(i => i.SortName) + .Select(i => _dtoService.GetBaseItemDto(i, dtoOptions, user, item)); return dtos.ToList(); } @@ -507,21 +510,20 @@ namespace MediaBrowser.Api.UserLibrary var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _libraryManager.GetItemById(request.Id); - // Get everything - var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)).ToList(); - var trailerIds = new List<Guid>(); var hasTrailers = item as IHasTrailers; if (hasTrailers != null) { - trailerIds = hasTrailers.LocalTrailerIds; + trailerIds = hasTrailers.GetTrailerIds(); } + var dtoOptions = new DtoOptions(); + var dtos = trailerIds .Select(_libraryManager.GetItemById) .OrderBy(i => i.SortName) - .Select(i => _dtoService.GetBaseItemDto(i, fields, user, item)); + .Select(i => _dtoService.GetBaseItemDto(i, dtoOptions, user, item)); return dtos.ToList(); } @@ -537,10 +539,9 @@ namespace MediaBrowser.Api.UserLibrary var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _libraryManager.GetItemById(request.Id); - // Get everything - var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)).ToList(); + var dtoOptions = new DtoOptions(); - var result = _dtoService.GetBaseItemDto(item, fields, user); + var result = _dtoService.GetBaseItemDto(item, dtoOptions, user); return ToOptimizedSerializedResultUsingCache(result); } @@ -556,10 +557,9 @@ namespace MediaBrowser.Api.UserLibrary var item = user.RootFolder; - // Get everything - var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)).ToList(); + var dtoOptions = new DtoOptions(); - var result = _dtoService.GetBaseItemDto(item, fields, user); + var result = _dtoService.GetBaseItemDto(item, dtoOptions, user); return ToOptimizedSerializedResultUsingCache(result); } @@ -569,20 +569,17 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <param name="request">The request.</param> /// <returns>System.Object.</returns> - public object Get(GetIntros request) + public async Task<object> Get(GetIntros request) { var user = _userManager.GetUserById(request.UserId); var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _libraryManager.GetItemById(request.Id); - var items = _libraryManager.GetIntros(item, user); + var items = await _libraryManager.GetIntros(item, user).ConfigureAwait(false); - // Get everything - var fields = Enum.GetNames(typeof(ItemFields)) - .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)) - .ToList(); + var dtoOptions = new DtoOptions(); - var dtos = items.Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + var dtos = items.Select(i => _dtoService.GetBaseItemDto(i, dtoOptions, user)) .ToArray(); var result = new ItemsResult |
