diff --git a/ErsatzTV.Core/Scheduling/BlockScheduling/BlockPlayoutBuilder.cs b/ErsatzTV.Core/Scheduling/BlockScheduling/BlockPlayoutBuilder.cs index 9364f6663..9739d588c 100644 --- a/ErsatzTV.Core/Scheduling/BlockScheduling/BlockPlayoutBuilder.cs +++ b/ErsatzTV.Core/Scheduling/BlockScheduling/BlockPlayoutBuilder.cs @@ -17,7 +17,7 @@ public class BlockPlayoutBuilder( ILogger logger) : IBlockPlayoutBuilder { - public async Task Build(Playout playout, PlayoutBuildMode mode, CancellationToken cancellationToken) + public virtual async Task Build(Playout playout, PlayoutBuildMode mode, CancellationToken cancellationToken) { Logger.LogDebug( "Building block playout {PlayoutId} for channel {ChannelNumber} - {ChannelName}", diff --git a/ErsatzTV.Core/Scheduling/BlockScheduling/BlockPlayoutPreviewBuilder.cs b/ErsatzTV.Core/Scheduling/BlockScheduling/BlockPlayoutPreviewBuilder.cs index 52f6b2e27..d4d5ada84 100644 --- a/ErsatzTV.Core/Scheduling/BlockScheduling/BlockPlayoutPreviewBuilder.cs +++ b/ErsatzTV.Core/Scheduling/BlockScheduling/BlockPlayoutPreviewBuilder.cs @@ -19,8 +19,24 @@ public class BlockPlayoutPreviewBuilder( artistRepository, logger), IBlockPlayoutPreviewBuilder { + private readonly Dictionary> _randomizedCollections = []; + protected override ILogger Logger => NullLogger.Instance; + public override async Task Build( + Playout playout, + PlayoutBuildMode mode, + CancellationToken cancellationToken) + { + _randomizedCollections.Add(playout.Channel.UniqueId, []); + + Playout result = await base.Build(playout, mode, cancellationToken); + + _randomizedCollections.Remove(playout.Channel.UniqueId); + + return result; + } + protected override Task GetDaysToBuild() => Task.FromResult(1); protected override IMediaCollectionEnumerator GetEnumerator( @@ -30,16 +46,25 @@ public class BlockPlayoutPreviewBuilder( string historyKey, Map> collectionMediaItems) { - IMediaCollectionEnumerator enumerator = base.GetEnumerator(playout, blockItem, currentTime, historyKey, collectionMediaItems); - + IMediaCollectionEnumerator enumerator = base.GetEnumerator( + playout, + blockItem, + currentTime, + historyKey, + collectionMediaItems); + var collectionKey = CollectionKey.ForBlockItem(blockItem); - - enumerator.ResetState( - new CollectionEnumeratorState - { - Seed = new Random().Next(), - Index = new Random().Next(collectionMediaItems[collectionKey].Count) - }); + if (!_randomizedCollections[playout.Channel.UniqueId].Contains(collectionKey)) + { + enumerator.ResetState( + new CollectionEnumeratorState + { + Seed = new Random().Next(), + Index = new Random().Next(collectionMediaItems[collectionKey].Count) + }); + + _randomizedCollections[playout.Channel.UniqueId].Add(collectionKey); + } return enumerator; } diff --git a/ErsatzTV/Pages/BlockEditor.razor b/ErsatzTV/Pages/BlockEditor.razor index 7f9fc020e..d5a87b728 100644 --- a/ErsatzTV/Pages/BlockEditor.razor +++ b/ErsatzTV/Pages/BlockEditor.razor @@ -53,6 +53,7 @@ + Collection @@ -60,6 +61,7 @@ + @@ -72,6 +74,11 @@ @context.PlaybackOrder + + + + bi.Index >= newItem.Index)) + { + i.Index += 1; + } + + _block.Items.Add(newItem); + _selectedItem = newItem; + } + private void RemoveBlockItem(BlockItemEditViewModel item) { _selectedItem = null;