diff options
Diffstat (limited to 'MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs')
| -rw-r--r-- | MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs | 254 |
1 files changed, 186 insertions, 68 deletions
diff --git a/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs b/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs index 6c7ba96ec..385bef026 100644 --- a/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs +++ b/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs @@ -51,8 +51,8 @@ namespace MediaBrowser.Api.DefaultTheme public string RomanceGenre { get; set; } } - [Route("/MBT/DefaultTheme/Home", "GET")] - public class GetHomeView : IReturn<HomeView> + [Route("/MBT/DefaultTheme/Favorites", "GET")] + public class GetFavoritesView : IReturn<FavoritesView> { [ApiMember(Name = "UserId", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] public Guid UserId { get; set; } @@ -78,47 +78,103 @@ namespace MediaBrowser.Api.DefaultTheme _userDataManager = userDataManager; } - public object Get(GetHomeView request) - { - var result = GetHomeView(request); - - return ToOptimizedResult(result); - } - - private HomeView GetHomeView(GetHomeView request) + public object Get(GetFavoritesView request) { var user = _userManager.GetUserById(request.UserId); - var allItems = user.RootFolder.GetRecursiveChildren(user) + var allItems = user.RootFolder.GetRecursiveChildren(user, i => _userDataManager.GetUserData(user.Id, i.GetUserDataKey()).IsFavorite) .ToList(); - var itemsWithBackdrops = allItems.Where(i => i.BackdropImagePaths.Count > 0).ToList(); + var itemsWithImages = allItems.Where(i => !string.IsNullOrEmpty(i.PrimaryImagePath)) + .ToList(); + + var itemsWithBackdrops = allItems.Where(i => i.BackdropImagePaths.Count > 0) + .ToList(); - var view = new HomeView(); + var view = new FavoritesView(); var fields = new List<ItemFields>(); - var eligibleSpotlightItems = itemsWithBackdrops - .Where(i => i is Game || i is Movie || i is Series || i is MusicArtist); + view.BackdropItems = FilterItemsForBackdropDisplay(itemsWithBackdrops.OrderBy(i => Guid.NewGuid())) + .Take(10) + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToList(); + + var spotlightItems = itemsWithBackdrops.OrderBy(i => Guid.NewGuid()) + .Take(10) + .ToList(); - var dtos = FilterItemsForBackdropDisplay(eligibleSpotlightItems) + view.SpotlightItems = spotlightItems + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToList(); + + view.Albums = itemsWithImages + .OfType<MusicAlbum>() .OrderBy(i => Guid.NewGuid()) - .Take(50) - .Select(i => _dtoService.GetBaseItemDto(i, fields, user)); + .Take(4) + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToList(); - view.SpotlightItems = dtos.ToList(); + view.Books = itemsWithImages + .OfType<Book>() + .OrderBy(i => Guid.NewGuid()) + .Take(6) + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToList(); - return view; - } + view.Episodes = itemsWithImages + .OfType<Episode>() + .OrderBy(i => Guid.NewGuid()) + .Take(6) + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToList(); - public object Get(GetGamesView request) - { - var result = GetGamesView(request); + view.Games = itemsWithImages + .OfType<Game>() + .OrderBy(i => Guid.NewGuid()) + .Take(6) + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToList(); + + view.Movies = itemsWithImages + .OfType<Movie>() + .OrderBy(i => Guid.NewGuid()) + .Take(6) + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToList(); + + view.Series = itemsWithImages + .OfType<Series>() + .OrderBy(i => Guid.NewGuid()) + .Take(6) + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToList(); - return ToOptimizedResult(result); + view.Songs = itemsWithImages + .OfType<Audio>() + .OrderBy(i => Guid.NewGuid()) + .Take(4) + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToList(); + + view.Artists = itemsWithImages + .OfType<MusicArtist>() + .OrderBy(i => Guid.NewGuid()) + .Take(4) + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToList(); + + view.MiniSpotlights = itemsWithBackdrops + .Except(spotlightItems) + .OrderBy(i => Guid.NewGuid()) + .Take(5) + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToList(); + + return ToOptimizedResult(view); } - private GamesView GetGamesView(GetGamesView request) + public object Get(GetGamesView request) { var user = _userManager.GetUserById(request.UserId); @@ -129,17 +185,23 @@ namespace MediaBrowser.Api.DefaultTheme var itemsWithBackdrops = FilterItemsForBackdropDisplay(items.Where(i => i.BackdropImagePaths.Count > 0)).ToList(); + var gamesWithBackdrops = itemsWithBackdrops.OfType<Game>().ToList(); + var view = new GamesView(); var fields = new List<ItemFields>(); - var dtos = itemsWithBackdrops - .OfType<Game>() + view.BackdropItems = gamesWithBackdrops .OrderBy(i => Guid.NewGuid()) - .Take(50) - .Select(i => _dtoService.GetBaseItemDto(i, fields, user)); + .Take(10) + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToList(); - view.SpotlightItems = dtos.ToList(); + view.SpotlightItems = gamesWithBackdrops + .OrderBy(i => Guid.NewGuid()) + .Take(10) + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToList(); view.MultiPlayerItems = gamesWithImages .Where(i => i.PlayersSupported.HasValue && i.PlayersSupported.Value > 1) @@ -149,32 +211,17 @@ namespace MediaBrowser.Api.DefaultTheme .Take(1) .ToList(); - view.MiniSpotlights = itemsWithBackdrops - .OfType<Game>() + view.MiniSpotlights = gamesWithBackdrops .OrderBy(i => Guid.NewGuid()) - .Take(3) + .Take(5) .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) .ToList(); - - return view; - } - - public object Get(GetMovieView request) - { - var result = GetMovieView(request); - return ToOptimizedResult(result); + return ToOptimizedResult(view); } public object Get(GetTvView request) { - var result = GetTvView(request); - - return ToOptimizedResult(result); - } - - private TvView GetTvView(GetTvView request) - { var user = _userManager.GetUserById(request.UserId); var series = user.RootFolder.GetRecursiveChildren(user) @@ -187,13 +234,14 @@ namespace MediaBrowser.Api.DefaultTheme var fields = new List<ItemFields>(); - var dtos = FilterItemsForBackdropDisplay(seriesWithBackdrops) + var seriesWithBestBackdrops = FilterItemsForBackdropDisplay(seriesWithBackdrops).ToList(); + + view.BackdropItems = seriesWithBestBackdrops .OrderBy(i => Guid.NewGuid()) - .Take(50) + .Take(10) .AsParallel() - .Select(i => _dtoService.GetBaseItemDto(i, fields, user)); - - view.SpotlightItems = dtos.ToList(); + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToList(); view.ShowsItems = series .Where(i => i.BackdropImagePaths.Count > 0) @@ -224,16 +272,45 @@ namespace MediaBrowser.Api.DefaultTheme view.ActorItems = GetActors(series, user.Id); - view.MiniSpotlights = seriesWithBackdrops + var spotlightSeries = seriesWithBestBackdrops + .Where(i => i.CommunityRating.HasValue && i.CommunityRating >= 8.5) + .ToList(); + + if (spotlightSeries.Count < 20) + { + spotlightSeries = seriesWithBestBackdrops; + } + + spotlightSeries = spotlightSeries + .OrderBy(i => Guid.NewGuid()) + .Take(10) + .ToList(); + + view.SpotlightItems = spotlightSeries + .AsParallel() + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToList(); + + var miniSpotlightItems = seriesWithBackdrops + .Except(spotlightSeries.OfType<Series>()) + .Where(i => i.CommunityRating.HasValue && i.CommunityRating >= 8) + .ToList(); + + if (miniSpotlightItems.Count < 15) + { + miniSpotlightItems = seriesWithBackdrops; + } + + view.MiniSpotlights = miniSpotlightItems .OrderBy(i => Guid.NewGuid()) - .Take(3) + .Take(5) .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) .ToList(); - - return view; + + return ToOptimizedResult(view); } - private MoviesView GetMovieView(GetMovieView request) + public object Get(GetMovieView request) { var user = _userManager.GetUserById(request.UserId); @@ -241,7 +318,7 @@ namespace MediaBrowser.Api.DefaultTheme .ToList(); // Exclude trailers from backdrops because they're not always 1080p - var itemsWithBackdrops = items.Where(i => i.BackdropImagePaths.Count > 0 && !(i is Trailer)) + var itemsWithBackdrops = items.Where(i => i.BackdropImagePaths.Count > 0) .ToList(); var view = new MoviesView(); @@ -267,12 +344,14 @@ namespace MediaBrowser.Api.DefaultTheme var fields = new List<ItemFields>(); - var dtos = FilterItemsForBackdropDisplay(itemsWithBackdrops) - .OrderBy(i => Guid.NewGuid()) - .Take(50) - .Select(i => _dtoService.GetBaseItemDto(i, fields, user)); + var itemsWithTopBackdrops = FilterItemsForBackdropDisplay(itemsWithBackdrops).ToList(); - view.SpotlightItems = dtos.ToList(); + view.BackdropItems = itemsWithTopBackdrops + .OrderBy(i => Guid.NewGuid()) + .Take(10) + .AsParallel() + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToList(); view.MovieItems = moviesWithBackdrops .OrderBy(i => Guid.NewGuid()) @@ -344,13 +423,52 @@ namespace MediaBrowser.Api.DefaultTheme view.PeopleItems = GetActors(items, user.Id); - view.MiniSpotlights = moviesWithBackdrops + var spotlightItems = itemsWithTopBackdrops + .Where(i => i.CommunityRating.HasValue && i.CommunityRating >= 8) + .ToList(); + + if (spotlightItems.Count < 20) + { + spotlightItems = itemsWithTopBackdrops; + } + + spotlightItems = spotlightItems + .OrderBy(i => Guid.NewGuid()) + .Take(10) + .ToList(); + + view.SpotlightItems = spotlightItems + .AsParallel() + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToList(); + + var miniSpotlightItems = moviesWithBackdrops + .Except(spotlightItems) + .Where(i => i.CommunityRating.HasValue && i.CommunityRating >= 7.5) + .ToList(); + + if (miniSpotlightItems.Count < 15) + { + miniSpotlightItems = itemsWithTopBackdrops; + } + + miniSpotlightItems = miniSpotlightItems .OrderBy(i => Guid.NewGuid()) - .Take(3) + .ToList(); + + // Avoid implicitly captured closure + var currentUserId = user.Id; + miniSpotlightItems.InsertRange(2, moviesWithBackdrops + .Where(i => _userDataManager.GetUserData(currentUserId, i.GetUserDataKey()).PlaybackPositionTicks > 0) + .OrderByDescending(i => _userDataManager.GetUserData(currentUserId, i.GetUserDataKey()).LastPlayedDate ?? DateTime.MaxValue) + .Take(3)); + + view.MiniSpotlights = miniSpotlightItems + .Take(5) .Select(i => _dtoService.GetBaseItemDto(i, fields, user)) .ToList(); - return view; + return ToOptimizedResult(view); } private IEnumerable<BaseItem> FilterItemsForBackdropDisplay(IEnumerable<BaseItem> items) |
