2
0
Shadowghost 1 жил өмнө
parent
commit
e4078f984a

+ 1 - 1
MediaBrowser.Controller/Entities/Folder.cs

@@ -194,7 +194,7 @@ namespace MediaBrowser.Controller.Entities
         /// </summary>
         /// <param name="item">The item.</param>
         /// <exception cref="InvalidOperationException">Unable to add  + item.Name.</exception>
-        public void AddChild(BaseItem item)
+        public virtual void AddChild(BaseItem item)
         {
             item.SetParent(this);
 

+ 15 - 0
MediaBrowser.Controller/Entities/TV/Season.cs

@@ -265,5 +265,20 @@ namespace MediaBrowser.Controller.Entities.TV
 
             return hasChanges;
         }
+
+        /// <inheritdoc />
+        public override void AddChild(BaseItem item)
+        {
+            if (item is Episode episode)
+            {
+                episode.SeriesPresentationUniqueKey = SeriesPresentationUniqueKey;
+                episode.SeriesId = SeriesId;
+                episode.SeriesName = SeriesName;
+                episode.SeasonId = Id;
+                episode.SeasonName = Name;
+            }
+
+            base.AddChild(item);
+        }
     }
 }

+ 15 - 9
MediaBrowser.Controller/Entities/TV/Series.cs

@@ -350,17 +350,10 @@ namespace MediaBrowser.Controller.Entities.TV
 
         public List<BaseItem> GetSeasonEpisodes(Season parentSeason, User user, DtoOptions options, bool shouldIncludeMissingEpisodes)
         {
-            var queryFromSeries = ConfigurationManager.Configuration.DisplaySpecialsWithinSeasons;
-
-            // add optimization when this setting is not enabled
-            var seriesKey = queryFromSeries ?
-                GetUniqueSeriesKey(this) :
-                GetUniqueSeriesKey(parentSeason);
-
             var query = new InternalItemsQuery(user)
             {
-                AncestorWithPresentationUniqueKey = queryFromSeries ? null : seriesKey,
-                SeriesPresentationUniqueKey = queryFromSeries ? seriesKey : null,
+                AncestorWithPresentationUniqueKey = null,
+                SeriesPresentationUniqueKey = GetUniqueSeriesKey(this),
                 IncludeItemTypes = new[] { BaseItemKind.Episode },
                 OrderBy = new[] { (ItemSortBy.SortName, SortOrder.Ascending) },
                 DtoOptions = options
@@ -506,5 +499,18 @@ namespace MediaBrowser.Controller.Entities.TV
 
             return list;
         }
+
+        /// <inheritdoc />
+        public override void AddChild(BaseItem item)
+        {
+            if (item is IHasSeries typedItem)
+            {
+                typedItem.SeriesId = Id;
+                typedItem.SeriesName = Name;
+                typedItem.SeriesPresentationUniqueKey = PresentationUniqueKey;
+            }
+
+            base.AddChild(item);
+        }
     }
 }

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

@@ -91,7 +91,7 @@ namespace MediaBrowser.Providers.TV
 
         private void RemoveObsoleteSeasons(Series series)
         {
-            // TODO Legacy. It's not really "physical" seasons as any virtual seasons are always converted to non-virtual in UpdateAndCreateSeasonsAsync.
+            // TODO Legacy. It's not really "physical" seasons as any virtual seasons are always converted to non-virtual in CreateSeasonsAsync.
             var physicalSeasonNumbers = new HashSet<int>();
             var virtualSeasons = new List<Season>();
             foreach (var existingSeason in series.Children.OfType<Season>())
@@ -203,11 +203,16 @@ namespace MediaBrowser.Providers.TV
             foreach (var seasonNumber in uniqueSeasonNumbers)
             {
                 // Null season numbers will have a 'dummy' season created because seasons are always required.
-                if (!seasons.Any(i => i.IndexNumber == seasonNumber))
+                var existingSeason = seasons.FirstOrDefault(i => i.IndexNumber == seasonNumber);
+                if (existingSeason is null)
                 {
                     var seasonName = GetValidSeasonNameForSeries(series, null, seasonNumber);
-                    var season = await CreateSeasonAsync(series, seasonName, seasonNumber, cancellationToken).ConfigureAwait(false);
-                    series.AddChild(season);
+                    await CreateSeasonAsync(series, seasonName, seasonNumber, cancellationToken).ConfigureAwait(false);
+                }
+                else if (existingSeason.IsVirtualItem)
+                {
+                    existingSeason.IsVirtualItem = false;
+                    await existingSeason.UpdateToRepositoryAsync(ItemUpdateType.MetadataEdit, cancellationToken).ConfigureAwait(false);
                 }
             }
         }
@@ -220,7 +225,7 @@ namespace MediaBrowser.Providers.TV
         /// <param name="seasonNumber">The season number.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <returns>The newly created season.</returns>
-        private async Task<Season> CreateSeasonAsync(
+        private async Task CreateSeasonAsync(
             Series series,
             string? seasonName,
             int? seasonNumber,
@@ -236,15 +241,10 @@ namespace MediaBrowser.Providers.TV
                     series.Id + (seasonNumber ?? -1).ToString(CultureInfo.InvariantCulture) + seasonName,
                     typeof(Season)),
                 IsVirtualItem = false,
-                SeriesId = series.Id,
-                SeriesName = series.Name
             };
 
             series.AddChild(season);
-
             await season.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(FileSystem)), cancellationToken).ConfigureAwait(false);
-
-            return season;
         }
 
         private string GetValidSeasonNameForSeries(Series series, string? seasonName, int? seasonNumber)