From 96ad22a00931ffea7dba828d5a677dac3d45d83c Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Wed, 2 Jan 2019 01:01:36 +0100 Subject: Reduce log spam and clean up EncoderValidator --- .../Encoder/EncoderValidator.cs | 35 ++++++++++++---------- 1 file changed, 19 insertions(+), 16 deletions(-) (limited to 'MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs') diff --git a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs index fb131f304..0f24a2370 100644 --- a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs +++ b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Globalization; using MediaBrowser.Model.Diagnostics; using Microsoft.Extensions.Logging; @@ -73,7 +72,7 @@ namespace MediaBrowser.MediaEncoding.Encoder private List GetDecoders(string encoderAppPath) { - string output = string.Empty; + string output = null; try { output = GetProcessOutput(encoderAppPath, "-decoders"); @@ -83,7 +82,11 @@ namespace MediaBrowser.MediaEncoding.Encoder _logger.LogError(ex, "Error detecting available decoders"); } - var found = new List(); + if (string.IsNullOrWhiteSpace(output)) + { + return new List(); + } + var required = new[] { "mpeg2video", @@ -101,17 +104,19 @@ namespace MediaBrowser.MediaEncoding.Encoder "hevc" }; + var found = new List(); foreach (var codec in required) { var srch = " " + codec + " "; if (output.IndexOf(srch, StringComparison.OrdinalIgnoreCase) != -1) { - _logger.LogInformation("Decoder available: " + codec); found.Add(codec); } } + _logger.LogInformation("Available decoders: {Codecs}", found); + return found; } @@ -122,11 +127,16 @@ namespace MediaBrowser.MediaEncoding.Encoder { output = GetProcessOutput(encoderAppPath, "-encoders"); } - catch + catch (Exception ex) { + _logger.LogError(ex, "Error getting encoders"); + } + + if (string.IsNullOrWhiteSpace(output)) + { + return new List(); } - var found = new List(); var required = new[] { "libx264", @@ -151,26 +161,19 @@ namespace MediaBrowser.MediaEncoding.Encoder "ac3" }; - output = output ?? string.Empty; - - var index = 0; - + var found = new List(); foreach (var codec in required) { var srch = " " + codec + " "; if (output.IndexOf(srch, StringComparison.OrdinalIgnoreCase) != -1) { - if (index < required.Length - 1) - { - _logger.LogInformation("Encoder available: " + codec); - } - found.Add(codec); } - index++; } + _logger.LogInformation("Available encoders: {Codecs}", found); + return found; } -- cgit v1.2.3 From 0042b96c806ce38b575b33246bdb56dfe73adace Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Wed, 2 Jan 2019 01:23:49 +0100 Subject: Use ValueTuple and Linq --- .../Encoder/EncoderValidator.cs | 43 +++++++--------------- MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs | 8 ++-- 2 files changed, 17 insertions(+), 34 deletions(-) (limited to 'MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs') diff --git a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs index 0f24a2370..400fa0b81 100644 --- a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs +++ b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.Linq; using MediaBrowser.Model.Diagnostics; using Microsoft.Extensions.Logging; @@ -17,21 +18,21 @@ namespace MediaBrowser.MediaEncoding.Encoder _processFactory = processFactory; } - public Tuple, List> Validate(string encoderPath) + public (IEnumerable decoders, IEnumerable 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); _logger.LogInformation("Encoder validation complete"); - return new Tuple, List>(decoders, encoders); + return (decoders, encoders); } public bool ValidateVersion(string encoderAppPath, bool logOutput) { - string output = string.Empty; + string output = null; try { output = GetProcessOutput(encoderAppPath, "-version"); @@ -70,7 +71,7 @@ namespace MediaBrowser.MediaEncoding.Encoder return true; } - private List GetDecoders(string encoderAppPath) + private IEnumerable GetDecoders(string encoderAppPath) { string output = null; try @@ -84,7 +85,7 @@ namespace MediaBrowser.MediaEncoding.Encoder if (string.IsNullOrWhiteSpace(output)) { - return new List(); + return Enumerable.Empty(); } var required = new[] @@ -104,23 +105,14 @@ namespace MediaBrowser.MediaEncoding.Encoder "hevc" }; - var found = new List(); - foreach (var codec in required) - { - var srch = " " + codec + " "; - - if (output.IndexOf(srch, StringComparison.OrdinalIgnoreCase) != -1) - { - found.Add(codec); - } - } + var found = required.Where(x => output.IndexOf(x, StringComparison.OrdinalIgnoreCase) != -1); _logger.LogInformation("Available decoders: {Codecs}", found); return found; } - private List GetEncoders(string encoderAppPath) + private IEnumerable GetEncoders(string encoderAppPath) { string output = null; try @@ -134,7 +126,7 @@ namespace MediaBrowser.MediaEncoding.Encoder if (string.IsNullOrWhiteSpace(output)) { - return new List(); + return Enumerable.Empty(); } var required = new[] @@ -161,16 +153,7 @@ namespace MediaBrowser.MediaEncoding.Encoder "ac3" }; - var found = new List(); - foreach (var codec in required) - { - var srch = " " + codec + " "; - - if (output.IndexOf(srch, StringComparison.OrdinalIgnoreCase) != -1) - { - found.Add(codec); - } - } + var found = required.Where(x => output.IndexOf(x, StringComparison.OrdinalIgnoreCase) != -1); _logger.LogInformation("Available encoders: {Codecs}", found); @@ -179,7 +162,7 @@ namespace MediaBrowser.MediaEncoding.Encoder private string GetProcessOutput(string path, string arguments) { - var process = _processFactory.Create(new ProcessOptions + IProcess process = _processFactory.Create(new ProcessOptions { CreateNoWindow = true, UseShellExecute = false, @@ -190,7 +173,7 @@ namespace MediaBrowser.MediaEncoding.Encoder RedirectStandardOutput = true }); - _logger.LogInformation("Running {path} {arguments}", path, arguments); + _logger.LogInformation("Running {Path} {Arguments}", path, arguments); using (process) { diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs index 181fc0f65..1d8cd6778 100644 --- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs @@ -175,8 +175,8 @@ namespace MediaBrowser.MediaEncoding.Encoder { var result = new EncoderValidator(_logger, _processFactory).Validate(FFMpegPath); - SetAvailableDecoders(result.Item1); - SetAvailableEncoders(result.Item2); + SetAvailableDecoders(result.decoders); + SetAvailableEncoders(result.encoders); if (EnableEncoderFontFile) { @@ -401,14 +401,14 @@ namespace MediaBrowser.MediaEncoding.Encoder } private List _encoders = new List(); - public void SetAvailableEncoders(List list) + public void SetAvailableEncoders(IEnumerable list) { _encoders = list.ToList(); //_logger.Info("Supported encoders: {0}", string.Join(",", list.ToArray())); } private List _decoders = new List(); - public void SetAvailableDecoders(List list) + public void SetAvailableDecoders(IEnumerable list) { _decoders = list.ToList(); //_logger.Info("Supported decoders: {0}", string.Join(",", list.ToArray())); -- cgit v1.2.3 From 12c43cd76974fb795043c15d907251b5bb459a20 Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Wed, 2 Jan 2019 10:48:10 +0100 Subject: Use regex to check if ffmpeg output contains codec Demo of the regex: https://regex101.com/r/bn9IOy/10/ --- .../Encoder/EncoderValidator.cs | 88 ++++++++++------------ 1 file changed, 41 insertions(+), 47 deletions(-) (limited to 'MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs') diff --git a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs index 400fa0b81..cafe3c64f 100644 --- a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs +++ b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; +using System.Text.RegularExpressions; using MediaBrowser.Model.Diagnostics; using Microsoft.Extensions.Logging; @@ -22,8 +23,8 @@ namespace MediaBrowser.MediaEncoding.Encoder { _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"); @@ -71,24 +72,7 @@ namespace MediaBrowser.MediaEncoding.Encoder return true; } - private IEnumerable GetDecoders(string encoderAppPath) - { - string output = null; - try - { - output = GetProcessOutput(encoderAppPath, "-decoders"); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error detecting available decoders"); - } - - if (string.IsNullOrWhiteSpace(output)) - { - return Enumerable.Empty(); - } - - var required = new[] + private static readonly string[] requiredDecoders = new[] { "mpeg2video", "h264_qsv", @@ -105,31 +89,7 @@ namespace MediaBrowser.MediaEncoding.Encoder "hevc" }; - var found = required.Where(x => output.IndexOf(x, StringComparison.OrdinalIgnoreCase) != -1); - - _logger.LogInformation("Available decoders: {Codecs}", found); - - return found; - } - - private IEnumerable GetEncoders(string encoderAppPath) - { - string output = null; - try - { - output = GetProcessOutput(encoderAppPath, "-encoders"); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error getting encoders"); - } - - if (string.IsNullOrWhiteSpace(output)) - { - return Enumerable.Empty(); - } - - var required = new[] + private static readonly string[] requiredEncoders = new[] { "libx264", "libx265", @@ -153,9 +113,43 @@ namespace MediaBrowser.MediaEncoding.Encoder "ac3" }; - var found = required.Where(x => output.IndexOf(x, StringComparison.OrdinalIgnoreCase) != -1); + private enum Codec + { + Encoder, + Decoder + } + + private IEnumerable 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); + } + + if (string.IsNullOrWhiteSpace(output)) + { + return Enumerable.Empty(); + } + + var required = codec == Codec.Encoder ? requiredEncoders : requiredDecoders; + + Regex regex = new Regex(@"\s\S{6}\s(?(\w|-)+)\s{3}"); + + MatchCollection matches = regex.Matches(output); + + var found = matches.Cast() + .Select(x => x.Groups["codec"].Value) + .Where(x => required.Contains(x)); + + //var found = required.Where(x => output.IndexOf(x, StringComparison.OrdinalIgnoreCase) != -1); - _logger.LogInformation("Available encoders: {Codecs}", found); + _logger.LogInformation("Available {Codec}: {Codecs}", codecstr, found); return found; } -- cgit v1.2.3 From c05e8088d68a6e6f5b7ce6ed4462c072a347aed3 Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Wed, 2 Jan 2019 11:03:19 +0100 Subject: Remove extra capture group from regex https://regex101.com/r/bn9IOy/11/ --- MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs') diff --git a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs index cafe3c64f..abb827e31 100644 --- a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs +++ b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs @@ -139,7 +139,7 @@ namespace MediaBrowser.MediaEncoding.Encoder var required = codec == Codec.Encoder ? requiredEncoders : requiredDecoders; - Regex regex = new Regex(@"\s\S{6}\s(?(\w|-)+)\s{3}"); + Regex regex = new Regex(@"\s\S{6}\s(?[\w|-]+)\s{3}"); MatchCollection matches = regex.Matches(output); @@ -147,8 +147,6 @@ namespace MediaBrowser.MediaEncoding.Encoder .Select(x => x.Groups["codec"].Value) .Where(x => required.Contains(x)); - //var found = required.Where(x => output.IndexOf(x, StringComparison.OrdinalIgnoreCase) != -1); - _logger.LogInformation("Available {Codec}: {Codecs}", codecstr, found); return found; -- cgit v1.2.3 From d6f3ca859eab462c12884a3e000a48a47eff6e4b Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Wed, 2 Jan 2019 11:13:33 +0100 Subject: Change regex to multiline ex: https://regex101.com/r/bn9IOy/12 --- MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs') diff --git a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs index abb827e31..0a97434e3 100644 --- a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs +++ b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs @@ -139,10 +139,8 @@ namespace MediaBrowser.MediaEncoding.Encoder var required = codec == Codec.Encoder ? requiredEncoders : requiredDecoders; - Regex regex = new Regex(@"\s\S{6}\s(?[\w|-]+)\s{3}"); - + Regex regex = new Regex(@"^\s\S{6}\s(?[\w|-]+)\s+.+$", RegexOptions.Multiline); MatchCollection matches = regex.Matches(output); - var found = matches.Cast() .Select(x => x.Groups["codec"].Value) .Where(x => required.Contains(x)); -- cgit v1.2.3 From f3030812ea8f79d4878a158695df0eb8a741b1e7 Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Wed, 2 Jan 2019 11:32:35 +0100 Subject: Use static regex --- MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs') diff --git a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs index 0a97434e3..b68961889 100644 --- a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs +++ b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs @@ -139,9 +139,9 @@ namespace MediaBrowser.MediaEncoding.Encoder var required = codec == Codec.Encoder ? requiredEncoders : requiredDecoders; - Regex regex = new Regex(@"^\s\S{6}\s(?[\w|-]+)\s+.+$", RegexOptions.Multiline); - MatchCollection matches = regex.Matches(output); - var found = matches.Cast() + var found = Regex + .Matches(output, @"^\s\S{6}\s(?[\w|-]+)\s+.+$", RegexOptions.Multiline) + .Cast() .Select(x => x.Groups["codec"].Value) .Where(x => required.Contains(x)); -- cgit v1.2.3