|
@@ -82,6 +82,8 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
|
|
|
private readonly List<ProcessWrapper> _runningProcesses = new List<ProcessWrapper>();
|
|
private readonly List<ProcessWrapper> _runningProcesses = new List<ProcessWrapper>();
|
|
private readonly bool _hasExternalEncoder;
|
|
private readonly bool _hasExternalEncoder;
|
|
|
|
+ private string _originalFFMpegPath;
|
|
|
|
+ private string _originalFFProbePath;
|
|
|
|
|
|
public MediaEncoder(ILogger logger, IJsonSerializer jsonSerializer, string ffMpegPath, string ffProbePath, bool hasExternalEncoder, IServerConfigurationManager configurationManager, IFileSystem fileSystem, ILiveTvManager liveTvManager, IIsoManager isoManager, ILibraryManager libraryManager, IChannelManager channelManager, ISessionManager sessionManager, Func<ISubtitleEncoder> subtitleEncoder, Func<IMediaSourceManager> mediaSourceManager, IHttpClient httpClient, IZipClient zipClient)
|
|
public MediaEncoder(ILogger logger, IJsonSerializer jsonSerializer, string ffMpegPath, string ffProbePath, bool hasExternalEncoder, IServerConfigurationManager configurationManager, IFileSystem fileSystem, ILiveTvManager liveTvManager, IIsoManager isoManager, ILibraryManager libraryManager, IChannelManager channelManager, ISessionManager sessionManager, Func<ISubtitleEncoder> subtitleEncoder, Func<IMediaSourceManager> mediaSourceManager, IHttpClient httpClient, IZipClient zipClient)
|
|
{
|
|
{
|
|
@@ -100,6 +102,8 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
_zipClient = zipClient;
|
|
_zipClient = zipClient;
|
|
FFProbePath = ffProbePath;
|
|
FFProbePath = ffProbePath;
|
|
FFMpegPath = ffMpegPath;
|
|
FFMpegPath = ffMpegPath;
|
|
|
|
+ _originalFFProbePath = ffProbePath;
|
|
|
|
+ _originalFFMpegPath = ffMpegPath;
|
|
|
|
|
|
_hasExternalEncoder = hasExternalEncoder;
|
|
_hasExternalEncoder = hasExternalEncoder;
|
|
}
|
|
}
|
|
@@ -231,6 +235,11 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
throw new ResourceNotFoundException("ffprobe not found");
|
|
throw new ResourceNotFoundException("ffprobe not found");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (!ValidateVersion(path))
|
|
|
|
+ {
|
|
|
|
+ throw new ResourceNotFoundException("ffmpeg version 3.0 or greater is required.");
|
|
|
|
+ }
|
|
|
|
+
|
|
var config = GetEncodingOptions();
|
|
var config = GetEncodingOptions();
|
|
config.EncoderAppPath = path;
|
|
config.EncoderAppPath = path;
|
|
ConfigurationManager.SaveConfiguration("encoding", config);
|
|
ConfigurationManager.SaveConfiguration("encoding", config);
|
|
@@ -238,6 +247,11 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
Init();
|
|
Init();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private bool ValidateVersion(string path)
|
|
|
|
+ {
|
|
|
|
+ return new EncoderValidator(_logger).ValidateVersion(path);
|
|
|
|
+ }
|
|
|
|
+
|
|
private void ConfigureEncoderPaths()
|
|
private void ConfigureEncoderPaths()
|
|
{
|
|
{
|
|
var appPath = GetEncodingOptions().EncoderAppPath;
|
|
var appPath = GetEncodingOptions().EncoderAppPath;
|
|
@@ -287,45 +301,22 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
string encoderPath = null;
|
|
string encoderPath = null;
|
|
string probePath = null;
|
|
string probePath = null;
|
|
|
|
|
|
- if (TestSystemInstalled("ffmpeg"))
|
|
|
|
|
|
+ if (_hasExternalEncoder && ValidateVersion(_originalFFMpegPath))
|
|
{
|
|
{
|
|
- encoderPath = "ffmpeg";
|
|
|
|
|
|
+ encoderPath = _originalFFMpegPath;
|
|
|
|
+ probePath = _originalFFProbePath;
|
|
}
|
|
}
|
|
- if (TestSystemInstalled("ffprobe"))
|
|
|
|
- {
|
|
|
|
- probePath = "ffprobe";
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return new Tuple<string, string>(encoderPath, probePath);
|
|
|
|
- }
|
|
|
|
|
|
|
|
- private bool TestSystemInstalled(string app)
|
|
|
|
- {
|
|
|
|
- try
|
|
|
|
|
|
+ if (string.IsNullOrWhiteSpace(encoderPath))
|
|
{
|
|
{
|
|
- var startInfo = new ProcessStartInfo
|
|
|
|
|
|
+ if (ValidateVersion("ffmpeg") && ValidateVersion("ffprobe"))
|
|
{
|
|
{
|
|
- FileName = app,
|
|
|
|
- Arguments = "-v",
|
|
|
|
- UseShellExecute = false,
|
|
|
|
- CreateNoWindow = true,
|
|
|
|
- WindowStyle = ProcessWindowStyle.Hidden,
|
|
|
|
- ErrorDialog = false
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- using (var process = Process.Start(startInfo))
|
|
|
|
- {
|
|
|
|
- process.WaitForExit();
|
|
|
|
|
|
+ encoderPath = "ffmpeg";
|
|
|
|
+ probePath = "ffprobe";
|
|
}
|
|
}
|
|
-
|
|
|
|
- _logger.Debug("System app installed: " + app);
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
- catch
|
|
|
|
- {
|
|
|
|
- _logger.Debug("System app not installed: " + app);
|
|
|
|
- return false;
|
|
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ return new Tuple<string, string>(encoderPath, probePath);
|
|
}
|
|
}
|
|
|
|
|
|
private Tuple<string, string> GetPathsFromDirectory(string path)
|
|
private Tuple<string, string> GetPathsFromDirectory(string path)
|