Browse Source

add new_epg_group instruction; add filler_kind propery (#1819)

pull/1820/head
Jason Dove 11 months ago committed by GitHub
parent
commit
f06ef5262a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 1
      ErsatzTV.Application/Channels/Commands/RefreshChannelDataHandler.cs
  2. 13
      ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutBuilder.cs
  3. 5
      ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutInstruction.cs
  4. 9
      ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutNewEpgGroupInstruction.cs
  5. 13
      ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutScheduler.cs
  6. 6
      ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutSchedulerCount.cs
  7. 9
      ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutSchedulerDuration.cs
  8. 3
      ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutSchedulerPadToNext.cs

1
ErsatzTV.Application/Channels/Commands/RefreshChannelDataHandler.cs

@ -182,6 +182,7 @@ public class RefreshChannelDataHandler : IRequestHandler<RefreshChannelData>
switch (playout.ProgramSchedulePlayoutType) switch (playout.ProgramSchedulePlayoutType)
{ {
case ProgramSchedulePlayoutType.Flood: case ProgramSchedulePlayoutType.Flood:
case ProgramSchedulePlayoutType.Yaml:
var floodSorted = playouts var floodSorted = playouts
.Collect(p => p.Items) .Collect(p => p.Items)
.OrderBy(pi => pi.Start) .OrderBy(pi => pi.Start)

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

@ -44,6 +44,7 @@ public class YamlPlayoutBuilder(
System.Collections.Generic.HashSet<string> missingContentKeys = []; System.Collections.Generic.HashSet<string> missingContentKeys = [];
int itemsAfterRepeat = playout.Items.Count; int itemsAfterRepeat = playout.Items.Count;
int guideGroup = 1;
var index = 0; var index = 0;
while (currentTime < finish) while (currentTime < finish)
{ {
@ -60,7 +61,8 @@ public class YamlPlayoutBuilder(
{ {
case YamlPlayoutWaitUntilInstruction waitUntil: case YamlPlayoutWaitUntilInstruction waitUntil:
currentTime = HandleWaitUntil(currentTime, waitUntil); currentTime = HandleWaitUntil(currentTime, waitUntil);
break; index++;
continue;
case YamlPlayoutRepeatInstruction: case YamlPlayoutRepeatInstruction:
// repeat resets index into YAML playout // repeat resets index into YAML playout
index = 0; index = 0;
@ -72,6 +74,10 @@ public class YamlPlayoutBuilder(
itemsAfterRepeat = playout.Items.Count; itemsAfterRepeat = playout.Items.Count;
continue; continue;
case YamlPlayoutNewEpgGroupInstruction:
guideGroup *= -1;
index++;
continue;
} }
Option<IMediaCollectionEnumerator> maybeEnumerator = await GetCachedEnumeratorForContent( Option<IMediaCollectionEnumerator> maybeEnumerator = await GetCachedEnumeratorForContent(
@ -96,7 +102,7 @@ public class YamlPlayoutBuilder(
switch (playoutItem) switch (playoutItem)
{ {
case YamlPlayoutCountInstruction count: case YamlPlayoutCountInstruction count:
currentTime = YamlPlayoutSchedulerCount.Schedule(playout, currentTime, count, enumerator); currentTime = YamlPlayoutSchedulerCount.Schedule(playout, currentTime, guideGroup, count, enumerator);
break; break;
case YamlPlayoutDurationInstruction duration: case YamlPlayoutDurationInstruction duration:
Option<IMediaCollectionEnumerator> durationFallbackEnumerator = await GetCachedEnumeratorForContent( Option<IMediaCollectionEnumerator> durationFallbackEnumerator = await GetCachedEnumeratorForContent(
@ -109,6 +115,7 @@ public class YamlPlayoutBuilder(
currentTime = YamlPlayoutSchedulerDuration.Schedule( currentTime = YamlPlayoutSchedulerDuration.Schedule(
playout, playout,
currentTime, currentTime,
guideGroup,
duration, duration,
enumerator, enumerator,
durationFallbackEnumerator); durationFallbackEnumerator);
@ -124,6 +131,7 @@ public class YamlPlayoutBuilder(
currentTime = YamlPlayoutSchedulerPadToNext.Schedule( currentTime = YamlPlayoutSchedulerPadToNext.Schedule(
playout, playout,
currentTime, currentTime,
guideGroup,
padToNext, padToNext,
enumerator, enumerator,
fallbackEnumerator); fallbackEnumerator);
@ -307,6 +315,7 @@ public class YamlPlayoutBuilder(
{ {
{ "count", typeof(YamlPlayoutCountInstruction) }, { "count", typeof(YamlPlayoutCountInstruction) },
{ "duration", typeof(YamlPlayoutDurationInstruction) }, { "duration", typeof(YamlPlayoutDurationInstruction) },
{ "new_epg_group", typeof(YamlPlayoutNewEpgGroupInstruction) },
{ "pad_to_next", typeof(YamlPlayoutPadToNextInstruction) }, { "pad_to_next", typeof(YamlPlayoutPadToNextInstruction) },
{ "repeat", typeof(YamlPlayoutRepeatInstruction) }, { "repeat", typeof(YamlPlayoutRepeatInstruction) },
{ "skip_items", typeof(YamlPlayoutSkipItemsInstruction) }, { "skip_items", typeof(YamlPlayoutSkipItemsInstruction) },

5
ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutInstruction.cs

@ -1,6 +1,11 @@
using YamlDotNet.Serialization;
namespace ErsatzTV.Core.Scheduling.YamlScheduling; namespace ErsatzTV.Core.Scheduling.YamlScheduling;
public class YamlPlayoutInstruction public class YamlPlayoutInstruction
{ {
public string Content { get; set; } public string Content { get; set; }
[YamlMember(Alias = "filler_kind", ApplyNamingConventions = false)]
public string FillerKind { get; set; }
} }

9
ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutNewEpgGroupInstruction.cs

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

13
ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutScheduler.cs

@ -1,4 +1,5 @@
using ErsatzTV.Core.Domain; using ErsatzTV.Core.Domain;
using ErsatzTV.Core.Domain.Filler;
using ErsatzTV.Core.Extensions; using ErsatzTV.Core.Extensions;
namespace ErsatzTV.Core.Scheduling.YamlScheduling; namespace ErsatzTV.Core.Scheduling.YamlScheduling;
@ -15,4 +16,16 @@ public abstract class YamlPlayoutScheduler
MediaVersion version = mediaItem.GetHeadVersion(); MediaVersion version = mediaItem.GetHeadVersion();
return version.Duration; return version.Duration;
} }
protected static FillerKind GetFillerKind(YamlPlayoutInstruction instruction)
{
if (string.IsNullOrWhiteSpace(instruction.FillerKind))
{
return FillerKind.None;
}
return Enum.TryParse(instruction.FillerKind, ignoreCase: true, out FillerKind result)
? result
: FillerKind.None;
}
} }

6
ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutSchedulerCount.cs

@ -1,5 +1,4 @@
using ErsatzTV.Core.Domain; using ErsatzTV.Core.Domain;
using ErsatzTV.Core.Domain.Filler;
using ErsatzTV.Core.Interfaces.Scheduling; using ErsatzTV.Core.Interfaces.Scheduling;
namespace ErsatzTV.Core.Scheduling.YamlScheduling; namespace ErsatzTV.Core.Scheduling.YamlScheduling;
@ -9,6 +8,7 @@ public class YamlPlayoutSchedulerCount : YamlPlayoutScheduler
public static DateTimeOffset Schedule( public static DateTimeOffset Schedule(
Playout playout, Playout playout,
DateTimeOffset currentTime, DateTimeOffset currentTime,
int guideGroup,
YamlPlayoutCountInstruction count, YamlPlayoutCountInstruction count,
IMediaCollectionEnumerator enumerator) IMediaCollectionEnumerator enumerator)
{ {
@ -26,14 +26,14 @@ public class YamlPlayoutSchedulerCount : YamlPlayoutScheduler
Finish = currentTime.UtcDateTime + itemDuration, Finish = currentTime.UtcDateTime + itemDuration,
InPoint = TimeSpan.Zero, InPoint = TimeSpan.Zero,
OutPoint = itemDuration, OutPoint = itemDuration,
FillerKind = FillerKind.None, //blockItem.IncludeInProgramGuide ? FillerKind.None : FillerKind.GuideMode, FillerKind = GetFillerKind(count),
//CustomTitle = scheduleItem.CustomTitle, //CustomTitle = scheduleItem.CustomTitle,
//WatermarkId = scheduleItem.WatermarkId, //WatermarkId = scheduleItem.WatermarkId,
//PreferredAudioLanguageCode = scheduleItem.PreferredAudioLanguageCode, //PreferredAudioLanguageCode = scheduleItem.PreferredAudioLanguageCode,
//PreferredAudioTitle = scheduleItem.PreferredAudioTitle, //PreferredAudioTitle = scheduleItem.PreferredAudioTitle,
//PreferredSubtitleLanguageCode = scheduleItem.PreferredSubtitleLanguageCode, //PreferredSubtitleLanguageCode = scheduleItem.PreferredSubtitleLanguageCode,
//SubtitleMode = scheduleItem.SubtitleMode //SubtitleMode = scheduleItem.SubtitleMode
//GuideGroup = effectiveBlock.TemplateItemId, GuideGroup = guideGroup
//GuideStart = effectiveBlock.Start.UtcDateTime, //GuideStart = effectiveBlock.Start.UtcDateTime,
//GuideFinish = blockFinish.UtcDateTime, //GuideFinish = blockFinish.UtcDateTime,
//BlockKey = JsonConvert.SerializeObject(effectiveBlock.BlockKey), //BlockKey = JsonConvert.SerializeObject(effectiveBlock.BlockKey),

9
ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutSchedulerDuration.cs

@ -10,6 +10,7 @@ public class YamlPlayoutSchedulerDuration : YamlPlayoutScheduler
public static DateTimeOffset Schedule( public static DateTimeOffset Schedule(
Playout playout, Playout playout,
DateTimeOffset currentTime, DateTimeOffset currentTime,
int guideGroup,
YamlPlayoutDurationInstruction duration, YamlPlayoutDurationInstruction duration,
IMediaCollectionEnumerator enumerator, IMediaCollectionEnumerator enumerator,
Option<IMediaCollectionEnumerator> fallbackEnumerator) Option<IMediaCollectionEnumerator> fallbackEnumerator)
@ -28,6 +29,8 @@ public class YamlPlayoutSchedulerDuration : YamlPlayoutScheduler
targetTime, targetTime,
duration.DiscardAttempts, duration.DiscardAttempts,
duration.Trim, duration.Trim,
GetFillerKind(duration),
guideGroup,
enumerator, enumerator,
fallbackEnumerator); fallbackEnumerator);
} }
@ -38,6 +41,8 @@ public class YamlPlayoutSchedulerDuration : YamlPlayoutScheduler
DateTimeOffset targetTime, DateTimeOffset targetTime,
int discardAttempts, int discardAttempts,
bool trim, bool trim,
FillerKind fillerKind,
int guideGroup,
IMediaCollectionEnumerator enumerator, IMediaCollectionEnumerator enumerator,
Option<IMediaCollectionEnumerator> fallbackEnumerator) Option<IMediaCollectionEnumerator> fallbackEnumerator)
{ {
@ -56,8 +61,8 @@ public class YamlPlayoutSchedulerDuration : YamlPlayoutScheduler
Finish = currentTime.UtcDateTime + itemDuration, Finish = currentTime.UtcDateTime + itemDuration,
InPoint = TimeSpan.Zero, InPoint = TimeSpan.Zero,
OutPoint = itemDuration, OutPoint = itemDuration,
//GuideGroup = playoutBuilderState.NextGuideGroup, GuideGroup = guideGroup,
//FillerKind = fillerKind, FillerKind = fillerKind
//DisableWatermarks = !allowWatermarks //DisableWatermarks = !allowWatermarks
}; };

3
ErsatzTV.Core/Scheduling/YamlScheduling/YamlPlayoutSchedulerPadToNext.cs

@ -8,6 +8,7 @@ public class YamlPlayoutSchedulerPadToNext : YamlPlayoutSchedulerDuration
public static DateTimeOffset Schedule( public static DateTimeOffset Schedule(
Playout playout, Playout playout,
DateTimeOffset currentTime, DateTimeOffset currentTime,
int guideGroup,
YamlPlayoutPadToNextInstruction padToNext, YamlPlayoutPadToNextInstruction padToNext,
IMediaCollectionEnumerator enumerator, IMediaCollectionEnumerator enumerator,
Option<IMediaCollectionEnumerator> fallbackEnumerator) Option<IMediaCollectionEnumerator> fallbackEnumerator)
@ -38,6 +39,8 @@ public class YamlPlayoutSchedulerPadToNext : YamlPlayoutSchedulerDuration
targetTime, targetTime,
padToNext.DiscardAttempts, padToNext.DiscardAttempts,
padToNext.Trim, padToNext.Trim,
GetFillerKind(padToNext),
guideGroup,
enumerator, enumerator,
fallbackEnumerator); fallbackEnumerator);
} }

Loading…
Cancel
Save