diff options
Diffstat (limited to 'MediaBrowser.Controller/Entities/UserViewBuilder.cs')
| -rw-r--r-- | MediaBrowser.Controller/Entities/UserViewBuilder.cs | 240 |
1 files changed, 176 insertions, 64 deletions
diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs index cd579f7ad..a76a28469 100644 --- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs +++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs @@ -44,7 +44,7 @@ namespace MediaBrowser.Controller.Entities _collectionManager = collectionManager; } - public async Task<QueryResult<BaseItem>> GetUserItems(Folder parent, string viewType, InternalItemsQuery query) + public async Task<QueryResult<BaseItem>> GetUserItems(Folder queryParent, Folder displayParent, string viewType, InternalItemsQuery query) { var user = query.User; @@ -107,110 +107,125 @@ namespace MediaBrowser.Controller.Entities { var result = await GetLiveTvFolders(user).ConfigureAwait(false); - return GetResult(result, parent, query); + return GetResult(result, queryParent, query); } case CollectionType.Folders: - return GetResult(user.RootFolder.GetChildren(user, true), parent, query); + return GetResult(user.RootFolder.GetChildren(user, true), queryParent, query); case CollectionType.Games: - return await GetGameView(user, parent, query).ConfigureAwait(false); + return await GetGameView(user, queryParent, query).ConfigureAwait(false); case CollectionType.BoxSets: - return GetResult(GetMediaFolders(user).SelectMany(i => i.GetRecursiveChildren(user)).OfType<BoxSet>(), parent, query); + return GetResult(GetMediaFolders(user).SelectMany(i => i.GetRecursiveChildren(user)).OfType<BoxSet>(), queryParent, query); case CollectionType.TvShows: - return await GetTvView(parent, user, query).ConfigureAwait(false); + return await GetTvView(queryParent, user, query).ConfigureAwait(false); case CollectionType.Music: - return await GetMusicFolders(parent, user, query).ConfigureAwait(false); + return await GetMusicFolders(queryParent, user, query).ConfigureAwait(false); case CollectionType.Movies: - return await GetMovieFolders(parent, user, query).ConfigureAwait(false); + return await GetMovieFolders(queryParent, user, query).ConfigureAwait(false); + + case SpecialFolder.MusicGenres: + return await GetMusicGenres(queryParent, user, query).ConfigureAwait(false); + + case SpecialFolder.MusicGenre: + return await GetMusicGenreItems(queryParent, displayParent, user, query).ConfigureAwait(false); case SpecialFolder.GameGenres: - return GetGameGenres(parent, user, query); + return await GetGameGenres(queryParent, user, query).ConfigureAwait(false); + + case SpecialFolder.GameGenre: + return await GetGameGenreItems(queryParent, displayParent, user, query).ConfigureAwait(false); case SpecialFolder.GameSystems: - return GetGameSystems(parent, user, query); + return GetGameSystems(queryParent, user, query); case SpecialFolder.LatestGames: - return GetLatestGames(parent, user, query); + return GetLatestGames(queryParent, user, query); case SpecialFolder.RecentlyPlayedGames: - return GetRecentlyPlayedGames(parent, user, query); + return GetRecentlyPlayedGames(queryParent, user, query); case SpecialFolder.GameFavorites: - return GetFavoriteGames(parent, user, query); + return GetFavoriteGames(queryParent, user, query); case SpecialFolder.TvShowSeries: - return GetTvSeries(parent, user, query); + return GetTvSeries(queryParent, user, query); case SpecialFolder.TvGenres: - return GetTvGenres(parent, user, query); + return await GetTvGenres(queryParent, user, query).ConfigureAwait(false); + + case SpecialFolder.TvGenre: + return await GetTvGenreItems(queryParent, displayParent, user, query).ConfigureAwait(false); case SpecialFolder.TvResume: - return GetTvResume(parent, user, query); + return GetTvResume(queryParent, user, query); case SpecialFolder.TvNextUp: - return GetTvNextUp(parent, query); + return GetTvNextUp(queryParent, query); case SpecialFolder.TvLatest: - return GetTvLatest(parent, user, query); + return GetTvLatest(queryParent, user, query); case SpecialFolder.MovieFavorites: - return GetFavoriteMovies(parent, user, query); + return GetFavoriteMovies(queryParent, user, query); case SpecialFolder.MovieLatest: - return GetMovieLatest(parent, user, query); + return GetMovieLatest(queryParent, user, query); case SpecialFolder.MovieGenres: - return GetMovieGenres(parent, user, query); + return await GetMovieGenres(queryParent, user, query).ConfigureAwait(false); + + case SpecialFolder.MovieGenre: + return await GetMovieGenreItems(queryParent, displayParent, user, query).ConfigureAwait(false); case SpecialFolder.MovieResume: - return GetMovieResume(parent, user, query); + return GetMovieResume(queryParent, user, query); case SpecialFolder.MovieMovies: - return GetMovieMovies(parent, user, query); + return GetMovieMovies(queryParent, user, query); case SpecialFolder.MovieCollections: - return GetMovieCollections(parent, user, query); + return GetMovieCollections(queryParent, user, query); case SpecialFolder.MusicLatest: - return GetMusicLatest(parent, user, query); + return GetMusicLatest(queryParent, user, query); case SpecialFolder.MusicAlbums: - return GetMusicAlbums(parent, user, query); + return GetMusicAlbums(queryParent, user, query); case SpecialFolder.MusicAlbumArtists: - return GetMusicAlbumArtists(parent, user, query); + return GetMusicAlbumArtists(queryParent, user, query); case SpecialFolder.MusicArtists: - return GetMusicArtists(parent, user, query); + return GetMusicArtists(queryParent, user, query); case SpecialFolder.MusicSongs: - return GetMusicSongs(parent, user, query); + return GetMusicSongs(queryParent, user, query); case SpecialFolder.TvFavoriteEpisodes: - return GetFavoriteEpisodes(parent, user, query); + return GetFavoriteEpisodes(queryParent, user, query); case SpecialFolder.TvFavoriteSeries: - return GetFavoriteSeries(parent, user, query); + return GetFavoriteSeries(queryParent, user, query); case SpecialFolder.MusicFavorites: - return await GetMusicFavorites(parent, user, query).ConfigureAwait(false); + return await GetMusicFavorites(queryParent, user, query).ConfigureAwait(false); case SpecialFolder.MusicFavoriteAlbums: - return GetFavoriteAlbums(parent, user, query); + return GetFavoriteAlbums(queryParent, user, query); case SpecialFolder.MusicFavoriteArtists: - return GetFavoriteArtists(parent, user, query); + return GetFavoriteArtists(queryParent, user, query); case SpecialFolder.MusicFavoriteSongs: - return GetFavoriteSongs(parent, user, query); + return GetFavoriteSongs(queryParent, user, query); default: - return GetResult(GetMediaFolders(user).SelectMany(i => i.GetChildren(user, true)), parent, query); + return GetResult(GetMediaFolders(user).SelectMany(i => i.GetChildren(user, true)), queryParent, query); } } @@ -231,9 +246,9 @@ namespace MediaBrowser.Controller.Entities list.Add(await GetUserView(SpecialFolder.MusicLatest, user, "0", parent).ConfigureAwait(false)); list.Add(await GetUserView(SpecialFolder.MusicAlbums, user, "1", parent).ConfigureAwait(false)); list.Add(await GetUserView(SpecialFolder.MusicAlbumArtists, user, "2", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicSongs, user, "3", parent).ConfigureAwait(false)); - //list.Add(await GetUserView(SpecialFolder.MusicArtists, user, "3", parent).ConfigureAwait(false)); - //list.Add(await GetUserView(SpecialFolder.MusicGenres, user, "5", parent).ConfigureAwait(false)); + list.Add(await GetUserView(SpecialFolder.MusicArtists, user, "3", parent).ConfigureAwait(false)); + list.Add(await GetUserView(SpecialFolder.MusicSongs, user, "4", parent).ConfigureAwait(false)); + list.Add(await GetUserView(SpecialFolder.MusicGenres, user, "5", parent).ConfigureAwait(false)); list.Add(await GetUserView(SpecialFolder.MusicFavorites, user, "6", parent).ConfigureAwait(false)); return GetResult(list, parent, query); @@ -250,6 +265,59 @@ namespace MediaBrowser.Controller.Entities return GetResult(list, parent, query); } + private async Task<QueryResult<BaseItem>> GetMusicGenres(Folder parent, User user, InternalItemsQuery query) + { + var tasks = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos }) + .Where(i => !i.IsFolder) + .SelectMany(i => i.Genres) + .Distinct(StringComparer.OrdinalIgnoreCase) + .Select(i => + { + try + { + return _libraryManager.GetMusicGenre(i); + } + catch + { + // Full exception logged at lower levels + _logger.Error("Error getting genre"); + return null; + } + + }) + .Where(i => i != null) + .Select(i => GetUserView(i.Name, SpecialFolder.MusicGenre, user, i.SortName, parent)); + + var genres = await Task.WhenAll(tasks).ConfigureAwait(false); + + return GetResult(genres, parent, query); + } + + private async Task<QueryResult<BaseItem>> GetMusicGenreItems(Folder queryParent, Folder displayParent, User user, InternalItemsQuery query) + { + var items = GetRecursiveChildren(queryParent, user, new[] { CollectionType.Music, CollectionType.MusicVideos }) + .Where(i => !i.IsFolder) + .Where(i => i.Genres.Contains(displayParent.Name, StringComparer.OrdinalIgnoreCase)) + .OfType<IHasAlbumArtist>() + .SelectMany(i => i.AlbumArtists) + .Distinct(StringComparer.OrdinalIgnoreCase) + .Select(i => + { + try + { + return _libraryManager.GetArtist(i); + } + catch + { + // Already logged at lower levels + return null; + } + }) + .Where(i => i != null); + + return GetResult(items, queryParent, query); + } + private QueryResult<BaseItem> GetMusicAlbumArtists(Folder parent, User user, InternalItemsQuery query) { var artists = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos }) @@ -354,7 +422,7 @@ namespace MediaBrowser.Controller.Entities list.Add(await GetUserView(SpecialFolder.MovieMovies, user, "2", parent).ConfigureAwait(false)); list.Add(await GetUserView(SpecialFolder.MovieCollections, user, "3", parent).ConfigureAwait(false)); list.Add(await GetUserView(SpecialFolder.MovieFavorites, user, "4", parent).ConfigureAwait(false)); - //list.Add(await GetUserView(CollectionType.MovieGenres, user, "5", parent).ConfigureAwait(false)); + list.Add(await GetUserView(SpecialFolder.MovieGenres, user, "5", parent).ConfigureAwait(false)); return GetResult(list, parent, query); } @@ -421,9 +489,9 @@ namespace MediaBrowser.Controller.Entities return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty }).Where(i => i is Movie), parent, GetSpecialItemsLimit(), query); } - private QueryResult<BaseItem> GetMovieGenres(Folder parent, User user, InternalItemsQuery query) + private async Task<QueryResult<BaseItem>> GetMovieGenres(Folder parent, User user, InternalItemsQuery query) { - var genres = GetRecursiveChildren(parent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty }) + var tasks = GetRecursiveChildren(parent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty }) .Where(i => i is Movie) .SelectMany(i => i.Genres) .Distinct(StringComparer.OrdinalIgnoreCase) @@ -441,11 +509,23 @@ namespace MediaBrowser.Controller.Entities } }) - .Where(i => i != null); + .Where(i => i != null) + .Select(i => GetUserView(i.Name, SpecialFolder.MovieGenre, user, i.SortName, parent)); + + var genres = await Task.WhenAll(tasks).ConfigureAwait(false); return GetResult(genres, parent, query); } + private async Task<QueryResult<BaseItem>> GetMovieGenreItems(Folder queryParent, Folder displayParent, User user, InternalItemsQuery query) + { + var items = GetRecursiveChildren(queryParent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty }) + .Where(i => i is Movie) + .Where(i => i.Genres.Contains(displayParent.Name, StringComparer.OrdinalIgnoreCase)); + + return GetResult(items, queryParent, query); + } + private async Task<QueryResult<BaseItem>> GetTvView(Folder parent, User user, InternalItemsQuery query) { if (query.Recursive) @@ -461,7 +541,7 @@ namespace MediaBrowser.Controller.Entities list.Add(await GetUserView(SpecialFolder.TvShowSeries, user, "3", parent).ConfigureAwait(false)); list.Add(await GetUserView(SpecialFolder.TvFavoriteSeries, user, "4", parent).ConfigureAwait(false)); list.Add(await GetUserView(SpecialFolder.TvFavoriteEpisodes, user, "5", parent).ConfigureAwait(false)); - //list.Add(await GetUserView(SpecialFolder.TvGenres, user, "5", parent).ConfigureAwait(false)); + list.Add(await GetUserView(SpecialFolder.TvGenres, user, "6", parent).ConfigureAwait(false)); return GetResult(list, parent, query); } @@ -479,7 +559,7 @@ namespace MediaBrowser.Controller.Entities list.Add(await GetUserView(SpecialFolder.RecentlyPlayedGames, user, "1", parent).ConfigureAwait(false)); list.Add(await GetUserView(SpecialFolder.GameFavorites, user, "2", parent).ConfigureAwait(false)); list.Add(await GetUserView(SpecialFolder.GameSystems, user, "3", parent).ConfigureAwait(false)); - //list.Add(await GetUserView(SpecialFolder.GameGenres, user, "4", parent).ConfigureAwait(false)); + list.Add(await GetUserView(SpecialFolder.GameGenres, user, "4", parent).ConfigureAwait(false)); return GetResult(list, parent, query); } @@ -545,9 +625,9 @@ namespace MediaBrowser.Controller.Entities return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.TvShows, string.Empty }).OfType<Series>(), parent, query); } - private QueryResult<BaseItem> GetTvGenres(Folder parent, User user, InternalItemsQuery query) + private async Task<QueryResult<BaseItem>> GetTvGenres(Folder parent, User user, InternalItemsQuery query) { - var genres = GetRecursiveChildren(parent, user, new[] { CollectionType.TvShows, string.Empty }) + var tasks = GetRecursiveChildren(parent, user, new[] { CollectionType.TvShows, string.Empty }) .OfType<Series>() .SelectMany(i => i.Genres) .Distinct(StringComparer.OrdinalIgnoreCase) @@ -565,19 +645,40 @@ namespace MediaBrowser.Controller.Entities } }) - .Where(i => i != null); + .Where(i => i != null) + .Select(i => GetUserView(i.Name, SpecialFolder.TvGenre, user, i.SortName, parent)); + + var genres = await Task.WhenAll(tasks).ConfigureAwait(false); return GetResult(genres, parent, query); } + private async Task<QueryResult<BaseItem>> GetTvGenreItems(Folder queryParent, Folder displayParent, User user, InternalItemsQuery query) + { + var items = GetRecursiveChildren(queryParent, user, new[] { CollectionType.TvShows, string.Empty }) + .Where(i => i is Series) + .Where(i => i.Genres.Contains(displayParent.Name, StringComparer.OrdinalIgnoreCase)); + + return GetResult(items, queryParent, query); + } + private QueryResult<BaseItem> GetGameSystems(Folder parent, User user, InternalItemsQuery query) { return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Games }).OfType<GameSystem>(), parent, query); } - private QueryResult<BaseItem> GetGameGenres(Folder parent, User user, InternalItemsQuery query) + private async Task<QueryResult<BaseItem>> GetGameGenreItems(Folder queryParent, Folder displayParent, User user, InternalItemsQuery query) + { + var items = GetRecursiveChildren(queryParent, user, new[] { CollectionType.Games }) + .OfType<Game>() + .Where(i => i.Genres.Contains(displayParent.Name, StringComparer.OrdinalIgnoreCase)); + + return GetResult(items, queryParent, query); + } + + private async Task<QueryResult<BaseItem>> GetGameGenres(Folder parent, User user, InternalItemsQuery query) { - var genres = GetRecursiveChildren(parent, user, new[] { CollectionType.Games }) + var tasks = GetRecursiveChildren(parent, user, new[] { CollectionType.Games }) .OfType<Game>() .SelectMany(i => i.Genres) .Distinct(StringComparer.OrdinalIgnoreCase) @@ -595,7 +696,10 @@ namespace MediaBrowser.Controller.Entities } }) - .Where(i => i != null); + .Where(i => i != null) + .Select(i => GetUserView(i.Name, SpecialFolder.GameGenre, user, i.SortName, parent)); + + var genres = await Task.WhenAll(tasks).ConfigureAwait(false); return GetResult(genres, parent, query); } @@ -611,24 +715,24 @@ namespace MediaBrowser.Controller.Entities } private QueryResult<BaseItem> GetResult<T>(IEnumerable<T> items, - BaseItem parentItem, + BaseItem queryParent, InternalItemsQuery query) where T : BaseItem { - return GetResult(items, parentItem, null, query); + return GetResult(items, queryParent, null, query); } private QueryResult<BaseItem> GetResult<T>(IEnumerable<T> items, - BaseItem parentItem, + BaseItem queryParent, int? totalRecordLimit, InternalItemsQuery query) where T : BaseItem { - return SortAndFilter(items, parentItem, totalRecordLimit, query, _libraryManager, _userDataManager); + return SortAndFilter(items, queryParent, totalRecordLimit, query, _libraryManager, _userDataManager); } public static QueryResult<BaseItem> SortAndFilter(IEnumerable<BaseItem> items, - BaseItem parentItem, + BaseItem queryParent, int? totalRecordLimit, InternalItemsQuery query, ILibraryManager libraryManager, @@ -643,7 +747,7 @@ namespace MediaBrowser.Controller.Entities query.IsVirtualUnaired, query.IsUnaired); - items = CollapseBoxSetItemsIfNeeded(items, query, parentItem, user); + items = CollapseBoxSetItemsIfNeeded(items, query, queryParent, user); // This must be the last filter if (!string.IsNullOrEmpty(query.AdjacentTo)) @@ -656,10 +760,10 @@ namespace MediaBrowser.Controller.Entities public static IEnumerable<BaseItem> CollapseBoxSetItemsIfNeeded(IEnumerable<BaseItem> items, InternalItemsQuery query, - BaseItem parentItem, + BaseItem queryParent, User user) { - if (CollapseBoxSetItems(query, parentItem, user)) + if (CollapseBoxSetItems(query, queryParent, user)) { items = BaseItem.CollectionManager.CollapseItemsWithinBoxSets(items, user); } @@ -691,11 +795,11 @@ namespace MediaBrowser.Controller.Entities } private static bool CollapseBoxSetItems(InternalItemsQuery query, - BaseItem parentItem, + BaseItem queryParent, User user) { // Could end up stuck in a loop like this - if (parentItem is BoxSet) + if (queryParent is BoxSet) { return false; } @@ -1488,7 +1592,7 @@ namespace MediaBrowser.Controller.Entities }); } - private IEnumerable<Folder> GetMediaFolders(Folder parent, User user, string[] viewTypes) + private IEnumerable<Folder> GetMediaFolders(Folder parent, User user, IEnumerable<string> viewTypes) { if (parent == null || parent is UserView) { @@ -1498,7 +1602,7 @@ namespace MediaBrowser.Controller.Entities return new[] { parent }; } - private IEnumerable<BaseItem> GetRecursiveChildren(Folder parent, User user, string[] viewTypes) + private IEnumerable<BaseItem> GetRecursiveChildren(Folder parent, User user, IEnumerable<string> viewTypes) { if (parent == null || parent is UserView) { @@ -1521,7 +1625,15 @@ namespace MediaBrowser.Controller.Entities return list; } - private async Task<UserView> GetUserView(string type, User user, string sortName, Folder parent) + private async Task<UserView> GetUserView(string name, string type, User user, string sortName, BaseItem parent) + { + var view = await _userViewManager.GetUserView(name, parent.Id.ToString("N"), type, user, sortName, CancellationToken.None) + .ConfigureAwait(false); + + return view; + } + + private async Task<UserView> GetUserView(string type, User user, string sortName, BaseItem parent) { var view = await _userViewManager.GetUserView(parent.Id.ToString("N"), type, user, sortName, CancellationToken.None) .ConfigureAwait(false); |
