@ -135,20 +135,15 @@ namespace Emby.Server.Implementations.TV
return GetResult ( episodes , request ) ;
return GetResult ( episodes , request ) ;
}
}
p ublic IEnumerable < Episode > GetNextUpEpisodes ( NextUpQuery request , User user , IReadOnlyList < string > seriesKeys , DtoOptions dtoOptions )
p rivate IEnumerable < Episode > GetNextUpEpisodes ( NextUpQuery request , User user , IReadOnlyList < string > seriesKeys , DtoOptions dtoOptions )
{
{
// Avoid implicitly captured closure
var allNextUp = seriesKeys . Select ( i = > GetNextUp ( i , user , dtoOptions , false ) ) ;
var currentUser = user ;
var allNextUp = seriesKeys
. Select ( i = > GetNextUp ( i , currentUser , dtoOptions , false ) ) ;
if ( request . EnableRewatching )
if ( request . EnableRewatching )
{
{
allNextUp = allNextUp . Concat (
allNextUp = allNextUp . Concat (
seriesKeys . Select ( i = > GetNextUp ( i , currentUser , dtoOptions , true ) )
seriesKeys . Select ( i = > GetNextUp ( i , user , dtoOptions , true ) ) )
)
. OrderByDescending ( i = > i . LastWatchedDate ) ;
. OrderByDescending ( i = > i . Item1 ) ;
}
}
// If viewing all next up for all series, remove first episodes
// If viewing all next up for all series, remove first episodes
@ -161,23 +156,18 @@ namespace Emby.Server.Implementations.TV
{
{
if ( request . DisableFirstEpisode )
if ( request . DisableFirstEpisode )
{
{
return i . Item1 ! = DateTime . MinValue ;
return i . LastWatchedDate ! = DateTime . MinValue ;
}
}
if ( alwaysEnableFirstEpisode | | ( i . Item1 ! = DateTime . MinValue & & i . Item1 . Date > = request . NextUpDateCutoff ) )
if ( alwaysEnableFirstEpisode | | ( i . LastWatchedDate ! = DateTime . MinValue & & i . LastWatchedDate . Date > = request . NextUpDateCutoff ) )
{
{
anyFound = true ;
anyFound = true ;
return true ;
return true ;
}
}
if ( ! anyFound & & i . Item1 = = DateTime . MinValue )
return ! anyFound & & i . LastWatchedDate = = DateTime . MinValue ;
{
return true ;
}
return false ;
} )
} )
. Select ( i = > i . Item2 ( ) )
. Select ( i = > i . GetEpisodeFunction ( ) )
. Where ( i = > i ! = null ) ;
. Where ( i = > i ! = null ) ;
}
}
@ -195,14 +185,14 @@ namespace Emby.Server.Implementations.TV
/// Gets the next up.
/// Gets the next up.
/// </summary>
/// </summary>
/// <returns>Task{Episode}.</returns>
/// <returns>Task{Episode}.</returns>
private Tuple < DateTime , Func < Episode > > GetNextUp ( string seriesKey , User user , DtoOptions dtoOptions , bool rewatching )
private ( DateTime LastWatchedDate , Func < Episode > GetEpisodeFunction ) GetNextUp ( string seriesKey , User user , DtoOptions dtoOptions , bool rewatching )
{
{
var lastQuery = new InternalItemsQuery ( user )
var lastQuery = new InternalItemsQuery ( user )
{
{
AncestorWithPresentationUniqueKey = null ,
AncestorWithPresentationUniqueKey = null ,
SeriesPresentationUniqueKey = seriesKey ,
SeriesPresentationUniqueKey = seriesKey ,
IncludeItemTypes = new [ ] { BaseItemKind . Episode } ,
IncludeItemTypes = new [ ] { BaseItemKind . Episode } ,
OrderBy = new [ ] { ( ItemSortBy . SortName , SortOrder . Descending ) } ,
OrderBy = new [ ] { ( ItemSortBy . ParentIndexNumber, SortOrder . Descending ) , ( ItemSortBy . IndexNumber , SortOrder . Descending ) } ,
IsPlayed = true ,
IsPlayed = true ,
Limit = 1 ,
Limit = 1 ,
ParentIndexNumberNotEquals = 0 ,
ParentIndexNumberNotEquals = 0 ,
@ -216,24 +206,23 @@ namespace Emby.Server.Implementations.TV
if ( rewatching )
if ( rewatching )
{
{
// find last watched by date played, not by newest episode watched
// find last watched by date played, not by newest episode watched
lastQuery . OrderBy = new [ ] { ( ItemSortBy . DatePlayed , SortOrder . Descending ) } ;
lastQuery . OrderBy = new [ ] { ( ItemSortBy . DatePlayed , SortOrder . Descending ) , ( ItemSortBy . ParentIndexNumber , SortOrder . Descending ) , ( ItemSortBy . IndexNumber , SortOrder . Descending ) } ;
}
}
var lastWatchedEpisode = _libraryManager . GetItemList ( lastQuery ) . Cast < Episode > ( ) . FirstOrDefault ( ) ;
var lastWatchedEpisode = _libraryManager . GetItemList ( lastQuery ) . Cast < Episode > ( ) . FirstOrDefault ( ) ;
Func< Episode > getEpisode = ( ) = >
Episode GetEpisode ( )
{
{
var nextQuery = new InternalItemsQuery ( user )
var nextQuery = new InternalItemsQuery ( user )
{
{
AncestorWithPresentationUniqueKey = null ,
AncestorWithPresentationUniqueKey = null ,
SeriesPresentationUniqueKey = seriesKey ,
SeriesPresentationUniqueKey = seriesKey ,
IncludeItemTypes = new [ ] { BaseItemKind . Episode } ,
IncludeItemTypes = new [ ] { BaseItemKind . Episode } ,
OrderBy = new [ ] { ( ItemSortBy . SortName , SortOrder . Ascending ) } ,
OrderBy = new [ ] { ( ItemSortBy . ParentIndexNumber, SortOrder . Ascending ) , ( ItemSortBy . IndexNumber , SortOrder . Ascending ) } ,
Limit = 1 ,
Limit = 1 ,
IsPlayed = rewatching ,
IsPlayed = rewatching ,
IsVirtualItem = false ,
IsVirtualItem = false ,
ParentIndexNumberNotEquals = 0 ,
ParentIndexNumberNotEquals = 0 ,
MinSortName = lastWatchedEpisode ? . SortName ,
DtoOptions = dtoOptions
DtoOptions = dtoOptions
} ;
} ;
@ -297,7 +286,7 @@ namespace Emby.Server.Implementations.TV
}
}
return nextEpisode ;
return nextEpisode ;
} ;
}
if ( lastWatchedEpisode ! = null )
if ( lastWatchedEpisode ! = null )
{
{
@ -305,11 +294,11 @@ namespace Emby.Server.Implementations.TV
var lastWatchedDate = userData . LastPlayedDate ? ? DateTime . MinValue . AddDays ( 1 ) ;
var lastWatchedDate = userData . LastPlayedDate ? ? DateTime . MinValue . AddDays ( 1 ) ;
return new Tuple < DateTime , Func < Episode > > ( lastWatchedDate , g etEpisode) ;
return ( lastWatchedDate , G etEpisode) ;
}
}
// Return the first episode
// Return the first episode
return new Tuple < DateTime , Func < Episode > > ( DateTime . MinValue , g etEpisode) ;
return ( DateTime . MinValue , G etEpisode) ;
}
}
private static QueryResult < BaseItem > GetResult ( IEnumerable < BaseItem > items , NextUpQuery query )
private static QueryResult < BaseItem > GetResult ( IEnumerable < BaseItem > items , NextUpQuery query )