Browse Source

add shuffle sequence instruction (#1827)

pull/1829/head
Jason Dove 12 months ago committed by GitHub
parent
commit
ec99d5976d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 51
      ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutShuffleSequenceHandler.cs
  2. 3
      ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutInstruction.cs
  3. 9
      ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutShuffleSequenceInstruction.cs
  4. 7
      ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutBuilder.cs

51
ErsatzTV.Core/Scheduling/YamlScheduling/Handlers/YamlPlayoutShuffleSequenceHandler.cs

@ -0,0 +1,51 @@ @@ -0,0 +1,51 @@
using ErsatzTV.Core.Scheduling.YamlScheduling.Models;
using Microsoft.Extensions.Logging;
namespace ErsatzTV.Core.Scheduling.YamlScheduling.Handlers;
public class YamlPlayoutShuffleSequenceHandler : IYamlPlayoutHandler
{
public bool Reset => false;
public Task<bool> Handle(
YamlPlayoutContext context,
YamlPlayoutInstruction instruction,
ILogger<YamlPlayoutBuilder> logger,
CancellationToken cancellationToken)
{
if (instruction is not YamlPlayoutShuffleSequenceInstruction shuffleSequenceInstruction)
{
return Task.FromResult(false);
}
if (string.IsNullOrWhiteSpace(shuffleSequenceInstruction.ShuffleSequence))
{
logger.LogWarning("Sequence key is required to shuffle sequence");
return Task.FromResult(false);
}
string sequenceKey = shuffleSequenceInstruction.ShuffleSequence;
var groupedSequenceItems = context.Definition.Playout
.Where(i => i.SequenceKey == sequenceKey)
.GroupBy(i => i.SequenceGuid)
.ToList();
foreach (IGrouping<Guid, YamlPlayoutInstruction> grouping in groupedSequenceItems)
{
// shuffle, avoiding starting with the tail of the last shuffle
YamlPlayoutInstruction tail = grouping.Last();
var shuffledGroup = grouping.OrderBy(_ => Guid.NewGuid()).ToList();
while (shuffledGroup.Count > 1 && shuffledGroup.Head() == tail)
{
shuffledGroup = grouping.OrderBy(_ => Guid.NewGuid()).ToList();
}
int firstIndex = context.Definition.Playout.FindIndex(i => i.SequenceGuid == grouping.Key);
context.Definition.Playout.RemoveRange(firstIndex, shuffledGroup.Count);
context.Definition.Playout.InsertRange(firstIndex, shuffledGroup);
}
return Task.FromResult(true);
}
}

3
ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutInstruction.cs

@ -13,4 +13,7 @@ public class YamlPlayoutInstruction @@ -13,4 +13,7 @@ public class YamlPlayoutInstruction
[YamlIgnore]
public string SequenceKey { get; set; }
[YamlIgnore]
public Guid SequenceGuid { get; set; }
}

9
ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutShuffleSequenceInstruction.cs

@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
using YamlDotNet.Serialization;
namespace ErsatzTV.Core.Scheduling.YamlScheduling.Models;
public class YamlPlayoutShuffleSequenceInstruction : YamlPlayoutInstruction
{
[YamlMember(Alias = "shuffle_sequence", ApplyNamingConventions = false)]
public string ShuffleSequence { get; set; }
}

7
ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutBuilder.cs

@ -131,11 +131,14 @@ public class YamlPlayoutBuilder( @@ -131,11 +131,14 @@ public class YamlPlayoutBuilder(
.Map(s => s.Items)
.Flatten();
var sequenceGuid = Guid.NewGuid();
// insert all instructions from the sequence
foreach (YamlPlayoutInstruction i in sequenceInstructions)
{
// maybe used for shuffling later?
// used for shuffling
i.SequenceKey = sequenceInstruction.Sequence;
i.SequenceGuid = sequenceGuid;
context.Definition.Playout.Add(i);
}
@ -162,6 +165,7 @@ public class YamlPlayoutBuilder( @@ -162,6 +165,7 @@ public class YamlPlayoutBuilder(
YamlPlayoutRepeatInstruction => new YamlPlayoutRepeatHandler(),
YamlPlayoutWaitUntilInstruction => new YamlPlayoutWaitUntilHandler(),
YamlPlayoutNewEpgGroupInstruction => new YamlPlayoutNewEpgGroupHandler(),
YamlPlayoutShuffleSequenceInstruction => new YamlPlayoutShuffleSequenceHandler(),
YamlPlayoutSkipItemsInstruction => new YamlPlayoutSkipItemsHandler(),
// content handlers
@ -207,6 +211,7 @@ public class YamlPlayoutBuilder( @@ -207,6 +211,7 @@ public class YamlPlayoutBuilder(
{ "pad_to_next", typeof(YamlPlayoutPadToNextInstruction) },
{ "repeat", typeof(YamlPlayoutRepeatInstruction) },
{ "sequence", typeof(YamlPlayoutSequenceInstruction) },
{ "shuffle_sequence", typeof(YamlPlayoutShuffleSequenceInstruction) },
{ "skip_items", typeof(YamlPlayoutSkipItemsInstruction) },
{ "wait_until", typeof(YamlPlayoutWaitUntilInstruction) }
};

Loading…
Cancel
Save