Browse Source

restore explicit priority since yaml doesn't have a ui to easily reorder

pull/2682/head
Jason Dove 7 months ago
parent
commit
b1855464cd
No known key found for this signature in database
  1. 5
      ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutSchedule.cs
  2. 37
      ErsatzTV.Core/Scheduling/YamlScheduling/SequentialPlayoutBuilder.cs

5
ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutSchedule.cs

@ -12,6 +12,11 @@ public class YamlPlayoutSchedule @@ -12,6 +12,11 @@ public class YamlPlayoutSchedule
[YamlMember(Alias = "end_date", ApplyNamingConventions = false)]
public string EndDate { get; set; }
/// <summary>
/// Priority for schedule matching. Higher values are checked first. Default is 0.
/// </summary>
public int Priority { get; set; }
public List<YamlPlayoutInstruction> Reset { get; set; } = [];
public List<YamlPlayoutInstruction> Playout { get; set; } = [];

37
ErsatzTV.Core/Scheduling/YamlScheduling/SequentialPlayoutBuilder.cs

@ -202,8 +202,23 @@ public class SequentialPlayoutBuilder( @@ -202,8 +202,23 @@ public class SequentialPlayoutBuilder(
cancellationToken);
}
// load alternate schedules
// sort by priority, then by index
IOrderedEnumerable<(YamlPlayoutSchedule schedule, int index)> sortedSchedules = playoutDefinition.Schedules
.Select((schedule, index) => (schedule, index))
.OrderByDescending(x => x.schedule.Priority)
.ThenBy(x => x.index);
// parse once
var parsedSchedules = sortedSchedules
.Select((s, i) => new YamlPlayoutParsedSchedule(s.schedule, i))
.ToList();
// Determine which schedule to use based on the start date
Option<YamlPlayoutSchedule> maybeActiveSchedule = GetActiveSchedule(playoutDefinition, start);
Option<YamlPlayoutSchedule> maybeActiveSchedule = AlternateScheduleSelector
.GetScheduleForDate(parsedSchedules, start)
.Map(s => s.Schedule);
List<YamlPlayoutInstruction> resetInstructions = [];
List<YamlPlayoutInstruction> playoutInstructions = [];
@ -305,7 +320,10 @@ public class SequentialPlayoutBuilder( @@ -305,7 +320,10 @@ public class SequentialPlayoutBuilder(
while (context.CurrentTime < finish)
{
// Check if we've crossed into a different schedule
Option<YamlPlayoutSchedule> maybeNewSchedule = GetActiveSchedule(playoutDefinition, context.CurrentTime);
Option<YamlPlayoutSchedule> maybeNewSchedule = AlternateScheduleSelector
.GetScheduleForDate(parsedSchedules, context.CurrentTime)
.Map(s => s.Schedule);
if (currentSchedule != maybeNewSchedule)
{
string oldName = currentSchedule.Match(cs => string.IsNullOrWhiteSpace(cs.Name) ? "Unnamed" : cs.Name, () => "Default");
@ -737,19 +755,4 @@ public class SequentialPlayoutBuilder( @@ -737,19 +755,4 @@ public class SequentialPlayoutBuilder(
return result;
}
/// <summary>
/// Finds the active schedule for the given date, or returns None if no schedule matches.
/// Schedules are checked by definition order.
/// </summary>
private static Option<YamlPlayoutSchedule> GetActiveSchedule(YamlPlayoutDefinition definition, DateTimeOffset date)
{
if (definition.Schedules.Count == 0)
{
return Option<YamlPlayoutSchedule>.None;
}
var parsedSchedules = definition.Schedules.Select((s, i) => new YamlPlayoutParsedSchedule(s, i)).ToList();
return AlternateScheduleSelector.GetScheduleForDate(parsedSchedules, date).Map(s => s.Schedule);
}
}

Loading…
Cancel
Save