瀏覽代碼

fix: use a combination of ParentIndexNumber and IndexNumber to determine next up episodes

cvium 2 年之前
父節點
當前提交
5ea9a74289

+ 4 - 3
Emby.Server.Implementations/Data/SqliteItemRepository.cs

@@ -3541,10 +3541,11 @@ namespace Emby.Server.Implementations.Data
                 statement?.TryBind("@MinIndexNumber", query.MinIndexNumber.Value);
             }
 
-            if (query.MinParentIndexNumber.HasValue)
+            if (query.MinParentAndIndexNumber.HasValue)
             {
-                whereClauses.Add("ParentIndexNumber>=@MinParentIndexNumber");
-                statement?.TryBind("@MinParentIndexNumber", query.MinParentIndexNumber.Value);
+                whereClauses.Add("((ParentIndexNumber=@MinParentAndIndexNumberParent and IndexNumber>=@MinParentAndIndexNumberIndex) or ParentIndexNumber>@MinParentAndIndexNumberParent)");
+                statement?.TryBind("@MinParentAndIndexNumberParent", query.MinParentAndIndexNumber.Value.ParentIndexNumber);
+                statement?.TryBind("@MinParentAndIndexNumberIndex", query.MinParentAndIndexNumber.Value.IndexNumber);
             }
 
             if (query.MinDateCreated.HasValue)

+ 12 - 18
Emby.Server.Implementations/TV/TVSeriesManager.cs

@@ -192,7 +192,6 @@ namespace Emby.Server.Implementations.TV
                 AncestorWithPresentationUniqueKey = null,
                 SeriesPresentationUniqueKey = seriesKey,
                 IncludeItemTypes = new[] { BaseItemKind.Episode },
-                OrderBy = new[] { (ItemSortBy.ParentIndexNumber, SortOrder.Descending), (ItemSortBy.IndexNumber, SortOrder.Descending) },
                 IsPlayed = true,
                 Limit = 1,
                 ParentIndexNumberNotEquals = 0,
@@ -203,11 +202,10 @@ namespace Emby.Server.Implementations.TV
                 }
             };
 
-            if (rewatching)
-            {
-                // find last watched by date played, not by newest episode watched
-                lastQuery.OrderBy = new[] { (ItemSortBy.DatePlayed, SortOrder.Descending), (ItemSortBy.ParentIndexNumber, SortOrder.Descending), (ItemSortBy.IndexNumber, SortOrder.Descending) };
-            }
+            // If rewatching is enabled, sort first by date played and then by season and episode numbers
+            lastQuery.OrderBy = rewatching
+                ? new[] { (ItemSortBy.DatePlayed, SortOrder.Descending), (ItemSortBy.ParentIndexNumber, SortOrder.Descending), (ItemSortBy.IndexNumber, SortOrder.Descending) }
+                : new[] { (ItemSortBy.ParentIndexNumber, SortOrder.Descending), (ItemSortBy.IndexNumber, SortOrder.Descending) };
 
             var lastWatchedEpisode = _libraryManager.GetItemList(lastQuery).Cast<Episode>().FirstOrDefault();
 
@@ -223,23 +221,19 @@ namespace Emby.Server.Implementations.TV
                     IsPlayed = rewatching,
                     IsVirtualItem = false,
                     ParentIndexNumberNotEquals = 0,
-                    DtoOptions = dtoOptions,
-                    MinIndexNumber = lastWatchedEpisode?.IndexNumberEnd ?? lastWatchedEpisode?.IndexNumber,
-                    MinParentIndexNumber = lastWatchedEpisode?.ParentIndexNumber
+                    DtoOptions = dtoOptions
                 };
 
-                Episode nextEpisode;
-                if (rewatching)
-                {
-                    nextQuery.Limit = 2;
-                    // get watched episode after most recently watched
-                    nextEpisode = _libraryManager.GetItemList(nextQuery).Cast<Episode>().ElementAtOrDefault(1);
-                }
-                else
+                // Locate the next up episode based on the last watched episode's season and episode number
+                var lastWatchedParentIndexNumber = lastWatchedEpisode?.ParentIndexNumber;
+                var lastWatchedIndexNumber = lastWatchedEpisode?.IndexNumberEnd ?? lastWatchedEpisode?.IndexNumber;
+                if (lastWatchedParentIndexNumber.HasValue && lastWatchedIndexNumber.HasValue)
                 {
-                    nextEpisode = _libraryManager.GetItemList(nextQuery).Cast<Episode>().FirstOrDefault();
+                    nextQuery.MinParentAndIndexNumber = (lastWatchedParentIndexNumber.Value, lastWatchedIndexNumber.Value + 1);
                 }
 
+                var nextEpisode = _libraryManager.GetItemList(nextQuery).Cast<Episode>().FirstOrDefault();
+
                 if (_configurationManager.Configuration.DisplaySpecialsWithinSeasons)
                 {
                     var consideredEpisodes = _libraryManager.GetItemList(new InternalItemsQuery(user)

+ 9 - 1
MediaBrowser.Controller/Entities/InternalItemsQuery.cs

@@ -205,7 +205,15 @@ namespace MediaBrowser.Controller.Entities
 
         public int? MinIndexNumber { get; set; }
 
-        public int? MinParentIndexNumber { get; set; }
+        /// <summary>
+        /// Gets or sets the minimum ParentIndexNumber and IndexNumber.
+        /// </summary>
+        /// <remarks>
+        /// It produces this where clause:
+        /// <para>(ParentIndexNumber = X and IndexNumber >= Y) or ParentIndexNumber > X.
+        /// </para>
+        /// </remarks>
+        public (int ParentIndexNumber, int IndexNumber)? MinParentAndIndexNumber { get; set; }
 
         public int? AiredDuringSeason { get; set; }