@ -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 . Item 2( ) . ToLi st( ) ;
var items = stub . Item s;
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 ;
}
}
}