From 95eaf88abd6a979b19f4ee998936ba6f2f4eef4b Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 9 Nov 2014 23:20:11 -0500 Subject: fixes #943 - Add web client filtering by genres, parental ratings, tags and years --- .../UserLibrary/BaseItemsByNameService.cs | 56 ++++++++++++++++++---- 1 file changed, 48 insertions(+), 8 deletions(-) (limited to 'MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs') diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs index 458cf8bae3..3ae53daf88 100644 --- a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs +++ b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs @@ -193,13 +193,6 @@ namespace MediaBrowser.Api.UserLibrary var filters = request.GetFilters().ToList(); - if (filters.Count == 0) - { - return items; - } - - items = items.AsParallel(); - if (filters.Contains(ItemFilter.Dislikes)) { items = items.Where(i => @@ -243,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; } + /// /// Filters the items. /// -- cgit v1.2.3