diff --git a/ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs b/ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs index 7b9845331..0b405c241 100644 --- a/ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs +++ b/ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs @@ -78,7 +78,7 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator } } - public ImmutableDictionary ChildEnumerators { get; private set; } + public ImmutableList ChildEnumerators { get; private set; } public int EnumeratorIndex => _enumeratorIndex; @@ -213,7 +213,16 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator } } - result.ChildEnumerators = enumeratorMap.ToImmutableDictionary(); + var childEnumerators = new List(); + foreach (IMediaCollectionEnumerator enumerator in result._sortedEnumerators) + { + foreach ((CollectionKey collectionKey, _) in enumeratorMap.Find(e => e.Value == enumerator)) + { + childEnumerators.Add(new PlaylistEnumeratorCollectionKey(enumerator, collectionKey)); + } + } + + result.ChildEnumerators = childEnumerators.ToImmutableList(); return result; } diff --git a/ErsatzTV.Core/Scheduling/PlaylistEnumeratorCollectionKey.cs b/ErsatzTV.Core/Scheduling/PlaylistEnumeratorCollectionKey.cs new file mode 100644 index 000000000..aee13ed64 --- /dev/null +++ b/ErsatzTV.Core/Scheduling/PlaylistEnumeratorCollectionKey.cs @@ -0,0 +1,5 @@ +using ErsatzTV.Core.Interfaces.Scheduling; + +namespace ErsatzTV.Core.Scheduling; + +public record PlaylistEnumeratorCollectionKey(IMediaCollectionEnumerator Enumerator, CollectionKey CollectionKey); diff --git a/ErsatzTV.Core/Scheduling/YamlScheduling/EnumeratorCache.cs b/ErsatzTV.Core/Scheduling/YamlScheduling/EnumeratorCache.cs index 88dc9a66e..0c59cd3a2 100644 --- a/ErsatzTV.Core/Scheduling/YamlScheduling/EnumeratorCache.cs +++ b/ErsatzTV.Core/Scheduling/YamlScheduling/EnumeratorCache.cs @@ -123,6 +123,13 @@ public class EnumeratorCache(IMediaCollectionRepository mediaCollectionRepositor Dictionary> itemMap = await mediaCollectionRepository.GetPlaylistItemMap(playlist.PlaylistGroup, playlist.Playlist); + // foreach ((PlaylistItem playlistItem, List mediaItems) in itemMap) + // { + // _playlistMediaItems.Add( + // new PlaylistKey(contentKey, CollectionKey.ForPlaylistItem(playlistItem)), + // mediaItems); + // } + return await PlaylistEnumerator.Create( mediaCollectionRepository, itemMap, diff --git a/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutApplyHistoryHandler.cs b/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutApplyHistoryHandler.cs index dae201fe2..5c2aa9f31 100644 --- a/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutApplyHistoryHandler.cs +++ b/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutApplyHistoryHandler.cs @@ -68,9 +68,8 @@ public class YamlPlayoutApplyHistoryHandler(EnumeratorCache enumeratorCache) itemPlaybackOrder = PlaybackOrder.None; } - var childEnumeratorKeys = playlistEnumerator.ChildEnumerators.Keys.ToList(); - foreach ((CollectionKey collectionKey, IMediaCollectionEnumerator childEnumerator) in - playlistEnumerator.ChildEnumerators) + var childEnumeratorKeys = playlistEnumerator.ChildEnumerators.Map(x => x.CollectionKey).ToList(); + foreach ((IMediaCollectionEnumerator childEnumerator, CollectionKey collectionKey) in playlistEnumerator.ChildEnumerators) { Option maybeApplicableHistory = maybeHistory .Filter(h => h.ChildKey == HistoryDetails.KeyForCollectionKey(collectionKey)) @@ -82,13 +81,17 @@ public class YamlPlayoutApplyHistoryHandler(EnumeratorCache enumeratorCache) foreach (PlayoutHistory h in maybeApplicableHistory) { // logger.LogDebug( - // "History is applicable: {When}: {ChildKey} / {History}", + // "History is applicable: {When}: {ChildKey} / {History} / {IsCurrentChild}", // h.When, // h.ChildKey, - // h.Details); + // h.Details, + // h.IsCurrentChild); - enumerator.ResetState( - new CollectionEnumeratorState { Seed = enumerator.State.Seed, Index = h.Index + 1 }); + enumerator.ResetState(new CollectionEnumeratorState + { + Seed = enumerator.State.Seed, + Index = h.Index + (h.IsCurrentChild ? 1 : 0) + }); if (itemPlaybackOrder is PlaybackOrder.Chronological) { @@ -97,7 +100,7 @@ public class YamlPlayoutApplyHistoryHandler(EnumeratorCache enumeratorCache) h.Details, childEnumerator, playbackOrder, - h.IsCurrentChild); + !h.IsCurrentChild); } if (h.IsCurrentChild) diff --git a/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutContentHandler.cs b/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutContentHandler.cs index bca7da00b..84ad0baf1 100644 --- a/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutContentHandler.cs +++ b/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutContentHandler.cs @@ -91,10 +91,10 @@ public abstract class YamlPlayoutContentHandler(EnumeratorCache enumeratorCache) result.Add(nextHistory); - var childEnumeratorKeys = playlistEnumerator.ChildEnumerators.Keys.ToList(); - foreach ((CollectionKey collectionKey, IMediaCollectionEnumerator childEnumerator) in playlistEnumerator.ChildEnumerators) + for (var i = 0; i < playlistEnumerator.ChildEnumerators.Count; i++) { - bool isCurrentChild = childEnumeratorKeys.IndexOf(collectionKey) == playlistEnumerator.EnumeratorIndex; + (IMediaCollectionEnumerator childEnumerator, CollectionKey collectionKey) = playlistEnumerator.ChildEnumerators[i]; + bool isCurrentChild = i == playlistEnumerator.EnumeratorIndex; foreach (MediaItem currentMediaItem in childEnumerator.Current) { // create a playout history record