Refactor RenderBumperPreviewCommandHandler to streamline background path resolution and rendering specification. Introduce helper methods for improved readability and maintainability. Update FindMissingEpisodesQueryHandler and RefreshShowEpisodesMetadataCommandHandler to encapsulate episode number resolution logic. Enhance CopyTemplateCommandHandler by modularizing junction copying and slot handling for better clarity. Improve FfmpegMediaProcessor by separating duration and stream parsing into dedicated methods. Refactor MediaClaimingBackgroundService to simplify idle waiting logic. Update GenreSeeder to modularize alias addition logic, enhancing code organization.
ci / build-backend (push) Successful in 1m29s
ci / build-frontend (push) Successful in 1m4s
ci / tests (push) Successful in 1m58s
ci / sonar (push) Successful in 3m34s

This commit is contained in:
Leonid Pershin
2026-07-26 23:31:56 +03:00
parent 69d1319564
commit 59cc453026
11 changed files with 544 additions and 362 deletions
@@ -244,27 +244,7 @@ public static class SchedulePlanner
var pick = ElementSelector.Select(slot, cursor, random);
if (pick is null)
{
// Пустая группа и отсечённая фильтром — разные беды: во втором случае контент есть,
// но не подходит по правилам, и админу надо чинить правило, а не состав группы.
var filteredOut =
slot.Elements.Any(e => e.Units.Count > 0)
&& !slot.Elements.Any(e =>
e.Units.Count > 0 && ElementSelector.IsAllowedByAudience(slot, e)
);
warnings.Add(
filteredOut
? new PlanningWarning(
PlanningWarningKind.CandidatesFiltered,
slot.SlotId,
"Возрастной потолок отсёк всех кандидатов — место закрыл фон."
)
: new PlanningWarning(
PlanningWarningKind.SlotEmpty,
slot.SlotId,
"Слот не дал контента — место закрыл фон."
)
);
warnings.Add(NoCandidatesWarning(slot));
return FillWithFallback(
cursor,
Min(slot.TargetEndUtc, limit),
@@ -365,6 +345,31 @@ public static class SchedulePlanner
return cursor;
}
/// <summary>
/// Почему слот остался без контента. Пустая группа и отсечённая фильтром — разные беды: во втором
/// случае контент есть, но не подходит по правилам, и админу надо чинить правило, а не состав
/// группы.
/// </summary>
private static PlanningWarning NoCandidatesWarning(PlanningSlot slot)
{
var hasPlayable = slot.Elements.Any(e => e.Units.Count > 0);
var hasAllowed = slot.Elements.Any(e =>
e.Units.Count > 0 && ElementSelector.IsAllowedByAudience(slot, e)
);
return hasPlayable && !hasAllowed
? new PlanningWarning(
PlanningWarningKind.CandidatesFiltered,
slot.SlotId,
"Возрастной потолок отсёк всех кандидатов — место закрыл фон."
)
: new PlanningWarning(
PlanningWarningKind.SlotEmpty,
slot.SlotId,
"Слот не дал контента — место закрыл фон."
);
}
/// <summary>
/// Влезает ли ещё одна единица в бюджет слота. <see cref="OverflowPolicy.ExtendSlot"/> бюджет
/// игнорирует: элемент доигрывается целиком, а разбег подберёт ближайший якорь.