diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs index fd79255518..93062add2c 100644 --- a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs +++ b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs @@ -3,6 +3,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Entities; using MediaBrowser.Model.Querying; using ServiceStack.ServiceHost; using System; @@ -81,7 +82,7 @@ namespace MediaBrowser.Api.UserLibrary } else { - items = request.Recursive ? folder.RecursiveChildren: folder.Children; + items = request.Recursive ? folder.RecursiveChildren : folder.Children; } } else @@ -149,7 +150,7 @@ namespace MediaBrowser.Api.UserLibrary { items = items.Where(item => imageTypes.Any(imageType => ItemsService.HasImage(item.GetItem().Result, imageType))); } - + var filters = request.GetFilters().ToList(); if (filters.Count == 0) @@ -162,18 +163,20 @@ namespace MediaBrowser.Api.UserLibrary if (filters.Contains(ItemFilter.Dislikes)) { items = items.Where(i => - { - var userdata = i.GetUserItemData(UserDataRepository, user.Id).Result; + { + var item = i.GetItem().Result; + var userdata = UserDataRepository.GetUserData(user.Id, item.GetUserDataKey()); - return userdata != null && userdata.Likes.HasValue && !userdata.Likes.Value; - }); + return userdata != null && userdata.Likes.HasValue && !userdata.Likes.Value; + }); } if (filters.Contains(ItemFilter.Likes)) { items = items.Where(i => { - var userdata = i.GetUserItemData(UserDataRepository, user.Id).Result; + var item = i.GetItem().Result; + var userdata = UserDataRepository.GetUserData(user.Id, item.GetUserDataKey()); return userdata != null && userdata.Likes.HasValue && userdata.Likes.Value; }); @@ -183,12 +186,8 @@ namespace MediaBrowser.Api.UserLibrary { items = items.Where(i => { - var userdata = i.GetUserItemData(UserDataRepository, user.Id).Result; - - if (userdata == null) - { - return false; - } + var item = i.GetItem().Result; + var userdata = UserDataRepository.GetUserData(user.Id, item.GetUserDataKey()); var likes = userdata.Likes ?? false; var favorite = userdata.IsFavorite; @@ -196,20 +195,21 @@ namespace MediaBrowser.Api.UserLibrary return likes || favorite; }); } - + if (filters.Contains(ItemFilter.IsFavorite)) { items = items.Where(i => { - var userdata = i.GetUserItemData(UserDataRepository, user.Id).Result; + var item = i.GetItem().Result; + var userdata = UserDataRepository.GetUserData(user.Id, item.GetUserDataKey()); return userdata != null && userdata.Likes.HasValue && userdata.IsFavorite; }); } - + return items.AsEnumerable(); } - + /// /// Sorts the items. /// @@ -220,7 +220,7 @@ namespace MediaBrowser.Api.UserLibrary { if (string.Equals(request.SortBy, "SortName", StringComparison.OrdinalIgnoreCase)) { - if (request.SortOrder.HasValue && request.SortOrder.Value == Model.Entities.SortOrder.Descending) + if (request.SortOrder.HasValue && request.SortOrder.Value == SortOrder.Descending) { items = items.OrderByDescending(i => i.Name); } @@ -231,7 +231,7 @@ namespace MediaBrowser.Api.UserLibrary } else if (string.Equals(request.SortBy, "Random", StringComparison.OrdinalIgnoreCase)) { - if (request.SortOrder.HasValue && request.SortOrder.Value == Model.Entities.SortOrder.Descending) + if (request.SortOrder.HasValue && request.SortOrder.Value == SortOrder.Descending) { items = items.OrderByDescending(i => Guid.NewGuid()); } @@ -273,7 +273,7 @@ namespace MediaBrowser.Api.UserLibrary items = items.Where(f => vals.Contains(f.MediaType ?? string.Empty, StringComparer.OrdinalIgnoreCase)); } - + return items; } @@ -344,7 +344,7 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "NameStartsWithOrGreater", Description = "Optional filter by items whose name is sorted equally or greater than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public string NameStartsWithOrGreater { get; set; } - + /// /// What to sort the results by /// @@ -361,26 +361,17 @@ namespace MediaBrowser.Api.UserLibrary public class IbnStub where T : BaseItem { - private readonly Func> _itemFunction; + private readonly Func> _itemFunction; private Task _itemTask; - - public string Name; - private UserItemData _userData; + public string Name; public Task GetItem() { return _itemTask ?? (_itemTask = _itemFunction(Name)); } - public async Task GetUserItemData(IUserDataRepository repo, Guid userId) - { - var item = await GetItem().ConfigureAwait(false); - - return _userData ?? (_userData = repo.GetUserData(userId, item.GetUserDataKey())); - } - - public IbnStub(string name, Func> item) + public IbnStub(string name, Func> item) { Name = name; _itemFunction = item; diff --git a/MediaBrowser.Controller/Entities/IItemByName.cs b/MediaBrowser.Controller/Entities/IItemByName.cs index 380846d151..ea23d7e3fc 100644 --- a/MediaBrowser.Controller/Entities/IItemByName.cs +++ b/MediaBrowser.Controller/Entities/IItemByName.cs @@ -13,4 +13,24 @@ namespace MediaBrowser.Controller.Entities Dictionary UserItemCounts { get; set; } } + + public static class IItemByNameExtensions + { + public static ItemByNameCounts GetItemByNameCounts(this IItemByName item, User user) + { + if (user == null) + { + return item.ItemCounts; + } + + ItemByNameCounts counts; + + if (item.UserItemCounts.TryGetValue(user.Id, out counts)) + { + return counts; + } + + return null; + } + } } diff --git a/MediaBrowser.Model/Querying/ItemSortBy.cs b/MediaBrowser.Model/Querying/ItemSortBy.cs index de0bd72e1e..0b6821d38e 100644 --- a/MediaBrowser.Model/Querying/ItemSortBy.cs +++ b/MediaBrowser.Model/Querying/ItemSortBy.cs @@ -74,5 +74,7 @@ namespace MediaBrowser.Model.Querying public const string IsFolder = "IsFolder"; public const string IsUnplayed = "IsUnplayed"; public const string IsPlayed = "IsPlayed"; + public const string TrailerCount = "TrailerCount"; + public const string MovieCount = "MovieCount"; } } diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index 6cd7fe8686..82d72c95a5 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -189,6 +189,7 @@ + @@ -202,6 +203,7 @@ + diff --git a/MediaBrowser.Server.Implementations/Sorting/MovieCountComparer.cs b/MediaBrowser.Server.Implementations/Sorting/MovieCountComparer.cs new file mode 100644 index 0000000000..9444a33219 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Sorting/MovieCountComparer.cs @@ -0,0 +1,71 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Persistence; +using MediaBrowser.Controller.Sorting; +using MediaBrowser.Model.Querying; + +namespace MediaBrowser.Server.Implementations.Sorting +{ + public class MovieCountComparer : IUserBaseItemComparer + { + /// + /// Gets or sets the user. + /// + /// The user. + public User User { get; set; } + + /// + /// Gets or sets the user manager. + /// + /// The user manager. + public IUserManager UserManager { get; set; } + + /// + /// Gets or sets the user data repository. + /// + /// The user data repository. + public IUserDataRepository UserDataRepository { get; set; } + + /// + /// Compares the specified x. + /// + /// The x. + /// The y. + /// System.Int32. + public int Compare(BaseItem x, BaseItem y) + { + return GetValue(x).CompareTo(GetValue(y)); + } + + /// + /// Gets the date. + /// + /// The x. + /// DateTime. + private int GetValue(BaseItem x) + { + var itemByName = x as IItemByName; + + if (itemByName != null) + { + var counts = itemByName.GetItemByNameCounts(User); + + if (counts != null) + { + return counts.MovieCount; + } + } + + return 0; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get { return ItemSortBy.MovieCount; } + } + } +} diff --git a/MediaBrowser.Server.Implementations/Sorting/TrailerCountComparer.cs b/MediaBrowser.Server.Implementations/Sorting/TrailerCountComparer.cs new file mode 100644 index 0000000000..2af2cdf9c2 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Sorting/TrailerCountComparer.cs @@ -0,0 +1,71 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Persistence; +using MediaBrowser.Controller.Sorting; +using MediaBrowser.Model.Querying; + +namespace MediaBrowser.Server.Implementations.Sorting +{ + public class TrailerCountComparer : IUserBaseItemComparer + { + /// + /// Gets or sets the user. + /// + /// The user. + public User User { get; set; } + + /// + /// Gets or sets the user manager. + /// + /// The user manager. + public IUserManager UserManager { get; set; } + + /// + /// Gets or sets the user data repository. + /// + /// The user data repository. + public IUserDataRepository UserDataRepository { get; set; } + + /// + /// Compares the specified x. + /// + /// The x. + /// The y. + /// System.Int32. + public int Compare(BaseItem x, BaseItem y) + { + return GetValue(x).CompareTo(GetValue(y)); + } + + /// + /// Gets the date. + /// + /// The x. + /// DateTime. + private int GetValue(BaseItem x) + { + var itemByName = x as IItemByName; + + if (itemByName != null) + { + var counts = itemByName.GetItemByNameCounts(User); + + if (counts != null) + { + return counts.TrailerCount; + } + } + + return 0; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get { return ItemSortBy.TrailerCount; } + } + } +}