aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/TV/SeriesMetadataService.cs
diff options
context:
space:
mode:
authorJPVenson <github@jpb.email>2025-02-05 18:32:13 +0000
committerJPVenson <github@jpb.email>2025-02-05 18:32:13 +0000
commitdfdef511a5b855ee4e4f079236ff43cb508958d5 (patch)
treedb2c5d8cfe13817b165c1d24495947d98c25f670 /MediaBrowser.Providers/TV/SeriesMetadataService.cs
parent078587d232ccbfdf6e08c6f1a6435e4e397e4bdc (diff)
parent00b66a06eac4d1331d59a6a9b7de3e99088ebaa9 (diff)
Merge remote-tracking branch 'jellyfinorigin/master' into feature/pgsql_provider
Diffstat (limited to 'MediaBrowser.Providers/TV/SeriesMetadataService.cs')
-rw-r--r--MediaBrowser.Providers/TV/SeriesMetadataService.cs45
1 files changed, 23 insertions, 22 deletions
diff --git a/MediaBrowser.Providers/TV/SeriesMetadataService.cs b/MediaBrowser.Providers/TV/SeriesMetadataService.cs
index f4aede463..284415dce 100644
--- a/MediaBrowser.Providers/TV/SeriesMetadataService.cs
+++ b/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);
}
}
}