diff options
Diffstat (limited to 'MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs')
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs | 73 |
1 files changed, 57 insertions, 16 deletions
diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs index c2b8069cb..9d211a419 100644 --- a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs +++ b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs @@ -3,6 +3,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Entities; using MediaBrowser.Model.Querying; using ServiceStack; using System; @@ -101,7 +102,7 @@ namespace MediaBrowser.Api.UserLibrary filteredItems = FilterByLibraryItems(request, filteredItems, user, libraryItems); - filteredItems = ItemsService.ApplySortOrder(request, filteredItems, user, LibraryManager).Cast<TItemType>(); + filteredItems = LibraryManager.Sort(filteredItems, user, request.GetOrderBy(), request.SortOrder ?? SortOrder.Ascending).Cast<TItemType>(); var ibnItemsArray = filteredItems.ToList(); @@ -126,11 +127,11 @@ namespace MediaBrowser.Api.UserLibrary } - var fields = request.GetItemFields().ToList(); - var tuples = ibnItems.Select(i => new Tuple<TItemType, List<BaseItem>>(i, i.GetTaggedItems(libraryItems).ToList())); - var dtos = tuples.Select(i => GetDto(i.Item1, user, fields, i.Item2)); + var dtoOptions = request.GetDtoOptions(); + + var dtos = tuples.Select(i => GetDto(i.Item1, user, dtoOptions, i.Item2)); result.Items = dtos.Where(i => i != null).ToArray(); @@ -187,18 +188,11 @@ namespace MediaBrowser.Api.UserLibrary var imageTypes = request.GetImageTypes().ToList(); if (imageTypes.Count > 0) { - items = items.Where(item => imageTypes.Any(imageType => ItemsService.HasImage(item, imageType))); + items = items.Where(item => imageTypes.Any(item.HasImage)); } var filters = request.GetFilters().ToList(); - if (filters.Count == 0) - { - return items; - } - - items = items.AsParallel(); - if (filters.Contains(ItemFilter.Dislikes)) { items = items.Where(i => @@ -242,9 +236,56 @@ namespace MediaBrowser.Api.UserLibrary }); } - return items.AsEnumerable(); + // Avoid implicitly captured closure + var currentRequest = request; + return items.Where(i => ApplyAdditionalFilters(currentRequest, i, user, false)); + } + + private bool ApplyAdditionalFilters(BaseItemsRequest request, BaseItem i, User user, bool isPreFiltered) + { + if (!isPreFiltered) + { + // Apply tag filter + var tags = request.GetTags(); + if (tags.Length > 0) + { + var hasTags = i as IHasTags; + if (hasTags == null) + { + return false; + } + if (!(tags.Any(v => hasTags.Tags.Contains(v, StringComparer.OrdinalIgnoreCase)))) + { + return false; + } + } + + // Apply official rating filter + var officialRatings = request.GetOfficialRatings(); + if (officialRatings.Length > 0 && !officialRatings.Contains(i.OfficialRating ?? string.Empty)) + { + return false; + } + + // Apply genre filter + var genres = request.GetGenres(); + if (genres.Length > 0 && !(genres.Any(v => i.Genres.Contains(v, StringComparer.OrdinalIgnoreCase)))) + { + return false; + } + + // Apply year filter + var years = request.GetYears(); + if (years.Length > 0 && !(i.ProductionYear.HasValue && years.Contains(i.ProductionYear.Value))) + { + return false; + } + } + + return true; } + /// <summary> /// Filters the items. /// </summary> @@ -291,12 +332,12 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <param name="item">The item.</param> /// <param name="user">The user.</param> - /// <param name="fields">The fields.</param> + /// <param name="options">The options.</param> /// <param name="libraryItems">The library items.</param> /// <returns>Task{DtoBaseItem}.</returns> - private BaseItemDto GetDto(TItemType item, User user, List<ItemFields> fields, List<BaseItem> libraryItems) + private BaseItemDto GetDto(TItemType item, User user, DtoOptions options, List<BaseItem> libraryItems) { - var dto = DtoService.GetItemByNameDto(item, fields, libraryItems, user); + var dto = DtoService.GetItemByNameDto(item, options, libraryItems, user); return dto; } |
