diff --git a/ErsatzTV.Application/ErsatzTV.Application.csproj b/ErsatzTV.Application/ErsatzTV.Application.csproj index 60d0189f6..bc262c31d 100644 --- a/ErsatzTV.Application/ErsatzTV.Application.csproj +++ b/ErsatzTV.Application/ErsatzTV.Application.csproj @@ -8,6 +8,7 @@ + diff --git a/ErsatzTV.Application/Streaming/Queries/GetLastPtsDurationHandler.cs b/ErsatzTV.Application/Streaming/Queries/GetLastPtsDurationHandler.cs index a80fc8060..59ac9e934 100644 --- a/ErsatzTV.Application/Streaming/Queries/GetLastPtsDurationHandler.cs +++ b/ErsatzTV.Application/Streaming/Queries/GetLastPtsDurationHandler.cs @@ -1,6 +1,7 @@ -using System.Diagnostics; -using System.Text; +using System.Text; using Bugsnag; +using CliWrap; +using CliWrap.Buffered; using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Core.FFmpeg; @@ -54,38 +55,34 @@ public class GetLastPtsDurationHandler : IRequestHandler maybeLastSegment = GetLastSegment(parameters.ChannelNumber); foreach (FileInfo segment in maybeLastSegment) { - var startInfo = new ProcessStartInfo + string[] argumentList = { - FileName = parameters.FFprobePath, - RedirectStandardOutput = true, - RedirectStandardError = true, - UseShellExecute = false, - StandardOutputEncoding = Encoding.UTF8, - StandardErrorEncoding = Encoding.UTF8 + // `-v 0` seems to prevent ffprobe from outputting anything on windows + "-show_entries", + "packet=pts,duration", + "-of", + "compact=p=0:nk=1", + "-read_intervals", + "-999999", + segment.FullName }; - // `-v 0` seems to prevent ffprobe from outputting anything on windows - startInfo.ArgumentList.Add("-show_entries"); - startInfo.ArgumentList.Add("packet=pts,duration"); - startInfo.ArgumentList.Add("-of"); - startInfo.ArgumentList.Add("compact=p=0:nk=1"); - startInfo.ArgumentList.Add("-read_intervals"); - startInfo.ArgumentList.Add("-999999"); - startInfo.ArgumentList.Add(segment.FullName); + BufferedCommandResult probe = await Cli.Wrap(parameters.FFprobePath) + .WithArguments(argumentList) + .WithValidation(CommandResultValidation.None) + .ExecuteBufferedAsync(cancellationToken); - var probe = new Process - { - StartInfo = startInfo - }; - - probe.Start(); - string output = await probe.StandardOutput.ReadToEndAsync(); - await probe.WaitForExitAsync(cancellationToken); if (probe.ExitCode != 0) { return BaseError.New($"FFprobe at {parameters.FFprobePath} exited with code {probe.ExitCode}"); } + string output = probe.StandardOutput; + if (string.IsNullOrWhiteSpace(probe.StandardOutput)) + { + output = probe.StandardError; + } + try { string[] lines = output.Split("\n");