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",