Refactor GridScheduleGenerator and related components to improve cursor management and group handling
Updated the GridScheduleGenerator to reset cursors for slots with no aired positions, ensuring proper state management during rebuilds. Introduced a new method, ResetUnairedCursorsAsync, to handle cursor resets effectively. Enhanced the handling of interstitial groups in the scheduling process, preventing them from being included in slots or fallback groups. Updated related tests to verify the correct behavior of these changes, ensuring robust scheduling logic and accurate group categorization.
This commit is contained in:
@@ -365,7 +365,15 @@ Slot
|
||||
|
||||
На самом краю остаётся `ScheduleTemplate.fallbackGroupId` и зацикленный аварийный ассет канала — на
|
||||
случай, когда пуст и фон. Только это и считается пост-проверкой «доля фона»: зацикленный филлер
|
||||
в эфире выглядит поломкой, а фоновый слот — ночным блоком.
|
||||
в эфире выглядит поломкой, а фоновый слот — ночным блоком. В расписании админки аварийный запас
|
||||
подписан меткой: у его записей есть и шоу, и номер серии, и без метки залитая им дыра читается как
|
||||
задуманная сетка.
|
||||
|
||||
**Рекламный шов ограничен целиком, а не по частям.** Добор до круглой отметки и остаток, куда
|
||||
программа уже не влезла, — это два конца одного шва, и потолок (`maxPadDuration`, по умолчанию
|
||||
10 минут) считается на них общий. Когда фону нечего играть, они сходятся встык, и раздельный
|
||||
потолок давал бы вдвое больше рекламы подряд, чем настроено. Поставил фон программу — шов после неё
|
||||
начинается заново.
|
||||
|
||||
Аварийная группа выбирается в карточке правил канала и снимается там же. Настройка обязана быть
|
||||
видимой: её проставляет ещё и автосборка сетки (если своя не выбрана), а сетка без слотов отдаёт
|
||||
@@ -437,6 +445,14 @@ SlotState
|
||||
элемент — из её трейса, позиция — поиском единицы в развёрнутом элементе (у коллекции серии
|
||||
нумеруются внутри каждой части, и `episodeIndex` как индекс в общей последовательности не годится).
|
||||
|
||||
Слот, за которым **не осталось ни одного отыгранного выхода**, начинает с начала, а сохранённое
|
||||
состояние забывается (`SlotState.Reset`): оно целиком набрано из только что снесённого хвоста.
|
||||
Случай не краевой, а обычный — так выглядит любой новый канал и любой добавленный слот, и без
|
||||
сброса второе «Применить» до первого эфира начинало бы сериал с середины, а франшизу — с третьей
|
||||
части. Отмотка не удалась иначе (единицы больше нет в элементе — серию удалили, ассет перестал быть
|
||||
готовым) — остаётся сохранённое состояние: слот в эфире уже был, и откат в начало группы виден
|
||||
зрителю.
|
||||
|
||||
Из этого следует: `SchedulerOptions.RetentionHours` (сейчас 24 часа) заменяется на `RetentionDays`,
|
||||
дефолт 90. Значение обязано покрывать максимальный `cooldownDays` среди правил канала и максимальный
|
||||
`daysAgo` среди слотов повтора — иначе остывание начнёт врать, а повторы находить нечего. Валидация
|
||||
@@ -1117,6 +1133,14 @@ seed = hash(channelId, date, slotId, occurrenceInDay)
|
||||
сутках. Не нашлось кандидата — полоса остаётся незакрытой, и это написано в предпросмотре, а не
|
||||
обнаруживается потом списком ошибок.
|
||||
|
||||
**Группы роликов в сетку не идут.** Отсев такой же жёсткий, как по рейтингу, и по той же причине:
|
||||
ролики — материал для стыков (6.7), а не для эфира, и слот по такой группе выдаёт полосу рекламы,
|
||||
подписанную в программе как обычная передача. Отсев обязателен, а не желателен: в группе роликов
|
||||
сотни коротких единиц, то есть самый большой запас на канале, — по баллам она выигрывала бы любую
|
||||
полосу без предпочтения по типу и становилась бы аварийной группой. Тип группы считает
|
||||
`GroupCatalog` (`DominantKind = Interstitial`, когда роликов половина единиц и больше), поэтому его
|
||||
же видит запрос к ИИ — там про это сказано отдельной строкой правил.
|
||||
|
||||
**Два режима.** «Заполнить дыры» застраивает только непокрытое время (дыры считаются тем же
|
||||
`GridCoverage`, что и в 5.1) и не трогает ручные слоты; интервалы, свободные во все семь дней,
|
||||
схлопываются в один слот «каждый день». «Собрать неделю с нуля» сносит все слоты шаблона и строит
|
||||
|
||||
Reference in New Issue
Block a user