Browse Source

Return missing episodes for series when no user defined (#11806)

Tim Eisele 1 year ago
parent
commit
ae584beaac

+ 2 - 1
Emby.Server.Implementations/Session/SessionManager.cs

@@ -1202,7 +1202,8 @@ namespace Emby.Server.Implementations.Session
                             new DtoOptions(false)
                             {
                                 EnableImages = false
-                            })
+                            },
+                            user.DisplayMissingEpisodes)
                         .Where(i => !i.IsVirtualItem)
                         .SkipWhile(i => !i.Id.Equals(episode.Id))
                         .ToList();

+ 4 - 3
Jellyfin.Api/Controllers/TvShowsController.cs

@@ -231,6 +231,7 @@ public class TvShowsController : BaseJellyfinApiController
         var dtoOptions = new DtoOptions { Fields = fields }
             .AddClientFields(User)
             .AddAdditionalDtoOptions(enableImages, enableUserData, imageTypeLimit, enableImageTypes);
+        var shouldIncludeMissingEpisodes = (user is not null && user.DisplayMissingEpisodes) || User.GetIsApiKey();
 
         if (seasonId.HasValue) // Season id was supplied. Get episodes by season id.
         {
@@ -240,7 +241,7 @@ public class TvShowsController : BaseJellyfinApiController
                 return NotFound("No season exists with Id " + seasonId);
             }
 
-            episodes = seasonItem.GetEpisodes(user, dtoOptions);
+            episodes = seasonItem.GetEpisodes(user, dtoOptions, shouldIncludeMissingEpisodes);
         }
         else if (season.HasValue) // Season number was supplied. Get episodes by season number
         {
@@ -256,7 +257,7 @@ public class TvShowsController : BaseJellyfinApiController
 
             episodes = seasonItem is null ?
                 new List<BaseItem>()
-                : ((Season)seasonItem).GetEpisodes(user, dtoOptions);
+                : ((Season)seasonItem).GetEpisodes(user, dtoOptions, shouldIncludeMissingEpisodes);
         }
         else // No season number or season id was supplied. Returning all episodes.
         {
@@ -265,7 +266,7 @@ public class TvShowsController : BaseJellyfinApiController
                 return NotFound("Series not found");
             }
 
-            episodes = series.GetEpisodes(user, dtoOptions).ToList();
+            episodes = series.GetEpisodes(user, dtoOptions, shouldIncludeMissingEpisodes).ToList();
         }
 
         // Filter after the fact in case the ui doesn't want them

+ 10 - 9
MediaBrowser.Controller/Entities/TV/Season.cs

@@ -159,7 +159,7 @@ namespace MediaBrowser.Controller.Entities.TV
 
             Func<BaseItem, bool> filter = i => UserViewBuilder.Filter(i, user, query, UserDataManager, LibraryManager);
 
-            var items = GetEpisodes(user, query.DtoOptions).Where(filter);
+            var items = GetEpisodes(user, query.DtoOptions, true).Where(filter);
 
             return PostFilterAndSort(items, query, false);
         }
@@ -169,30 +169,31 @@ namespace MediaBrowser.Controller.Entities.TV
         /// </summary>
         /// <param name="user">The user.</param>
         /// <param name="options">The options to use.</param>
+        /// <param name="shouldIncludeMissingEpisodes">If missing episodes should be included.</param>
         /// <returns>Set of episodes.</returns>
-        public List<BaseItem> GetEpisodes(User user, DtoOptions options)
+        public List<BaseItem> GetEpisodes(User user, DtoOptions options, bool shouldIncludeMissingEpisodes)
         {
-            return GetEpisodes(Series, user, options);
+            return GetEpisodes(Series, user, options, shouldIncludeMissingEpisodes);
         }
 
-        public List<BaseItem> GetEpisodes(Series series, User user, DtoOptions options)
+        public List<BaseItem> GetEpisodes(Series series, User user, DtoOptions options, bool shouldIncludeMissingEpisodes)
         {
-            return GetEpisodes(series, user, null, options);
+            return GetEpisodes(series, user, null, options, shouldIncludeMissingEpisodes);
         }
 
-        public List<BaseItem> GetEpisodes(Series series, User user, IEnumerable<Episode> allSeriesEpisodes, DtoOptions options)
+        public List<BaseItem> GetEpisodes(Series series, User user, IEnumerable<Episode> allSeriesEpisodes, DtoOptions options, bool shouldIncludeMissingEpisodes)
         {
-            return series.GetSeasonEpisodes(this, user, allSeriesEpisodes, options);
+            return series.GetSeasonEpisodes(this, user, allSeriesEpisodes, options, shouldIncludeMissingEpisodes);
         }
 
         public List<BaseItem> GetEpisodes()
         {
-            return Series.GetSeasonEpisodes(this, null, null, new DtoOptions(true));
+            return Series.GetSeasonEpisodes(this, null, null, new DtoOptions(true), true);
         }
 
         public override List<BaseItem> GetChildren(User user, bool includeLinkedChildren, InternalItemsQuery query)
         {
-            return GetEpisodes(user, new DtoOptions(true));
+            return GetEpisodes(user, new DtoOptions(true), true);
         }
 
         protected override bool GetBlockUnratedValue(User user)

