Add bumper variant management: implement API endpoints for adding, updating, and removing bumper text variants, enhance data models to support variant details, and update scheduling logic to utilize variants. Refactor related components for improved bumper template handling and ensure proper error management for variant operations.
This commit is contained in:
@@ -39,12 +39,11 @@ public static class SchedulePlanner
|
||||
|
||||
var pick = WeightedPick(candidates, random);
|
||||
|
||||
// ТВ-заставка на переходе. Резервируем слот выбранного блока фикс. длины — конкретный
|
||||
// отрендеренный ассет («Сейчас/Далее» стилем блока поверх его звука) подставит оркестратор.
|
||||
// ТВ-заставка на переходе. Из подходящих подблоков (по правилу показа vs контексту)
|
||||
// резервируем слот выбранного блока — ассет подставит оркестратор.
|
||||
if (
|
||||
prevShowId is { } prev
|
||||
&& input.Bumpers is { Enabled: true } bumper
|
||||
&& (!bumper.OnlyBetweenDifferentShows || prev != pick.ShowId)
|
||||
&& (
|
||||
bumper.MinInterval <= TimeSpan.Zero
|
||||
|| lastBumperAt is not { } last
|
||||
@@ -94,9 +93,10 @@ public static class SchedulePlanner
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Ставит на переходе заставку выбранного блока: резервирует слот его длины и оставляет
|
||||
/// плейсхолдер с парой шоу + id блока (ассет отрендерит оркестратор). Выбор блока — по стратегии
|
||||
/// канала (ротация двигает курсор). Возвращает true, если заставка добавлена (курсор сдвинут).
|
||||
/// Ставит на переходе заставку выбранного подблока: из подходящих по правилу показа (контекст —
|
||||
/// сменилось ли шоу) выбирает один по стратегии канала и резервирует слот длины его блока. Оставляет
|
||||
/// плейсхолдер с парой шоу + id блока/варианта (ассет отрендерит оркестратор). Возвращает true, если
|
||||
/// заставка добавлена (курсор сдвинут).
|
||||
/// </summary>
|
||||
private static bool TryPlaceBumper(
|
||||
List<PlannedEntry> entries,
|
||||
@@ -108,30 +108,30 @@ public static class SchedulePlanner
|
||||
ref DateTimeOffset cursor
|
||||
)
|
||||
{
|
||||
var templates = bumper.Templates;
|
||||
if (templates is not { Count: > 0 })
|
||||
var isShowChange = fromShowId != toShowId;
|
||||
var eligible = bumper.Variants
|
||||
.Where(v => v.Duration > TimeSpan.Zero && MatchesTrigger(v.Trigger, isShowChange))
|
||||
.ToList();
|
||||
if (eligible.Count == 0)
|
||||
return false;
|
||||
|
||||
PlannerBumperTemplate template;
|
||||
PlannerBumperVariant variant;
|
||||
switch (bumper.Selection)
|
||||
{
|
||||
case BumperSelection.Random:
|
||||
template = templates[random.Next(templates.Count)];
|
||||
variant = eligible[random.Next(eligible.Count)];
|
||||
break;
|
||||
case BumperSelection.AlwaysFirst:
|
||||
template = templates[0];
|
||||
variant = eligible[0];
|
||||
break;
|
||||
default: // Rotation
|
||||
var idx = ((nextBumper % templates.Count) + templates.Count) % templates.Count;
|
||||
template = templates[idx];
|
||||
var idx = ((nextBumper % eligible.Count) + eligible.Count) % eligible.Count;
|
||||
variant = eligible[idx];
|
||||
nextBumper++;
|
||||
break;
|
||||
}
|
||||
|
||||
if (template.Duration <= TimeSpan.Zero)
|
||||
return false;
|
||||
|
||||
var end = cursor + template.Duration;
|
||||
var end = cursor + variant.Duration;
|
||||
entries.Add(
|
||||
new PlannedEntry(
|
||||
Guid.Empty,
|
||||
@@ -142,13 +142,22 @@ public static class SchedulePlanner
|
||||
null,
|
||||
fromShowId,
|
||||
toShowId,
|
||||
template.TemplateId
|
||||
variant.TemplateId,
|
||||
variant.VariantId
|
||||
)
|
||||
);
|
||||
cursor = end;
|
||||
return true;
|
||||
}
|
||||
|
||||
private static bool MatchesTrigger(BumperTrigger trigger, bool isShowChange) =>
|
||||
trigger switch
|
||||
{
|
||||
BumperTrigger.OnShowChange => isShowChange,
|
||||
BumperTrigger.BetweenEpisodes => !isShowChange,
|
||||
_ => true,
|
||||
};
|
||||
|
||||
private static List<(PlannerShow Show, int Weight)> ResolvePolicy(
|
||||
DateTimeOffset moment,
|
||||
PlannerInput input,
|
||||
|
||||
Reference in New Issue
Block a user