浏览代码

Fix missing episode removal (#13218)

Tim Eisele 5 月之前
父节点
当前提交
4e28f4fe03
共有 1 个文件被更改,包括 23 次插入22 次删除
  1. 23 22
      MediaBrowser.Providers/TV/SeriesMetadataService.cs

+ 23 - 22
MediaBrowser.Providers/TV/SeriesMetadataService.cs

@@ -140,38 +140,39 @@ namespace MediaBrowser.Providers.TV
 
         private void RemoveObsoleteEpisodes(Series series)
         {
-            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++)
+            var episodesBySeason = series.GetEpisodes(null, new DtoOptions(), true)
+                            .OfType<Episode>()
+                            .GroupBy(e => e.ParentIndexNumber)
+                            .ToList();
+
+            foreach (var seasonEpisodes in episodesBySeason)
             {
-                var currentEpisode = episodes[i];
-                // The outer loop only examines virtual episodes
-                if (!currentEpisode.IsVirtualItem)
+                List<Episode> nonPhysicalEpisodes = [];
+                List<Episode> physicalEpisodes = [];
+                foreach (var episode in seasonEpisodes)
                 {
-                    continue;
-                }
+                    if (episode.IsVirtualItem || episode.IsMissingEpisode)
+                    {
+                        nonPhysicalEpisodes.Add(episode);
+                        continue;
+                    }
 
-                // Virtual episodes without an episode number are practically orphaned and should be deleted
-                if (!currentEpisode.IndexNumber.HasValue)
-                {
-                    DeleteEpisode(currentEpisode);
-                    continue;
+                    physicalEpisodes.Add(episode);
                 }
 
-                for (var j = i + 1; j < numberOfEpisodes; j++)
+                // Only consider non-physical episodes
+                foreach (var episode in nonPhysicalEpisodes)
                 {
-                    var comparisonEpisode = episodes[j];
-                    // The inner loop is only for "physical" episodes
-                    if (comparisonEpisode.IsVirtualItem
-                        || currentEpisode.ParentIndexNumber != comparisonEpisode.ParentIndexNumber
-                        || !comparisonEpisode.ContainsEpisodeNumber(currentEpisode.IndexNumber.Value))
+                    // Episodes without an episode number are practically orphaned and should be deleted
+                    // Episodes with a physical equivalent should be deleted (they are no longer missing)
+                    var shouldKeep = episode.IndexNumber.HasValue && !physicalEpisodes.Any(e => e.ContainsEpisodeNumber(episode.IndexNumber.Value));
+
+                    if (shouldKeep)
                     {
                         continue;
                     }
 
-                    DeleteEpisode(currentEpisode);
-                    break;
+                    DeleteEpisode(episode);
                 }
             }
         }