@ -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: C onfig > CLI > $PATH.
/// Precedence is: C LI/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 . Log Warning ( "FFmpeg: Failed version check: {Path}" , path ) ;
_logger . Log Error ( "FFmpeg: Failed version check: {Path}" , path ) ;
return false ;
}