diff options
Diffstat (limited to 'MediaBrowser.Api')
| -rw-r--r-- | MediaBrowser.Api/BaseApiService.cs | 34 | ||||
| -rw-r--r-- | MediaBrowser.Api/GamesService.cs | 15 | ||||
| -rw-r--r-- | MediaBrowser.Api/ItemRefreshService.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Api/ItemUpdateService.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Api/Library/LibraryService.cs | 81 | ||||
| -rw-r--r-- | MediaBrowser.Api/Movies/MoviesService.cs | 11 | ||||
| -rw-r--r-- | MediaBrowser.Api/Music/AlbumsService.cs | 8 | ||||
| -rw-r--r-- | MediaBrowser.Api/SearchService.cs | 8 | ||||
| -rw-r--r-- | MediaBrowser.Api/SimilarItemsHelper.cs | 10 | ||||
| -rw-r--r-- | MediaBrowser.Api/TvShowsService.cs | 19 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs | 66 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/ItemsService.cs | 4 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/UserLibraryService.cs | 63 |
13 files changed, 182 insertions, 141 deletions
diff --git a/MediaBrowser.Api/BaseApiService.cs b/MediaBrowser.Api/BaseApiService.cs index 2aaec8627..dff433c9d 100644 --- a/MediaBrowser.Api/BaseApiService.cs +++ b/MediaBrowser.Api/BaseApiService.cs @@ -174,7 +174,7 @@ namespace MediaBrowser.Api return libraryManager.GetPerson(DeSlugPersonName(name, libraryManager)); } - protected IEnumerable<BaseItem> GetAllLibraryItems(Guid? userId, IUserManager userManager, ILibraryManager libraryManager, string parentId = null) + protected IList<BaseItem> GetAllLibraryItems(Guid? userId, IUserManager userManager, ILibraryManager libraryManager, string parentId, Func<BaseItem,bool> filter) { if (!string.IsNullOrEmpty(parentId)) { @@ -189,10 +189,13 @@ namespace MediaBrowser.Api throw new ArgumentException("User not found"); } - return folder.GetRecursiveChildren(user); + return folder + .GetRecursiveChildren(user, filter) + .ToList(); } - return folder.GetRecursiveChildren(); + return folder + .GetRecursiveChildren(filter); } if (userId.HasValue) { @@ -203,10 +206,16 @@ namespace MediaBrowser.Api throw new ArgumentException("User not found"); } - return userManager.GetUserById(userId.Value).RootFolder.GetRecursiveChildren(user); + return userManager + .GetUserById(userId.Value) + .RootFolder + .GetRecursiveChildren(user, filter) + .ToList(); } - return libraryManager.RootFolder.GetRecursiveChildren(); + return libraryManager + .RootFolder + .GetRecursiveChildren(filter); } /// <summary> @@ -222,8 +231,9 @@ namespace MediaBrowser.Api return name; } - return libraryManager.RootFolder.RecursiveChildren - .OfType<Audio>() + return libraryManager.RootFolder + .GetRecursiveChildren(i => i is IHasArtist) + .Cast<IHasArtist>() .SelectMany(i => i.AllArtists) .Distinct(StringComparer.OrdinalIgnoreCase) .FirstOrDefault(i => @@ -264,8 +274,8 @@ namespace MediaBrowser.Api return name; } - return libraryManager.RootFolder.GetRecursiveChildren() - .OfType<Game>() + return libraryManager.RootFolder + .GetRecursiveChildren(i => i is Game) .SelectMany(i => i.Genres) .Distinct(StringComparer.OrdinalIgnoreCase) .FirstOrDefault(i => @@ -287,7 +297,8 @@ namespace MediaBrowser.Api return name; } - return libraryManager.RootFolder.GetRecursiveChildren() + return libraryManager.RootFolder + .GetRecursiveChildren() .SelectMany(i => i.Studios) .Distinct(StringComparer.OrdinalIgnoreCase) .FirstOrDefault(i => @@ -309,7 +320,8 @@ namespace MediaBrowser.Api return name; } - return libraryManager.RootFolder.GetRecursiveChildren() + return libraryManager.RootFolder + .GetRecursiveChildren() .SelectMany(i => i.People) .Select(i => i.Name) .Distinct(StringComparer.OrdinalIgnoreCase) diff --git a/MediaBrowser.Api/GamesService.cs b/MediaBrowser.Api/GamesService.cs index 39e357f49..c18c32920 100644 --- a/MediaBrowser.Api/GamesService.cs +++ b/MediaBrowser.Api/GamesService.cs @@ -102,8 +102,8 @@ namespace MediaBrowser.Api /// <returns>System.Object.</returns> public object Get(GetGameSystemSummaries request) { - var gameSystems = GetAllLibraryItems(request.UserId, _userManager, _libraryManager) - .OfType<GameSystem>() + var gameSystems = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, null, i => i is GameSystem) + .Cast<GameSystem>() .ToList(); var user = request.UserId == null ? null : _userManager.GetUserById(request.UserId.Value); @@ -119,9 +119,8 @@ namespace MediaBrowser.Api public object Get(GetPlayerIndex request) { - var games = GetAllLibraryItems(request.UserId, _userManager, _libraryManager) - .OfType<Game>() - .ToList(); + var games = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, null, i => i is Game) + .Cast<Game>(); var lookup = games .ToLookup(i => i.PlayersSupported ?? -1) @@ -150,9 +149,11 @@ namespace MediaBrowser.Api DisplayName = system.Name }; - var items = user == null ? system.RecursiveChildren : system.GetRecursiveChildren(user); + var items = user == null ? + system.GetRecursiveChildren(i => i is Game) : + system.GetRecursiveChildren(user, i => i is Game); - var games = items.OfType<Game>().ToList(); + var games = items.Cast<Game>().ToList(); summary.ClientInstalledGameCount = games.Count(i => i.IsPlaceHolder); diff --git a/MediaBrowser.Api/ItemRefreshService.cs b/MediaBrowser.Api/ItemRefreshService.cs index 152a64c24..78bc14ab0 100644 --- a/MediaBrowser.Api/ItemRefreshService.cs +++ b/MediaBrowser.Api/ItemRefreshService.cs @@ -51,7 +51,7 @@ namespace MediaBrowser.Api var cancellationToken = CancellationToken.None; var albums = _libraryManager.RootFolder - .RecursiveChildren + .GetRecursiveChildren() .OfType<MusicAlbum>() .Where(i => i.HasArtist(item.Name)) .ToList(); diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs index 98c259825..ea90afc3b 100644 --- a/MediaBrowser.Api/ItemUpdateService.cs +++ b/MediaBrowser.Api/ItemUpdateService.cs @@ -215,7 +215,7 @@ namespace MediaBrowser.Api { var folder = (Folder)item; - foreach (var child in folder.RecursiveChildren.ToList()) + foreach (var child in folder.GetRecursiveChildren()) { child.IsLocked = newLockData; await child.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs index bac6f6a39..f147234fe 100644 --- a/MediaBrowser.Api/Library/LibraryService.cs +++ b/MediaBrowser.Api/Library/LibraryService.cs @@ -392,52 +392,43 @@ namespace MediaBrowser.Api.Library /// <returns>System.Object.</returns> public object Get(GetItemCounts request) { - var items = GetAllLibraryItems(request.UserId, _userManager, _libraryManager) - .Where(i => i.LocationType != LocationType.Virtual) - .ToList(); - - var filteredItems = request.UserId.HasValue ? FilterItems(items, request, request.UserId.Value).ToList() : items; - - var albums = filteredItems.OfType<MusicAlbum>().ToList(); - var episodes = filteredItems.OfType<Episode>().ToList(); - var games = filteredItems.OfType<Game>().ToList(); - var movies = filteredItems.OfType<Movie>().ToList(); - var musicVideos = filteredItems.OfType<MusicVideo>().ToList(); - var boxsets = filteredItems.OfType<BoxSet>().ToList(); - var books = filteredItems.OfType<Book>().ToList(); - var songs = filteredItems.OfType<Audio>().ToList(); - var series = filteredItems.OfType<Series>().ToList(); + var filteredItems = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, null, i => i.LocationType != LocationType.Virtual && FilterItem(i, request, request.UserId)); var counts = new ItemCounts { - AlbumCount = albums.Count, - EpisodeCount = episodes.Count, - GameCount = games.Count, - GameSystemCount = filteredItems.OfType<GameSystem>().Count(), - MovieCount = movies.Count, - SeriesCount = series.Count, - SongCount = songs.Count, - MusicVideoCount = musicVideos.Count, - BoxSetCount = boxsets.Count, - BookCount = books.Count, - - UniqueTypes = items.Select(i => i.GetClientTypeName()).Distinct().ToList() + AlbumCount = filteredItems.Count(i => i is MusicAlbum), + EpisodeCount = filteredItems.Count(i => i is Episode), + GameCount = filteredItems.Count(i => i is Game), + GameSystemCount = filteredItems.Count(i => i is GameSystem), + MovieCount = filteredItems.Count(i => i is Movie), + SeriesCount = filteredItems.Count(i => i is Series), + SongCount = filteredItems.Count(i => i is Audio), + MusicVideoCount = filteredItems.Count(i => i is MusicVideo), + BoxSetCount = filteredItems.Count(i => i is BoxSet), + BookCount = filteredItems.Count(i => i is Book), + + UniqueTypes = filteredItems.Select(i => i.GetClientTypeName()).Distinct().ToList() }; return ToOptimizedSerializedResultUsingCache(counts); } - private IEnumerable<T> FilterItems<T>(IEnumerable<T> items, GetItemCounts request, Guid userId) - where T : BaseItem + private bool FilterItem(BaseItem item, GetItemCounts request, Guid? userId) { - if (request.IsFavorite.HasValue) + if (userId.HasValue) { - var val = request.IsFavorite.Value; + if (request.IsFavorite.HasValue) + { + var val = request.IsFavorite.Value; - items = items.Where(i => _userDataManager.GetUserData(userId, i.GetUserDataKey()).IsFavorite == val); + if (_userDataManager.GetUserData(userId.Value, item.GetUserDataKey()).IsFavorite != val) + { + return false; + } + } } - return items; + return true; } /// <summary> @@ -711,13 +702,24 @@ namespace MediaBrowser.Api.Library public object Get(GetYearIndex request) { - IEnumerable<BaseItem> items = GetAllLibraryItems(request.UserId, _userManager, _libraryManager); + var includeTypes = string.IsNullOrWhiteSpace(request.IncludeItemTypes) + ? new string[] { } + : request.IncludeItemTypes.Split(','); - if (!string.IsNullOrEmpty(request.IncludeItemTypes)) + Func<BaseItem, bool> filter = i => { - var vals = request.IncludeItemTypes.Split(','); - items = items.Where(f => vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase)); - } + if (includeTypes.Length > 0) + { + if (!includeTypes.Contains(i.GetType().Name, StringComparer.OrdinalIgnoreCase)) + { + return false; + } + } + + return true; + }; + + IEnumerable<BaseItem> items = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, null, filter); var lookup = items .ToLookup(i => i.ProductionYear ?? -1) @@ -747,8 +749,7 @@ namespace MediaBrowser.Api.Library var dtos = GetSoundtrackSongIds(item, inheritFromParent) .Select(_libraryManager.GetItemById) .OfType<MusicAlbum>() - .SelectMany(i => i.RecursiveChildren) - .OfType<Audio>() + .SelectMany(i => i.GetRecursiveChildren(a => a is Audio)) .OrderBy(i => i.SortName) .Select(i => _dtoService.GetBaseItemDto(i, dtoOptions, user, item)); diff --git a/MediaBrowser.Api/Movies/MoviesService.cs b/MediaBrowser.Api/Movies/MoviesService.cs index 0b8bb4036..07f5942c6 100644 --- a/MediaBrowser.Api/Movies/MoviesService.cs +++ b/MediaBrowser.Api/Movies/MoviesService.cs @@ -121,8 +121,7 @@ namespace MediaBrowser.Api.Movies { var user = _userManager.GetUserById(request.UserId.Value); - var movies = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId) - .Where(i => i is Movie); + IEnumerable<BaseItem> movies = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId, i => i is Movie); movies = _libraryManager.ReplaceVideosWithPrimaryVersions(movies); @@ -174,11 +173,11 @@ namespace MediaBrowser.Api.Movies (request.UserId.HasValue ? user.RootFolder : _libraryManager.RootFolder) : _libraryManager.GetItemById(request.Id); + Func<BaseItem, bool> filter = i => i.Id != item.Id && includeInSearch(i); + var inputItems = user == null - ? _libraryManager.RootFolder.GetRecursiveChildren().Where(i => i.Id != item.Id) - : user.RootFolder.GetRecursiveChildren(user).Where(i => i.Id != item.Id); - - inputItems = inputItems.Where(includeInSearch); + ? _libraryManager.RootFolder.GetRecursiveChildren(filter) + : user.RootFolder.GetRecursiveChildren(user, filter); var list = inputItems.ToList(); diff --git a/MediaBrowser.Api/Music/AlbumsService.cs b/MediaBrowser.Api/Music/AlbumsService.cs index 4cfb3c7d4..76c6c5776 100644 --- a/MediaBrowser.Api/Music/AlbumsService.cs +++ b/MediaBrowser.Api/Music/AlbumsService.cs @@ -77,14 +77,14 @@ namespace MediaBrowser.Api.Music var album1 = (MusicAlbum)item1; var album2 = (MusicAlbum)item2; - var artists1 = album1.GetRecursiveChildren() - .OfType<Audio>() + var artists1 = album1.GetRecursiveChildren(i => i is IHasArtist) + .Cast<IHasArtist>() .SelectMany(i => i.AllArtists) .Distinct(StringComparer.OrdinalIgnoreCase) .ToList(); - var artists2 = album2.GetRecursiveChildren() - .OfType<Audio>() + var artists2 = album2.GetRecursiveChildren(i => i is IHasArtist) + .Cast<IHasArtist>() .SelectMany(i => i.AllArtists) .Distinct(StringComparer.OrdinalIgnoreCase) .ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); diff --git a/MediaBrowser.Api/SearchService.cs b/MediaBrowser.Api/SearchService.cs index 61c7305b5..4dcf72407 100644 --- a/MediaBrowser.Api/SearchService.cs +++ b/MediaBrowser.Api/SearchService.cs @@ -194,21 +194,23 @@ namespace MediaBrowser.Api { result.Series = season.Series.Name; - result.EpisodeCount = season.GetRecursiveChildren().Count(i => i is Episode); + result.EpisodeCount = season.GetRecursiveChildren(i => i is Episode).Count; } var series = item as Series; if (series != null) { - result.EpisodeCount = series.GetRecursiveChildren().Count(i => i is Episode); + result.EpisodeCount = series.GetRecursiveChildren(i => i is Episode).Count; } var album = item as MusicAlbum; if (album != null) { - var songs = album.GetRecursiveChildren().OfType<Audio>().ToList(); + var songs = album.GetRecursiveChildren(i => i is Audio) + .Cast<Audio>() + .ToList(); result.SongCount = songs.Count; diff --git a/MediaBrowser.Api/SimilarItemsHelper.cs b/MediaBrowser.Api/SimilarItemsHelper.cs index 150aebf50..e061c391a 100644 --- a/MediaBrowser.Api/SimilarItemsHelper.cs +++ b/MediaBrowser.Api/SimilarItemsHelper.cs @@ -76,13 +76,13 @@ namespace MediaBrowser.Api (request.UserId.HasValue ? user.RootFolder : libraryManager.RootFolder) : libraryManager.GetItemById(request.Id); - var fields = request.GetItemFields().ToList(); + Func<BaseItem, bool> filter = i => i.Id != item.Id && includeInSearch(i); var inputItems = user == null - ? libraryManager.RootFolder.GetRecursiveChildren().Where(i => i.Id != item.Id) - : user.RootFolder.GetRecursiveChildren(user).Where(i => i.Id != item.Id); + ? libraryManager.RootFolder.GetRecursiveChildren(filter) + : user.RootFolder.GetRecursiveChildren(user, filter); - var items = GetSimilaritems(item, inputItems.Where(includeInSearch), getSimilarityScore) + var items = GetSimilaritems(item, inputItems, getSimilarityScore) .ToList(); IEnumerable<BaseItem> returnItems = items; @@ -165,7 +165,7 @@ namespace MediaBrowser.Api // Find common keywords points += GetKeywords(item1).Where(i => GetKeywords(item2).Contains(i, StringComparer.OrdinalIgnoreCase)).Sum(i => 10); - + // Find common studios points += item1.Studios.Where(i => item2.Studios.Contains(i, StringComparer.OrdinalIgnoreCase)).Sum(i => 3); diff --git a/MediaBrowser.Api/TvShowsService.cs b/MediaBrowser.Api/TvShowsService.cs index 79db6cbe5..ccb844912 100644 --- a/MediaBrowser.Api/TvShowsService.cs +++ b/MediaBrowser.Api/TvShowsService.cs @@ -256,10 +256,10 @@ namespace MediaBrowser.Api { var user = _userManager.GetUserById(request.UserId); - var items = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId) - .OfType<Episode>(); + var items = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId, i => i is Episode); - var itemsList = _libraryManager.Sort(items, user, new[] { "PremiereDate", "AirTime", "SortName" }, SortOrder.Ascending) + var itemsList = _libraryManager + .Sort(items, user, new[] { "PremiereDate", "AirTime", "SortName" }, SortOrder.Ascending) .Cast<Episode>() .ToList(); @@ -450,24 +450,25 @@ namespace MediaBrowser.Api episodes = episodes.Where(i => i.IsVirtualUnaired == val); } + IEnumerable<BaseItem> returnItems = episodes; + // This must be the last filter if (!string.IsNullOrEmpty(request.AdjacentTo)) { - episodes = UserViewBuilder.FilterForAdjacency(episodes, request.AdjacentTo) - .Cast<Episode>(); + returnItems = UserViewBuilder.FilterForAdjacency(returnItems, request.AdjacentTo); } - episodes = _libraryManager.ReplaceVideosWithPrimaryVersions(episodes).Cast<Episode>(); + returnItems = _libraryManager.ReplaceVideosWithPrimaryVersions(returnItems); var dtoOptions = GetDtoOptions(request); - var returnItems = _dtoService.GetBaseItemDtos(episodes, dtoOptions, user) + var dtos = _dtoService.GetBaseItemDtos(returnItems, dtoOptions, user) .ToArray(); return new ItemsResult { - TotalRecordCount = returnItems.Length, - Items = returnItems + TotalRecordCount = dtos.Length, + Items = dtos }; } } diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs index e0747b547..880d57b9a 100644 --- a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs +++ b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs @@ -56,46 +56,52 @@ namespace MediaBrowser.Api.UserLibrary protected ItemsResult GetResult(GetItemsByName request) { User user = null; - BaseItem item; + BaseItem parentItem; List<BaseItem> libraryItems; if (request.UserId.HasValue) { user = UserManager.GetUserById(request.UserId.Value); - item = string.IsNullOrEmpty(request.ParentId) ? user.RootFolder : LibraryManager.GetItemById(request.ParentId); - + parentItem = string.IsNullOrEmpty(request.ParentId) ? user.RootFolder : LibraryManager.GetItemById(request.ParentId); libraryItems = user.RootFolder.GetRecursiveChildren(user).ToList(); } else { - item = string.IsNullOrEmpty(request.ParentId) ? LibraryManager.RootFolder : LibraryManager.GetItemById(request.ParentId); - - libraryItems = LibraryManager.RootFolder.RecursiveChildren.ToList(); + parentItem = string.IsNullOrEmpty(request.ParentId) ? LibraryManager.RootFolder : LibraryManager.GetItemById(request.ParentId); + libraryItems = LibraryManager.RootFolder.GetRecursiveChildren().ToList(); } IEnumerable<BaseItem> items; - if (item.IsFolder) + var excludeItemTypes = request.GetExcludeItemTypes(); + var includeItemTypes = request.GetIncludeItemTypes(); + var mediaTypes = request.GetMediaTypes(); + + Func<BaseItem, bool> filter = i => FilterItem(request, i, excludeItemTypes, includeItemTypes, mediaTypes); + + if (parentItem.IsFolder) { - var folder = (Folder)item; + var folder = (Folder)parentItem; if (request.UserId.HasValue) { - items = request.Recursive ? folder.GetRecursiveChildren(user) : folder.GetChildren(user, true); + items = request.Recursive ? + folder.GetRecursiveChildren(user, filter) : + folder.GetChildren(user, true).Where(filter); } else { - items = request.Recursive ? folder.GetRecursiveChildren() : folder.Children; + items = request.Recursive ? + folder.GetRecursiveChildren(filter) : + folder.Children.Where(filter); } } else { - items = new[] { item }; + items = new[] { parentItem }.Where(filter); } - items = FilterItems(request, items); - var extractedItems = GetAllItems(request, items); var filteredItems = FilterItems(request, extractedItems, user); @@ -290,33 +296,41 @@ namespace MediaBrowser.Api.UserLibrary /// Filters the items. /// </summary> /// <param name="request">The request.</param> - /// <param name="items">The items.</param> + /// <param name="f">The f.</param> + /// <param name="excludeItemTypes">The exclude item types.</param> + /// <param name="includeItemTypes">The include item types.</param> + /// <param name="mediaTypes">The media types.</param> /// <returns>IEnumerable{BaseItem}.</returns> - protected virtual IEnumerable<BaseItem> FilterItems(GetItemsByName request, IEnumerable<BaseItem> items) + protected bool FilterItem(GetItemsByName request, BaseItem f, string[] excludeItemTypes, string[] includeItemTypes, string[] mediaTypes) { // Exclude item types - if (!string.IsNullOrEmpty(request.ExcludeItemTypes)) + if (excludeItemTypes.Length > 0) { - var vals = request.ExcludeItemTypes.Split(','); - items = items.Where(f => !vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase)); + if (excludeItemTypes.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase)) + { + return false; + } } // Include item types - if (!string.IsNullOrEmpty(request.IncludeItemTypes)) + if (includeItemTypes.Length > 0) { - var vals = request.IncludeItemTypes.Split(','); - items = items.Where(f => vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase)); + if (!includeItemTypes.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase)) + { + return false; + } } // Include MediaTypes - if (!string.IsNullOrEmpty(request.MediaTypes)) + if (mediaTypes.Length > 0) { - var vals = request.MediaTypes.Split(','); - - items = items.Where(f => vals.Contains(f.MediaType ?? string.Empty, StringComparer.OrdinalIgnoreCase)); + if (!mediaTypes.Contains(f.MediaType ?? string.Empty, StringComparer.OrdinalIgnoreCase)) + { + return false; + } } - return items; + return true; } /// <summary> diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index 6f6bd2dff..15b1f6dba 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -398,7 +398,7 @@ namespace MediaBrowser.Api.UserLibrary { if (user == null) { - items = ((Folder)item).RecursiveChildren; + items = ((Folder)item).GetRecursiveChildren(); items = _libraryManager.ReplaceVideosWithPrimaryVersions(items); } @@ -464,7 +464,7 @@ namespace MediaBrowser.Api.UserLibrary SortBy = request.GetOrderBy(), SortOrder = request.SortOrder ?? SortOrder.Ascending, - Filter = (i, u) => ApplyAdditionalFilters(request, i, u, true, _libraryManager), + Filter = i => ApplyAdditionalFilters(request, i, user, true, _libraryManager), Limit = request.Limit, StartIndex = request.StartIndex, diff --git a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs index 3fc42c6b1..c6ec53018 100644 --- a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs +++ b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs @@ -259,7 +259,7 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "EnableImageTypes", Description = "Optional. The image types to include in the output.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public string EnableImageTypes { get; set; } - + public GetLatestMedia() { Limit = 20; @@ -304,36 +304,45 @@ namespace MediaBrowser.Api.UserLibrary { var user = _userManager.GetUserById(request.UserId); - // Avoid implicitly captured closure - var libraryItems = string.IsNullOrEmpty(request.ParentId) && user != null ? - GetItemsConfiguredForLatest(user) : - GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId); + var includeTypes = string.IsNullOrWhiteSpace(request.IncludeItemTypes) + ? new string[] { } + : request.IncludeItemTypes.Split(','); - libraryItems = libraryItems.OrderByDescending(i => i.DateCreated) - .Where(i => i.LocationType != LocationType.Virtual); + var currentUser = user; + + Func<BaseItem, bool> filter = i => + { + if (includeTypes.Length > 0) + { + if (!includeTypes.Contains(i.GetType().Name, StringComparer.OrdinalIgnoreCase)) + { + return false; + } + } + if (request.IsPlayed.HasValue) + { + var val = request.IsPlayed.Value; + if (i.IsPlayed(currentUser) != val) + { + return false; + } + } - //if (request.IsFolder.HasValue) - //{ - //var val = request.IsFolder.Value; - libraryItems = libraryItems.Where(f => f.IsFolder == false); - //} + return i.LocationType != LocationType.Virtual && !i.IsFolder; + }; - if (!string.IsNullOrEmpty(request.IncludeItemTypes)) - { - var vals = request.IncludeItemTypes.Split(','); - libraryItems = libraryItems.Where(f => vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase)); - } + // Avoid implicitly captured closure + var libraryItems = string.IsNullOrEmpty(request.ParentId) && user != null ? + GetItemsConfiguredForLatest(user, filter) : + GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId, filter); - var currentUser = user; + libraryItems = libraryItems.OrderByDescending(i => i.DateCreated); if (request.IsPlayed.HasValue) { var takeLimit = request.Limit * 20; - - var val = request.IsPlayed.Value; - libraryItems = libraryItems.Where(f => f.IsPlayed(currentUser) == val) - .Take(takeLimit); + libraryItems = libraryItems.Take(takeLimit); } // Avoid implicitly captured closure @@ -394,12 +403,15 @@ namespace MediaBrowser.Api.UserLibrary return ToOptimizedResult(dtos.ToList()); } - private IEnumerable<BaseItem> GetItemsConfiguredForLatest(User user) + private IEnumerable<BaseItem> GetItemsConfiguredForLatest(User user, Func<BaseItem,bool> filter) { + // Avoid implicitly captured closure + var currentUser = user; + return user.RootFolder.GetChildren(user, true) .OfType<Folder>() .Where(i => !user.Configuration.LatestItemsExcludes.Contains(i.Id.ToString("N"))) - .SelectMany(i => i.GetRecursiveChildren(user)) + .SelectMany(i => i.GetRecursiveChildren(currentUser, filter)) .DistinctBy(i => i.Id); } @@ -453,8 +465,7 @@ namespace MediaBrowser.Api.UserLibrary var currentUser = user; var dtos = series - .GetRecursiveChildren() - .Where(i => i is Episode && i.ParentIndexNumber.HasValue && i.ParentIndexNumber.Value == 0) + .GetRecursiveChildren(i => i is Episode && i.ParentIndexNumber.HasValue && i.ParentIndexNumber.Value == 0) .OrderBy(i => { if (i.PremiereDate.HasValue) |
