Fix missing episode removal (#13218)

This commit is contained in:
Tim Eisele 2024-12-31 17:09:42 +01:00 committed by GitHub
parent f0e9b2fb96
commit 4e28f4fe03
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

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