|
@@ -70,9 +70,13 @@ namespace MediaBrowser.Api.UserLibrary
|
|
|
items = FilterItems(request, items, user);
|
|
|
|
|
|
var extractedItems = GetAllItems(request, items, user);
|
|
|
- var ibnItemsArray = SortItems(request, extractedItems).ToArray();
|
|
|
-
|
|
|
- IEnumerable<Tuple<string, Func<IEnumerable<BaseItem>>>> ibnItems = ibnItemsArray;
|
|
|
+
|
|
|
+ extractedItems = FilterItems(request, extractedItems, user);
|
|
|
+ extractedItems = SortItems(request, extractedItems);
|
|
|
+
|
|
|
+ var ibnItemsArray = extractedItems.ToArray();
|
|
|
+
|
|
|
+ IEnumerable<IbnStub<TItemType>> ibnItems = ibnItemsArray;
|
|
|
|
|
|
var result = new ItemsResult
|
|
|
{
|
|
@@ -104,23 +108,74 @@ namespace MediaBrowser.Api.UserLibrary
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// Filters the items.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="request">The request.</param>
|
|
|
+ /// <param name="items">The items.</param>
|
|
|
+ /// <param name="user">The user.</param>
|
|
|
+ /// <returns>IEnumerable{IbnStub}.</returns>
|
|
|
+ private IEnumerable<IbnStub<TItemType>> FilterItems(GetItemsByName request, IEnumerable<IbnStub<TItemType>> items, User user)
|
|
|
+ {
|
|
|
+ var filters = request.GetFilters().ToList();
|
|
|
+
|
|
|
+ if (filters.Count == 0)
|
|
|
+ {
|
|
|
+ return items;
|
|
|
+ }
|
|
|
+
|
|
|
+ items = items.AsParallel();
|
|
|
+
|
|
|
+ if (filters.Contains(ItemFilter.Dislikes))
|
|
|
+ {
|
|
|
+ items = items.Where(i =>
|
|
|
+ {
|
|
|
+ var userdata = i.GetUserItemData(UserDataRepository, user.Id).Result;
|
|
|
+
|
|
|
+ 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;
|
|
|
+
|
|
|
+ return userdata != null && userdata.Likes.HasValue && userdata.Likes.Value;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ if (filters.Contains(ItemFilter.IsFavorite))
|
|
|
+ {
|
|
|
+ items = items.Where(i =>
|
|
|
+ {
|
|
|
+ var userdata = i.GetUserItemData(UserDataRepository, user.Id).Result;
|
|
|
+
|
|
|
+ return userdata != null && userdata.Likes.HasValue && userdata.IsFavorite;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ return items.AsEnumerable();
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// Sorts the items.
|
|
|
/// </summary>
|
|
|
/// <param name="request">The request.</param>
|
|
|
/// <param name="items">The items.</param>
|
|
|
/// <returns>IEnumerable{BaseItem}.</returns>
|
|
|
- private IEnumerable<Tuple<string, Func<IEnumerable<BaseItem>>>> SortItems(GetItemsByName request, IEnumerable<Tuple<string, Func<IEnumerable<BaseItem>>>> items)
|
|
|
+ private IEnumerable<IbnStub<TItemType>> SortItems(GetItemsByName request, IEnumerable<IbnStub<TItemType>> items)
|
|
|
{
|
|
|
if (string.Equals(request.SortBy, "SortName", StringComparison.OrdinalIgnoreCase))
|
|
|
{
|
|
|
if (request.SortOrder.HasValue && request.SortOrder.Value == Model.Entities.SortOrder.Descending)
|
|
|
{
|
|
|
- items = items.OrderByDescending(i => i.Item1);
|
|
|
+ items = items.OrderByDescending(i => i.Name);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- items = items.OrderBy(i => i.Item1);
|
|
|
+ items = items.OrderBy(i => i.Name);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -160,14 +215,7 @@ namespace MediaBrowser.Api.UserLibrary
|
|
|
/// <param name="items">The items.</param>
|
|
|
/// <param name="user">The user.</param>
|
|
|
/// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns>
|
|
|
- protected abstract IEnumerable<Tuple<string, Func<IEnumerable<BaseItem>>>> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items, User user);
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// Gets the entity.
|
|
|
- /// </summary>
|
|
|
- /// <param name="name">The name.</param>
|
|
|
- /// <returns>Task{BaseItem}.</returns>
|
|
|
- protected abstract Task<TItemType> GetEntity(string name);
|
|
|
+ protected abstract IEnumerable<IbnStub<TItemType>> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items, User user);
|
|
|
|
|
|
/// <summary>
|
|
|
/// Gets the dto.
|
|
@@ -176,17 +224,17 @@ namespace MediaBrowser.Api.UserLibrary
|
|
|
/// <param name="user">The user.</param>
|
|
|
/// <param name="fields">The fields.</param>
|
|
|
/// <returns>Task{DtoBaseItem}.</returns>
|
|
|
- private async Task<BaseItemDto> GetDto(Tuple<string, Func<IEnumerable<BaseItem>>> stub, User user, List<ItemFields> fields)
|
|
|
+ private async Task<BaseItemDto> GetDto(IbnStub<TItemType> stub, User user, List<ItemFields> fields)
|
|
|
{
|
|
|
BaseItem item;
|
|
|
|
|
|
try
|
|
|
{
|
|
|
- item = await GetEntity(stub.Item1).ConfigureAwait(false);
|
|
|
+ item = await stub.GetItem().ConfigureAwait(false);
|
|
|
}
|
|
|
catch (IOException ex)
|
|
|
{
|
|
|
- Logger.ErrorException("Error getting IBN item {0}", ex, stub.Item1);
|
|
|
+ Logger.ErrorException("Error getting IBN item {0}", ex, stub.Name);
|
|
|
return null;
|
|
|
}
|
|
|
|
|
@@ -194,7 +242,7 @@ namespace MediaBrowser.Api.UserLibrary
|
|
|
|
|
|
if (fields.Contains(ItemFields.ItemCounts))
|
|
|
{
|
|
|
- var items = stub.Item2().ToList();
|
|
|
+ var items = stub.Items;
|
|
|
|
|
|
dto.ChildCount = items.Count;
|
|
|
dto.RecentlyAddedItemCount = items.Count(i => i.IsRecentlyAdded(user));
|
|
@@ -216,4 +264,48 @@ namespace MediaBrowser.Api.UserLibrary
|
|
|
[ApiMember(Name = "SortBy", Description = "Optional. Options: SortName", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
|
|
|
public string SortBy { get; set; }
|
|
|
}
|
|
|
+
|
|
|
+ public class IbnStub<T>
|
|
|
+ where T : BaseItem
|
|
|
+ {
|
|
|
+ private readonly Func<IEnumerable<BaseItem>> _childItemsFunction;
|
|
|
+ private List<BaseItem> _childItems;
|
|
|
+
|
|
|
+ private readonly Func<string,Task<T>> _itemFunction;
|
|
|
+ private Task<T> _itemTask;
|
|
|
+
|
|
|
+ public string Name;
|
|
|
+
|
|
|
+ public BaseItem Item;
|
|
|
+ private Task<UserItemData> _userData;
|
|
|
+
|
|
|
+ public List<BaseItem> Items
|
|
|
+ {
|
|
|
+ get { return _childItems ?? (_childItems = _childItemsFunction().ToList()); }
|
|
|
+ }
|
|
|
+
|
|
|
+ public Task<T> GetItem()
|
|
|
+ {
|
|
|
+ return _itemTask ?? (_itemTask = _itemFunction(Name));
|
|
|
+ }
|
|
|
+
|
|
|
+ public async Task<UserItemData> GetUserItemData(IUserDataRepository repo, Guid userId)
|
|
|
+ {
|
|
|
+ var item = await GetItem().ConfigureAwait(false);
|
|
|
+
|
|
|
+ if (_userData == null)
|
|
|
+ {
|
|
|
+ _userData = repo.GetUserData(userId, item.GetUserDataKey());
|
|
|
+ }
|
|
|
+
|
|
|
+ return await _userData.ConfigureAwait(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ public IbnStub(string name, Func<IEnumerable<BaseItem>> childItems, Func<string,Task<T>> item)
|
|
|
+ {
|
|
|
+ Name = name;
|
|
|
+ _childItemsFunction = childItems;
|
|
|
+ _itemFunction = item;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|