Browse Source

fix saving yaml playout history (#2327)

* fix saving yaml playout history

* cleanup
pull/2329/head
Jason Dove 5 months ago committed by GitHub
parent
commit
1e7f9a5709
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 29
      ErsatzTV.Application/Playouts/Commands/BuildPlayout.cs
  2. 7
      ErsatzTV.Application/Playouts/Commands/BuildPlayoutHandler.cs
  3. 1
      ErsatzTV.Core/Interfaces/Scheduling/IYamlPlayoutBuilder.cs
  4. 6
      ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutApplyHistoryHandler.cs
  5. 15
      ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutBuilder.cs
  6. 31
      ErsatzTV/Controllers/Api/ChannelController.cs

29
ErsatzTV.Application/Playouts/Commands/BuildPlayout.cs

@ -3,5 +3,30 @@ using ErsatzTV.Core.Scheduling; @@ -3,5 +3,30 @@ using ErsatzTV.Core.Scheduling;
namespace ErsatzTV.Application.Playouts;
public record BuildPlayout(int PlayoutId, PlayoutBuildMode Mode) : IRequest<Either<BaseError, Unit>>,
IBackgroundServiceRequest;
public record BuildPlayout : IRequest<Either<BaseError, Unit>>, 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;
}
}

7
ErsatzTV.Application/Playouts/Commands/BuildPlayoutHandler.cs

@ -125,7 +125,12 @@ public class BuildPlayoutHandler : IRequestHandler<BuildPlayout, Either<BaseErro @@ -125,7 +125,12 @@ public class BuildPlayoutHandler : IRequestHandler<BuildPlayout, Either<BaseErro
cancellationToken);
break;
case ProgramSchedulePlayoutType.Yaml:
result = await _yamlPlayoutBuilder.Build(playout, referenceData, request.Mode, cancellationToken);
result = await _yamlPlayoutBuilder.Build(
request.Start,
playout,
referenceData,
request.Mode,
cancellationToken);
break;
case ProgramSchedulePlayoutType.ExternalJson:
await _externalJsonPlayoutBuilder.Build(playout, request.Mode, cancellationToken);

1
ErsatzTV.Core/Interfaces/Scheduling/IYamlPlayoutBuilder.cs

@ -6,6 +6,7 @@ namespace ErsatzTV.Core.Interfaces.Scheduling; @@ -6,6 +6,7 @@ namespace ErsatzTV.Core.Interfaces.Scheduling;
public interface IYamlPlayoutBuilder
{
Task<PlayoutBuildResult> Build(
DateTimeOffset start,
Playout playout,
PlayoutReferenceData referenceData,
PlayoutBuildMode mode,

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

@ -9,7 +9,7 @@ namespace ErsatzTV.Core.Scheduling.YamlScheduling.Handlers; @@ -9,7 +9,7 @@ namespace ErsatzTV.Core.Scheduling.YamlScheduling.Handlers;
public class YamlPlayoutApplyHistoryHandler(EnumeratorCache enumeratorCache)
{
public async Task<bool> Handle(
PlayoutReferenceData referenceData,
IReadOnlyCollection<PlayoutHistory> filteredHistory,
YamlPlayoutContext context,
YamlPlayoutContentItem contentItem,
ILogger<YamlPlayoutBuilder> logger,
@ -39,7 +39,7 @@ public class YamlPlayoutApplyHistoryHandler(EnumeratorCache enumeratorCache) @@ -39,7 +39,7 @@ public class YamlPlayoutApplyHistoryHandler(EnumeratorCache enumeratorCache)
string historyKey = HistoryDetails.KeyForYamlContent(contentItem);
DateTime historyTime = context.CurrentTime.UtcDateTime;
Option<DateTime> maxWhen = await referenceData.PlayoutHistory
Option<DateTime> 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) @@ -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();

15
ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutBuilder.cs

@ -25,6 +25,7 @@ public class YamlPlayoutBuilder( @@ -25,6 +25,7 @@ public class YamlPlayoutBuilder(
: IYamlPlayoutBuilder
{
public async Task<PlayoutBuildResult> Build(
DateTimeOffset start,
Playout playout,
PlayoutReferenceData referenceData,
PlayoutBuildMode mode,
@ -99,8 +100,6 @@ public class YamlPlayoutBuilder( @@ -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( @@ -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( @@ -286,6 +292,7 @@ public class YamlPlayoutBuilder(
playout.Anchor = anchor;
result.AddedItems.AddRange(context.AddedItems);
result.AddedHistory.AddRange(context.AddedHistory);
return result;
}

31
ErsatzTV/Controllers/Api/ChannelController.cs

@ -30,16 +30,23 @@ public class ChannelController(ChannelWriter<IBackgroundServiceRequest> workerCh @@ -30,16 +30,23 @@ public class ChannelController(ChannelWriter<IBackgroundServiceRequest> workerCh
return new NotFoundResult();
}
[HttpPost("/api/channels/{channelNumber}/playout/continue")]
public async Task<IActionResult> ContinuePlayout(string channelNumber)
{
Option<int> 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<IActionResult> ContinuePlayout(string channelNumber)
// {
// Option<int> 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();
// }
}

Loading…
Cancel
Save