Add Configure on FFMpegArgumentProcessor to fuently configure ffoptions per run.

This commit is contained in:
BobSilent 2021-11-02 10:40:05 +01:00
parent e052688209
commit 965e756dc4
2 changed files with 42 additions and 12 deletions

View file

@ -14,6 +14,7 @@ namespace FFMpegCore
public class FFMpegArgumentProcessor public class FFMpegArgumentProcessor
{ {
private static readonly Regex ProgressRegex = new Regex(@"time=(\d\d:\d\d:\d\d.\d\d?)", RegexOptions.Compiled); private static readonly Regex ProgressRegex = new Regex(@"time=(\d\d:\d\d:\d\d.\d\d?)", RegexOptions.Compiled);
private readonly List<Action<FFOptions>> _configurations;
private readonly FFMpegArguments _ffMpegArguments; private readonly FFMpegArguments _ffMpegArguments;
private Action<double>? _onPercentageProgress; private Action<double>? _onPercentageProgress;
private Action<TimeSpan>? _onTimeProgress; private Action<TimeSpan>? _onTimeProgress;
@ -22,6 +23,7 @@ public class FFMpegArgumentProcessor
internal FFMpegArgumentProcessor(FFMpegArguments ffMpegArguments) internal FFMpegArgumentProcessor(FFMpegArguments ffMpegArguments)
{ {
_configurations = new List<Action<FFOptions>>();
_ffMpegArguments = ffMpegArguments; _ffMpegArguments = ffMpegArguments;
} }
@ -70,10 +72,15 @@ public FFMpegArgumentProcessor CancellableThrough(CancellationToken token, int t
token.Register(() => CancelEvent?.Invoke(this, timeout)); token.Register(() => CancelEvent?.Invoke(this, timeout));
return this; return this;
} }
public FFMpegArgumentProcessor Configure(Action<FFOptions> configureOptions)
{
_configurations.Add(configureOptions);
return this;
}
public bool ProcessSynchronously(bool throwOnError = true, FFOptions? ffMpegOptions = null) public bool ProcessSynchronously(bool throwOnError = true, FFOptions? ffMpegOptions = null)
{ {
using var instance = PrepareInstance(ffMpegOptions ?? GlobalFFOptions.Current, out var cancellationTokenSource); var options = GetConfiguredOptions(ffMpegOptions);
var errorCode = -1; using var instance = PrepareInstance(options, out var cancellationTokenSource);
void OnCancelEvent(object sender, int timeout) void OnCancelEvent(object sender, int timeout)
{ {
@ -88,6 +95,7 @@ void OnCancelEvent(object sender, int timeout)
CancelEvent += OnCancelEvent; CancelEvent += OnCancelEvent;
instance.Exited += delegate { cancellationTokenSource.Cancel(); }; instance.Exited += delegate { cancellationTokenSource.Cancel(); };
var errorCode = -1;
try try
{ {
errorCode = Process(instance, cancellationTokenSource).ConfigureAwait(false).GetAwaiter().GetResult(); errorCode = Process(instance, cancellationTokenSource).ConfigureAwait(false).GetAwaiter().GetResult();
@ -106,8 +114,8 @@ void OnCancelEvent(object sender, int timeout)
public async Task<bool> ProcessAsynchronously(bool throwOnError = true, FFOptions? ffMpegOptions = null) public async Task<bool> ProcessAsynchronously(bool throwOnError = true, FFOptions? ffMpegOptions = null)
{ {
using var instance = PrepareInstance(ffMpegOptions ?? GlobalFFOptions.Current, out var cancellationTokenSource); var options = GetConfiguredOptions(ffMpegOptions);
var errorCode = -1; using var instance = PrepareInstance(options, out var cancellationTokenSource);
void OnCancelEvent(object sender, int timeout) void OnCancelEvent(object sender, int timeout)
{ {
@ -121,6 +129,7 @@ void OnCancelEvent(object sender, int timeout)
} }
CancelEvent += OnCancelEvent; CancelEvent += OnCancelEvent;
var errorCode = -1;
try try
{ {
errorCode = await Process(instance, cancellationTokenSource).ConfigureAwait(false); errorCode = await Process(instance, cancellationTokenSource).ConfigureAwait(false);
@ -163,6 +172,18 @@ private bool HandleCompletion(bool throwOnError, int exitCode, IReadOnlyList<str
return exitCode == 0; return exitCode == 0;
} }
private FFOptions GetConfiguredOptions(FFOptions? ffOptions)
{
var options = ffOptions ?? GlobalFFOptions.Current.Clone();
foreach (var configureOptions in _configurations)
{
configureOptions(options);
}
return options;
}
private Instance PrepareInstance(FFOptions ffOptions, private Instance PrepareInstance(FFOptions ffOptions,
out CancellationTokenSource cancellationTokenSource) out CancellationTokenSource cancellationTokenSource)
{ {

View file

@ -1,10 +1,11 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Text; using System.Text;
namespace FFMpegCore namespace FFMpegCore
{ {
public class FFOptions public class FFOptions : ICloneable
{ {
/// <summary> /// <summary>
/// Working directory for the ffmpeg/ffprobe instance /// Working directory for the ffmpeg/ffprobe instance
@ -38,5 +39,13 @@ public class FFOptions
/// Whether to cache calls to get ffmpeg codec, pixel- and container-formats /// Whether to cache calls to get ffmpeg codec, pixel- and container-formats
/// </summary> /// </summary>
public bool UseCache { get; set; } = true; public bool UseCache { get; set; } = true;
/// <inheritdoc/>
object ICloneable.Clone() => Clone();
/// <summary>
/// Creates a new object that is a copy of the current instance.
/// </summary>
public FFOptions Clone() => (FFOptions)MemberwiseClone();
} }
} }