From f02f3222085311b2a2cacab6642ad987a4176e65 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 6 Oct 2014 19:58:46 -0400 Subject: remove mono compiler directives --- .../UserLibrary/BaseItemsByNameService.cs | 3 +- MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs | 17 +- MediaBrowser.Api/UserLibrary/ItemsService.cs | 710 +++++++++++++-------- MediaBrowser.Api/UserLibrary/PersonsService.cs | 11 +- 4 files changed, 482 insertions(+), 259 deletions(-) (limited to 'MediaBrowser.Api/UserLibrary') diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs index c2b8069cb2..15a2d5c337 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(); + filteredItems = LibraryManager.Sort(filteredItems, user, request.GetOrderBy(), request.SortOrder ?? SortOrder.Ascending).Cast(); var ibnItemsArray = filteredItems.ToList(); diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs b/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs index f236100147..3dcd4efbda 100644 --- a/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs +++ b/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs @@ -96,6 +96,21 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "IsPlayed", Description = "Optional filter by items that are played, or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] public bool? IsPlayed { get; set; } + public string[] GetMediaTypes() + { + return (MediaTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + } + + public string[] GetIncludeItemTypes() + { + return (IncludeItemTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + } + + public string[] GetExcludeItemTypes() + { + return (ExcludeItemTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + } + /// /// Gets the filters. /// @@ -132,7 +147,7 @@ namespace MediaBrowser.Api.UserLibrary /// Gets the order by. /// /// IEnumerable{ItemSortBy}. - public IEnumerable GetOrderBy() + public string[] GetOrderBy() { var val = SortBy; diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index 2ac4f5e636..011864d35e 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 /// /// The request. /// System.Object. - public object Get(GetItems request) + public async Task 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 /// /// The request. /// Task{ItemsResult}. - private ItemsResult GetItems(GetItems request) + private async Task 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 /// The user. /// The parent item. /// IEnumerable{BaseItem}. - /// - private IEnumerable GetItemsToSerialize(GetItems request, User user, BaseItem parentItem) + private async Task, 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, 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, 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, bool>(new QueryResult + { + Items = items.ToArray() + + }, false); } - /// - /// Applies sort order - /// - /// The request. - /// The items. - /// The user. - /// The library manager. - /// IEnumerable{BaseItem}. - internal static IEnumerable ApplySortOrder(BaseItemsRequest request, IEnumerable 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; } /// @@ -648,36 +725,70 @@ namespace MediaBrowser.Api.UserLibrary return items; } - /// - /// Applies the additional filters. - /// - /// The request. - /// The items. - /// IEnumerable{BaseItem}. - private IEnumerable ApplyAdditionalFilters(GetItems request, IEnumerable 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() - .Where(i => string.Compare(request.AlbumArtistStartsWithOrGreater, i.AlbumArtists.FirstOrDefault(), StringComparison.CurrentCultureIgnoreCase) < 1) - .Cast(); + var ok = new[] { i }.OfType() + .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().Where(i => i.Status.HasValue && vals.Contains(i.Status.Value.ToString(), StringComparer.OrdinalIgnoreCase)); + var ok = new[] { i }.OfType().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().Where(i => i.AirDays != null && days.Any(d => i.AirDays.Contains(d))); + var ok = new[] { i }.OfType().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