Add TV bumpers functionality: introduce configuration options for bumpers in .env.example and appsettings.json, enhance ChannelEndpoints to manage jingles and bumper assets, and update Channel and ScheduleEntry models to support bumper logic. Implement validation for bumper settings and integrate bumper handling in scheduling logic.
This commit is contained in:
@@ -13,6 +13,7 @@ public interface IAppDbContext
|
||||
DbSet<Show> Shows { get; }
|
||||
DbSet<Channel> Channels { get; }
|
||||
DbSet<ScheduleEntry> ScheduleEntries { get; }
|
||||
DbSet<BumperAsset> BumperAssets { get; }
|
||||
|
||||
Task<int> SaveChangesAsync(CancellationToken cancellationToken);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
namespace TeleWave.Application.Common.Interfaces;
|
||||
|
||||
/// <summary>
|
||||
/// Полная спецификация одной заставки для рендера: оформление канала + подписи + названия шоу.
|
||||
/// <see cref="DurationSeconds"/> уже выровнена на длину сегмента (готовит оркестратор), а
|
||||
/// <see cref="FontFile"/> — абсолютный путь к TTF внутри контейнера.
|
||||
/// </summary>
|
||||
public sealed record BumperRenderSpec(
|
||||
int DurationSeconds,
|
||||
int Width,
|
||||
int Height,
|
||||
string BackgroundColor,
|
||||
string BackgroundColor2,
|
||||
string AccentColor,
|
||||
string TextColor,
|
||||
string FontFile,
|
||||
string NowLabel,
|
||||
string NowTitle,
|
||||
string NextLabel,
|
||||
string NextTitle,
|
||||
string? BackgroundFile = null,
|
||||
string? MusicFile = null
|
||||
);
|
||||
|
||||
/// <summary>Итог рендера заставки — та же форма метаданных, что у обычного ассета после нарезки.</summary>
|
||||
public sealed record BumperRenderResult(
|
||||
TimeSpan Duration,
|
||||
int SegmentSeconds,
|
||||
int SegmentCount,
|
||||
int Width,
|
||||
int Height,
|
||||
string RelativePath
|
||||
);
|
||||
|
||||
/// <summary>
|
||||
/// Порт рендера ТВ-заставок. Реализация синтезирует короткий клип (анимированный фон + текст
|
||||
/// «Сейчас/Далее» + джингл) по <see cref="BumperRenderSpec"/> и режет его на HLS-сегменты в
|
||||
/// assets/{assetId} — так же, как обычный ассет, чтобы раздача эфира не отличала заставку от программы.
|
||||
/// </summary>
|
||||
public interface IBumperRenderer
|
||||
{
|
||||
Task<BumperRenderResult> RenderAsync(
|
||||
Guid assetId,
|
||||
BumperRenderSpec spec,
|
||||
CancellationToken cancellationToken
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
namespace TeleWave.Application.Common.Interfaces;
|
||||
|
||||
/// <summary>
|
||||
/// Хранилище сырых файлов шаблона заставки канала (фон и музыка) под bumpers/{channelId}. В отличие
|
||||
/// от обычных ассетов эти файлы НЕ режутся на HLS — они подаются как входы в рендер заставки.
|
||||
/// </summary>
|
||||
public interface IBumperTemplateStorage
|
||||
{
|
||||
Task SaveBackgroundAsync(
|
||||
Guid channelId,
|
||||
string extension,
|
||||
Stream content,
|
||||
CancellationToken cancellationToken
|
||||
);
|
||||
|
||||
Task SaveMusicAsync(
|
||||
Guid channelId,
|
||||
string extension,
|
||||
Stream content,
|
||||
CancellationToken cancellationToken
|
||||
);
|
||||
|
||||
void DeleteBackground(Guid channelId);
|
||||
void DeleteMusic(Guid channelId);
|
||||
|
||||
/// <summary>Абсолютный путь к загруженному фону или null (нет расширения / файл отсутствует).</summary>
|
||||
string? BackgroundPath(Guid channelId, string? extension);
|
||||
|
||||
/// <summary>Абсолютный путь к загруженной музыке или null.</summary>
|
||||
string? MusicPath(Guid channelId, string? extension);
|
||||
}
|
||||
Reference in New Issue
Block a user