diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-09-11 13:54:59 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-09-11 13:54:59 -0400 |
| commit | 803e8b4a2eb5fcf1b5a3679fe551d541620d4743 (patch) | |
| tree | 8d070a411db7406fe5e7f30e03feefe83ad7127d /MediaBrowser.Api | |
| parent | 1496991096c4db9f69bc572aeefc8099ca0f0c01 (diff) | |
improved performance of item counts
Diffstat (limited to 'MediaBrowser.Api')
| -rw-r--r-- | MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs | 106 | ||||
| -rw-r--r-- | MediaBrowser.Api/DefaultTheme/MoviesView.cs | 12 | ||||
| -rw-r--r-- | MediaBrowser.Api/DefaultTheme/TvView.cs | 6 | ||||
| -rw-r--r-- | MediaBrowser.Api/ItemUpdateService.cs | 8 | ||||
| -rw-r--r-- | MediaBrowser.Api/SimilarItemsHelper.cs | 1 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/ItemsService.cs | 49 |
6 files changed, 140 insertions, 42 deletions
diff --git a/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs b/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs index 71001a657d..d4f8241989 100644 --- a/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs +++ b/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs @@ -4,8 +4,10 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Localization; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Querying; using ServiceStack.ServiceHost; using System; using System.Collections.Generic; @@ -26,8 +28,11 @@ namespace MediaBrowser.Api.DefaultTheme { [ApiMember(Name = "UserId", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] public Guid UserId { get; set; } + + [ApiMember(Name = "FamilyRating", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + public string FamilyRating { get; set; } } - + public class DefaultThemeService : BaseApiService { private readonly IUserManager _userManager; @@ -35,12 +40,15 @@ namespace MediaBrowser.Api.DefaultTheme private readonly ILogger _logger; private readonly ILibraryManager _libraryManager; - public DefaultThemeService(IUserManager userManager, IDtoService dtoService, ILogger logger, ILibraryManager libraryManager) + private readonly ILocalizationManager _localization; + + public DefaultThemeService(IUserManager userManager, IDtoService dtoService, ILogger logger, ILibraryManager libraryManager, ILocalizationManager localization) { _userManager = userManager; _dtoService = dtoService; _logger = logger; _libraryManager = libraryManager; + _localization = localization; } public object Get(GetTvView request) @@ -62,19 +70,16 @@ namespace MediaBrowser.Api.DefaultTheme var view = new TvView(); - view.BackdropItems = seriesWithBackdrops + var fields = Enum.GetNames(typeof(ItemFields)) + .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)) + .ToList(); + + var spotlightItemTasks = seriesWithBackdrops .OrderBy(i => Guid.NewGuid()) - .Select(i => GetItemStub(i, ImageType.Backdrop)) - .Where(i => i != null) .Take(30) - .ToArray(); + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)); - view.SpotlightItems = seriesWithBackdrops - .OrderBy(i => Guid.NewGuid()) - .Select(i => GetItemStub(i, ImageType.Backdrop)) - .Where(i => i != null) - .Take(30) - .ToArray(); + view.SpotlightItems = await Task.WhenAll(spotlightItemTasks).ConfigureAwait(false); view.ShowsItems = series .Where(i => !string.IsNullOrEmpty(i.PrimaryImagePath)) @@ -104,31 +109,43 @@ namespace MediaBrowser.Api.DefaultTheme .Where(i => i is Movie || i is Trailer || i is BoxSet) .ToList(); + var actorsTask = GetActors(items); + // Exclude trailers from backdrops because they're not always 1080p var itemsWithBackdrops = items.Where(i => i.BackdropImagePaths.Count > 0 && !(i is Trailer)) .ToList(); - var movies = items.OfType<Movie>().ToList(); + var baselineRating = _localization.GetRatingLevel(request.FamilyRating ?? "PG"); + + var view = new MoviesView(); + + var movies = items.OfType<Movie>() + .ToList(); + + var hdMovies = movies.Where(i => i.IsHd).ToList(); + + var familyMovies = movies.Where(i => IsFamilyMovie(i, baselineRating)).ToList(); + + view.HDMoviePercentage = 100 * hdMovies.Count; + view.HDMoviePercentage /= movies.Count; + view.FamilyMoviePercentage = 100 * familyMovies.Count; + view.FamilyMoviePercentage /= movies.Count; + var moviesWithImages = movies .Where(i => !string.IsNullOrEmpty(i.PrimaryImagePath)) .ToList(); - var view = new MoviesView(); + var fields = Enum.GetNames(typeof(ItemFields)) + .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)) + .ToList(); - view.BackdropItems = itemsWithBackdrops + var spotlightItemTasks = itemsWithBackdrops .OrderBy(i => Guid.NewGuid()) - .Select(i => GetItemStub(i, ImageType.Backdrop)) - .Where(i => i != null) .Take(30) - .ToArray(); + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)); - view.SpotlightItems = itemsWithBackdrops - .OrderBy(i => Guid.NewGuid()) - .Select(i => GetItemStub(i, ImageType.Backdrop)) - .Where(i => i != null) - .Take(30) - .ToArray(); + view.SpotlightItems = await Task.WhenAll(spotlightItemTasks).ConfigureAwait(false); view.MovieItems = moviesWithImages .OrderBy(i => Guid.NewGuid()) @@ -155,8 +172,6 @@ namespace MediaBrowser.Api.DefaultTheme .Take(3) .ToArray(); - view.PeopleItems = await GetActors(items).ConfigureAwait(false); - view.ThreeDItems = moviesWithImages .Where(i => i.Is3D) .OrderBy(i => Guid.NewGuid()) @@ -165,17 +180,51 @@ namespace MediaBrowser.Api.DefaultTheme .Take(3) .ToArray(); - view.HDItems = moviesWithImages - .Where(i => i.IsHd) + view.HDItems = hdMovies + .Where(i => !string.IsNullOrEmpty(i.PrimaryImagePath)) .OrderBy(i => Guid.NewGuid()) .Select(i => GetItemStub(i, ImageType.Primary)) .Where(i => i != null) .Take(3) .ToArray(); + view.FamilyMovies = familyMovies + .Where(i => !string.IsNullOrEmpty(i.PrimaryImagePath)) + .OrderBy(i => Guid.NewGuid()) + .Select(i => GetItemStub(i, ImageType.Primary)) + .Where(i => i != null) + .Take(3) + .ToArray(); + + view.PeopleItems = await actorsTask.ConfigureAwait(false); + return view; } + private bool IsFamilyMovie(BaseItem item, int? baselineRating) + { + var ratingString = item.CustomRating; + + if (string.IsNullOrEmpty(ratingString)) + { + ratingString = item.OfficialRating; + } + + if (string.IsNullOrEmpty(ratingString)) + { + return false; + } + + var rating = _localization.GetRatingLevel(ratingString); + + if (!baselineRating.HasValue || !rating.HasValue) + { + return false; + } + + return rating.Value <= baselineRating.Value; + } + private async Task<ItemStub[]> GetActors(IEnumerable<BaseItem> mediaItems) { var actorStubs = new List<ItemStub>(); @@ -183,6 +232,7 @@ namespace MediaBrowser.Api.DefaultTheme var actors = mediaItems.SelectMany(i => i.People) .Select(i => i.Name) .Distinct(StringComparer.OrdinalIgnoreCase) + .OrderBy(i => Guid.NewGuid()) .ToList(); foreach (var actor in actors) diff --git a/MediaBrowser.Api/DefaultTheme/MoviesView.cs b/MediaBrowser.Api/DefaultTheme/MoviesView.cs index 0802473d2b..6bf1bfdd93 100644 --- a/MediaBrowser.Api/DefaultTheme/MoviesView.cs +++ b/MediaBrowser.Api/DefaultTheme/MoviesView.cs @@ -1,10 +1,10 @@ - +using MediaBrowser.Model.Dto; + namespace MediaBrowser.Api.DefaultTheme { public class MoviesView { - public ItemStub[] SpotlightItems { get; set; } - public ItemStub[] BackdropItems { get; set; } + public BaseItemDto[] SpotlightItems { get; set; } public ItemStub[] MovieItems { get; set; } public ItemStub[] PeopleItems { get; set; } @@ -12,5 +12,11 @@ namespace MediaBrowser.Api.DefaultTheme public ItemStub[] TrailerItems { get; set; } public ItemStub[] HDItems { get; set; } public ItemStub[] ThreeDItems { get; set; } + + public ItemStub[] FamilyMovies { get; set; } + + public double FamilyMoviePercentage { get; set; } + + public double HDMoviePercentage { get; set; } } } diff --git a/MediaBrowser.Api/DefaultTheme/TvView.cs b/MediaBrowser.Api/DefaultTheme/TvView.cs index b7379699da..ba7d120f12 100644 --- a/MediaBrowser.Api/DefaultTheme/TvView.cs +++ b/MediaBrowser.Api/DefaultTheme/TvView.cs @@ -1,10 +1,10 @@ - +using MediaBrowser.Model.Dto; + namespace MediaBrowser.Api.DefaultTheme { public class TvView { - public ItemStub[] SpotlightItems { get; set; } - public ItemStub[] BackdropItems { get; set; } + public BaseItemDto[] SpotlightItems { get; set; } public ItemStub[] ShowsItems { get; set; } public ItemStub[] ActorItems { get; set; } } diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs index df5c32b991..0428570cc5 100644 --- a/MediaBrowser.Api/ItemUpdateService.cs +++ b/MediaBrowser.Api/ItemUpdateService.cs @@ -207,13 +207,15 @@ namespace MediaBrowser.Api item.ForcedSortName = request.SortName; } - item.DisplayMediaType = request.DisplayMediaType; - item.CommunityRating = request.CommunityRating; - item.HomePageUrl = request.HomePageUrl; item.Budget = request.Budget; item.Revenue = request.Revenue; + item.CriticRating = request.CriticRating; item.CriticRatingSummary = request.CriticRatingSummary; + + item.DisplayMediaType = request.DisplayMediaType; + item.CommunityRating = request.CommunityRating; + item.HomePageUrl = request.HomePageUrl; item.IndexNumber = request.IndexNumber; item.ParentIndexNumber = request.ParentIndexNumber; item.Overview = request.Overview; diff --git a/MediaBrowser.Api/SimilarItemsHelper.cs b/MediaBrowser.Api/SimilarItemsHelper.cs index 5d10afd2cf..9877860454 100644 --- a/MediaBrowser.Api/SimilarItemsHelper.cs +++ b/MediaBrowser.Api/SimilarItemsHelper.cs @@ -139,7 +139,6 @@ namespace MediaBrowser.Api .Select(i => new Tuple<BaseItem, int>(i, getSimilarityScore(item, i))) .Where(i => i.Item2 > 2) .OrderByDescending(i => i.Item2) - .ThenByDescending(i => i.Item1.CriticRating ?? 0) .Select(i => i.Item1); } diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index 1cf8fda20b..80246a5d84 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -121,7 +121,7 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "AlbumArtistStartsWithOrGreater", Description = "Optional filter by items whose album artist is sorted equally or greater than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public string AlbumArtistStartsWithOrGreater { get; set; } - + /// <summary> /// Gets or sets the air days. /// </summary> @@ -161,8 +161,14 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "AdjacentTo", Description = "Optional. Return items that are siblings of a supplied item.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public string AdjacentTo { get; set; } - [ApiMember(Name = "MinIndexNumber", Description = "Optional filter index number.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")] + [ApiMember(Name = "MinIndexNumber", Description = "Optional filter by minimum index number.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")] public int? MinIndexNumber { get; set; } + + [ApiMember(Name = "HasParentalRating", Description = "Optional filter by items that have or do not have a parental rating", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] + public bool? HasParentalRating { get; set; } + + [ApiMember(Name = "IsHD", Description = "Optional filter by items that are HD or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] + public bool? IsHD { get; set; } } /// <summary> @@ -481,7 +487,12 @@ namespace MediaBrowser.Api.UserLibrary { items = items.Where(i => { - var rating = i.CustomRating ?? i.OfficialRating; + var rating = i.CustomRating; + + if (string.IsNullOrEmpty(rating)) + { + rating = i.OfficialRating; + } if (string.IsNullOrEmpty(rating)) { @@ -504,7 +515,12 @@ namespace MediaBrowser.Api.UserLibrary { items = items.Where(i => { - var rating = i.CustomRating ?? i.OfficialRating; + var rating = i.CustomRating; + + if (string.IsNullOrEmpty(rating)) + { + rating = i.OfficialRating; + } if (string.IsNullOrEmpty(rating)) { @@ -669,6 +685,31 @@ namespace MediaBrowser.Api.UserLibrary }); } + if (request.HasParentalRating.HasValue) + { + items = items.Where(i => + { + var rating = i.CustomRating; + + if (string.IsNullOrEmpty(rating)) + { + rating = i.OfficialRating; + } + + if (request.HasParentalRating.Value) + { + return !string.IsNullOrEmpty(rating); + } + + return string.IsNullOrEmpty(rating); + }); + } + + if (request.IsHD.HasValue) + { + items = items.OfType<Video>().Where(i => i.IsHd == request.IsHD.Value); + } + return items; } |
