From 015f5e9798dcfd22d991b8d7d65efc7081319827 Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Thu, 22 Jun 2023 09:40:20 -0500 Subject: [PATCH] fix playout build loop that was recently introduced (#1318) --- .../Domain/CollectionEnumeratorState.cs | 2 +- .../Scheduling/IMediaCollectionEnumerator.cs | 2 +- .../ChronologicalMediaCollectionEnumerator.cs | 5 ++-- .../CustomOrderCollectionEnumerator.cs | 5 ++-- .../PlayoutModeSchedulerDuration.cs | 23 +++++++---------- .../Scheduling/PlayoutModeSchedulerFlood.cs | 25 ++++++++----------- .../RandomizedMediaCollectionEnumerator.cs | 5 ++-- .../SeasonEpisodeMediaCollectionEnumerator.cs | 5 ++-- .../ShuffleInOrderCollectionEnumerator.cs | 11 ++++++-- .../ShuffledMediaCollectionEnumerator.cs | 11 ++++++-- ...MultiEpisodeShuffleCollectionEnumerator.cs | 23 ++++++++--------- 11 files changed, 62 insertions(+), 55 deletions(-) diff --git a/ErsatzTV.Core/Domain/CollectionEnumeratorState.cs b/ErsatzTV.Core/Domain/CollectionEnumeratorState.cs index 167632d1..3cf6a310 100644 --- a/ErsatzTV.Core/Domain/CollectionEnumeratorState.cs +++ b/ErsatzTV.Core/Domain/CollectionEnumeratorState.cs @@ -4,5 +4,5 @@ public class CollectionEnumeratorState { public int Seed { get; set; } public int Index { get; set; } - public CollectionEnumeratorState Clone() => new CollectionEnumeratorState { Seed = Seed, Index = Index }; + public CollectionEnumeratorState Clone() => new() { Seed = Seed, Index = Index }; } diff --git a/ErsatzTV.Core/Interfaces/Scheduling/IMediaCollectionEnumerator.cs b/ErsatzTV.Core/Interfaces/Scheduling/IMediaCollectionEnumerator.cs index bfa5c909..3a6c210e 100644 --- a/ErsatzTV.Core/Interfaces/Scheduling/IMediaCollectionEnumerator.cs +++ b/ErsatzTV.Core/Interfaces/Scheduling/IMediaCollectionEnumerator.cs @@ -4,7 +4,7 @@ namespace ErsatzTV.Core.Interfaces.Scheduling; public interface IMediaCollectionEnumerator { - IMediaCollectionEnumerator Clone(CollectionEnumeratorState state, CancellationToken cancellationToken); + void ResetState(CollectionEnumeratorState state); CollectionEnumeratorState State { get; } Option Current { get; } void MoveNext(); diff --git a/ErsatzTV.Core/Scheduling/ChronologicalMediaCollectionEnumerator.cs b/ErsatzTV.Core/Scheduling/ChronologicalMediaCollectionEnumerator.cs index 537cc929..60c52bc6 100644 --- a/ErsatzTV.Core/Scheduling/ChronologicalMediaCollectionEnumerator.cs +++ b/ErsatzTV.Core/Scheduling/ChronologicalMediaCollectionEnumerator.cs @@ -31,9 +31,10 @@ public sealed class ChronologicalMediaCollectionEnumerator : IMediaCollectionEnu } } - public IMediaCollectionEnumerator Clone(CollectionEnumeratorState state, CancellationToken cancellationToken) + public void ResetState(CollectionEnumeratorState state) { - return new ChronologicalMediaCollectionEnumerator(_sortedMediaItems, state); + // seed doesn't matter in chronological + State.Index = state.Index; } public CollectionEnumeratorState State { get; } diff --git a/ErsatzTV.Core/Scheduling/CustomOrderCollectionEnumerator.cs b/ErsatzTV.Core/Scheduling/CustomOrderCollectionEnumerator.cs index c7528a54..b311a829 100644 --- a/ErsatzTV.Core/Scheduling/CustomOrderCollectionEnumerator.cs +++ b/ErsatzTV.Core/Scheduling/CustomOrderCollectionEnumerator.cs @@ -35,9 +35,10 @@ public class CustomOrderCollectionEnumerator : IMediaCollectionEnumerator } } - public IMediaCollectionEnumerator Clone(CollectionEnumeratorState state, CancellationToken cancellationToken) + public void ResetState(CollectionEnumeratorState state) { - return new CustomOrderCollectionEnumerator(_collection, _mediaItems, state); + // seed doesn't matter here + State.Index = state.Index; } public CollectionEnumeratorState State { get; } diff --git a/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerDuration.cs b/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerDuration.cs index 1e5589fe..85a4b22f 100644 --- a/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerDuration.cs +++ b/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerDuration.cs @@ -122,16 +122,15 @@ public class PlayoutModeSchedulerDuration : PlayoutModeSchedulerBase(); + var enumeratorStates = new Dictionary(); foreach ((CollectionKey key, IMediaCollectionEnumerator enumerator) in collectionEnumerators) { - IMediaCollectionEnumerator clone = enumerator.Clone(enumerator.State.Clone(), cancellationToken); - enumeratorClones.Add(key, clone); + enumeratorStates.Add(key, enumerator.State.Clone()); } List maybePlayoutItems = AddFiller( nextState, - enumeratorClones, + collectionEnumerators, scheduleItem, playoutItem, itemChapters, @@ -147,16 +146,6 @@ public class PlayoutModeSchedulerDuration : PlayoutModeSchedulerBase scheduleItem.PlayoutDuration) { diff --git a/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerFlood.cs b/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerFlood.cs index 4f17997c..e92fc9b0 100644 --- a/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerFlood.cs +++ b/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerFlood.cs @@ -74,16 +74,15 @@ public class PlayoutModeSchedulerFlood : PlayoutModeSchedulerBase(); + var enumeratorStates = new Dictionary(); foreach ((CollectionKey key, IMediaCollectionEnumerator enumerator) in collectionEnumerators) { - IMediaCollectionEnumerator clone = enumerator.Clone(enumerator.State.Clone(), cancellationToken); - enumeratorClones.Add(key, clone); + enumeratorStates.Add(key, enumerator.State.Clone()); } List maybePlayoutItems = AddFiller( nextState, - enumeratorClones, + collectionEnumerators, scheduleItem, playoutItem, itemChapters, @@ -102,16 +101,6 @@ public class PlayoutModeSchedulerFlood : PlayoutModeSchedulerBase _mediaItems; - private readonly IScriptEngine _scriptEngine; private readonly ILogger _logger; private readonly int _mediaItemCount; private readonly Dictionary> _mediaItemGroups; @@ -21,15 +19,13 @@ public class MultiEpisodeShuffleCollectionEnumerator : IMediaCollectionEnumerato private readonly Lazy> _lazyMinimumDuration; public MultiEpisodeShuffleCollectionEnumerator( - IList mediaItems, + ICollection mediaItems, CollectionEnumeratorState state, IScriptEngine scriptEngine, string scriptFile, ILogger logger, CancellationToken cancellationToken) { - _mediaItems = mediaItems; - _scriptEngine = scriptEngine; _logger = logger; _cancellationToken = cancellationToken; @@ -91,15 +87,16 @@ public class MultiEpisodeShuffleCollectionEnumerator : IMediaCollectionEnumerato } } - public IMediaCollectionEnumerator Clone(CollectionEnumeratorState state, CancellationToken cancellationToken) + public void ResetState(CollectionEnumeratorState state) { - return new MultiEpisodeShuffleCollectionEnumerator( - _mediaItems, - state, - _scriptEngine, - null, - _logger, - cancellationToken); + // only re-shuffle if needed + if (State.Seed != state.Seed) + { + _random = new CloneableRandom(state.Seed); + _shuffled = Shuffle(_random); + } + + State.Index = state.Index; } public CollectionEnumeratorState State { get; }