From 1b72b8491c104b6abe8f8440de2a3da4d8de0981 Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Wed, 31 Dec 2025 11:24:07 -0600 Subject: [PATCH] improve multi-episode grouping logic (#2744) --- CHANGELOG.md | 2 ++ ErsatzTV.Core/Scheduling/MultiPartEpisodeGrouper.cs | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4261fc412..6b1174f1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Fix startup error caused by duplicate smart collection names (and no longer allow duplicate smart collection names) - Fix erroneous downgrade health check failure with some installations that use MariaDB - Sequential schedules: fix `count` instruction validation to accept integer (constant) or string (expression) +- Fix multi-part episode grouping logic so that it does NOT require release date metadata for episodes within a single show + - When **Treat Collections As Shows** is enabled (i.e. for crossover episodes) release date metadata is required for proper grouping ### Changed - No longer round framerate to nearest integer when normalizing framerate diff --git a/ErsatzTV.Core/Scheduling/MultiPartEpisodeGrouper.cs b/ErsatzTV.Core/Scheduling/MultiPartEpisodeGrouper.cs index 5d0e66ccd..fb7cebb9c 100644 --- a/ErsatzTV.Core/Scheduling/MultiPartEpisodeGrouper.cs +++ b/ErsatzTV.Core/Scheduling/MultiPartEpisodeGrouper.cs @@ -40,9 +40,17 @@ public static partial class MultiPartEpisodeGrouper groups.Add(new GroupedMediaItem(item, null)); } + // when treating multiple shows as a single "show" - we need to + // first sort by release date before looking for part 1, part 2, etc. to group + // otherwise, we can simply sort by season, episode number + // which does not require release date metadata + IComparer comparer = treatCollectionsAsShows + ? new ChronologicalMediaComparer() + : new SeasonEpisodeMediaComparer(); + IEnumerable sortedEpisodes = showId.Match( id => episodes.Filter(e => e.Season.ShowId == id), - () => episodes).OrderBy(identity, new ChronologicalMediaComparer()); + () => episodes).OrderBy(identity, comparer); foreach (Episode episode in sortedEpisodes) {