Browse Source

update yaml playout watermark to support multiple watermarks

pull/2267/head
Jason Dove 4 days ago
parent
commit
c43edcb325
No known key found for this signature in database
  1. 4
      CHANGELOG.md
  2. 2
      ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutAllHandler.cs
  3. 2
      ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutCountHandler.cs
  4. 2
      ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutDurationHandler.cs
  5. 41
      ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutWatermarkHandler.cs
  6. 35
      ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutContext.cs

4
CHANGELOG.md

@ -18,6 +18,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). @@ -18,6 +18,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Changed
- Allow multiple watermarks on a single playout item
- YAML playout: `watermark` instruction changes:
- When value is `true`, will add named watermark to list of active watermarks
- When value is `false` and `name` is specified, will remove named watermark from list of active watermarks
- When value is `false` and `name` is not specified, will clear all active watermarks
## [25.4.0] - 2025-08-05
### Added

2
ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutAllHandler.cs

@ -67,7 +67,7 @@ public class YamlPlayoutAllHandler(EnumeratorCache enumeratorCache) : YamlPlayou @@ -67,7 +67,7 @@ public class YamlPlayoutAllHandler(EnumeratorCache enumeratorCache) : YamlPlayou
PlayoutItemWatermarks = []
};
foreach (int watermarkId in context.GetChannelWatermarkId())
foreach (int watermarkId in context.GetChannelWatermarkIds())
{
playoutItem.PlayoutItemWatermarks.Add(
new PlayoutItemWatermark

2
ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutCountHandler.cs

@ -92,7 +92,7 @@ public class YamlPlayoutCountHandler(EnumeratorCache enumeratorCache) : YamlPlay @@ -92,7 +92,7 @@ public class YamlPlayoutCountHandler(EnumeratorCache enumeratorCache) : YamlPlay
PlayoutItemWatermarks = []
};
foreach (int watermarkId in context.GetChannelWatermarkId())
foreach (int watermarkId in context.GetChannelWatermarkIds())
{
playoutItem.PlayoutItemWatermarks.Add(
new PlayoutItemWatermark

2
ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutDurationHandler.cs

@ -126,7 +126,7 @@ public class YamlPlayoutDurationHandler(EnumeratorCache enumeratorCache) : YamlP @@ -126,7 +126,7 @@ public class YamlPlayoutDurationHandler(EnumeratorCache enumeratorCache) : YamlP
PlayoutItemWatermarks = []
};
foreach (int watermarkId in context.GetChannelWatermarkId())
foreach (int watermarkId in context.GetChannelWatermarkIds())
{
playoutItem.PlayoutItemWatermarks.Add(
new PlayoutItemWatermark

41
ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutWatermarkHandler.cs

@ -7,6 +7,8 @@ namespace ErsatzTV.Core.Scheduling.YamlScheduling.Handlers; @@ -7,6 +7,8 @@ namespace ErsatzTV.Core.Scheduling.YamlScheduling.Handlers;
public class YamlPlayoutWatermarkHandler(IChannelRepository channelRepository) : IYamlPlayoutHandler
{
private readonly Dictionary<string, Option<ChannelWatermark>> _watermarkCache = new();
public bool Reset => false;
public async Task<bool> Handle(
@ -24,17 +26,48 @@ public class YamlPlayoutWatermarkHandler(IChannelRepository channelRepository) : @@ -24,17 +26,48 @@ public class YamlPlayoutWatermarkHandler(IChannelRepository channelRepository) :
if (watermark.Watermark && !string.IsNullOrWhiteSpace(watermark.Name))
{
Option<ChannelWatermark> maybeWatermark = await channelRepository.GetWatermarkByName(watermark.Name);
foreach (ChannelWatermark channelWatermark in maybeWatermark)
foreach (var wm in await GetChannelWatermarkByName(watermark.Name))
{
context.SetChannelWatermarkId(channelWatermark.Id);
context.SetChannelWatermarkId(wm.Id);
}
}
else
{
context.ClearChannelWatermarkId();
if (!string.IsNullOrWhiteSpace(watermark.Name))
{
foreach (var wm in await GetChannelWatermarkByName(watermark.Name))
{
context.RemoveChannelWatermarkId(wm.Id);
}
}
else
{
context.ClearChannelWatermarkIds();
}
}
return true;
}
private async Task<Option<ChannelWatermark>> GetChannelWatermarkByName(string name)
{
if (_watermarkCache.TryGetValue(name, out var cachedWatermark))
{
foreach (ChannelWatermark channelWatermark in cachedWatermark)
{
return channelWatermark;
}
}
else
{
Option<ChannelWatermark> maybeWatermark = await channelRepository.GetWatermarkByName(name);
_watermarkCache.Add(name, maybeWatermark);
foreach (ChannelWatermark channelWatermark in maybeWatermark)
{
return channelWatermark;
}
}
return Option<ChannelWatermark>.None;
}
}

35
ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutContext.cs

@ -14,10 +14,10 @@ public class YamlPlayoutContext(Playout playout, YamlPlayoutDefinition definitio @@ -14,10 +14,10 @@ public class YamlPlayoutContext(Playout playout, YamlPlayoutDefinition definitio
private readonly System.Collections.Generic.HashSet<int> _visitedInstructions = [];
private readonly Stack<FillerKind> _fillerKind = new();
private readonly System.Collections.Generic.HashSet<int> _channelWatermarkIds = [];
private int _guideGroup = guideGroup;
private bool _guideGroupLocked;
private int _instructionIndex;
private Option<int> _channelWatermarkId;
private Option<string> _preRollSequence;
private Option<string> _postRollSequence;
private Option<MidRollSequence> _midRollSequence;
@ -84,15 +84,20 @@ public class YamlPlayoutContext(Playout playout, YamlPlayoutDefinition definitio @@ -84,15 +84,20 @@ public class YamlPlayoutContext(Playout playout, YamlPlayoutDefinition definitio
public void SetChannelWatermarkId(int id)
{
_channelWatermarkId = id;
_channelWatermarkIds.Add(id);
}
public void ClearChannelWatermarkId()
public void RemoveChannelWatermarkId(int id)
{
_channelWatermarkId = Option<int>.None;
_channelWatermarkIds.Remove(id);
}
public Option<int> GetChannelWatermarkId() => _channelWatermarkId;
public void ClearChannelWatermarkIds()
{
_channelWatermarkIds.Clear();
}
public List<int> GetChannelWatermarkIds() => _channelWatermarkIds.ToList();
public void SetPreRollSequence(string sequence)
{
@ -142,19 +147,19 @@ public class YamlPlayoutContext(Playout playout, YamlPlayoutDefinition definitio @@ -142,19 +147,19 @@ public class YamlPlayoutContext(Playout playout, YamlPlayoutDefinition definitio
public string Serialize()
{
int? channelWatermarkId = null;
foreach (int id in _channelWatermarkId)
{
channelWatermarkId = id;
}
string preRollSequence = null;
foreach (string sequence in _preRollSequence)
{
preRollSequence = sequence;
}
var state = new State(_instructionIndex, _guideGroup, _guideGroupLocked, channelWatermarkId, preRollSequence);
var state = new State(
_instructionIndex,
_guideGroup,
_guideGroupLocked,
_channelWatermarkIds.ToList(),
preRollSequence);
return JsonConvert.SerializeObject(state, Formatting.None, JsonSettings);
}
@ -184,9 +189,9 @@ public class YamlPlayoutContext(Playout playout, YamlPlayoutDefinition definitio @@ -184,9 +189,9 @@ public class YamlPlayoutContext(Playout playout, YamlPlayoutDefinition definitio
_guideGroupLocked = guideGroupLocked;
}
foreach (int channelWatermarkId in Optional(state.ChannelWatermarkId))
foreach (int channelWatermarkId in state.ChannelWatermarkIds)
{
_channelWatermarkId = channelWatermarkId;
_channelWatermarkIds.Add(channelWatermarkId);
}
foreach (string preRollSequence in Optional(state.PreRollSequence))
@ -199,7 +204,7 @@ public class YamlPlayoutContext(Playout playout, YamlPlayoutDefinition definitio @@ -199,7 +204,7 @@ public class YamlPlayoutContext(Playout playout, YamlPlayoutDefinition definitio
int? InstructionIndex,
int? GuideGroup,
bool? GuideGroupLocked,
int? ChannelWatermarkId,
List<int> ChannelWatermarkIds,
string PreRollSequence);
public record MidRollSequence(string Sequence, string Expression);

Loading…
Cancel
Save