Backport pull request #8348 from jellyfin/release-10.8.z

Revert "Revert "refactor: use season number and episode number for NextUp ordering instead of SortName""

Original-merge: 88d5230bab

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
pull/8172/head
Claus Vium 2 years ago committed by Joshua M. Boniface
parent c9f3c7b11a
commit 4a261a3ec0

@ -135,20 +135,15 @@ namespace Emby.Server.Implementations.TV
return GetResult(episodes, request); return GetResult(episodes, request);
} }
public IEnumerable<Episode> GetNextUpEpisodes(NextUpQuery request, User user, IReadOnlyList<string> seriesKeys, DtoOptions dtoOptions) private 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, getEpisode); return (lastWatchedDate, GetEpisode);
} }
// Return the first episode // Return the first episode
return new Tuple<DateTime, Func<Episode>>(DateTime.MinValue, getEpisode); return (DateTime.MinValue, GetEpisode);
} }
private static QueryResult<BaseItem> GetResult(IEnumerable<BaseItem> items, NextUpQuery query) private static QueryResult<BaseItem> GetResult(IEnumerable<BaseItem> items, NextUpQuery query)

Loading…
Cancel
Save