aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs')
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs104
1 files changed, 40 insertions, 64 deletions
diff --git a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs
index fb131f304..b68961889 100644
--- a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs
@@ -1,7 +1,8 @@
using System;
using System.Collections.Generic;
-using System.Diagnostics;
using System.Globalization;
+using System.Linq;
+using System.Text.RegularExpressions;
using MediaBrowser.Model.Diagnostics;
using Microsoft.Extensions.Logging;
@@ -18,21 +19,21 @@ namespace MediaBrowser.MediaEncoding.Encoder
_processFactory = processFactory;
}
- public Tuple<List<string>, List<string>> Validate(string encoderPath)
+ public (IEnumerable<string> decoders, IEnumerable<string> encoders) Validate(string encoderPath)
{
- _logger.LogInformation("Validating media encoder at {0}", encoderPath);
+ _logger.LogInformation("Validating media encoder at {EncoderPath}", encoderPath);
- var decoders = GetDecoders(encoderPath);
- var encoders = GetEncoders(encoderPath);
+ var decoders = GetCodecs(encoderPath, Codec.Decoder);
+ var encoders = GetCodecs(encoderPath, Codec.Encoder);
_logger.LogInformation("Encoder validation complete");
- return new Tuple<List<string>, List<string>>(decoders, encoders);
+ return (decoders, encoders);
}
public bool ValidateVersion(string encoderAppPath, bool logOutput)
{
- string output = string.Empty;
+ string output = null;
try
{
output = GetProcessOutput(encoderAppPath, "-version");
@@ -71,20 +72,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
return true;
}
- private List<string> GetDecoders(string encoderAppPath)
- {
- string output = string.Empty;
- try
- {
- output = GetProcessOutput(encoderAppPath, "-decoders");
- }
- catch (Exception ex)
- {
- _logger.LogError(ex, "Error detecting available decoders");
- }
-
- var found = new List<string>();
- var required = new[]
+ private static readonly string[] requiredDecoders = new[]
{
"mpeg2video",
"h264_qsv",
@@ -101,33 +89,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
"hevc"
};
- foreach (var codec in required)
- {
- var srch = " " + codec + " ";
-
- if (output.IndexOf(srch, StringComparison.OrdinalIgnoreCase) != -1)
- {
- _logger.LogInformation("Decoder available: " + codec);
- found.Add(codec);
- }
- }
-
- return found;
- }
-
- private List<string> GetEncoders(string encoderAppPath)
- {
- string output = null;
- try
- {
- output = GetProcessOutput(encoderAppPath, "-encoders");
- }
- catch
- {
- }
-
- var found = new List<string>();
- var required = new[]
+ private static readonly string[] requiredEncoders = new[]
{
"libx264",
"libx265",
@@ -151,32 +113,46 @@ namespace MediaBrowser.MediaEncoding.Encoder
"ac3"
};
- output = output ?? string.Empty;
+ private enum Codec
+ {
+ Encoder,
+ Decoder
+ }
- var index = 0;
+ private IEnumerable<string> GetCodecs(string encoderAppPath, Codec codec)
+ {
+ string codecstr = codec == Codec.Encoder ? "encoders" : "decoders";
+ string output = null;
+ try
+ {
+ output = GetProcessOutput(encoderAppPath, "-" + codecstr);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Error detecting available {Codec}", codecstr);
+ }
- foreach (var codec in required)
+ if (string.IsNullOrWhiteSpace(output))
{
- var srch = " " + codec + " ";
+ return Enumerable.Empty<string>();
+ }
- if (output.IndexOf(srch, StringComparison.OrdinalIgnoreCase) != -1)
- {
- if (index < required.Length - 1)
- {
- _logger.LogInformation("Encoder available: " + codec);
- }
+ var required = codec == Codec.Encoder ? requiredEncoders : requiredDecoders;
- found.Add(codec);
- }
- index++;
- }
+ var found = Regex
+ .Matches(output, @"^\s\S{6}\s(?<codec>[\w|-]+)\s+.+$", RegexOptions.Multiline)
+ .Cast<Match>()
+ .Select(x => x.Groups["codec"].Value)
+ .Where(x => required.Contains(x));
+
+ _logger.LogInformation("Available {Codec}: {Codecs}", codecstr, found);
return found;
}
private string GetProcessOutput(string path, string arguments)
{
- var process = _processFactory.Create(new ProcessOptions
+ IProcess process = _processFactory.Create(new ProcessOptions
{
CreateNoWindow = true,
UseShellExecute = false,
@@ -187,7 +163,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
RedirectStandardOutput = true
});
- _logger.LogInformation("Running {path} {arguments}", path, arguments);
+ _logger.LogInformation("Running {Path} {Arguments}", path, arguments);
using (process)
{