diff --git a/ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutSchedule.cs b/ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutSchedule.cs index 33ac51f6c..cf311a9cc 100644 --- a/ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutSchedule.cs +++ b/ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutSchedule.cs @@ -12,6 +12,11 @@ public class YamlPlayoutSchedule [YamlMember(Alias = "end_date", ApplyNamingConventions = false)] public string EndDate { get; set; } + /// + /// Priority for schedule matching. Higher values are checked first. Default is 0. + /// + public int Priority { get; set; } = 0; + public List Reset { get; set; } = []; public List Playout { get; set; } = []; diff --git a/ErsatzTV.Core/Scheduling/YamlScheduling/SequentialPlayoutBuilder.cs b/ErsatzTV.Core/Scheduling/YamlScheduling/SequentialPlayoutBuilder.cs index 2e9efb258..58e5fe9e9 100644 --- a/ErsatzTV.Core/Scheduling/YamlScheduling/SequentialPlayoutBuilder.cs +++ b/ErsatzTV.Core/Scheduling/YamlScheduling/SequentialPlayoutBuilder.cs @@ -743,6 +743,7 @@ public class SequentialPlayoutBuilder( /// /// Finds the active schedule for the given date, or returns null if no schedule matches. + /// Schedules are checked in priority order (highest first), then by definition order. /// private static YamlPlayoutSchedule GetActiveSchedule(YamlPlayoutDefinition definition, DateTimeOffset date) { @@ -751,7 +752,13 @@ public class SequentialPlayoutBuilder( return null; } - foreach (YamlPlayoutSchedule schedule in definition.Schedules) + // Sort by priority (descending), then by original order + var sortedSchedules = definition.Schedules + .Select((schedule, index) => (schedule, index)) + .OrderByDescending(x => x.schedule.Priority) + .ThenBy(x => x.index); + + foreach ((YamlPlayoutSchedule schedule, int _) in sortedSchedules) { if (IsDateInSchedule(schedule, date)) { diff --git a/ErsatzTV/Resources/sequential-schedule.schema.json b/ErsatzTV/Resources/sequential-schedule.schema.json index 10a13e6f4..acca84815 100644 --- a/ErsatzTV/Resources/sequential-schedule.schema.json +++ b/ErsatzTV/Resources/sequential-schedule.schema.json @@ -86,6 +86,11 @@ "description": "End date in MM-DD (e.g., '01-31') or YYYY-MM-DD format (e.g., '2024-12-25'). MM-DD dates recur annually, YYYY-MM-DD dates are one-time events.", "pattern": "^((\\d{4}-)?(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01]))$" }, + "priority": { + "type": "integer", + "description": "Priority for schedule matching. Higher values are checked first. Default is 0. Use this when schedules overlap (e.g., a specific date within a broader range).", + "default": 0 + }, "reset": { "description": "Reset instructions for this scheduled playout", "type": "array",