From 2b693b064bbf6948e7a728667421f0cf4e10c3cb Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Tue, 21 Jul 2026 19:44:58 -0500 Subject: [PATCH] fixes --- .../Scheduling/ChronologicalMediaCollectionEnumerator.cs | 2 +- ErsatzTV.Core/Scheduling/CustomOrderCollectionEnumerator.cs | 2 +- ErsatzTV.Core/Scheduling/OrderedScheduleItemsEnumerator.cs | 2 +- ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs | 6 +++--- ErsatzTV.Core/Scheduling/PlayoutBuilder.cs | 6 +++--- .../Scheduling/RandomizedMediaCollectionEnumerator.cs | 2 +- .../RandomizedRotatingMediaCollectionEnumerator.cs | 2 +- .../Scheduling/SeasonEpisodeMediaCollectionEnumerator.cs | 2 +- .../Scheduling/ShuffleInOrderCollectionEnumerator.cs | 2 +- .../Scheduling/ShuffledMediaCollectionEnumerator.cs | 3 ++- ErsatzTV.Core/Scheduling/ShuffledScheduleItemsEnumerator.cs | 2 +- .../Scheduling/MultiEpisodeShuffleCollectionEnumerator.cs | 2 +- 12 files changed, 17 insertions(+), 16 deletions(-) diff --git a/ErsatzTV.Core/Scheduling/ChronologicalMediaCollectionEnumerator.cs b/ErsatzTV.Core/Scheduling/ChronologicalMediaCollectionEnumerator.cs index 964023679..13dd95fe4 100644 --- a/ErsatzTV.Core/Scheduling/ChronologicalMediaCollectionEnumerator.cs +++ b/ErsatzTV.Core/Scheduling/ChronologicalMediaCollectionEnumerator.cs @@ -22,7 +22,7 @@ public sealed class ChronologicalMediaCollectionEnumerator : IMediaCollectionEnu _lazyMediaItemGroupSize = new Lazy>(CalculateMediaItemGroupSizes); - State = new CollectionEnumeratorState { Seed = state.Seed }; + State = new CollectionEnumeratorState { Seed = state.Seed, Started = state.Started }; if (state.Index >= _sortedMediaItems.Count) { diff --git a/ErsatzTV.Core/Scheduling/CustomOrderCollectionEnumerator.cs b/ErsatzTV.Core/Scheduling/CustomOrderCollectionEnumerator.cs index 3f6cae438..f94d0f8a6 100644 --- a/ErsatzTV.Core/Scheduling/CustomOrderCollectionEnumerator.cs +++ b/ErsatzTV.Core/Scheduling/CustomOrderCollectionEnumerator.cs @@ -25,7 +25,7 @@ public class CustomOrderCollectionEnumerator : IMediaCollectionEnumerator _lazyMinimumDuration = new Lazy>(() => _sortedMediaItems.Bind(i => i.GetNonZeroDuration()).OrderBy(identity).HeadOrNone()); - State = new CollectionEnumeratorState { Seed = state.Seed }; + State = new CollectionEnumeratorState { Seed = state.Seed, Started = state.Started }; while (State.Index < state.Index) { MoveNext(Option.None); diff --git a/ErsatzTV.Core/Scheduling/OrderedScheduleItemsEnumerator.cs b/ErsatzTV.Core/Scheduling/OrderedScheduleItemsEnumerator.cs index e83a2c5a8..3bbe7df7b 100644 --- a/ErsatzTV.Core/Scheduling/OrderedScheduleItemsEnumerator.cs +++ b/ErsatzTV.Core/Scheduling/OrderedScheduleItemsEnumerator.cs @@ -13,7 +13,7 @@ public class OrderedScheduleItemsEnumerator : IScheduleItemsEnumerator { _sortedScheduleItems = scheduleItems.OrderBy(i => i.Index).ToList(); - State = new CollectionEnumeratorState { Seed = state.Seed }; + State = new CollectionEnumeratorState { Seed = state.Seed, Started = state.Started }; if (state.Index >= _sortedScheduleItems.Count) { diff --git a/ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs b/ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs index 90aa96826..62cb8f682 100644 --- a/ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs +++ b/ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs @@ -178,7 +178,7 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator case PlaybackOrder.Chronological: if (randomStartPoint) { - initState.Index = random.Next(0, items.Count - 1); + initState.Index = items.Count > 0 ? random.Next(0, items.Count) : 0; } enumerator = new ChronologicalMediaCollectionEnumerator(items, initState); @@ -208,7 +208,7 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator case PlaybackOrder.SeasonEpisode: if (randomStartPoint) { - initState.Index = random.Next(0, items.Count - 1); + initState.Index = items.Count > 0 ? random.Next(0, items.Count) : 0; } enumerator = new SeasonEpisodeMediaCollectionEnumerator(items, initState); @@ -248,7 +248,7 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator result._sortedEnumerators = result.ShufflePlaylistItems(); } - result.State = new CollectionEnumeratorState { Seed = state.Seed }; + result.State = new CollectionEnumeratorState { Seed = state.Seed, Started = state.Started }; result.EnumeratorIndex = 0; // this was a bug when playlist enumerators were first added; shouldn't happen anymore diff --git a/ErsatzTV.Core/Scheduling/PlayoutBuilder.cs b/ErsatzTV.Core/Scheduling/PlayoutBuilder.cs index af5cab7fe..d1c46d428 100644 --- a/ErsatzTV.Core/Scheduling/PlayoutBuilder.cs +++ b/ErsatzTV.Core/Scheduling/PlayoutBuilder.cs @@ -1344,7 +1344,7 @@ public class PlayoutBuilder : IPlayoutBuilder state = new CollectionEnumeratorState { Seed = state.Seed, - Index = random.Next(0, mediaItems.Count - 1) + Index = mediaItems.Count > 0 ? random.Next(0, mediaItems.Count) : 0 }; } @@ -1355,7 +1355,7 @@ public class PlayoutBuilder : IPlayoutBuilder state = new CollectionEnumeratorState { Seed = state.Seed, - Index = random.Next(0, mediaItems.Count - 1) + Index = mediaItems.Count > 0 ? random.Next(0, mediaItems.Count) : 0 }; } @@ -1369,7 +1369,7 @@ public class PlayoutBuilder : IPlayoutBuilder collectionKey, cancellationToken), state, - activeSchedule.RandomStartPoint, + randomStartPoint, cancellationToken); case PlaybackOrder.MultiEpisodeShuffle when collectionKey.CollectionType == CollectionType.TelevisionShow && diff --git a/ErsatzTV.Core/Scheduling/RandomizedMediaCollectionEnumerator.cs b/ErsatzTV.Core/Scheduling/RandomizedMediaCollectionEnumerator.cs index 27bbb8b37..66cf35f3c 100644 --- a/ErsatzTV.Core/Scheduling/RandomizedMediaCollectionEnumerator.cs +++ b/ErsatzTV.Core/Scheduling/RandomizedMediaCollectionEnumerator.cs @@ -21,7 +21,7 @@ public class RandomizedMediaCollectionEnumerator : IMediaCollectionEnumerator _mediaItems.Bind(i => i.GetNonZeroDuration()).OrderBy(identity).HeadOrNone()); _random = new Random(state.Seed); - State = new CollectionEnumeratorState { Seed = state.Seed }; + State = new CollectionEnumeratorState { Seed = state.Seed, Started = state.Started }; // we want to move at least once so we start with a random item and not the first // because _index defaults to 0 if (State.Index == state.Index) diff --git a/ErsatzTV.Core/Scheduling/RandomizedRotatingMediaCollectionEnumerator.cs b/ErsatzTV.Core/Scheduling/RandomizedRotatingMediaCollectionEnumerator.cs index c62c726b5..a331c3308 100644 --- a/ErsatzTV.Core/Scheduling/RandomizedRotatingMediaCollectionEnumerator.cs +++ b/ErsatzTV.Core/Scheduling/RandomizedRotatingMediaCollectionEnumerator.cs @@ -45,7 +45,7 @@ public class RandomizedRotatingMediaCollectionEnumerator : IMediaCollectionEnume _groupNumber = 0; - State = new CollectionEnumeratorState { Seed = state.Seed }; + State = new CollectionEnumeratorState { Seed = state.Seed, Started = state.Started }; // we want to move at least once so we start with a random item and not the first // because _index defaults to 0 if (State.Index == state.Index) diff --git a/ErsatzTV.Core/Scheduling/SeasonEpisodeMediaCollectionEnumerator.cs b/ErsatzTV.Core/Scheduling/SeasonEpisodeMediaCollectionEnumerator.cs index 04d126452..10845e45a 100644 --- a/ErsatzTV.Core/Scheduling/SeasonEpisodeMediaCollectionEnumerator.cs +++ b/ErsatzTV.Core/Scheduling/SeasonEpisodeMediaCollectionEnumerator.cs @@ -21,7 +21,7 @@ public sealed class SeasonEpisodeMediaCollectionEnumerator : IMediaCollectionEnu _lazyMinimumDuration = new Lazy>(() => _sortedMediaItems.Bind(i => i.GetNonZeroDuration()).OrderBy(identity).HeadOrNone()); - State = new CollectionEnumeratorState { Seed = state.Seed }; + State = new CollectionEnumeratorState { Seed = state.Seed, Started = state.Started }; if (state.Index >= _sortedMediaItems.Count) { diff --git a/ErsatzTV.Core/Scheduling/ShuffleInOrderCollectionEnumerator.cs b/ErsatzTV.Core/Scheduling/ShuffleInOrderCollectionEnumerator.cs index 974d6f735..fda74a715 100644 --- a/ErsatzTV.Core/Scheduling/ShuffleInOrderCollectionEnumerator.cs +++ b/ErsatzTV.Core/Scheduling/ShuffleInOrderCollectionEnumerator.cs @@ -39,7 +39,7 @@ public class ShuffleInOrderCollectionEnumerator : IMediaCollectionEnumerator new Lazy>(() => _shuffled.Bind(i => i.GetNonZeroDuration()).OrderBy(identity).HeadOrNone()); - State = new CollectionEnumeratorState { Seed = state.Seed }; + State = new CollectionEnumeratorState { Seed = state.Seed, Started = state.Started }; while (State.Index < state.Index) { MoveNext(Option.None); diff --git a/ErsatzTV.Core/Scheduling/ShuffledMediaCollectionEnumerator.cs b/ErsatzTV.Core/Scheduling/ShuffledMediaCollectionEnumerator.cs index 32ff22014..86a03e4dc 100644 --- a/ErsatzTV.Core/Scheduling/ShuffledMediaCollectionEnumerator.cs +++ b/ErsatzTV.Core/Scheduling/ShuffledMediaCollectionEnumerator.cs @@ -36,7 +36,7 @@ public class ShuffledMediaCollectionEnumerator : IMediaCollectionEnumerator new Lazy>(() => _shuffled.Bind(i => i.GetNonZeroDuration()).OrderBy(identity).HeadOrNone()); - State = new CollectionEnumeratorState { Seed = state.Seed }; + State = new CollectionEnumeratorState { Seed = state.Seed, Started = state.Started }; while (State.Index < state.Index) { MoveNext(Option.None); @@ -54,6 +54,7 @@ public class ShuffledMediaCollectionEnumerator : IMediaCollectionEnumerator State.Seed = state.Seed; State.Index = state.Index; + State.Started = state.Started; } public string SchedulingContextName => "Shuffle"; diff --git a/ErsatzTV.Core/Scheduling/ShuffledScheduleItemsEnumerator.cs b/ErsatzTV.Core/Scheduling/ShuffledScheduleItemsEnumerator.cs index 7f96017b0..a81634b37 100644 --- a/ErsatzTV.Core/Scheduling/ShuffledScheduleItemsEnumerator.cs +++ b/ErsatzTV.Core/Scheduling/ShuffledScheduleItemsEnumerator.cs @@ -26,7 +26,7 @@ public class ShuffledScheduleItemsEnumerator : IScheduleItemsEnumerator _random = new CloneableRandom(state.Seed); _shuffled = Shuffle(_scheduleItems, _random); - State = new CollectionEnumeratorState { Seed = state.Seed }; + State = new CollectionEnumeratorState { Seed = state.Seed, Started = state.Started }; while (State.Index < state.Index) { MoveNext(); diff --git a/ErsatzTV.Infrastructure/Scheduling/MultiEpisodeShuffleCollectionEnumerator.cs b/ErsatzTV.Infrastructure/Scheduling/MultiEpisodeShuffleCollectionEnumerator.cs index 51b9934df..b9296a98d 100644 --- a/ErsatzTV.Infrastructure/Scheduling/MultiEpisodeShuffleCollectionEnumerator.cs +++ b/ErsatzTV.Infrastructure/Scheduling/MultiEpisodeShuffleCollectionEnumerator.cs @@ -83,7 +83,7 @@ public class MultiEpisodeShuffleCollectionEnumerator : IMediaCollectionEnumerato new Lazy>(() => _shuffled.Bind(i => i.GetNonZeroDuration()).OrderBy(identity).HeadOrNone()); - State = new CollectionEnumeratorState { Seed = state.Seed }; + State = new CollectionEnumeratorState { Seed = state.Seed, Started = state.Started }; while (State.Index < state.Index) { MoveNext(Option.None);