Browse Source

marathon playout history fixes (#2096)

pull/2097/head
Jason Dove 2 months ago committed by GitHub
parent
commit
d6bfc2fd05
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 13
      ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs
  2. 5
      ErsatzTV.Core/Scheduling/PlaylistEnumeratorCollectionKey.cs
  3. 7
      ErsatzTV.Core/Scheduling/YamlScheduling/EnumeratorCache.cs
  4. 19
      ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutApplyHistoryHandler.cs
  5. 6
      ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutContentHandler.cs

13
ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs

@ -78,7 +78,7 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator
} }
} }
public ImmutableDictionary<CollectionKey, IMediaCollectionEnumerator> ChildEnumerators { get; private set; } public ImmutableList<PlaylistEnumeratorCollectionKey> ChildEnumerators { get; private set; }
public int EnumeratorIndex => _enumeratorIndex; public int EnumeratorIndex => _enumeratorIndex;
@ -213,7 +213,16 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator
} }
} }
result.ChildEnumerators = enumeratorMap.ToImmutableDictionary(); var childEnumerators = new List<PlaylistEnumeratorCollectionKey>();
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; return result;
} }

5
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);

7
ErsatzTV.Core/Scheduling/YamlScheduling/EnumeratorCache.cs

@ -123,6 +123,13 @@ public class EnumeratorCache(IMediaCollectionRepository mediaCollectionRepositor
Dictionary<PlaylistItem, List<MediaItem>> itemMap = Dictionary<PlaylistItem, List<MediaItem>> itemMap =
await mediaCollectionRepository.GetPlaylistItemMap(playlist.PlaylistGroup, playlist.Playlist); await mediaCollectionRepository.GetPlaylistItemMap(playlist.PlaylistGroup, playlist.Playlist);
// foreach ((PlaylistItem playlistItem, List<MediaItem> mediaItems) in itemMap)
// {
// _playlistMediaItems.Add(
// new PlaylistKey(contentKey, CollectionKey.ForPlaylistItem(playlistItem)),
// mediaItems);
// }
return await PlaylistEnumerator.Create( return await PlaylistEnumerator.Create(
mediaCollectionRepository, mediaCollectionRepository,
itemMap, itemMap,

19
ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutApplyHistoryHandler.cs

@ -68,9 +68,8 @@ public class YamlPlayoutApplyHistoryHandler(EnumeratorCache enumeratorCache)
itemPlaybackOrder = PlaybackOrder.None; itemPlaybackOrder = PlaybackOrder.None;
} }
var childEnumeratorKeys = playlistEnumerator.ChildEnumerators.Keys.ToList(); var childEnumeratorKeys = playlistEnumerator.ChildEnumerators.Map(x => x.CollectionKey).ToList();
foreach ((CollectionKey collectionKey, IMediaCollectionEnumerator childEnumerator) in foreach ((IMediaCollectionEnumerator childEnumerator, CollectionKey collectionKey) in playlistEnumerator.ChildEnumerators)
playlistEnumerator.ChildEnumerators)
{ {
Option<PlayoutHistory> maybeApplicableHistory = maybeHistory Option<PlayoutHistory> maybeApplicableHistory = maybeHistory
.Filter(h => h.ChildKey == HistoryDetails.KeyForCollectionKey(collectionKey)) .Filter(h => h.ChildKey == HistoryDetails.KeyForCollectionKey(collectionKey))
@ -82,13 +81,17 @@ public class YamlPlayoutApplyHistoryHandler(EnumeratorCache enumeratorCache)
foreach (PlayoutHistory h in maybeApplicableHistory) foreach (PlayoutHistory h in maybeApplicableHistory)
{ {
// logger.LogDebug( // logger.LogDebug(
// "History is applicable: {When}: {ChildKey} / {History}", // "History is applicable: {When}: {ChildKey} / {History} / {IsCurrentChild}",
// h.When, // h.When,
// h.ChildKey, // h.ChildKey,
// h.Details); // h.Details,
// h.IsCurrentChild);
enumerator.ResetState( enumerator.ResetState(new CollectionEnumeratorState
new CollectionEnumeratorState { Seed = enumerator.State.Seed, Index = h.Index + 1 }); {
Seed = enumerator.State.Seed,
Index = h.Index + (h.IsCurrentChild ? 1 : 0)
});
if (itemPlaybackOrder is PlaybackOrder.Chronological) if (itemPlaybackOrder is PlaybackOrder.Chronological)
{ {
@ -97,7 +100,7 @@ public class YamlPlayoutApplyHistoryHandler(EnumeratorCache enumeratorCache)
h.Details, h.Details,
childEnumerator, childEnumerator,
playbackOrder, playbackOrder,
h.IsCurrentChild); !h.IsCurrentChild);
} }
if (h.IsCurrentChild) if (h.IsCurrentChild)

6
ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutContentHandler.cs

@ -91,10 +91,10 @@ public abstract class YamlPlayoutContentHandler(EnumeratorCache enumeratorCache)
result.Add(nextHistory); result.Add(nextHistory);
var childEnumeratorKeys = playlistEnumerator.ChildEnumerators.Keys.ToList(); for (var i = 0; i < playlistEnumerator.ChildEnumerators.Count; i++)
foreach ((CollectionKey collectionKey, IMediaCollectionEnumerator childEnumerator) in playlistEnumerator.ChildEnumerators)
{ {
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) foreach (MediaItem currentMediaItem in childEnumerator.Current)
{ {
// create a playout history record // create a playout history record

Loading…
Cancel
Save