|
@@ -21,6 +21,8 @@ using System.Linq;
|
|
using System.Threading;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Threading.Tasks;
|
|
using CommonIO;
|
|
using CommonIO;
|
|
|
|
+using MediaBrowser.Model.Configuration;
|
|
|
|
+using MediaBrowser.Common.Configuration;
|
|
|
|
|
|
namespace MediaBrowser.MediaEncoding.Encoder
|
|
namespace MediaBrowser.MediaEncoding.Encoder
|
|
{
|
|
{
|
|
@@ -77,6 +79,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
protected readonly Func<IMediaSourceManager> MediaSourceManager;
|
|
protected readonly Func<IMediaSourceManager> MediaSourceManager;
|
|
|
|
|
|
private readonly List<ProcessWrapper> _runningProcesses = new List<ProcessWrapper>();
|
|
private readonly List<ProcessWrapper> _runningProcesses = new List<ProcessWrapper>();
|
|
|
|
+ private readonly bool _hasExternalEncoder;
|
|
|
|
|
|
public MediaEncoder(ILogger logger, IJsonSerializer jsonSerializer, string ffMpegPath, string ffProbePath, string version, IServerConfigurationManager configurationManager, IFileSystem fileSystem, ILiveTvManager liveTvManager, IIsoManager isoManager, ILibraryManager libraryManager, IChannelManager channelManager, ISessionManager sessionManager, Func<ISubtitleEncoder> subtitleEncoder, Func<IMediaSourceManager> mediaSourceManager)
|
|
public MediaEncoder(ILogger logger, IJsonSerializer jsonSerializer, string ffMpegPath, string ffProbePath, string version, IServerConfigurationManager configurationManager, IFileSystem fileSystem, ILiveTvManager liveTvManager, IIsoManager isoManager, ILibraryManager libraryManager, IChannelManager channelManager, ISessionManager sessionManager, Func<ISubtitleEncoder> subtitleEncoder, Func<IMediaSourceManager> mediaSourceManager)
|
|
{
|
|
{
|
|
@@ -94,6 +97,74 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
MediaSourceManager = mediaSourceManager;
|
|
MediaSourceManager = mediaSourceManager;
|
|
FFProbePath = ffProbePath;
|
|
FFProbePath = ffProbePath;
|
|
FFMpegPath = ffMpegPath;
|
|
FFMpegPath = ffMpegPath;
|
|
|
|
+
|
|
|
|
+ _hasExternalEncoder = !string.IsNullOrWhiteSpace(ffMpegPath);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void Init()
|
|
|
|
+ {
|
|
|
|
+ ConfigureEncoderPaths();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void ConfigureEncoderPaths()
|
|
|
|
+ {
|
|
|
|
+ if (_hasExternalEncoder)
|
|
|
|
+ {
|
|
|
|
+ LogPaths();
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var appPath = GetEncodingOptions().EncoderAppPath;
|
|
|
|
+ appPath = "C:\\dev\\Emby.dev\\ProgramData-Server\\ffmpeg";
|
|
|
|
+
|
|
|
|
+ if (Directory.Exists(appPath))
|
|
|
|
+ {
|
|
|
|
+ SetPathsFromDirectory(appPath);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ else if (File.Exists(appPath))
|
|
|
|
+ {
|
|
|
|
+ FFMpegPath = appPath;
|
|
|
|
+
|
|
|
|
+ SetProbePathFromEncoderPath(appPath);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ LogPaths();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void SetPathsFromDirectory(string path)
|
|
|
|
+ {
|
|
|
|
+ // Since we can't predict the file extension, first try directly within the folder
|
|
|
|
+ // If that doesn't pan out, then do a recursive search
|
|
|
|
+ var files = Directory.GetFiles(path);
|
|
|
|
+
|
|
|
|
+ FFMpegPath = files.FirstOrDefault(i => string.Equals(Path.GetFileNameWithoutExtension(i), "ffmpeg", StringComparison.OrdinalIgnoreCase));
|
|
|
|
+ FFProbePath = files.FirstOrDefault(i => string.Equals(Path.GetFileNameWithoutExtension(i), "ffprobe", StringComparison.OrdinalIgnoreCase));
|
|
|
|
+
|
|
|
|
+ if (string.IsNullOrWhiteSpace(FFMpegPath) || !File.Exists(FFMpegPath))
|
|
|
|
+ {
|
|
|
|
+ files = Directory.GetFiles(path, "*", SearchOption.AllDirectories);
|
|
|
|
+
|
|
|
|
+ FFMpegPath = files.FirstOrDefault(i => string.Equals(Path.GetFileNameWithoutExtension(i), "ffmpeg", StringComparison.OrdinalIgnoreCase));
|
|
|
|
+ SetProbePathFromEncoderPath(FFMpegPath);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void SetProbePathFromEncoderPath(string appPath)
|
|
|
|
+ {
|
|
|
|
+ FFProbePath = Directory.GetFiles(Path.GetDirectoryName(appPath))
|
|
|
|
+ .FirstOrDefault(i => string.Equals(Path.GetFileNameWithoutExtension(i), "ffprobe", StringComparison.OrdinalIgnoreCase));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void LogPaths()
|
|
|
|
+ {
|
|
|
|
+ _logger.Info("FFMpeg: {0}", FFMpegPath ?? "not found");
|
|
|
|
+ _logger.Info("FFProbe: {0}", FFProbePath ?? "not found");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private EncodingOptions GetEncodingOptions()
|
|
|
|
+ {
|
|
|
|
+ return ConfigurationManager.GetConfiguration<EncodingOptions>("encoding");
|
|
}
|
|
}
|
|
|
|
|
|
private List<string> _encoders = new List<string>();
|
|
private List<string> _encoders = new List<string>();
|