Prevent server from starting if the ffmpeg path is invalid (#12463)

This commit is contained in:
gnattu
2024-08-29 02:43:37 +08:00
committed by GitHub
parent 8c3f3c503b
commit 6c8ca30f7f
6 changed files with 43 additions and 73 deletions

View File

@@ -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;
}