@ -44,7 +44,7 @@ namespace MediaBrowser.Controller.Entities
_collectionManager = collectionManager ;
}
public async Task < QueryResult < BaseItem > > GetUserItems ( Folder parent, string viewType , InternalItemsQuery query )
public async Task < QueryResult < BaseItem > > GetUserItems ( Folder queryParent, Folder dis playP arent, string viewType , InternalItemsQuery query )
{
var user = query . User ;
@ -107,110 +107,125 @@ namespace MediaBrowser.Controller.Entities
{
var result = await GetLiveTvFolders ( user ) . ConfigureAwait ( false ) ;
return GetResult ( result , p arent, query ) ;
return GetResult ( result , queryP arent, query ) ;
}
case CollectionType . Folders :
return GetResult ( user . RootFolder . GetChildren ( user , true ) , p arent, query ) ;
return GetResult ( user . RootFolder . GetChildren ( user , true ) , queryP arent, query ) ;
case CollectionType . Games :
return await GetGameView ( user , p arent, query ) . ConfigureAwait ( false ) ;
return await GetGameView ( user , queryP arent, query ) . ConfigureAwait ( false ) ;
case CollectionType . BoxSets :
return GetResult ( GetMediaFolders ( user ) . SelectMany ( i = > i . GetRecursiveChildren ( user ) ) . OfType < BoxSet > ( ) , p arent, query ) ;
return GetResult ( GetMediaFolders ( user ) . SelectMany ( i = > i . GetRecursiveChildren ( user ) ) . OfType < BoxSet > ( ) , queryP arent, query ) ;
case CollectionType . TvShows :
return await GetTvView ( p arent, user , query ) . ConfigureAwait ( false ) ;
return await GetTvView ( queryP arent, user , query ) . ConfigureAwait ( false ) ;
case CollectionType . Music :
return await GetMusicFolders ( p arent, user , query ) . ConfigureAwait ( false ) ;
return await GetMusicFolders ( queryP arent, user , query ) . ConfigureAwait ( false ) ;
case CollectionType . Movies :
return await GetMovieFolders ( parent , user , query ) . ConfigureAwait ( false ) ;
return await GetMovieFolders ( queryParent , user , query ) . ConfigureAwait ( false ) ;
case SpecialFolder . MusicGenres :
return await GetMusicGenres ( queryParent , user , query ) . ConfigureAwait ( false ) ;
case SpecialFolder . MusicGenre :
return await GetMusicGenreItems ( queryParent , displayParent , user , query ) . ConfigureAwait ( false ) ;
case SpecialFolder . GameGenres :
return GetGameGenres ( parent , user , query ) ;
return await GetGameGenres ( queryParent , user , query ) . ConfigureAwait ( false ) ;
case SpecialFolder . GameGenre :
return await GetGameGenreItems ( queryParent , displayParent , user , query ) . ConfigureAwait ( false ) ;
case SpecialFolder . GameSystems :
return GetGameSystems ( parent , user , query ) ;
return GetGameSystems ( queryP arent, user , query ) ;
case SpecialFolder . LatestGames :
return GetLatestGames ( p arent, user , query ) ;
return GetLatestGames ( queryP arent, user , query ) ;
case SpecialFolder . RecentlyPlayedGames :
return GetRecentlyPlayedGames ( p arent, user , query ) ;
return GetRecentlyPlayedGames ( queryP arent, user , query ) ;
case SpecialFolder . GameFavorites :
return GetFavoriteGames ( p arent, user , query ) ;
return GetFavoriteGames ( queryP arent, user , query ) ;
case SpecialFolder . TvShowSeries :
return GetTvSeries ( p arent, user , query ) ;
return GetTvSeries ( queryP arent, user , query ) ;
case SpecialFolder . TvGenres :
return GetTvGenres ( parent , user , query ) ;
return await GetTvGenres ( queryParent , user , query ) . ConfigureAwait ( false ) ;
case SpecialFolder . TvGenre :
return await GetTvGenreItems ( queryParent , displayParent , user , query ) . ConfigureAwait ( false ) ;
case SpecialFolder . TvResume :
return GetTvResume ( parent , user , query ) ;
return GetTvResume ( queryP arent, user , query ) ;
case SpecialFolder . TvNextUp :
return GetTvNextUp ( p arent, query ) ;
return GetTvNextUp ( queryP arent, query ) ;
case SpecialFolder . TvLatest :
return GetTvLatest ( p arent, user , query ) ;
return GetTvLatest ( queryP arent, user , query ) ;
case SpecialFolder . MovieFavorites :
return GetFavoriteMovies ( p arent, user , query ) ;
return GetFavoriteMovies ( queryP arent, user , query ) ;
case SpecialFolder . MovieLatest :
return GetMovieLatest ( p arent, user , query ) ;
return GetMovieLatest ( queryP arent, user , query ) ;
case SpecialFolder . MovieGenres :
return GetMovieGenres ( parent , user , query ) ;
return await GetMovieGenres ( queryParent , user , query ) . ConfigureAwait ( false ) ;
case SpecialFolder . MovieGenre :
return await GetMovieGenreItems ( queryParent , displayParent , user , query ) . ConfigureAwait ( false ) ;
case SpecialFolder . MovieResume :
return GetMovieResume ( parent , user , query ) ;
return GetMovieResume ( queryP arent, user , query ) ;
case SpecialFolder . MovieMovies :
return GetMovieMovies ( p arent, user , query ) ;
return GetMovieMovies ( queryP arent, user , query ) ;
case SpecialFolder . MovieCollections :
return GetMovieCollections ( p arent, user , query ) ;
return GetMovieCollections ( queryP arent, user , query ) ;
case SpecialFolder . MusicLatest :
return GetMusicLatest ( p arent, user , query ) ;
return GetMusicLatest ( queryP arent, user , query ) ;
case SpecialFolder . MusicAlbums :
return GetMusicAlbums ( p arent, user , query ) ;
return GetMusicAlbums ( queryP arent, user , query ) ;
case SpecialFolder . MusicAlbumArtists :
return GetMusicAlbumArtists ( p arent, user , query ) ;
return GetMusicAlbumArtists ( queryP arent, user , query ) ;
case SpecialFolder . MusicArtists :
return GetMusicArtists ( p arent, user , query ) ;
return GetMusicArtists ( queryP arent, user , query ) ;
case SpecialFolder . MusicSongs :
return GetMusicSongs ( p arent, user , query ) ;
return GetMusicSongs ( queryP arent, user , query ) ;
case SpecialFolder . TvFavoriteEpisodes :
return GetFavoriteEpisodes ( p arent, user , query ) ;
return GetFavoriteEpisodes ( queryP arent, user , query ) ;
case SpecialFolder . TvFavoriteSeries :
return GetFavoriteSeries ( p arent, user , query ) ;
return GetFavoriteSeries ( queryP arent, user , query ) ;
case SpecialFolder . MusicFavorites :
return await GetMusicFavorites ( p arent, user , query ) . ConfigureAwait ( false ) ;
return await GetMusicFavorites ( queryP arent, user , query ) . ConfigureAwait ( false ) ;
case SpecialFolder . MusicFavoriteAlbums :
return GetFavoriteAlbums ( p arent, user , query ) ;
return GetFavoriteAlbums ( queryP arent, user , query ) ;
case SpecialFolder . MusicFavoriteArtists :
return GetFavoriteArtists ( p arent, user , query ) ;
return GetFavoriteArtists ( queryP arent, user , query ) ;
case SpecialFolder . MusicFavoriteSongs :
return GetFavoriteSongs ( p arent, user , query ) ;
return GetFavoriteSongs ( queryP arent, user , query ) ;
default :
return GetResult ( GetMediaFolders ( user ) . SelectMany ( i = > i . GetChildren ( user , true ) ) , p arent, query ) ;
return GetResult ( GetMediaFolders ( user ) . SelectMany ( i = > i . GetChildren ( user , true ) ) , queryP arent, query ) ;
}
}
@ -231,9 +246,9 @@ namespace MediaBrowser.Controller.Entities
list . Add ( await GetUserView ( SpecialFolder . MusicLatest , user , "0" , parent ) . ConfigureAwait ( false ) ) ;
list . Add ( await GetUserView ( SpecialFolder . MusicAlbums , user , "1" , parent ) . ConfigureAwait ( false ) ) ;
list . Add ( await GetUserView ( SpecialFolder . MusicAlbumArtists , user , "2" , parent ) . ConfigureAwait ( false ) ) ;
list . Add ( await GetUserView ( SpecialFolder . Music Song s, user , "3" , parent ) . ConfigureAwait ( false ) ) ;
//list.Add(await GetUserView(SpecialFolder.MusicArtists, user, "3", parent).ConfigureAwait(false)) ;
//list.Add(await GetUserView(SpecialFolder.MusicGenres, user, "5", parent).ConfigureAwait(false)) ;
list . Add ( await GetUserView ( SpecialFolder . Music Artist s, user , "3" , parent ) . ConfigureAwait ( false ) ) ;
list . Add ( await GetUserView ( SpecialFolder . MusicSongs , user , "4" , parent ) . ConfigureAwait ( false ) ) ;
list . Add ( await GetUserView ( SpecialFolder . MusicGenres , user , "5" , parent ) . ConfigureAwait ( false ) ) ;
list . Add ( await GetUserView ( SpecialFolder . MusicFavorites , user , "6" , parent ) . ConfigureAwait ( false ) ) ;
return GetResult ( list , parent , query ) ;
@ -250,6 +265,59 @@ namespace MediaBrowser.Controller.Entities
return GetResult ( list , parent , query ) ;
}
private async Task < QueryResult < BaseItem > > GetMusicGenres ( Folder parent , User user , InternalItemsQuery query )
{
var tasks = GetRecursiveChildren ( parent , user , new [ ] { CollectionType . Music , CollectionType . MusicVideos } )
. Where ( i = > ! i . IsFolder )
. SelectMany ( i = > i . Genres )
. Distinct ( StringComparer . OrdinalIgnoreCase )
. Select ( i = >
{
try
{
return _libraryManager . GetMusicGenre ( i ) ;
}
catch
{
// Full exception logged at lower levels
_logger . Error ( "Error getting genre" ) ;
return null ;
}
} )
. Where ( i = > i ! = null )
. Select ( i = > GetUserView ( i . Name , SpecialFolder . MusicGenre , user , i . SortName , parent ) ) ;
var genres = await Task . WhenAll ( tasks ) . ConfigureAwait ( false ) ;
return GetResult ( genres , parent , query ) ;
}
private async Task < QueryResult < BaseItem > > GetMusicGenreItems ( Folder queryParent , Folder displayParent , User user , InternalItemsQuery query )
{
var items = GetRecursiveChildren ( queryParent , user , new [ ] { CollectionType . Music , CollectionType . MusicVideos } )
. Where ( i = > ! i . IsFolder )
. Where ( i = > i . Genres . Contains ( displayParent . Name , StringComparer . OrdinalIgnoreCase ) )
. OfType < IHasAlbumArtist > ( )
. SelectMany ( i = > i . AlbumArtists )
. Distinct ( StringComparer . OrdinalIgnoreCase )
. Select ( i = >
{
try
{
return _libraryManager . GetArtist ( i ) ;
}
catch
{
// Already logged at lower levels
return null ;
}
} )
. Where ( i = > i ! = null ) ;
return GetResult ( items , queryParent , query ) ;
}
private QueryResult < BaseItem > GetMusicAlbumArtists ( Folder parent , User user , InternalItemsQuery query )
{
var artists = GetRecursiveChildren ( parent , user , new [ ] { CollectionType . Music , CollectionType . MusicVideos } )
@ -354,7 +422,7 @@ namespace MediaBrowser.Controller.Entities
list . Add ( await GetUserView ( SpecialFolder . MovieMovies , user , "2" , parent ) . ConfigureAwait ( false ) ) ;
list . Add ( await GetUserView ( SpecialFolder . MovieCollections , user , "3" , parent ) . ConfigureAwait ( false ) ) ;
list . Add ( await GetUserView ( SpecialFolder . MovieFavorites , user , "4" , parent ) . ConfigureAwait ( false ) ) ;
//list.Add(await GetUserView(CollectionType.MovieGenres, user, "5", parent).ConfigureAwait(false)) ;
list . Add ( await GetUserView ( SpecialFolder . MovieGenres , user , "5" , parent ) . ConfigureAwait ( false ) ) ;
return GetResult ( list , parent , query ) ;
}
@ -421,9 +489,9 @@ namespace MediaBrowser.Controller.Entities
return GetResult ( GetRecursiveChildren ( parent , user , new [ ] { CollectionType . Movies , CollectionType . BoxSets , string . Empty } ) . Where ( i = > i is Movie ) , parent , GetSpecialItemsLimit ( ) , query ) ;
}
private QueryResult < BaseItem > GetMovieGenres ( Folder parent , User user , InternalItemsQuery query )
private async Task < QueryResult < BaseItem > > GetMovieGenres ( Folder parent , User user , InternalItemsQuery query )
{
var genre s = GetRecursiveChildren ( parent , user , new [ ] { CollectionType . Movies , CollectionType . BoxSets , string . Empty } )
var task s = GetRecursiveChildren ( parent , user , new [ ] { CollectionType . Movies , CollectionType . BoxSets , string . Empty } )
. Where ( i = > i is Movie )
. SelectMany ( i = > i . Genres )
. Distinct ( StringComparer . OrdinalIgnoreCase )
@ -441,11 +509,23 @@ namespace MediaBrowser.Controller.Entities
}
} )
. Where ( i = > i ! = null ) ;
. Where ( i = > i ! = null )
. Select ( i = > GetUserView ( i . Name , SpecialFolder . MovieGenre , user , i . SortName , parent ) ) ;
var genres = await Task . WhenAll ( tasks ) . ConfigureAwait ( false ) ;
return GetResult ( genres , parent , query ) ;
}
private async Task < QueryResult < BaseItem > > GetMovieGenreItems ( Folder queryParent , Folder displayParent , User user , InternalItemsQuery query )
{
var items = GetRecursiveChildren ( queryParent , user , new [ ] { CollectionType . Movies , CollectionType . BoxSets , string . Empty } )
. Where ( i = > i is Movie )
. Where ( i = > i . Genres . Contains ( displayParent . Name , StringComparer . OrdinalIgnoreCase ) ) ;
return GetResult ( items , queryParent , query ) ;
}
private async Task < QueryResult < BaseItem > > GetTvView ( Folder parent , User user , InternalItemsQuery query )
{
if ( query . Recursive )
@ -461,7 +541,7 @@ namespace MediaBrowser.Controller.Entities
list . Add ( await GetUserView ( SpecialFolder . TvShowSeries , user , "3" , parent ) . ConfigureAwait ( false ) ) ;
list . Add ( await GetUserView ( SpecialFolder . TvFavoriteSeries , user , "4" , parent ) . ConfigureAwait ( false ) ) ;
list . Add ( await GetUserView ( SpecialFolder . TvFavoriteEpisodes , user , "5" , parent ) . ConfigureAwait ( false ) ) ;
//list.Add(await GetUserView(SpecialFolder.TvGenres, user, "5", parent).ConfigureAwait(false)) ;
list . Add ( await GetUserView ( SpecialFolder . TvGenres , user , "6" , parent ) . ConfigureAwait ( false ) ) ;
return GetResult ( list , parent , query ) ;
}
@ -479,7 +559,7 @@ namespace MediaBrowser.Controller.Entities
list . Add ( await GetUserView ( SpecialFolder . RecentlyPlayedGames , user , "1" , parent ) . ConfigureAwait ( false ) ) ;
list . Add ( await GetUserView ( SpecialFolder . GameFavorites , user , "2" , parent ) . ConfigureAwait ( false ) ) ;
list . Add ( await GetUserView ( SpecialFolder . GameSystems , user , "3" , parent ) . ConfigureAwait ( false ) ) ;
//list.Add(await GetUserView(SpecialFolder.GameGenres, user, "4", parent).ConfigureAwait(false)) ;
list . Add ( await GetUserView ( SpecialFolder . GameGenres , user , "4" , parent ) . ConfigureAwait ( false ) ) ;
return GetResult ( list , parent , query ) ;
}
@ -545,9 +625,9 @@ namespace MediaBrowser.Controller.Entities
return GetResult ( GetRecursiveChildren ( parent , user , new [ ] { CollectionType . TvShows , string . Empty } ) . OfType < Series > ( ) , parent , query ) ;
}
private QueryResult < BaseItem > GetTvGenres ( Folder parent , User user , InternalItemsQuery query )
private async Task < QueryResult < BaseItem > > GetTvGenres ( Folder parent , User user , InternalItemsQuery query )
{
var genre s = GetRecursiveChildren ( parent , user , new [ ] { CollectionType . TvShows , string . Empty } )
var task s = GetRecursiveChildren ( parent , user , new [ ] { CollectionType . TvShows , string . Empty } )
. OfType < Series > ( )
. SelectMany ( i = > i . Genres )
. Distinct ( StringComparer . OrdinalIgnoreCase )
@ -565,19 +645,40 @@ namespace MediaBrowser.Controller.Entities
}
} )
. Where ( i = > i ! = null ) ;
. Where ( i = > i ! = null )
. Select ( i = > GetUserView ( i . Name , SpecialFolder . TvGenre , user , i . SortName , parent ) ) ;
var genres = await Task . WhenAll ( tasks ) . ConfigureAwait ( false ) ;
return GetResult ( genres , parent , query ) ;
}
private async Task < QueryResult < BaseItem > > GetTvGenreItems ( Folder queryParent , Folder displayParent , User user , InternalItemsQuery query )
{
var items = GetRecursiveChildren ( queryParent , user , new [ ] { CollectionType . TvShows , string . Empty } )
. Where ( i = > i is Series )
. Where ( i = > i . Genres . Contains ( displayParent . Name , StringComparer . OrdinalIgnoreCase ) ) ;
return GetResult ( items , queryParent , query ) ;
}
private QueryResult < BaseItem > GetGameSystems ( Folder parent , User user , InternalItemsQuery query )
{
return GetResult ( GetRecursiveChildren ( parent , user , new [ ] { CollectionType . Games } ) . OfType < GameSystem > ( ) , parent , query ) ;
}
private QueryResult < BaseItem > GetGameGenres ( Folder parent , User user , InternalItemsQuery query )
private async Task < QueryResult < BaseItem > > GetGameGenreItems ( Folder queryParent , Folder displayParent , User user , InternalItemsQuery query )
{
var items = GetRecursiveChildren ( queryParent , user , new [ ] { CollectionType . Games } )
. OfType < Game > ( )
. Where ( i = > i . Genres . Contains ( displayParent . Name , StringComparer . OrdinalIgnoreCase ) ) ;
return GetResult ( items , queryParent , query ) ;
}
private async Task < QueryResult < BaseItem > > GetGameGenres ( Folder parent , User user , InternalItemsQuery query )
{
var genres = GetRecursiveChildren ( parent , user , new [ ] { CollectionType . Games } )
var task s = GetRecursiveChildren ( parent , user , new [ ] { CollectionType . Games } )
. OfType < Game > ( )
. SelectMany ( i = > i . Genres )
. Distinct ( StringComparer . OrdinalIgnoreCase )
@ -595,7 +696,10 @@ namespace MediaBrowser.Controller.Entities
}
} )
. Where ( i = > i ! = null ) ;
. Where ( i = > i ! = null )
. Select ( i = > GetUserView ( i . Name , SpecialFolder . GameGenre , user , i . SortName , parent ) ) ;
var genres = await Task . WhenAll ( tasks ) . ConfigureAwait ( false ) ;
return GetResult ( genres , parent , query ) ;
}
@ -611,24 +715,24 @@ namespace MediaBrowser.Controller.Entities
}
private QueryResult < BaseItem > GetResult < T > ( IEnumerable < T > items ,
BaseItem parentItem ,
BaseItem queryParent ,
InternalItemsQuery query )
where T : BaseItem
{
return GetResult ( items , parentItem , null , query ) ;
return GetResult ( items , queryParent , null , query ) ;
}
private QueryResult < BaseItem > GetResult < T > ( IEnumerable < T > items ,
BaseItem parentItem ,
BaseItem queryParent ,
int? totalRecordLimit ,
InternalItemsQuery query )
where T : BaseItem
{
return SortAndFilter ( items , parentItem , totalRecordLimit , query , _libraryManager , _userDataManager ) ;
return SortAndFilter ( items , queryParent , totalRecordLimit , query , _libraryManager , _userDataManager ) ;
}
public static QueryResult < BaseItem > SortAndFilter ( IEnumerable < BaseItem > items ,
BaseItem parentItem ,
BaseItem queryParent ,
int? totalRecordLimit ,
InternalItemsQuery query ,
ILibraryManager libraryManager ,
@ -643,7 +747,7 @@ namespace MediaBrowser.Controller.Entities
query . IsVirtualUnaired ,
query . IsUnaired ) ;
items = CollapseBoxSetItemsIfNeeded ( items , query , parentItem , user ) ;
items = CollapseBoxSetItemsIfNeeded ( items , query , queryParent , user ) ;
// This must be the last filter
if ( ! string . IsNullOrEmpty ( query . AdjacentTo ) )
@ -656,10 +760,10 @@ namespace MediaBrowser.Controller.Entities
public static IEnumerable < BaseItem > CollapseBoxSetItemsIfNeeded ( IEnumerable < BaseItem > items ,
InternalItemsQuery query ,
BaseItem parentItem ,
BaseItem queryParent ,
User user )
{
if ( CollapseBoxSetItems ( query , parentItem , user ) )
if ( CollapseBoxSetItems ( query , queryParent , user ) )
{
items = BaseItem . CollectionManager . CollapseItemsWithinBoxSets ( items , user ) ;
}
@ -691,11 +795,11 @@ namespace MediaBrowser.Controller.Entities
}
private static bool CollapseBoxSetItems ( InternalItemsQuery query ,
BaseItem parentItem ,
BaseItem queryParent ,
User user )
{
// Could end up stuck in a loop like this
if ( parentItem is BoxSet )
if ( queryParent is BoxSet )
{
return false ;
}
@ -1488,7 +1592,7 @@ namespace MediaBrowser.Controller.Entities
} ) ;
}
private IEnumerable < Folder > GetMediaFolders ( Folder parent , User user , string [ ] viewTypes )
private IEnumerable < Folder > GetMediaFolders ( Folder parent , User user , IEnumerable < string > viewTypes )
{
if ( parent = = null | | parent is UserView )
{
@ -1498,7 +1602,7 @@ namespace MediaBrowser.Controller.Entities
return new [ ] { parent } ;
}
private IEnumerable < BaseItem > GetRecursiveChildren ( Folder parent , User user , string [ ] viewTypes )
private IEnumerable < BaseItem > GetRecursiveChildren ( Folder parent , User user , IEnumerable < string > viewTypes )
{
if ( parent = = null | | parent is UserView )
{
@ -1521,7 +1625,15 @@ namespace MediaBrowser.Controller.Entities
return list ;
}
private async Task < UserView > GetUserView ( string type , User user , string sortName , Folder parent )
private async Task < UserView > GetUserView ( string name , string type , User user , string sortName , BaseItem parent )
{
var view = await _userViewManager . GetUserView ( name , parent . Id . ToString ( "N" ) , type , user , sortName , CancellationToken . None )
. ConfigureAwait ( false ) ;
return view ;
}
private async Task < UserView > GetUserView ( string type , User user , string sortName , BaseItem parent )
{
var view = await _userViewManager . GetUserView ( parent . Id . ToString ( "N" ) , type , user , sortName , CancellationToken . None )
. ConfigureAwait ( false ) ;