|
|
|
@ -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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|