using System.Threading.Tasks; using ErsatzTV.Application.Streaming.Queries; using ErsatzTV.Extensions; using LanguageExt; using MediatR; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; namespace ErsatzTV.Controllers { [ApiController] [ApiExplorerSettings(IgnoreApi = true)] public class InternalController : ControllerBase { private readonly ILogger _logger; private readonly IMediator _mediator; public InternalController(IMediator mediator, ILogger logger) { _mediator = mediator; _logger = logger; } [HttpGet("ffmpeg/concat/{channelNumber}")] public Task GetConcatPlaylist(string channelNumber) => _mediator.Send(new GetConcatPlaylistByChannelNumber(Request.Scheme, Request.Host.ToString(), channelNumber)) .ToActionResult(); [HttpGet("ffmpeg/stream/{channelNumber}")] public Task GetStream( string channelNumber, [FromQuery] string mode = "mixed") => _mediator.Send(new GetPlayoutItemProcessByChannelNumber(channelNumber, mode)).Map( result => result.Match( process => { _logger.LogDebug( "ffmpeg arguments {FFmpegArguments}", string.Join(" ", process.StartInfo.ArgumentList)); process.Start(); return new FileStreamResult(process.StandardOutput.BaseStream, "video/mp2t"); }, error => { _logger.LogError( "Failed to create stream for channel {ChannelNumber}: {Error}", channelNumber, error.Value); return BadRequest(error.Value); } )); } }