implemented filtering of ibn items based on like/dislike/favorite
This commit is contained in:
parent
86d15e145f
commit
cdd1a03299
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -48,14 +48,14 @@ 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 override IEnumerable<Tuple<string, Func<IEnumerable<BaseItem>>>> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items, User user)
|
||||
protected override IEnumerable<IbnStub<Genre>> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items, User user)
|
||||
{
|
||||
var itemsList = items.Where(i => i.Genres != null).ToList();
|
||||
|
||||
return itemsList
|
||||
.SelectMany(i => i.Genres)
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
.Select(name => new Tuple<string, Func<IEnumerable<BaseItem>>>(name, () => itemsList.Where(i => i.Genres.Contains(name, StringComparer.OrdinalIgnoreCase))));
|
||||
.Select(name => new IbnStub<Genre>(name, () => itemsList.Where(i => i.Genres.Contains(name, StringComparer.OrdinalIgnoreCase)), GetEntity));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -63,7 +63,7 @@ namespace MediaBrowser.Api.UserLibrary
|
|||
/// </summary>
|
||||
/// <param name="name">The name.</param>
|
||||
/// <returns>Task{Genre}.</returns>
|
||||
protected override Task<Genre> GetEntity(string name)
|
||||
protected Task<Genre> GetEntity(string name)
|
||||
{
|
||||
return LibraryManager.GetGenre(name);
|
||||
}
|
||||
|
|
|
@ -53,7 +53,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 override IEnumerable<Tuple<string, Func<IEnumerable<BaseItem>>>> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items, User user)
|
||||
protected override IEnumerable<IbnStub<Person>> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items, User user)
|
||||
{
|
||||
var inputPersonTypes = ((GetPersons) request).PersonTypes;
|
||||
var personTypes = string.IsNullOrEmpty(inputPersonTypes) ? new string[] { } : inputPersonTypes.Split(',');
|
||||
|
@ -67,7 +67,7 @@ namespace MediaBrowser.Api.UserLibrary
|
|||
.Select(i => i.Name)
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
|
||||
.Select(name => new Tuple<string, Func<IEnumerable<BaseItem>>>(name, () =>
|
||||
.Select(name => new IbnStub<Person>(name, () =>
|
||||
{
|
||||
if (personTypes.Length == 0)
|
||||
{
|
||||
|
@ -75,7 +75,7 @@ namespace MediaBrowser.Api.UserLibrary
|
|||
}
|
||||
|
||||
return itemsList.Where(i => i.People.Any(p => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase) && personTypes.Contains(p.Type ?? string.Empty, StringComparer.OrdinalIgnoreCase)));
|
||||
})
|
||||
}, GetEntity)
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -102,7 +102,7 @@ namespace MediaBrowser.Api.UserLibrary
|
|||
/// </summary>
|
||||
/// <param name="name">The name.</param>
|
||||
/// <returns>Task{Genre}.</returns>
|
||||
protected override Task<Person> GetEntity(string name)
|
||||
protected Task<Person> GetEntity(string name)
|
||||
{
|
||||
return LibraryManager.GetPerson(name);
|
||||
}
|
||||
|
|
|
@ -48,14 +48,14 @@ 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 override IEnumerable<Tuple<string, Func<IEnumerable<BaseItem>>>> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items, User user)
|
||||
protected override IEnumerable<IbnStub<Studio>> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items, User user)
|
||||
{
|
||||
var itemsList = items.Where(i => i.Studios != null).ToList();
|
||||
|
||||
return itemsList
|
||||
.SelectMany(i => i.Studios)
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
.Select(name => new Tuple<string, Func<IEnumerable<BaseItem>>>(name, () => itemsList.Where(i => i.Studios.Contains(name, StringComparer.OrdinalIgnoreCase))));
|
||||
.Select(name => new IbnStub<Studio>(name, () => itemsList.Where(i => i.Studios.Contains(name, StringComparer.OrdinalIgnoreCase)), GetEntity));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -63,7 +63,7 @@ namespace MediaBrowser.Api.UserLibrary
|
|||
/// </summary>
|
||||
/// <param name="name">The name.</param>
|
||||
/// <returns>Task{Studio}.</returns>
|
||||
protected override Task<Studio> GetEntity(string name)
|
||||
protected Task<Studio> GetEntity(string name)
|
||||
{
|
||||
return LibraryManager.GetStudio(name);
|
||||
}
|
||||
|
|
|
@ -54,14 +54,14 @@ 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 override IEnumerable<Tuple<string, Func<IEnumerable<BaseItem>>>> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items, User user)
|
||||
protected override IEnumerable<IbnStub<Year>> GetAllItems(GetItemsByName request, IEnumerable<BaseItem> items, User user)
|
||||
{
|
||||
var itemsList = items.Where(i => i.ProductionYear != null).ToList();
|
||||
|
||||
return itemsList
|
||||
.Select(i => i.ProductionYear.Value)
|
||||
.Distinct()
|
||||
.Select(year => new Tuple<string, Func<IEnumerable<BaseItem>>>(year.ToString(UsCulture), () => itemsList.Where(i => i.ProductionYear.HasValue && i.ProductionYear.Value == year)));
|
||||
.Select(year => new IbnStub<Year>(year.ToString(UsCulture), () => itemsList.Where(i => i.ProductionYear.HasValue && i.ProductionYear.Value == year), GetEntity));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -69,7 +69,7 @@ namespace MediaBrowser.Api.UserLibrary
|
|||
/// </summary>
|
||||
/// <param name="name">The name.</param>
|
||||
/// <returns>Task{Studio}.</returns>
|
||||
protected override Task<Year> GetEntity(string name)
|
||||
protected Task<Year> GetEntity(string name)
|
||||
{
|
||||
return LibraryManager.GetYear(int.Parse(name, UsCulture));
|
||||
}
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
using MediaBrowser.Common.Extensions;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.IO;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.Localization;
|
||||
|
|
Loading…
Reference in New Issue
Block a user