diff --git a/ErsatzTV.Application/Playouts/Commands/BuildPlayout.cs b/ErsatzTV.Application/Playouts/Commands/BuildPlayout.cs index 2159b907a..8a9a52184 100644 --- a/ErsatzTV.Application/Playouts/Commands/BuildPlayout.cs +++ b/ErsatzTV.Application/Playouts/Commands/BuildPlayout.cs @@ -3,5 +3,30 @@ using ErsatzTV.Core.Scheduling; namespace ErsatzTV.Application.Playouts; -public record BuildPlayout(int PlayoutId, PlayoutBuildMode Mode) : IRequest>, - IBackgroundServiceRequest; +public record BuildPlayout : IRequest>, IBackgroundServiceRequest +{ + public BuildPlayout(int playoutId, PlayoutBuildMode mode) + { + Start = DateTimeOffset.Now; + PlayoutId = playoutId; + Mode = mode; + } + + public BuildPlayout(int playoutId, PlayoutBuildMode mode, DateTimeOffset start) + { + Start = start; + PlayoutId = playoutId; + Mode = mode; + } + + public DateTimeOffset Start { get; set; } + public int PlayoutId { get; init; } + public PlayoutBuildMode Mode { get; init; } + + public void Deconstruct(out int playoutId, out PlayoutBuildMode mode, out DateTimeOffset start) + { + playoutId = PlayoutId; + mode = Mode; + start = Start; + } +} diff --git a/ErsatzTV.Application/Playouts/Commands/BuildPlayoutHandler.cs b/ErsatzTV.Application/Playouts/Commands/BuildPlayoutHandler.cs index 4d2178583..60fabfaa0 100644 --- a/ErsatzTV.Application/Playouts/Commands/BuildPlayoutHandler.cs +++ b/ErsatzTV.Application/Playouts/Commands/BuildPlayoutHandler.cs @@ -125,7 +125,12 @@ public class BuildPlayoutHandler : IRequestHandler Build( + DateTimeOffset start, Playout playout, PlayoutReferenceData referenceData, PlayoutBuildMode mode, diff --git a/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutApplyHistoryHandler.cs b/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutApplyHistoryHandler.cs index 25b961bcc..2e61dde7c 100644 --- a/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutApplyHistoryHandler.cs +++ b/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutApplyHistoryHandler.cs @@ -9,7 +9,7 @@ namespace ErsatzTV.Core.Scheduling.YamlScheduling.Handlers; public class YamlPlayoutApplyHistoryHandler(EnumeratorCache enumeratorCache) { public async Task Handle( - PlayoutReferenceData referenceData, + IReadOnlyCollection filteredHistory, YamlPlayoutContext context, YamlPlayoutContentItem contentItem, ILogger logger, @@ -39,7 +39,7 @@ public class YamlPlayoutApplyHistoryHandler(EnumeratorCache enumeratorCache) string historyKey = HistoryDetails.KeyForYamlContent(contentItem); DateTime historyTime = context.CurrentTime.UtcDateTime; - Option maxWhen = await referenceData.PlayoutHistory + Option maxWhen = await filteredHistory .Filter(h => h.Key == historyKey) .Filter(h => h.When < historyTime) .Map(h => h.When) @@ -47,7 +47,7 @@ public class YamlPlayoutApplyHistoryHandler(EnumeratorCache enumeratorCache) .HeadOrNone() .IfNoneAsync(DateTime.MinValue); - var maybeHistory = referenceData.PlayoutHistory + var maybeHistory = filteredHistory .Filter(h => h.Key == historyKey) .Filter(h => h.When == maxWhen) .ToList(); diff --git a/ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutBuilder.cs b/ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutBuilder.cs index c390b5973..b0d0a73d2 100644 --- a/ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutBuilder.cs +++ b/ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutBuilder.cs @@ -25,6 +25,7 @@ public class YamlPlayoutBuilder( : IYamlPlayoutBuilder { public async Task Build( + DateTimeOffset start, Playout playout, PlayoutReferenceData referenceData, PlayoutBuildMode mode, @@ -99,8 +100,6 @@ public class YamlPlayoutBuilder( } } - DateTimeOffset start = DateTimeOffset.Now; - int daysToBuild = await GetDaysToBuild(); DateTimeOffset finish = start.AddDays(daysToBuild); @@ -161,11 +160,18 @@ public class YamlPlayoutBuilder( // finish, // context.InstructionIndex); - // apply all history + // apply all (filtered) history + var filteredHistory = referenceData.PlayoutHistory.ToList(); + filteredHistory.RemoveAll(h => result.HistoryToRemove.Contains(h.Id)); var applyHistoryHandler = new YamlPlayoutApplyHistoryHandler(enumeratorCache); foreach (YamlPlayoutContentItem contentItem in playoutDefinition.Content) { - await applyHistoryHandler.Handle(referenceData, context, contentItem, logger, cancellationToken); + await applyHistoryHandler.Handle( + filteredHistory.ToImmutableList(), + context, + contentItem, + logger, + cancellationToken); } if (mode is PlayoutBuildMode.Reset) @@ -286,6 +292,7 @@ public class YamlPlayoutBuilder( playout.Anchor = anchor; result.AddedItems.AddRange(context.AddedItems); + result.AddedHistory.AddRange(context.AddedHistory); return result; } diff --git a/ErsatzTV/Controllers/Api/ChannelController.cs b/ErsatzTV/Controllers/Api/ChannelController.cs index 7eccf81f2..5cf18e704 100644 --- a/ErsatzTV/Controllers/Api/ChannelController.cs +++ b/ErsatzTV/Controllers/Api/ChannelController.cs @@ -30,16 +30,23 @@ public class ChannelController(ChannelWriter workerCh return new NotFoundResult(); } - [HttpPost("/api/channels/{channelNumber}/playout/continue")] - public async Task ContinuePlayout(string channelNumber) - { - Option maybePlayoutId = await mediator.Send(new GetPlayoutIdByChannelNumber(channelNumber)); - foreach (int playoutId in maybePlayoutId) - { - await workerChannel.WriteAsync(new BuildPlayout(playoutId, PlayoutBuildMode.Continue)); - return new OkResult(); - } - - return new NotFoundResult(); - } + // for debugging by fast-forwarding a YAML playout + // [HttpPost("/api/channels/{channelNumber}/playout/continue")] + // public async Task ContinuePlayout(string channelNumber) + // { + // Option maybePlayoutId = await mediator.Send(new GetPlayoutIdByChannelNumber(channelNumber)); + // foreach (int playoutId in maybePlayoutId) + // { + // DateTimeOffset start = DateTimeOffset.Now; + // for (int i = 0; i < 24; i++) + // { + // await workerChannel.WriteAsync(new BuildPlayout(playoutId, PlayoutBuildMode.Continue, start)); + // start += TimeSpan.FromHours(1); + // } + // + // return new OkResult(); + // } + // + // return new NotFoundResult(); + // } }