using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.FFmpeg; using ErsatzTV.Core.Interfaces.Streaming; using ErsatzTV.Infrastructure.Data; using Microsoft.EntityFrameworkCore; namespace ErsatzTV.Application.Streaming; public class GetSlugProcessByChannelNumberHandler( IDbContextFactory dbContextFactory, IFFmpegProcessService ffmpegProcessService) : FFmpegProcessHandler(dbContextFactory) { protected override async Task> GetProcess( TvContext dbContext, GetSlugProcessByChannelNumber request, Channel channel, string ffmpegPath, string ffprobePath, CancellationToken cancellationToken) { var duration = TimeSpan.FromSeconds(await request.SlugSeconds.IfNoneAsync(0)); if (duration <= TimeSpan.Zero) { return BaseError.New("Slug seconds must be non-zero"); } DateTimeOffset finish = request.Now.Add(duration); var playoutItemResult = await ffmpegProcessService.Slug( ffmpegPath, channel, request.Now, duration, request.HlsRealtime, request.PtsOffset, cancellationToken); var result = new PlayoutItemProcessModel( playoutItemResult, Option.None, duration, finish, isComplete: true, request.Now.ToUnixTimeSeconds(), Option.None, Optional(channel.PlayoutOffset), !request.HlsRealtime); return Right(result); } }