+ 10 - 20
MediaBrowser.Controller/Entities/TV/Series.cs

@@ -276,7 +276,7 @@ namespace MediaBrowser.Controller.Entities.TV
             return LibraryManager.GetItemsResult(query);
         }
 
-        public IEnumerable<BaseItem> GetEpisodes(User user, DtoOptions options)
+        public IEnumerable<BaseItem> GetEpisodes(User user, DtoOptions options, bool shouldIncludeMissingEpisodes)
         {
             var seriesKey = GetUniqueSeriesKey(this);
 
@@ -286,20 +286,16 @@ namespace MediaBrowser.Controller.Entities.TV
                 SeriesPresentationUniqueKey = seriesKey,
                 IncludeItemTypes = new[] { BaseItemKind.Episode, BaseItemKind.Season },
                 OrderBy = new[] { (ItemSortBy.SortName, SortOrder.Ascending) },
-                DtoOptions = options
+                DtoOptions = options,
+                IsMissing = shouldIncludeMissingEpisodes
             };
 
-            if (user is null || !user.DisplayMissingEpisodes)
-            {
-                query.IsMissing = false;
-            }
-
             var allItems = LibraryManager.GetItemList(query);
 
             var allSeriesEpisodes = allItems.OfType<Episode>().ToList();
 
             var allEpisodes = allItems.OfType<Season>()
-                .SelectMany(i => i.GetEpisodes(this, user, allSeriesEpisodes, options))
+                .SelectMany(i => i.GetEpisodes(this, user, allSeriesEpisodes, options, shouldIncludeMissingEpisodes))
                 .Reverse();
 
             // Specials could appear twice based on above - once in season 0, once in the aired season
@@ -375,7 +371,7 @@ namespace MediaBrowser.Controller.Entities.TV
             await ProviderManager.RefreshSingleItem(this, refreshOptions, cancellationToken).ConfigureAwait(false);
         }
 
-        public List<BaseItem> GetSeasonEpisodes(Season parentSeason, User user, DtoOptions options)
+        public List<BaseItem> GetSeasonEpisodes(Season parentSeason, User user, DtoOptions options, bool shouldIncludeMissingEpisodes)
         {
             var queryFromSeries = ConfigurationManager.Configuration.DisplaySpecialsWithinSeasons;
 
@@ -390,26 +386,20 @@ namespace MediaBrowser.Controller.Entities.TV
                 SeriesPresentationUniqueKey = queryFromSeries ? seriesKey : null,
                 IncludeItemTypes = new[] { BaseItemKind.Episode },
                 OrderBy = new[] { (ItemSortBy.SortName, SortOrder.Ascending) },
-                DtoOptions = options
+                DtoOptions = options,
+                IsMissing = shouldIncludeMissingEpisodes
             };
-            if (user is not null)
-            {
-                if (!user.DisplayMissingEpisodes)
-                {
-                    query.IsMissing = false;
-                }
-            }
 
             var allItems = LibraryManager.GetItemList(query);
 
-            return GetSeasonEpisodes(parentSeason, user, allItems, options);
+            return GetSeasonEpisodes(parentSeason, user, allItems, options, shouldIncludeMissingEpisodes);
         }
 
-        public List<BaseItem> GetSeasonEpisodes(Season parentSeason, User user, IEnumerable<BaseItem> allSeriesEpisodes, DtoOptions options)
+        public List<BaseItem> GetSeasonEpisodes(Season parentSeason, User user, IEnumerable<BaseItem> allSeriesEpisodes, DtoOptions options, bool shouldIncludeMissingEpisodes)
         {
             if (allSeriesEpisodes is null)
             {
-                return GetSeasonEpisodes(parentSeason, user, options);
+                return GetSeasonEpisodes(parentSeason, user, options, shouldIncludeMissingEpisodes);
             }
 
             var episodes = FilterEpisodesBySeason(allSeriesEpisodes, parentSeason, ConfigurationManager.Configuration.DisplaySpecialsWithinSeasons);

+ 1 - 1
MediaBrowser.Providers/TV/SeriesMetadataService.cs

@@ -162,7 +162,7 @@ namespace MediaBrowser.Providers.TV
 
         private void RemoveObsoleteEpisodes(Series series)
         {
-            var episodes = series.GetEpisodes(null, new DtoOptions()).OfType<Episode>().ToList();
+            var episodes = series.GetEpisodes(null, new DtoOptions(), true).OfType<Episode>().ToList();
             var numberOfEpisodes = episodes.Count;
             // TODO: O(n^2), but can it be done faster without overcomplicating it?
             for (var i = 0; i < numberOfEpisodes; i++)