diff options
| author | gnattu <gnattu@users.noreply.github.com> | 2024-08-29 02:43:37 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-28 12:43:37 -0600 |
| commit | 6c8ca30f7fc02170901a969c71dc35ec8992ad02 (patch) | |
| tree | 20e674033780ce8254fd41e467c9c1fe3d03bdbc /MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs | |
| parent | 8c3f3c503b4b0606e2987ed58e5228d72669afeb (diff) | |
Prevent server from starting if the ffmpeg path is invalid (#12463)
Diffstat (limited to 'MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs')
| -rw-r--r-- | MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs | 81 |
1 files changed, 18 insertions, 63 deletions
diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs index e8461e77f..d9fe0594f 100644 --- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs @@ -147,28 +147,41 @@ namespace MediaBrowser.MediaEncoding.Encoder private static partial Regex FfprobePathRegex(); /// <summary> - /// Run at startup or if the user removes a Custom path from transcode page. + /// Run at startup to validate ffmpeg. /// Sets global variables FFmpegPath. - /// Precedence is: Config > CLI > $PATH. + /// Precedence is: CLI/Env var > Config > $PATH. /// </summary> - public void SetFFmpegPath() + /// <returns>bool indicates whether a valid ffmpeg is found.</returns> + public bool SetFFmpegPath() { + var skipValidation = _config.GetFFmpegSkipValidation(); + if (skipValidation) + { + _logger.LogWarning("FFmpeg: Skipping FFmpeg Validation due to FFmpeg:novalidation set to true"); + return true; + } + // 1) Check if the --ffmpeg CLI switch has been given var ffmpegPath = _startupOptionFFmpegPath; + string ffmpegPathSetMethodText = "command line or environment variable"; if (string.IsNullOrEmpty(ffmpegPath)) { // 2) Custom path stored in config/encoding xml file under tag <EncoderAppPath> should be used as a fallback ffmpegPath = _configurationManager.GetEncodingOptions().EncoderAppPath; + ffmpegPathSetMethodText = "encoding.xml config file"; if (string.IsNullOrEmpty(ffmpegPath)) { // 3) Check "ffmpeg" ffmpegPath = "ffmpeg"; + ffmpegPathSetMethodText = "system $PATH"; } } if (!ValidatePath(ffmpegPath)) { _ffmpegPath = null; + _logger.LogError("FFmpeg: Path set by {FfmpegPathSetMethodText} is invalid", ffmpegPathSetMethodText); + return false; } // Write the FFmpeg path to the config/encoding.xml file as <EncoderAppPathDisplay> so it appears in UI @@ -229,65 +242,7 @@ namespace MediaBrowser.MediaEncoding.Encoder } _logger.LogInformation("FFmpeg: {FfmpegPath}", _ffmpegPath ?? string.Empty); - } - - /// <summary> - /// Triggered from the Settings > Transcoding UI page when users submits Custom FFmpeg path to use. - /// Only write the new path to xml if it exists. Do not perform validation checks on ffmpeg here. - /// </summary> - /// <param name="path">The path.</param> - /// <param name="pathType">The path type.</param> - public void UpdateEncoderPath(string path, string pathType) - { - var config = _configurationManager.GetEncodingOptions(); - - // Filesystem may not be case insensitive, but EncoderAppPathDisplay should always point to a valid file? - if (string.IsNullOrEmpty(config.EncoderAppPath) - && string.Equals(config.EncoderAppPathDisplay, path, StringComparison.OrdinalIgnoreCase)) - { - _logger.LogDebug("Existing ffmpeg path is empty and the new path is the same as {EncoderAppPathDisplay}. Skipping", nameof(config.EncoderAppPathDisplay)); - return; - } - - string newPath; - - _logger.LogInformation("Attempting to update encoder path to {Path}. pathType: {PathType}", path ?? string.Empty, pathType ?? string.Empty); - - if (!string.Equals(pathType, "custom", StringComparison.OrdinalIgnoreCase)) - { - throw new ArgumentException("Unexpected pathType value"); - } - - if (string.IsNullOrWhiteSpace(path)) - { - // User had cleared the custom path in UI - newPath = string.Empty; - } - else - { - if (Directory.Exists(path)) - { - // Given path is directory, so resolve down to filename - newPath = GetEncoderPathFromDirectory(path, "ffmpeg"); - } - else - { - newPath = path; - } - - if (!new EncoderValidator(_logger, newPath).ValidateVersion()) - { - throw new ResourceNotFoundException(); - } - } - - // Write the new ffmpeg path to the xml as <EncoderAppPath> - // This ensures its not lost on next startup - config.EncoderAppPath = newPath; - _configurationManager.SaveConfiguration("encoding", config); - - // Trigger SetFFmpegPath so we validate the new path and setup probe path - SetFFmpegPath(); + return !string.IsNullOrWhiteSpace(ffmpegPath); } /// <summary> @@ -306,7 +261,7 @@ namespace MediaBrowser.MediaEncoding.Encoder bool rc = new EncoderValidator(_logger, path).ValidateVersion(); if (!rc) { - _logger.LogWarning("FFmpeg: Failed version check: {Path}", path); + _logger.LogError("FFmpeg: Failed version check: {Path}", path); return false; } |
