aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs')
-rw-r--r--MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs73
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;
}