diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-10-06 19:58:46 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-10-06 19:58:46 -0400 |
| commit | f02f3222085311b2a2cacab6642ad987a4176e65 (patch) | |
| tree | 9f317e5a3f087d4b4c5e523a8d8552d7d248567e /MediaBrowser.Api/UserLibrary/ItemsService.cs | |
| parent | a9eed234ba2a366fe014f0cc6f462c3764528948 (diff) | |
remove mono compiler directives
Diffstat (limited to 'MediaBrowser.Api/UserLibrary/ItemsService.cs')
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/ItemsService.cs | 710 |
1 files changed, 457 insertions, 253 deletions
diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index 2ac4f5e63..011864d35 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -16,6 +16,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; +using System.Threading.Tasks; namespace MediaBrowser.Api.UserLibrary { @@ -289,9 +290,9 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <param name="request">The request.</param> /// <returns>System.Object.</returns> - public object Get(GetItems request) + public async Task<object> Get(GetItems request) { - var result = GetItems(request); + var result = await GetItems(request).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(result); } @@ -301,16 +302,27 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <param name="request">The request.</param> /// <returns>Task{ItemsResult}.</returns> - private ItemsResult GetItems(GetItems request) + private async Task<ItemsResult> GetItems(GetItems request) { var parentItem = string.IsNullOrEmpty(request.ParentId) ? null : _libraryManager.GetItemById(request.ParentId); var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null; - var items = GetItemsToSerialize(request, user, parentItem); + var result = await GetItemsToSerialize(request, user, parentItem).ConfigureAwait(false); - items = items.AsParallel(); + var isFiltered = result.Item2; - items = ApplyAdditionalFilters(request, items, user); + if (isFiltered) + { + var currentFields = request.GetItemFields().ToList(); + + return new ItemsResult + { + TotalRecordCount = result.Item1.TotalRecordCount, + Items = result.Item1.Items.Select(i => _dtoService.GetBaseItemDto(i, currentFields, user)).ToArray() + }; + } + + var items = result.Item1.Items.Where(i => ApplyAdditionalFilters(request, i, user, false)); // Apply filters // Run them starting with the ones that are likely to reduce the list the most @@ -321,16 +333,14 @@ namespace MediaBrowser.Api.UserLibrary items = FilterVirtualEpisodes(request, items, user); - items = items.AsEnumerable(); - if (CollapseBoxSetItems(request, parentItem, user)) { items = _collectionManager.CollapseItemsWithinBoxSets(items, user); } items = ApplyPostCollectionCollapseFilters(request, items, user); - - items = ApplySortOrder(request, items, user, _libraryManager); + + items = _libraryManager.Sort(items, user, request.GetOrderBy(), request.SortOrder ?? SortOrder.Ascending); // This must be the last filter if (!string.IsNullOrEmpty(request.AdjacentTo)) @@ -387,8 +397,7 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="user">The user.</param> /// <param name="parentItem">The parent item.</param> /// <returns>IEnumerable{BaseItem}.</returns> - /// <exception cref="System.InvalidOperationException"></exception> - private IEnumerable<BaseItem> GetItemsToSerialize(GetItems request, User user, BaseItem parentItem) + private async Task<Tuple<QueryResult<BaseItem>, bool>> GetItemsToSerialize(GetItems request, User user, BaseItem parentItem) { var item = string.IsNullOrEmpty(request.ParentId) ? user == null ? _libraryManager.RootFolder : user.RootFolder : @@ -406,19 +415,40 @@ namespace MediaBrowser.Api.UserLibrary else if (request.Recursive) { - items = user == null ? - ((Folder)item).RecursiveChildren : - ((Folder)item).GetRecursiveChildren(user); + if (user == null) + { + items = ((Folder)item).RecursiveChildren; + + items = _libraryManager.ReplaceVideosWithPrimaryVersions(items); + } + else + { + var result = await ((Folder)item).GetItems(GetItemsQuery(request, user)); - items = _libraryManager.ReplaceVideosWithPrimaryVersions(items); + return new Tuple<QueryResult<BaseItem>, bool>(result, true); + } } else { - items = user == null ? - ((Folder)item).Children : - ((Folder)item).GetChildren(user, true); + if (user == null) + { + items = ((Folder)item).Children; + + items = _libraryManager.ReplaceVideosWithPrimaryVersions(items); + } + else + { + var userRoot = item as UserRootFolder; + + if (userRoot == null) + { + var result = await ((Folder)item).GetItems(GetItemsQuery(request, user)); + + return new Tuple<QueryResult<BaseItem>, bool>(result, true); + } - items = _libraryManager.ReplaceVideosWithPrimaryVersions(items); + items = ((Folder)item).GetChildren(user, true); + } } if (request.IncludeIndexContainers) @@ -430,25 +460,72 @@ namespace MediaBrowser.Api.UserLibrary list.AddRange(containers); - return list.Distinct(); + items = list.Distinct(); } - return items; + return new Tuple<QueryResult<BaseItem>, bool>(new QueryResult<BaseItem> + { + Items = items.ToArray() + + }, false); } - /// <summary> - /// Applies sort order - /// </summary> - /// <param name="request">The request.</param> - /// <param name="items">The items.</param> - /// <param name="user">The user.</param> - /// <param name="libraryManager">The library manager.</param> - /// <returns>IEnumerable{BaseItem}.</returns> - internal static IEnumerable<BaseItem> ApplySortOrder(BaseItemsRequest request, IEnumerable<BaseItem> items, User user, ILibraryManager libraryManager) + private InternalItemsQuery GetItemsQuery(GetItems request, User user) { - var orderBy = request.GetOrderBy().ToList(); + var query = new InternalItemsQuery + { + User = user, + IsPlayed = request.IsPlayed, + MediaTypes = request.GetMediaTypes(), + IncludeItemTypes = request.GetIncludeItemTypes(), + ExcludeItemTypes = request.GetExcludeItemTypes(), + Recursive = request.Recursive, + SortBy = request.GetOrderBy(), + SortOrder = request.SortOrder ?? SortOrder.Ascending, + + Filter = (i, u) => ApplyAdditionalFilters(request, i, u, true), + + Limit = request.Limit, + StartIndex = request.StartIndex + }; + + foreach (var filter in request.GetFilters()) + { + switch (filter) + { + case ItemFilter.Dislikes: + query.IsLiked = false; + break; + case ItemFilter.IsFavorite: + query.IsFavorite = true; + break; + case ItemFilter.IsFavoriteOrLikes: + query.IsFavoriteOrLiked = true; + break; + case ItemFilter.IsFolder: + query.IsFolder = true; + break; + case ItemFilter.IsNotFolder: + query.IsFolder = false; + break; + case ItemFilter.IsPlayed: + query.IsPlayed = true; + break; + case ItemFilter.IsRecentlyAdded: + break; + case ItemFilter.IsResumable: + query.IsResumable = true; + break; + case ItemFilter.IsUnplayed: + query.IsPlayed = false; + break; + case ItemFilter.Likes: + query.IsLiked = true; + break; + } + } - return orderBy.Count == 0 ? items : libraryManager.Sort(items, user, orderBy, request.SortOrder ?? SortOrder.Ascending); + return query; } /// <summary> @@ -648,36 +725,70 @@ namespace MediaBrowser.Api.UserLibrary return items; } - /// <summary> - /// Applies the additional filters. - /// </summary> - /// <param name="request">The request.</param> - /// <param name="items">The items.</param> - /// <returns>IEnumerable{BaseItem}.</returns> - private IEnumerable<BaseItem> ApplyAdditionalFilters(GetItems request, IEnumerable<BaseItem> items, User user) + private bool ApplyAdditionalFilters(GetItems request, BaseItem i, User user, bool isPreFiltered) { + if (!isPreFiltered) + { + var mediaTypes = request.GetMediaTypes(); + if (mediaTypes.Length > 0) + { + if (!(!string.IsNullOrEmpty(i.MediaType) && mediaTypes.Contains(i.MediaType, StringComparer.OrdinalIgnoreCase))) + { + return false; + } + } + + if (request.IsPlayed.HasValue) + { + var val = request.IsPlayed.Value; + if (i.IsPlayed(user) != val) + { + return false; + } + } + + // Exclude item types + var excluteItemTypes = request.GetExcludeItemTypes(); + if (excluteItemTypes.Length > 0 && excluteItemTypes.Contains(i.GetType().Name, StringComparer.OrdinalIgnoreCase)) + { + return false; + } + + // Include item types + var includeItemTypes = request.GetIncludeItemTypes(); + if (includeItemTypes.Length > 0 && !includeItemTypes.Contains(i.GetType().Name, StringComparer.OrdinalIgnoreCase)) + { + return false; + } + } + if (request.MinCommunityRating.HasValue) { var val = request.MinCommunityRating.Value; - items = items.Where(i => i.CommunityRating.HasValue && i.CommunityRating >= val); + if (!(i.CommunityRating.HasValue && i.CommunityRating >= val)) + { + return false; + } } if (request.MinCriticRating.HasValue) { var val = request.MinCriticRating.Value; - items = items.Where(i => - { - var hasCriticRating = i as IHasCriticRating; + var hasCriticRating = i as IHasCriticRating; - if (hasCriticRating != null) + if (hasCriticRating != null) + { + if (!(hasCriticRating.CriticRating.HasValue && hasCriticRating.CriticRating >= val)) { - return hasCriticRating.CriticRating.HasValue && hasCriticRating.CriticRating >= val; + return false; } - + } + else + { return false; - }); + } } // Artists @@ -685,12 +796,12 @@ namespace MediaBrowser.Api.UserLibrary { var artists = request.Artists.Split('|'); - items = items.Where(i => - { - var audio = i as IHasArtist; + var audio = i as IHasArtist; - return audio != null && artists.Any(audio.HasArtist); - }); + if (!(audio != null && artists.Any(audio.HasArtist))) + { + return false; + } } // Albums @@ -698,37 +809,46 @@ namespace MediaBrowser.Api.UserLibrary { var albums = request.Albums.Split('|'); - items = items.Where(i => - { - var audio = i as Audio; + var audio = i as Audio; - if (audio != null) + if (audio != null) + { + if (!albums.Any(a => string.Equals(a, audio.Album, StringComparison.OrdinalIgnoreCase))) { - return albums.Any(a => string.Equals(a, audio.Album, StringComparison.OrdinalIgnoreCase)); + return false; } + } - var album = i as MusicAlbum; + var album = i as MusicAlbum; - if (album != null) + if (album != null) + { + if (!albums.Any(a => string.Equals(a, album.Name, StringComparison.OrdinalIgnoreCase))) { - return albums.Any(a => string.Equals(a, album.Name, StringComparison.OrdinalIgnoreCase)); + return false; } + } - var musicVideo = i as MusicVideo; + var musicVideo = i as MusicVideo; - if (musicVideo != null) + if (musicVideo != null) + { + if (!albums.Any(a => string.Equals(a, musicVideo.Album, StringComparison.OrdinalIgnoreCase))) { - return albums.Any(a => string.Equals(a, musicVideo.Album, StringComparison.OrdinalIgnoreCase)); + return false; } + } - return false; - }); + return false; } // Min index number if (request.MinIndexNumber.HasValue) { - items = items.Where(i => i.IndexNumber.HasValue && i.IndexNumber.Value >= request.MinIndexNumber.Value); + if (!(i.IndexNumber.HasValue && i.IndexNumber.Value >= request.MinIndexNumber.Value)) + { + return false; + } } // Min official rating @@ -738,24 +858,22 @@ namespace MediaBrowser.Api.UserLibrary if (level.HasValue) { - items = items.Where(i => + var rating = i.CustomRating; + + if (string.IsNullOrEmpty(rating)) { - var rating = i.CustomRating; + rating = i.OfficialRating; + } - if (string.IsNullOrEmpty(rating)) - { - rating = i.OfficialRating; - } + if (!string.IsNullOrEmpty(rating)) + { + var itemLevel = _localization.GetRatingLevel(rating); - if (string.IsNullOrEmpty(rating)) + if (!(!itemLevel.HasValue || itemLevel.Value >= level.Value)) { - return true; + return false; } - - var itemLevel = _localization.GetRatingLevel(rating); - - return !itemLevel.HasValue || itemLevel.Value >= level.Value; - }); + } } } @@ -766,60 +884,54 @@ namespace MediaBrowser.Api.UserLibrary if (level.HasValue) { - items = items.Where(i => + var rating = i.CustomRating; + + if (string.IsNullOrEmpty(rating)) { - var rating = i.CustomRating; + rating = i.OfficialRating; + } - if (string.IsNullOrEmpty(rating)) - { - rating = i.OfficialRating; - } + if (!string.IsNullOrEmpty(rating)) + { + var itemLevel = _localization.GetRatingLevel(rating); - if (string.IsNullOrEmpty(rating)) + if (!(!itemLevel.HasValue || itemLevel.Value <= level.Value)) { - return true; + return false; } - - var itemLevel = _localization.GetRatingLevel(rating); - - return !itemLevel.HasValue || itemLevel.Value <= level.Value; - }); + } } } - // Exclude item types - if (!string.IsNullOrEmpty(request.ExcludeItemTypes)) - { - var vals = request.ExcludeItemTypes.Split(','); - items = items.Where(f => !vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase)); - } - - // Include item types - if (!string.IsNullOrEmpty(request.IncludeItemTypes)) - { - var vals = request.IncludeItemTypes.Split(','); - items = items.Where(f => vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase)); - } - // LocationTypes if (!string.IsNullOrEmpty(request.LocationTypes)) { var vals = request.LocationTypes.Split(','); - items = items.Where(f => vals.Contains(f.LocationType.ToString(), StringComparer.OrdinalIgnoreCase)); + if (!vals.Contains(i.LocationType.ToString(), StringComparer.OrdinalIgnoreCase)) + { + return false; + } } // ExcludeLocationTypes if (!string.IsNullOrEmpty(request.ExcludeLocationTypes)) { var vals = request.ExcludeLocationTypes.Split(','); - items = items.Where(f => !vals.Contains(f.LocationType.ToString(), StringComparer.OrdinalIgnoreCase)); + if (vals.Contains(i.LocationType.ToString(), StringComparer.OrdinalIgnoreCase)) + { + return false; + } } if (!string.IsNullOrEmpty(request.AlbumArtistStartsWithOrGreater)) { - items = items.OfType<IHasAlbumArtist>() - .Where(i => string.Compare(request.AlbumArtistStartsWithOrGreater, i.AlbumArtists.FirstOrDefault(), StringComparison.CurrentCultureIgnoreCase) < 1) - .Cast<BaseItem>(); + var ok = new[] { i }.OfType<IHasAlbumArtist>() + .Any(p => string.Compare(request.AlbumArtistStartsWithOrGreater, p.AlbumArtists.FirstOrDefault(), StringComparison.CurrentCultureIgnoreCase) < 1); + + if (!ok) + { + return false; + } } // Filter by Series Status @@ -827,7 +939,12 @@ namespace MediaBrowser.Api.UserLibrary { var vals = request.SeriesStatus.Split(','); - items = items.OfType<Series>().Where(i => i.Status.HasValue && vals.Contains(i.Status.Value.ToString(), StringComparer.OrdinalIgnoreCase)); + var ok = new[] { i }.OfType<Series>().Any(p => p.Status.HasValue && vals.Contains(p.Status.Value.ToString(), StringComparer.OrdinalIgnoreCase)); + + if (!ok) + { + return false; + } } // Filter by Series AirDays @@ -835,13 +952,24 @@ namespace MediaBrowser.Api.UserLibrary { var days = request.AirDays.Split(',').Select(d => (DayOfWeek)Enum.Parse(typeof(DayOfWeek), d, true)); - items = items.OfType<Series>().Where(i => i.AirDays != null && days.Any(d => i.AirDays.Contains(d))); + var ok = new[] { i }.OfType<Series>().Any(p => p.AirDays != null && days.Any(d => p.AirDays.Contains(d))); + + if (!ok) + { + return false; + } } // Filter by Video3DFormat if (request.Is3D.HasValue) { - items = items.OfType<Video>().Where(i => request.Is3D.Value == i.Video3DFormat.HasValue); + var val = request.Is3D.Value; + var video = i as Video; + + if (video == null || val != video.Video3DFormat.HasValue) + { + return false; + } } // Filter by VideoType @@ -849,48 +977,60 @@ namespace MediaBrowser.Api.UserLibrary { var types = request.VideoTypes.Split(','); - items = items.OfType<Video>().Where(i => types.Contains(i.VideoType.ToString(), StringComparer.OrdinalIgnoreCase)); - } - - if (!string.IsNullOrEmpty(request.MediaTypes)) - { - var types = request.MediaTypes.Split(','); - - items = items.Where(i => !string.IsNullOrEmpty(i.MediaType) && types.Contains(i.MediaType, StringComparer.OrdinalIgnoreCase)); + var video = i as Video; + if (video == null || !types.Contains(video.VideoType.ToString(), StringComparer.OrdinalIgnoreCase)) + { + return false; + } } var imageTypes = request.GetImageTypes().ToList(); if (imageTypes.Count > 0) { - items = items.Where(item => imageTypes.Any(imageType => HasImage(item, imageType))); + if (!(imageTypes.Any(imageType => HasImage(i, imageType)))) + { + return false; + } } // Apply genre filter if (!string.IsNullOrEmpty(request.Genres)) { var vals = request.Genres.Split('|'); - items = items.Where(f => vals.Any(v => f.Genres.Contains(v, StringComparer.OrdinalIgnoreCase))); + if (!(vals.Any(v => i.Genres.Contains(v, StringComparer.OrdinalIgnoreCase)))) + { + return false; + } } // Apply genre filter if (!string.IsNullOrEmpty(request.AllGenres)) { var vals = request.AllGenres.Split('|'); - items = items.Where(f => vals.All(v => f.Genres.Contains(v, StringComparer.OrdinalIgnoreCase))); + if (!vals.All(v => i.Genres.Contains(v, StringComparer.OrdinalIgnoreCase))) + { + return false; + } } // Apply studio filter if (!string.IsNullOrEmpty(request.Studios)) { var vals = request.Studios.Split('|'); - items = items.Where(f => vals.Any(v => f.Studios.Contains(v, StringComparer.OrdinalIgnoreCase))); + if (!vals.Any(v => i.Studios.Contains(v, StringComparer.OrdinalIgnoreCase))) + { + return false; + } } // Apply year filter if (!string.IsNullOrEmpty(request.Years)) { var vals = request.Years.Split(',').Select(int.Parse).ToList(); - items = items.Where(f => f.ProductionYear.HasValue && vals.Contains(f.ProductionYear.Value)); + if (!(i.ProductionYear.HasValue && vals.Contains(i.ProductionYear.Value))) + { + return false; + } } // Apply person filter @@ -900,316 +1040,380 @@ namespace MediaBrowser.Api.UserLibrary if (string.IsNullOrEmpty(personTypes)) { - items = items.Where(item => item.People.Any(p => string.Equals(p.Name, request.Person, StringComparison.OrdinalIgnoreCase))); + if (!(i.People.Any(p => string.Equals(p.Name, request.Person, StringComparison.OrdinalIgnoreCase)))) + { + return false; + } } else { var types = personTypes.Split(','); - items = items.Where(item => + var ok = new[] { i }.Any(item => item.People != null && item.People.Any(p => p.Name.Equals(request.Person, StringComparison.OrdinalIgnoreCase) && (types.Contains(p.Type, StringComparer.OrdinalIgnoreCase) || types.Contains(p.Role, StringComparer.OrdinalIgnoreCase)))); + + if (!ok) + { + return false; + } } } if (request.HasTrailer.HasValue) { var val = request.HasTrailer.Value; - items = items.Where(i => + var trailerCount = 0; + + var hasTrailers = i as IHasTrailers; + if (hasTrailers != null) { - var trailerCount = 0; + trailerCount = hasTrailers.LocalTrailerIds.Count; + } - var hasTrailers = i as IHasTrailers; - if (hasTrailers != null) - { - trailerCount = hasTrailers.LocalTrailerIds.Count; - } + var ok = val ? trailerCount > 0 : trailerCount == 0; - return val ? trailerCount > 0 : trailerCount == 0; - }); + if (!ok) + { + return false; + } } if (request.HasThemeSong.HasValue) { var filterValue = request.HasThemeSong.Value; - items = items.Where(i => + var themeCount = 0; + var iHasThemeMedia = i as IHasThemeMedia; + + if (iHasThemeMedia != null) { - var themeCount = 0; - var iHasThemeMedia = i as IHasThemeMedia; + themeCount = iHasThemeMedia.ThemeSongIds.Count; + } + var ok = filterValue ? themeCount > 0 : themeCount == 0; - if (iHasThemeMedia != null) - { - themeCount = iHasThemeMedia.ThemeSongIds.Count; - } - return filterValue ? themeCount > 0 : themeCount == 0; - }); + if (!ok) + { + return false; + } } if (request.HasThemeVideo.HasValue) { var filterValue = request.HasThemeVideo.Value; - items = items.Where(i => + var themeCount = 0; + var iHasThemeMedia = i as IHasThemeMedia; + + if (iHasThemeMedia != null) { - var themeCount = 0; - var iHasThemeMedia = i as IHasThemeMedia; + themeCount = iHasThemeMedia.ThemeVideoIds.Count; + } + var ok = filterValue ? themeCount > 0 : themeCount == 0; - if (iHasThemeMedia != null) - { - themeCount = iHasThemeMedia.ThemeVideoIds.Count; - } - return filterValue ? themeCount > 0 : themeCount == 0; - }); + if (!ok) + { + return false; + } } if (request.MinPlayers.HasValue) { var filterValue = request.MinPlayers.Value; - items = items.Where(i => + var game = i as Game; + + if (game != null) { - var game = i as Game; + var players = game.PlayersSupported ?? 1; - if (game != null) - { - var players = game.PlayersSupported ?? 1; + var ok = players >= filterValue; - return players >= filterValue; + if (!ok) + { + return false; } - + } + else + { return false; - }); + } } if (request.MaxPlayers.HasValue) { var filterValue = request.MaxPlayers.Value; - items = items.Where(i => + var game = i as Game; + + if (game != null) { - var game = i as Game; + var players = game.PlayersSupported ?? 1; - if (game != null) - { - var players = game.PlayersSupported ?? 1; + var ok = players <= filterValue; - return players <= filterValue; + if (!ok) + { + return false; } - + } + else + { return false; - }); + } } if (request.HasSpecialFeature.HasValue) { var filterValue = request.HasSpecialFeature.Value; - items = items.Where(i => + var movie = i as IHasSpecialFeatures; + + if (movie != null) { - var movie = i as IHasSpecialFeatures; + var ok = filterValue + ? movie.SpecialFeatureIds.Count > 0 + : movie.SpecialFeatureIds.Count == 0; - if (movie != null) + if (!ok) { - return filterValue - ? movie.SpecialFeatureIds.Count > 0 - : movie.SpecialFeatureIds.Count == 0; + return false; } - + } + else + { return false; - }); + } } if (request.HasSubtitles.HasValue) { var val = request.HasSubtitles.Value; - items = items.OfType<Video>().Where(i => val == i.HasSubtitles); + var video = i as Video; + + if (video == null || val != video.HasSubtitles) + { + return false; + } } if (request.HasParentalRating.HasValue) { var val = request.HasParentalRating.Value; - items = items.Where(i => + var rating = i.CustomRating; + + if (string.IsNullOrEmpty(rating)) { - var rating = i.CustomRating; + rating = i.OfficialRating; + } + if (val) + { if (string.IsNullOrEmpty(rating)) { - rating = i.OfficialRating; + return false; } - - if (val) + } + else + { + if (!string.IsNullOrEmpty(rating)) { - return !string.IsNullOrEmpty(rating); + return false; } - - return string.IsNullOrEmpty(rating); - }); + } } if (request.IsHD.HasValue) { var val = request.IsHD.Value; - items = items.OfType<Video>().Where(i => i.IsHD == val); + var video = i as Video; + + if (video == null || val != video.IsHD) + { + return false; + } } if (request.IsInBoxSet.HasValue) { var val = request.IsHD.Value; - items = items.Where(i => i.Parents.OfType<BoxSet>().Any() == val); - } - - if (request.IsPlayed.HasValue) - { - var val = request.IsPlayed.Value; - items = items.Where(i => i.IsPlayed(user) == val); + if (i.Parents.OfType<BoxSet>().Any() != val) + { + return false; + } } if (request.IsUnidentified.HasValue) { var val = request.IsUnidentified.Value; - items = items.Where(i => i.IsUnidentified == val); + if (i.IsUnidentified != val) + { + return false; + } } if (request.IsLocked.HasValue) { var val = request.IsLocked.Value; - items = items.Where(i => i.IsLocked == val); + if (i.IsLocked != val) + { + return false; + } } if (request.ParentIndexNumber.HasValue) { var filterValue = request.ParentIndexNumber.Value; - items = items.Where(i => - { - var episode = i as Episode; + var episode = i as Episode; - if (episode != null) + if (episode != null) + { + if (episode.ParentIndexNumber.HasValue && episode.ParentIndexNumber.Value != filterValue) { - return episode.ParentIndexNumber.HasValue && episode.ParentIndexNumber.Value == filterValue; + return false; } + } - var song = i as Audio; + var song = i as Audio; - if (song != null) + if (song != null) + { + if (song.ParentIndexNumber.HasValue && song.ParentIndexNumber.Value != filterValue) { - return song.ParentIndexNumber.HasValue && song.ParentIndexNumber.Value == filterValue; + return false; } - - return true; - }); + } } if (request.AiredDuringSeason.HasValue) { - items = Series.FilterEpisodesBySeason(items.OfType<Episode>(), request.AiredDuringSeason.Value, true); + var episode = i as Episode; + + if (episode == null) + { + return false; + } + + if (!Series.FilterEpisodesBySeason(new[] { episode }, request.AiredDuringSeason.Value, true).Any()) + { + return false; + } } if (!string.IsNullOrEmpty(request.MinPremiereDate)) { var date = DateTime.Parse(request.MinPremiereDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime(); - items = items.Where(i => i.PremiereDate.HasValue && i.PremiereDate.Value >= date); + if (!(i.PremiereDate.HasValue && i.PremiereDate.Value >= date)) + { + return false; + } } if (!string.IsNullOrEmpty(request.MaxPremiereDate)) { var date = DateTime.Parse(request.MaxPremiereDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime(); - items = items.Where(i => i.PremiereDate.HasValue && i.PremiereDate.Value <= date); + if (!(i.PremiereDate.HasValue && i.PremiereDate.Value <= date)) + { + return false; + } } if (request.HasOverview.HasValue) { var filterValue = request.HasOverview.Value; - items = items.Where(i => - { - var hasValue = !string.IsNullOrEmpty(i.Overview); + var hasValue = !string.IsNullOrEmpty(i.Overview); - return hasValue == filterValue; - }); + if (hasValue != filterValue) + { + return false; + } } if (request.HasImdbId.HasValue) { var filterValue = request.HasImdbId.Value; - items = items.Where(i => - { - var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Imdb)); + var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Imdb)); - return hasValue == filterValue; - }); + if (hasValue != filterValue) + { + return false; + } } if (request.HasTmdbId.HasValue) { var filterValue = request.HasTmdbId.Value; - items = items.Where(i => - { - var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tmdb)); + var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tmdb)); - return hasValue == filterValue; - }); + if (hasValue != filterValue) + { + return false; + } } if (request.HasTvdbId.HasValue) { var filterValue = request.HasTvdbId.Value; - items = items.Where(i => - { - var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tvdb)); + var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tvdb)); - return hasValue == filterValue; - }); + if (hasValue != filterValue) + { + return false; + } } if (request.IsYearMismatched.HasValue) { var filterValue = request.IsYearMismatched.Value; - items = items.Where(i => IsYearMismatched(i) == filterValue); + if (IsYearMismatched(i) != filterValue) + { + return false; + } } if (request.HasOfficialRating.HasValue) { var filterValue = request.HasOfficialRating.Value; - items = items.Where(i => - { - var hasValue = !string.IsNullOrEmpty(i.OfficialRating); + var hasValue = !string.IsNullOrEmpty(i.OfficialRating); - return hasValue == filterValue; - }); + if (hasValue != filterValue) + { + return false; + } } if (request.IsPlaceHolder.HasValue) { var filterValue = request.IsPlaceHolder.Value; - items = items.Where(i => - { - var isPlaceHolder = false; + var isPlaceHolder = false; - var hasPlaceHolder = i as ISupportsPlaceHolders; + var hasPlaceHolder = i as ISupportsPlaceHolders; - if (hasPlaceHolder != null) - { - isPlaceHolder = hasPlaceHolder.IsPlaceHolder; - } + if (hasPlaceHolder != null) + { + isPlaceHolder = hasPlaceHolder.IsPlaceHolder; + } - return isPlaceHolder == filterValue; - }); + if (isPlaceHolder != filterValue) + { + return false; + } } - return items; + return true; } private IEnumerable<BaseItem> ApplyPostCollectionCollapseFilters(GetItems request, IEnumerable<BaseItem> items, User user) @@ -1230,7 +1434,7 @@ namespace MediaBrowser.Api.UserLibrary return items; } - + private bool IsYearMismatched(BaseItem item) { if (item.ProductionYear.HasValue) |
