aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2013-09-11 13:54:59 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2013-09-11 13:54:59 -0400
commit803e8b4a2eb5fcf1b5a3679fe551d541620d4743 (patch)
tree8d070a411db7406fe5e7f30e03feefe83ad7127d /MediaBrowser.Api
parent1496991096c4db9f69bc572aeefc8099ca0f0c01 (diff)
improved performance of item counts
Diffstat (limited to 'MediaBrowser.Api')
-rw-r--r--MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs106
-rw-r--r--MediaBrowser.Api/DefaultTheme/MoviesView.cs12
-rw-r--r--MediaBrowser.Api/DefaultTheme/TvView.cs6
-rw-r--r--MediaBrowser.Api/ItemUpdateService.cs8
-rw-r--r--MediaBrowser.Api/SimilarItemsHelper.cs1
-rw-r--r--MediaBrowser.Api/UserLibrary/ItemsService.cs49
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;
}