diff --git a/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutDurationHandler.cs b/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutDurationHandler.cs index 35eadcf1..1fdf4e12 100644 --- a/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutDurationHandler.cs +++ b/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutDurationHandler.cs @@ -50,6 +50,8 @@ public class YamlPlayoutDurationHandler(EnumeratorCache enumeratorCache) : YamlP targetTime, duration.DiscardAttempts, duration.Trim, + duration.OfflineTail, + duration.EpgGroupPerItem, GetFillerKind(duration), enumerator, fallbackEnumerator); @@ -67,6 +69,8 @@ public class YamlPlayoutDurationHandler(EnumeratorCache enumeratorCache) : YamlP DateTimeOffset targetTime, int discardAttempts, bool trim, + bool offlineTail, + bool guideGroupPerItem, FillerKind fillerKind, IMediaCollectionEnumerator enumerator, Option fallbackEnumerator) @@ -77,6 +81,11 @@ public class YamlPlayoutDurationHandler(EnumeratorCache enumeratorCache) : YamlP { foreach (MediaItem mediaItem in enumerator.Current) { + if (guideGroupPerItem) + { + context.GuideGroup *= -1; + } + TimeSpan itemDuration = DurationForMediaItem(mediaItem); var playoutItem = new PlayoutItem @@ -151,6 +160,7 @@ public class YamlPlayoutDurationHandler(EnumeratorCache enumeratorCache) : YamlP foreach (IMediaCollectionEnumerator fallback in fallbackEnumerator) { remainingToFill = TimeSpan.Zero; + context.CurrentTime = targetTime; done = true; // replace with fallback content @@ -187,6 +197,6 @@ public class YamlPlayoutDurationHandler(EnumeratorCache enumeratorCache) : YamlP } } - return targetTime; + return offlineTail ? targetTime : context.CurrentTime; } } diff --git a/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutPadToNextHandler.cs b/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutPadToNextHandler.cs index 56343ced..a62ed484 100644 --- a/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutPadToNextHandler.cs +++ b/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutPadToNextHandler.cs @@ -58,6 +58,8 @@ public class YamlPlayoutPadToNextHandler(EnumeratorCache enumeratorCache) : Yaml targetTime, padToNext.DiscardAttempts, padToNext.Trim, + offlineTail: true, + guideGroupPerItem: false, GetFillerKind(padToNext), enumerator, fallbackEnumerator); diff --git a/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutPadUntilHandler.cs b/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutPadUntilHandler.cs index f5570ed7..fd229bcf 100644 --- a/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutPadUntilHandler.cs +++ b/ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutPadUntilHandler.cs @@ -68,6 +68,8 @@ public class YamlPlayoutPadUntilHandler(EnumeratorCache enumeratorCache) : YamlP targetTime, padUntil.DiscardAttempts, padUntil.Trim, + offlineTail: true, + guideGroupPerItem: false, GetFillerKind(padUntil), enumerator, fallbackEnumerator); diff --git a/ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutDurationInstruction.cs b/ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutDurationInstruction.cs index 1e42992f..cdf5c1b2 100644 --- a/ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutDurationInstruction.cs +++ b/ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutDurationInstruction.cs @@ -8,6 +8,12 @@ public class YamlPlayoutDurationInstruction : YamlPlayoutInstruction public bool Trim { get; set; } + [YamlMember(Alias = "offline_tail", ApplyNamingConventions = false)] + public bool OfflineTail { get; set; } + + [YamlMember(Alias = "epg_group_per_item", ApplyNamingConventions = false)] + public bool EpgGroupPerItem { get; set; } = true; + public string Fallback { get; set; } [YamlMember(Alias = "discard_attempts", ApplyNamingConventions = false)]