diff options
Diffstat (limited to 'MediaBrowser.Api/UserLibrary')
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/ArtistsService.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs | 33 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs | 53 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/GameGenresService.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/GenresService.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/ItemsService.cs | 43 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/MusicGenresService.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/PersonsService.cs | 12 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/PlaystateService.cs | 451 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/StudiosService.cs | 6 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/UserLibraryService.cs | 57 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/UserViewsService.cs | 21 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/YearsService.cs | 6 |
13 files changed, 120 insertions, 570 deletions
diff --git a/MediaBrowser.Api/UserLibrary/ArtistsService.cs b/MediaBrowser.Api/UserLibrary/ArtistsService.cs index 7c1519e9f..4018759d9 100644 --- a/MediaBrowser.Api/UserLibrary/ArtistsService.cs +++ b/MediaBrowser.Api/UserLibrary/ArtistsService.cs @@ -132,7 +132,7 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="request">The request.</param> /// <param name="items">The items.</param> /// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns> - protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items) + protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IList<BaseItem> items) { throw new NotImplementedException(); } diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs index 24d0a7d52..ed0c4069b 100644 --- a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs +++ b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs @@ -10,6 +10,7 @@ using System.Linq; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Services; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Api.UserLibrary { @@ -87,7 +88,7 @@ namespace MediaBrowser.Api.UserLibrary return null; } - protected ItemsResult GetResultSlim(GetItemsByName request) + protected QueryResult<BaseItemDto> GetResultSlim(GetItemsByName request) { var dtoOptions = GetDtoOptions(AuthorizationContext, request); @@ -208,9 +209,9 @@ namespace MediaBrowser.Api.UserLibrary return dto; }); - return new ItemsResult + return new QueryResult<BaseItemDto> { - Items = dtos.ToArray(), + Items = dtos.ToArray(result.Items.Length), TotalRecordCount = result.TotalRecordCount }; } @@ -239,7 +240,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <param name="request">The request.</param> /// <returns>Task{ItemsResult}.</returns> - protected ItemsResult GetResult(GetItemsByName request) + protected QueryResult<BaseItemDto> GetResult(GetItemsByName request) { var dtoOptions = GetDtoOptions(AuthorizationContext, request); @@ -256,7 +257,7 @@ namespace MediaBrowser.Api.UserLibrary parentItem = string.IsNullOrEmpty(request.ParentId) ? LibraryManager.RootFolder : LibraryManager.GetItemById(request.ParentId); } - IEnumerable<BaseItem> items; + IList<BaseItem> items; var excludeItemTypes = request.GetExcludeItemTypes(); var includeItemTypes = request.GetIncludeItemTypes(); @@ -279,32 +280,32 @@ namespace MediaBrowser.Api.UserLibrary if (!string.IsNullOrWhiteSpace(request.UserId)) { items = request.Recursive ? - folder.GetRecursiveChildren(user, query) : - folder.GetChildren(user, true).Where(filter); + folder.GetRecursiveChildren(user, query).ToList() : + folder.GetChildren(user, true).Where(filter).ToList(); } else { items = request.Recursive ? folder.GetRecursiveChildren(filter) : - folder.Children.Where(filter); + folder.Children.Where(filter).ToList(); } } else { - items = new[] { parentItem }.Where(filter); + items = new[] { parentItem }.Where(filter).ToList(); } var extractedItems = GetAllItems(request, items); var filteredItems = FilterItems(request, extractedItems, user); - filteredItems = LibraryManager.Sort(filteredItems, user, request.GetOrderBy(), request.SortOrder ?? SortOrder.Ascending); + filteredItems = LibraryManager.Sort(filteredItems, user, request.GetOrderBy()); var ibnItemsArray = filteredItems.ToList(); IEnumerable<BaseItem> ibnItems = ibnItemsArray; - var result = new ItemsResult + var result = new QueryResult<BaseItemDto> { TotalRecordCount = ibnItemsArray.Count }; @@ -356,13 +357,13 @@ namespace MediaBrowser.Api.UserLibrary items = items.Where(i => string.Compare(request.NameLessThan, i.SortName, StringComparison.CurrentCultureIgnoreCase) == 1); } - var imageTypes = request.GetImageTypes().ToList(); - if (imageTypes.Count > 0) + var imageTypes = request.GetImageTypes(); + if (imageTypes.Length > 0) { items = items.Where(item => imageTypes.Any(item.HasImage)); } - var filters = request.GetFilters().ToList(); + var filters = request.GetFilters(); if (filters.Contains(ItemFilter.Dislikes)) { @@ -499,13 +500,13 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="request">The request.</param> /// <param name="items">The items.</param> /// <returns>IEnumerable{Task{`0}}.</returns> - protected abstract IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items); + protected abstract IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IList<BaseItem> items); } /// <summary> /// Class GetItemsByName /// </summary> - public class GetItemsByName : BaseItemsRequest, IReturn<ItemsResult> + public class GetItemsByName : BaseItemsRequest, IReturn<QueryResult<BaseItemDto>> { public GetItemsByName() { diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs b/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs index 3415d01f1..88d080db5 100644 --- a/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs +++ b/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs @@ -70,9 +70,6 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "IsUnaired", Description = "Optional filter by items that are unaired episodes or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] public bool? IsUnaired { get; set; } - [ApiMember(Name = "IsVirtualUnaired", Description = "Optional filter by items that are virtual unaired episodes or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] - public bool? IsVirtualUnaired { get; set; } - [ApiMember(Name = "MinCommunityRating", Description = "Optional filter by minimum community rating.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")] public double? MinCommunityRating { get; set; } @@ -139,7 +136,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <value>The sort order.</value> [ApiMember(Name = "SortOrder", Description = "Sort Order - Ascending,Descending", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] - public SortOrder? SortOrder { get; set; } + public string SortOrder { get; set; } /// <summary> /// Specify this to localize the search to a specific item or folder. Omit to use the root. @@ -300,13 +297,6 @@ namespace MediaBrowser.Api.UserLibrary public string VideoTypes { get; set; } /// <summary> - /// Gets or sets the air days. - /// </summary> - /// <value>The air days.</value> - [ApiMember(Name = "AirDays", Description = "Optional filter by Series Air Days. Allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)] - public string AirDays { get; set; } - - /// <summary> /// Gets or sets the user id. /// </summary> /// <value>The user id.</value> @@ -445,7 +435,7 @@ namespace MediaBrowser.Api.UserLibrary /// Gets the filters. /// </summary> /// <returns>IEnumerable{ItemFilter}.</returns> - public IEnumerable<ItemFilter> GetFilters() + public ItemFilter[] GetFilters() { var val = Filters; @@ -454,14 +444,14 @@ namespace MediaBrowser.Api.UserLibrary return new ItemFilter[] { }; } - return val.Split(',').Select(v => (ItemFilter)Enum.Parse(typeof(ItemFilter), v, true)); + return val.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(v => (ItemFilter)Enum.Parse(typeof(ItemFilter), v, true)).ToArray(); } /// <summary> /// Gets the image types. /// </summary> /// <returns>IEnumerable{ImageType}.</returns> - public IEnumerable<ImageType> GetImageTypes() + public ImageType[] GetImageTypes() { var val = ImageTypes; @@ -470,23 +460,48 @@ namespace MediaBrowser.Api.UserLibrary return new ImageType[] { }; } - return val.Split(',').Select(v => (ImageType)Enum.Parse(typeof(ImageType), v, true)); + return val.Split(',').Select(v => (ImageType)Enum.Parse(typeof(ImageType), v, true)).ToArray(); } /// <summary> /// Gets the order by. /// </summary> /// <returns>IEnumerable{ItemSortBy}.</returns> - public string[] GetOrderBy() + public Tuple<string, SortOrder>[] GetOrderBy() { - var val = SortBy; + return GetOrderBy(SortBy, SortOrder); + } + + public static Tuple<string, SortOrder>[] GetOrderBy(string sortBy, string requestedSortOrder) + { + var val = sortBy; if (string.IsNullOrEmpty(val)) { - return new string[] { }; + return new Tuple<string, Model.Entities.SortOrder>[] { }; + } + + var vals = val.Split(','); + if (string.IsNullOrWhiteSpace(requestedSortOrder)) + { + requestedSortOrder = "Ascending"; + } + + var sortOrders = requestedSortOrder.Split(','); + + var result = new Tuple<string, Model.Entities.SortOrder>[vals.Length]; + + for (var i = 0; i < vals.Length; i++) + { + var sortOrderIndex = sortOrders.Length > i ? i : 0; + + var sortOrderValue = sortOrders.Length > sortOrderIndex ? sortOrders[sortOrderIndex] : null; + var sortOrder = string.Equals(sortOrderValue, "Descending", StringComparison.OrdinalIgnoreCase) ? MediaBrowser.Model.Entities.SortOrder.Descending : MediaBrowser.Model.Entities.SortOrder.Ascending; + + result[i] = new Tuple<string, Model.Entities.SortOrder>(vals[i], sortOrder); } - return val.Split(','); + return result; } } } diff --git a/MediaBrowser.Api/UserLibrary/GameGenresService.cs b/MediaBrowser.Api/UserLibrary/GameGenresService.cs index 56730c1b2..0b2ca4daf 100644 --- a/MediaBrowser.Api/UserLibrary/GameGenresService.cs +++ b/MediaBrowser.Api/UserLibrary/GameGenresService.cs @@ -93,7 +93,7 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="request">The request.</param> /// <param name="items">The items.</param> /// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns> - protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items) + protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IList<BaseItem> items) { throw new NotImplementedException(); } diff --git a/MediaBrowser.Api/UserLibrary/GenresService.cs b/MediaBrowser.Api/UserLibrary/GenresService.cs index fc387e5e3..d913f52d9 100644 --- a/MediaBrowser.Api/UserLibrary/GenresService.cs +++ b/MediaBrowser.Api/UserLibrary/GenresService.cs @@ -115,7 +115,7 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="request">The request.</param> /// <param name="items">The items.</param> /// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns> - protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items) + protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IList<BaseItem> items) { throw new NotImplementedException(); } diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index 01e1ce769..fb48f65e4 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -10,8 +10,10 @@ using System.Globalization; using System.Linq; using System.Threading.Tasks; using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Model.Dto; using MediaBrowser.Model.Globalization; using MediaBrowser.Model.Services; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Api.UserLibrary { @@ -20,7 +22,7 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> [Route("/Items", "GET", Summary = "Gets items based on a query.")] [Route("/Users/{UserId}/Items", "GET", Summary = "Gets items based on a query.")] - public class GetItems : BaseItemsRequest, IReturn<ItemsResult> + public class GetItems : BaseItemsRequest, IReturn<QueryResult<BaseItemDto>> { } @@ -82,14 +84,14 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <param name="request">The request.</param> /// <returns>System.Object.</returns> - public async Task<object> Get(GetItems request) + public object Get(GetItems request) { if (request == null) { throw new ArgumentNullException("request"); } - var result = await GetItems(request).ConfigureAwait(false); + var result = GetItems(request); return ToOptimizedSerializedResultUsingCache(result); } @@ -98,8 +100,7 @@ namespace MediaBrowser.Api.UserLibrary /// Gets the items. /// </summary> /// <param name="request">The request.</param> - /// <returns>Task{ItemsResult}.</returns> - private async Task<ItemsResult> GetItems(GetItems request) + private QueryResult<BaseItemDto> GetItems(GetItems request) { var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; @@ -117,17 +118,17 @@ namespace MediaBrowser.Api.UserLibrary throw new InvalidOperationException("GetItemsToSerialize result.Items returned null"); } - var dtoList = await _dtoService.GetBaseItemDtos(result.Items, dtoOptions, user).ConfigureAwait(false); + var dtoList = _dtoService.GetBaseItemDtos(result.Items, dtoOptions, user); if (dtoList == null) { throw new InvalidOperationException("GetBaseItemDtos returned null"); } - return new ItemsResult + return new QueryResult<BaseItemDto> { TotalRecordCount = result.TotalRecordCount, - Items = dtoList.ToArray() + Items = dtoList }; } @@ -179,9 +180,7 @@ namespace MediaBrowser.Api.UserLibrary return folder.GetItems(GetItemsQuery(request, dtoOptions, user)); } - IEnumerable<BaseItem> items = folder.GetChildren(user, true); - - var itemsArray = items.ToArray(); + var itemsArray = folder.GetChildren(user, true).ToArray(); return new QueryResult<BaseItem> { @@ -199,14 +198,12 @@ namespace MediaBrowser.Api.UserLibrary IncludeItemTypes = request.GetIncludeItemTypes(), ExcludeItemTypes = request.GetExcludeItemTypes(), Recursive = request.Recursive, - SortBy = request.GetOrderBy(), - SortOrder = request.SortOrder ?? SortOrder.Ascending, + OrderBy = request.GetOrderBy(), IsFavorite = request.IsFavorite, Limit = request.Limit, StartIndex = request.StartIndex, IsMissing = request.IsMissing, - IsVirtualUnaired = request.IsVirtualUnaired, IsUnaired = request.IsUnaired, CollapseBoxSetItems = request.CollapseBoxSetItems, NameLessThan = request.NameLessThan, @@ -238,8 +235,8 @@ namespace MediaBrowser.Api.UserLibrary PersonIds = request.GetPersonIds(), PersonTypes = request.GetPersonTypes(), Years = request.GetYears(), - ImageTypes = request.GetImageTypes().ToArray(), - VideoTypes = request.GetVideoTypes().ToArray(), + ImageTypes = request.GetImageTypes(), + VideoTypes = request.GetVideoTypes(), AdjacentTo = request.AdjacentTo, ItemIds = request.GetItemIds(), MinPlayers = request.MinPlayers, @@ -319,12 +316,6 @@ namespace MediaBrowser.Api.UserLibrary query.SeriesStatuses = request.SeriesStatus.Split(',').Select(d => (SeriesStatus)Enum.Parse(typeof(SeriesStatus), d, true)).ToArray(); } - // Filter by Series AirDays - if (!string.IsNullOrEmpty(request.AirDays)) - { - query.AirDays = request.AirDays.Split(',').Select(d => (DayOfWeek)Enum.Parse(typeof(DayOfWeek), d, true)).ToArray(); - } - // ExcludeLocationTypes if (!string.IsNullOrEmpty(request.ExcludeLocationTypes)) { @@ -338,13 +329,11 @@ namespace MediaBrowser.Api.UserLibrary if (!string.IsNullOrEmpty(request.LocationTypes)) { var requestedLocationTypes = - request.LocationTypes.Split(',') - .Select(d => (LocationType)Enum.Parse(typeof(LocationType), d, true)) - .ToList(); + request.LocationTypes.Split(','); - if (requestedLocationTypes.Count > 0 && requestedLocationTypes.Count < 4) + if (requestedLocationTypes.Length > 0 && requestedLocationTypes.Length < 4) { - query.IsVirtualItem = requestedLocationTypes.Contains(LocationType.Virtual); + query.IsVirtualItem = requestedLocationTypes.Contains(LocationType.Virtual.ToString()); } } diff --git a/MediaBrowser.Api/UserLibrary/MusicGenresService.cs b/MediaBrowser.Api/UserLibrary/MusicGenresService.cs index d1d4aa634..36dc773d4 100644 --- a/MediaBrowser.Api/UserLibrary/MusicGenresService.cs +++ b/MediaBrowser.Api/UserLibrary/MusicGenresService.cs @@ -94,7 +94,7 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="request">The request.</param> /// <param name="items">The items.</param> /// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns> - protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items) + protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IList<BaseItem> items) { throw new NotImplementedException(); } diff --git a/MediaBrowser.Api/UserLibrary/PersonsService.cs b/MediaBrowser.Api/UserLibrary/PersonsService.cs index 21f416025..9417447d8 100644 --- a/MediaBrowser.Api/UserLibrary/PersonsService.cs +++ b/MediaBrowser.Api/UserLibrary/PersonsService.cs @@ -96,15 +96,13 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="request">The request.</param> /// <param name="items">The items.</param> /// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns> - protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items) + protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IList<BaseItem> items) { var inputPersonTypes = ((GetPersons)request).PersonTypes; var personTypes = string.IsNullOrEmpty(inputPersonTypes) ? new string[] { } : inputPersonTypes.Split(','); - var itemsList = items.ToList(); - // Either get all people, or all people filtered by a specific person type - var allPeople = GetAllPeople(itemsList, personTypes); + var allPeople = GetAllPeople(items, personTypes); return allPeople .Select(i => i.Name) @@ -132,13 +130,13 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="itemsList">The items list.</param> /// <param name="personTypes">The person types.</param> /// <returns>IEnumerable{PersonInfo}.</returns> - private IEnumerable<PersonInfo> GetAllPeople(IEnumerable<BaseItem> itemsList, IEnumerable<string> personTypes) + private IEnumerable<PersonInfo> GetAllPeople(IList<BaseItem> itemsList, string[] personTypes) { - var allIds = itemsList.Select(i => i.Id).ToList(); + var allIds = itemsList.Select(i => i.Id).ToArray(); var allPeople = LibraryManager.GetPeople(new InternalPeopleQuery { - PersonTypes = personTypes.ToList() + PersonTypes = personTypes }); return allPeople.Where(i => allIds.Contains(i.ItemId)).OrderBy(p => p.SortOrder ?? int.MaxValue).ThenBy(p => p.Type); diff --git a/MediaBrowser.Api/UserLibrary/PlaystateService.cs b/MediaBrowser.Api/UserLibrary/PlaystateService.cs deleted file mode 100644 index 98b4a5d5d..000000000 --- a/MediaBrowser.Api/UserLibrary/PlaystateService.cs +++ /dev/null @@ -1,451 +0,0 @@ -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Library; -using MediaBrowser.Controller.Net; -using MediaBrowser.Controller.Session; -using MediaBrowser.Model.Dto; -using MediaBrowser.Model.Session; -using System; -using System.Globalization; -using System.Linq; -using System.Threading.Tasks; -using MediaBrowser.Model.Services; - -namespace MediaBrowser.Api.UserLibrary -{ - /// <summary> - /// Class MarkPlayedItem - /// </summary> - [Route("/Users/{UserId}/PlayedItems/{Id}", "POST", Summary = "Marks an item as played")] - public class MarkPlayedItem : IReturn<UserItemDataDto> - { - /// <summary> - /// Gets or sets the user id. - /// </summary> - /// <value>The user id.</value> - [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public string UserId { get; set; } - - [ApiMember(Name = "DatePlayed", Description = "The date the item was played (if any). Format = yyyyMMddHHmmss", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] - public string DatePlayed { get; set; } - - /// <summary> - /// Gets or sets the id. - /// </summary> - /// <value>The id.</value> - [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public string Id { get; set; } - } - - /// <summary> - /// Class MarkUnplayedItem - /// </summary> - [Route("/Users/{UserId}/PlayedItems/{Id}", "DELETE", Summary = "Marks an item as unplayed")] - public class MarkUnplayedItem : IReturn<UserItemDataDto> - { - /// <summary> - /// Gets or sets the user id. - /// </summary> - /// <value>The user id.</value> - [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] - public string UserId { get; set; } - - /// <summary> - /// Gets or sets the id. - /// </summary> - /// <value>The id.</value> - [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] - public string Id { get; set; } - } - - [Route("/Sessions/Playing", "POST", Summary = "Reports playback has started within a session")] - public class ReportPlaybackStart : PlaybackStartInfo, IReturnVoid - { - } - - [Route("/Sessions/Playing/Progress", "POST", Summary = "Reports playback progress within a session")] - public class ReportPlaybackProgress : PlaybackProgressInfo, IReturnVoid - { - } - - [Route("/Sessions/Playing/Ping", "POST", Summary = "Pings a playback session")] - public class PingPlaybackSession : IReturnVoid - { - [ApiMember(Name = "PlaySessionId", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] - public string PlaySessionId { get; set; } - } - - [Route("/Sessions/Playing/Stopped", "POST", Summary = "Reports playback has stopped within a session")] - public class ReportPlaybackStopped : PlaybackStopInfo, IReturnVoid - { - } - - /// <summary> - /// Class OnPlaybackStart - /// </summary> - [Route("/Users/{UserId}/PlayingItems/{Id}", "POST", Summary = "Reports that a user has begun playing an item")] - public class OnPlaybackStart : IReturnVoid - { - /// <summary> - /// Gets or sets the user id. - /// </summary> - /// <value>The user id.</value> - [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public string UserId { get; set; } - - /// <summary> - /// Gets or sets the id. - /// </summary> - /// <value>The id.</value> - [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public string Id { get; set; } - - [ApiMember(Name = "MediaSourceId", Description = "The id of the MediaSource", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] - public string MediaSourceId { get; set; } - - /// <summary> - /// Gets or sets a value indicating whether this <see cref="UpdateUserItemRating" /> is likes. - /// </summary> - /// <value><c>true</c> if likes; otherwise, <c>false</c>.</value> - [ApiMember(Name = "CanSeek", Description = "Indicates if the client can seek", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "POST")] - public bool CanSeek { get; set; } - - [ApiMember(Name = "AudioStreamIndex", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "POST")] - public int? AudioStreamIndex { get; set; } - - [ApiMember(Name = "SubtitleStreamIndex", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "POST")] - public int? SubtitleStreamIndex { get; set; } - - [ApiMember(Name = "PlayMethod", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] - public PlayMethod PlayMethod { get; set; } - - [ApiMember(Name = "LiveStreamId", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] - public string LiveStreamId { get; set; } - - [ApiMember(Name = "PlaySessionId", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] - public string PlaySessionId { get; set; } - } - - /// <summary> - /// Class OnPlaybackProgress - /// </summary> - [Route("/Users/{UserId}/PlayingItems/{Id}/Progress", "POST", Summary = "Reports a user's playback progress")] - public class OnPlaybackProgress : IReturnVoid - { - /// <summary> - /// Gets or sets the user id. - /// </summary> - /// <value>The user id.</value> - [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public string UserId { get; set; } - - /// <summary> - /// Gets or sets the id. - /// </summary> - /// <value>The id.</value> - [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public string Id { get; set; } - - [ApiMember(Name = "MediaSourceId", Description = "The id of the MediaSource", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] - public string MediaSourceId { get; set; } - - /// <summary> - /// Gets or sets the position ticks. - /// </summary> - /// <value>The position ticks.</value> - [ApiMember(Name = "PositionTicks", Description = "Optional. The current position, in ticks. 1 tick = 10000 ms", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "POST")] - public long? PositionTicks { get; set; } - - [ApiMember(Name = "IsPaused", Description = "Indicates if the player is paused.", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "POST")] - public bool IsPaused { get; set; } - - [ApiMember(Name = "IsMuted", Description = "Indicates if the player is muted.", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "POST")] - public bool IsMuted { get; set; } - - [ApiMember(Name = "AudioStreamIndex", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "POST")] - public int? AudioStreamIndex { get; set; } - - [ApiMember(Name = "SubtitleStreamIndex", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "POST")] - public int? SubtitleStreamIndex { get; set; } - - [ApiMember(Name = "VolumeLevel", Description = "Scale of 0-100", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "POST")] - public int? VolumeLevel { get; set; } - - [ApiMember(Name = "PlayMethod", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] - public PlayMethod PlayMethod { get; set; } - - [ApiMember(Name = "LiveStreamId", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] - public string LiveStreamId { get; set; } - - [ApiMember(Name = "PlaySessionId", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] - public string PlaySessionId { get; set; } - - [ApiMember(Name = "RepeatMode", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] - public RepeatMode RepeatMode { get; set; } - } - - /// <summary> - /// Class OnPlaybackStopped - /// </summary> - [Route("/Users/{UserId}/PlayingItems/{Id}", "DELETE", Summary = "Reports that a user has stopped playing an item")] - public class OnPlaybackStopped : IReturnVoid - { - /// <summary> - /// Gets or sets the user id. - /// </summary> - /// <value>The user id.</value> - [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] - public string UserId { get; set; } - - /// <summary> - /// Gets or sets the id. - /// </summary> - /// <value>The id.</value> - [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] - public string Id { get; set; } - - [ApiMember(Name = "MediaSourceId", Description = "The id of the MediaSource", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "DELETE")] - public string MediaSourceId { get; set; } - - [ApiMember(Name = "NextMediaType", Description = "The next media type that will play", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "DELETE")] - public string NextMediaType { get; set; } - - /// <summary> - /// Gets or sets the position ticks. - /// </summary> - /// <value>The position ticks.</value> - [ApiMember(Name = "PositionTicks", Description = "Optional. The position, in ticks, where playback stopped. 1 tick = 10000 ms", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "DELETE")] - public long? PositionTicks { get; set; } - - [ApiMember(Name = "LiveStreamId", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] - public string LiveStreamId { get; set; } - - [ApiMember(Name = "PlaySessionId", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] - public string PlaySessionId { get; set; } - } - - [Authenticated] - public class PlaystateService : BaseApiService - { - private readonly IUserManager _userManager; - private readonly IUserDataManager _userDataRepository; - private readonly ILibraryManager _libraryManager; - private readonly ISessionManager _sessionManager; - private readonly ISessionContext _sessionContext; - private readonly IAuthorizationContext _authContext; - - public PlaystateService(IUserManager userManager, IUserDataManager userDataRepository, ILibraryManager libraryManager, ISessionManager sessionManager, ISessionContext sessionContext, IAuthorizationContext authContext) - { - _userManager = userManager; - _userDataRepository = userDataRepository; - _libraryManager = libraryManager; - _sessionManager = sessionManager; - _sessionContext = sessionContext; - _authContext = authContext; - } - - /// <summary> - /// Posts the specified request. - /// </summary> - /// <param name="request">The request.</param> - public async Task<object> Post(MarkPlayedItem request) - { - var result = await MarkPlayed(request).ConfigureAwait(false); - - return ToOptimizedResult(result); - } - - private async Task<UserItemDataDto> MarkPlayed(MarkPlayedItem request) - { - var user = _userManager.GetUserById(request.UserId); - - DateTime? datePlayed = null; - - if (!string.IsNullOrEmpty(request.DatePlayed)) - { - datePlayed = DateTime.ParseExact(request.DatePlayed, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); - } - - var session = await GetSession(_sessionContext).ConfigureAwait(false); - - var dto = await UpdatePlayedStatus(user, request.Id, true, datePlayed).ConfigureAwait(false); - - foreach (var additionalUserInfo in session.AdditionalUsers) - { - var additionalUser = _userManager.GetUserById(additionalUserInfo.UserId); - - await UpdatePlayedStatus(additionalUser, request.Id, true, datePlayed).ConfigureAwait(false); - } - - return dto; - } - - private PlayMethod ValidatePlayMethod(PlayMethod method, string playSessionId) - { - if (method == PlayMethod.Transcode) - { - var job = string.IsNullOrWhiteSpace(playSessionId) ? null : ApiEntryPoint.Instance.GetTranscodingJob(playSessionId); - if (job == null) - { - return PlayMethod.DirectPlay; - } - } - - return method; - } - - /// <summary> - /// Posts the specified request. - /// </summary> - /// <param name="request">The request.</param> - public void Post(OnPlaybackStart request) - { - Post(new ReportPlaybackStart - { - CanSeek = request.CanSeek, - ItemId = request.Id, - MediaSourceId = request.MediaSourceId, - AudioStreamIndex = request.AudioStreamIndex, - SubtitleStreamIndex = request.SubtitleStreamIndex, - PlayMethod = request.PlayMethod, - PlaySessionId = request.PlaySessionId, - LiveStreamId = request.LiveStreamId - }); - } - - public void Post(ReportPlaybackStart request) - { - request.PlayMethod = ValidatePlayMethod(request.PlayMethod, request.PlaySessionId); - - request.SessionId = GetSession(_sessionContext).Result.Id; - - var task = _sessionManager.OnPlaybackStart(request); - - Task.WaitAll(task); - } - - /// <summary> - /// Posts the specified request. - /// </summary> - /// <param name="request">The request.</param> - public void Post(OnPlaybackProgress request) - { - Post(new ReportPlaybackProgress - { - ItemId = request.Id, - PositionTicks = request.PositionTicks, - IsMuted = request.IsMuted, - IsPaused = request.IsPaused, - MediaSourceId = request.MediaSourceId, - AudioStreamIndex = request.AudioStreamIndex, - SubtitleStreamIndex = request.SubtitleStreamIndex, - VolumeLevel = request.VolumeLevel, - PlayMethod = request.PlayMethod, - PlaySessionId = request.PlaySessionId, - LiveStreamId = request.LiveStreamId, - RepeatMode = request.RepeatMode - }); - } - - public void Post(ReportPlaybackProgress request) - { - request.PlayMethod = ValidatePlayMethod(request.PlayMethod, request.PlaySessionId); - - request.SessionId = GetSession(_sessionContext).Result.Id; - - var task = _sessionManager.OnPlaybackProgress(request); - - Task.WaitAll(task); - } - - public void Post(PingPlaybackSession request) - { - ApiEntryPoint.Instance.PingTranscodingJob(request.PlaySessionId, null); - } - - /// <summary> - /// Posts the specified request. - /// </summary> - /// <param name="request">The request.</param> - public void Delete(OnPlaybackStopped request) - { - Post(new ReportPlaybackStopped - { - ItemId = request.Id, - PositionTicks = request.PositionTicks, - MediaSourceId = request.MediaSourceId, - PlaySessionId = request.PlaySessionId, - LiveStreamId = request.LiveStreamId, - NextMediaType = request.NextMediaType - }); - } - - public void Post(ReportPlaybackStopped request) - { - Logger.Debug("ReportPlaybackStopped PlaySessionId: {0}", request.PlaySessionId ?? string.Empty); - - if (!string.IsNullOrWhiteSpace(request.PlaySessionId)) - { - ApiEntryPoint.Instance.KillTranscodingJobs(_authContext.GetAuthorizationInfo(Request).DeviceId, request.PlaySessionId, s => true); - } - - request.SessionId = GetSession(_sessionContext).Result.Id; - - var task = _sessionManager.OnPlaybackStopped(request); - - Task.WaitAll(task); - } - - /// <summary> - /// Deletes the specified request. - /// </summary> - /// <param name="request">The request.</param> - public object Delete(MarkUnplayedItem request) - { - var task = MarkUnplayed(request); - - return ToOptimizedResult(task.Result); - } - - private async Task<UserItemDataDto> MarkUnplayed(MarkUnplayedItem request) - { - var user = _userManager.GetUserById(request.UserId); - - var session = await GetSession(_sessionContext).ConfigureAwait(false); - - var dto = await UpdatePlayedStatus(user, request.Id, false, null).ConfigureAwait(false); - - foreach (var additionalUserInfo in session.AdditionalUsers) - { - var additionalUser = _userManager.GetUserById(additionalUserInfo.UserId); - - await UpdatePlayedStatus(additionalUser, request.Id, false, null).ConfigureAwait(false); - } - - return dto; - } - - /// <summary> - /// Updates the played status. - /// </summary> - /// <param name="user">The user.</param> - /// <param name="itemId">The item id.</param> - /// <param name="wasPlayed">if set to <c>true</c> [was played].</param> - /// <param name="datePlayed">The date played.</param> - /// <returns>Task.</returns> - private async Task<UserItemDataDto> UpdatePlayedStatus(User user, string itemId, bool wasPlayed, DateTime? datePlayed) - { - var item = _libraryManager.GetItemById(itemId); - - if (wasPlayed) - { - await item.MarkPlayed(user, datePlayed, true).ConfigureAwait(false); - } - else - { - await item.MarkUnplayed(user).ConfigureAwait(false); - } - - return _userDataRepository.GetUserDataDto(item, user); - } - } -}
\ No newline at end of file diff --git a/MediaBrowser.Api/UserLibrary/StudiosService.cs b/MediaBrowser.Api/UserLibrary/StudiosService.cs index 7ac1264e8..f10cccbb1 100644 --- a/MediaBrowser.Api/UserLibrary/StudiosService.cs +++ b/MediaBrowser.Api/UserLibrary/StudiosService.cs @@ -103,11 +103,9 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="request">The request.</param> /// <param name="items">The items.</param> /// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns> - protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items) + protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IList<BaseItem> items) { - var itemsList = items.Where(i => i.Studios != null).ToList(); - - return itemsList + return items .SelectMany(i => i.Studios) .DistinctNames() .Select(name => LibraryManager.GetStudio(name)); diff --git a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs index 4bb3de882..1bbc740c0 100644 --- a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs +++ b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs @@ -12,7 +12,6 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Controller.Entities.Audio; -using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Services; @@ -58,7 +57,7 @@ namespace MediaBrowser.Api.UserLibrary /// Class GetIntros /// </summary> [Route("/Users/{UserId}/Items/{Id}/Intros", "GET", Summary = "Gets intros to play before the main media item plays")] - public class GetIntros : IReturn<ItemsResult> + public class GetIntros : IReturn<QueryResult<BaseItemDto>> { /// <summary> /// Gets or sets the user id. @@ -170,7 +169,7 @@ namespace MediaBrowser.Api.UserLibrary /// Class GetLocalTrailers /// </summary> [Route("/Users/{UserId}/Items/{Id}/LocalTrailers", "GET", Summary = "Gets local trailers for an item")] - public class GetLocalTrailers : IReturn<List<BaseItemDto>> + public class GetLocalTrailers : IReturn<BaseItemDto[]> { /// <summary> /// Gets or sets the user id. @@ -191,7 +190,7 @@ namespace MediaBrowser.Api.UserLibrary /// Class GetSpecialFeatures /// </summary> [Route("/Users/{UserId}/Items/{Id}/SpecialFeatures", "GET", Summary = "Gets special features for an item")] - public class GetSpecialFeatures : IReturn<List<BaseItemDto>> + public class GetSpecialFeatures : IReturn<BaseItemDto[]> { /// <summary> /// Gets or sets the user id. @@ -209,7 +208,7 @@ namespace MediaBrowser.Api.UserLibrary } [Route("/Users/{UserId}/Items/Latest", "GET", Summary = "Gets latest media")] - public class GetLatestMedia : IReturn<List<BaseItemDto>>, IHasDtoOptions + public class GetLatestMedia : IReturn<BaseItemDto[]>, IHasDtoOptions { /// <summary> /// Gets or sets the user id. @@ -312,7 +311,7 @@ namespace MediaBrowser.Api.UserLibrary var list = _userViewManager.GetLatestItems(new LatestItemsQuery { GroupItems = request.GroupItems, - IncludeItemTypes = (request.IncludeItemTypes ?? string.Empty).Split(',').Where(i => !string.IsNullOrWhiteSpace(i)).ToArray(), + IncludeItemTypes = ApiEntryPoint.Split(request.IncludeItemTypes, ',', true), IsPlayed = request.IsPlayed, Limit = request.Limit, ParentId = request.ParentId, @@ -337,10 +336,10 @@ namespace MediaBrowser.Api.UserLibrary return dto; }); - return ToOptimizedResult(dtos.ToList()); + return ToOptimizedResult(dtos.ToArray()); } - private List<BaseItemDto> GetAsync(GetSpecialFeatures request) + private BaseItemDto[] GetAsync(GetSpecialFeatures request) { var user = _userManager.GetUserById(request.UserId); @@ -363,7 +362,7 @@ namespace MediaBrowser.Api.UserLibrary .Where(i => i.ParentIndexNumber.HasValue && i.ParentIndexNumber.Value == 0) .Select(i => _dtoService.GetBaseItemDto(i, dtoOptions, currentUser)); - return dtos.ToList(); + return dtos.ToArray(); } var movie = item as IHasSpecialFeatures; @@ -378,10 +377,10 @@ namespace MediaBrowser.Api.UserLibrary .OrderBy(i => i.SortName) .Select(i => _dtoService.GetBaseItemDto(i, dtoOptions, user, item)); - return dtos.ToList(); + return dtos.ToArray(); } - return new List<BaseItemDto>(); + return new BaseItemDto[] { }; } /// <summary> @@ -395,19 +394,24 @@ namespace MediaBrowser.Api.UserLibrary var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _libraryManager.GetItemById(request.Id); - var trailerIds = new List<Guid>(); + List<Guid> trailerIds = null; var hasTrailers = item as IHasTrailers; if (hasTrailers != null) { trailerIds = hasTrailers.GetTrailerIds(); } + else + { + trailerIds = new List<Guid>(); + } var dtoOptions = GetDtoOptions(_authContext, request); var dtos = trailerIds .Select(_libraryManager.GetItemById) - .Select(i => _dtoService.GetBaseItemDto(i, dtoOptions, user, item)); + .Select(i => _dtoService.GetBaseItemDto(i, dtoOptions, user, item)) + .ToArray(); return ToOptimizedSerializedResultUsingCache(dtos); } @@ -486,10 +490,9 @@ namespace MediaBrowser.Api.UserLibrary var dtoOptions = GetDtoOptions(_authContext, request); - var dtos = items.Select(i => _dtoService.GetBaseItemDto(i, dtoOptions, user)) - .ToArray(); + var dtos = items.Select(i => _dtoService.GetBaseItemDto(i, dtoOptions, user)).ToArray(); - var result = new ItemsResult + var result = new QueryResult<BaseItemDto> { Items = dtos, TotalRecordCount = dtos.Length @@ -502,9 +505,9 @@ namespace MediaBrowser.Api.UserLibrary /// Posts the specified request. /// </summary> /// <param name="request">The request.</param> - public async Task<object> Post(MarkFavoriteItem request) + public object Post(MarkFavoriteItem request) { - var dto = await MarkFavorite(request.UserId, request.Id, true).ConfigureAwait(false); + var dto = MarkFavorite(request.UserId, request.Id, true); return ToOptimizedResult(dto); } @@ -515,7 +518,7 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="request">The request.</param> public object Delete(UnmarkFavoriteItem request) { - var dto = MarkFavorite(request.UserId, request.Id, false).Result; + var dto = MarkFavorite(request.UserId, request.Id, false); return ToOptimizedResult(dto); } @@ -526,8 +529,7 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="userId">The user id.</param> /// <param name="itemId">The item id.</param> /// <param name="isFavorite">if set to <c>true</c> [is favorite].</param> - /// <returns>Task{UserItemDataDto}.</returns> - private async Task<UserItemDataDto> MarkFavorite(string userId, string itemId, bool isFavorite) + private UserItemDataDto MarkFavorite(string userId, string itemId, bool isFavorite) { var user = _userManager.GetUserById(userId); @@ -539,7 +541,7 @@ namespace MediaBrowser.Api.UserLibrary // Set favorite status data.IsFavorite = isFavorite; - await _userDataRepository.SaveUserData(user.Id, item, data, UserDataSaveReason.UpdateUserRating, CancellationToken.None).ConfigureAwait(false); + _userDataRepository.SaveUserData(user.Id, item, data, UserDataSaveReason.UpdateUserRating, CancellationToken.None); return _userDataRepository.GetUserDataDto(item, user); } @@ -550,7 +552,7 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="request">The request.</param> public object Delete(DeleteUserItemRating request) { - var dto = UpdateUserItemRating(request.UserId, request.Id, null).Result; + var dto = UpdateUserItemRating(request.UserId, request.Id, null); return ToOptimizedResult(dto); } @@ -559,9 +561,9 @@ namespace MediaBrowser.Api.UserLibrary /// Posts the specified request. /// </summary> /// <param name="request">The request.</param> - public async Task<object> Post(UpdateUserItemRating request) + public object Post(UpdateUserItemRating request) { - var dto = await UpdateUserItemRating(request.UserId, request.Id, request.Likes).ConfigureAwait(false); + var dto = UpdateUserItemRating(request.UserId, request.Id, request.Likes); return ToOptimizedResult(dto); } @@ -572,8 +574,7 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="userId">The user id.</param> /// <param name="itemId">The item id.</param> /// <param name="likes">if set to <c>true</c> [likes].</param> - /// <returns>Task{UserItemDataDto}.</returns> - private async Task<UserItemDataDto> UpdateUserItemRating(string userId, string itemId, bool? likes) + private UserItemDataDto UpdateUserItemRating(string userId, string itemId, bool? likes) { var user = _userManager.GetUserById(userId); @@ -584,7 +585,7 @@ namespace MediaBrowser.Api.UserLibrary data.Likes = likes; - await _userDataRepository.SaveUserData(user.Id, item, data, UserDataSaveReason.UpdateUserRating, CancellationToken.None).ConfigureAwait(false); + _userDataRepository.SaveUserData(user.Id, item, data, UserDataSaveReason.UpdateUserRating, CancellationToken.None); return _userDataRepository.GetUserDataDto(item, user); } diff --git a/MediaBrowser.Api/UserLibrary/UserViewsService.cs b/MediaBrowser.Api/UserLibrary/UserViewsService.cs index 3ed5166a4..096157e47 100644 --- a/MediaBrowser.Api/UserLibrary/UserViewsService.cs +++ b/MediaBrowser.Api/UserLibrary/UserViewsService.cs @@ -12,6 +12,7 @@ using System.Threading; using System.Threading.Tasks; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Services; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Api.UserLibrary { @@ -32,7 +33,7 @@ namespace MediaBrowser.Api.UserLibrary } [Route("/Users/{UserId}/GroupingOptions", "GET")] - public class GetGroupingOptions : IReturn<List<SpecialViewOption>> + public class GetGroupingOptions : IReturn<SpecialViewOption[]> { /// <summary> /// Gets or sets the user id. @@ -84,10 +85,13 @@ namespace MediaBrowser.Api.UserLibrary var folders = await _userViewManager.GetUserViews(query, CancellationToken.None).ConfigureAwait(false); var dtoOptions = GetDtoOptions(_authContext, request); - dtoOptions.Fields.Add(ItemFields.PrimaryImageAspectRatio); - dtoOptions.Fields.Add(ItemFields.DisplayPreferencesId); - dtoOptions.Fields.Remove(ItemFields.SyncInfo); - dtoOptions.Fields.Remove(ItemFields.BasicSyncInfo); + var fields = dtoOptions.Fields.ToList(); + + fields.Add(ItemFields.PrimaryImageAspectRatio); + fields.Add(ItemFields.DisplayPreferencesId); + fields.Remove(ItemFields.SyncInfo); + fields.Remove(ItemFields.BasicSyncInfo); + dtoOptions.Fields = fields.ToArray(fields.Count); var user = _userManager.GetUserById(request.UserId); @@ -107,13 +111,10 @@ namespace MediaBrowser.Api.UserLibrary { var user = _userManager.GetUserById(request.UserId); - var views = user.RootFolder + var list = user.RootFolder .GetChildren(user, true) .OfType<Folder>() .Where(UserView.IsEligibleForGrouping) - .ToList(); - - var list = views .Select(i => new SpecialViewOption { Name = i.Name, @@ -121,7 +122,7 @@ namespace MediaBrowser.Api.UserLibrary }) .OrderBy(i => i.Name) - .ToList(); + .ToArray(); return ToOptimizedResult(list); } diff --git a/MediaBrowser.Api/UserLibrary/YearsService.cs b/MediaBrowser.Api/UserLibrary/YearsService.cs index 1059b72cb..db622a9b3 100644 --- a/MediaBrowser.Api/UserLibrary/YearsService.cs +++ b/MediaBrowser.Api/UserLibrary/YearsService.cs @@ -96,11 +96,9 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="request">The request.</param> /// <param name="items">The items.</param> /// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns> - protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items) + protected override IEnumerable<BaseItem> GetAllItems(GetItemsByName request, IList<BaseItem> items) { - var itemsList = items.Where(i => i.ProductionYear != null).ToList(); - - return itemsList + return items .Select(i => i.ProductionYear ?? 0) .Where(i => i > 0) .Distinct() |
