add ability to customize ffmpeg path

This commit is contained in:
Luke Pulverenti 2014-09-14 11:26:33 -04:00
parent 5c615fa024
commit 10cb5a8bf6
6 changed files with 75 additions and 36 deletions

View file

@ -5,6 +5,7 @@ using MediaBrowser.Model.Logging;
using MediaBrowser.Server.Implementations; using MediaBrowser.Server.Implementations;
using MediaBrowser.ServerApplication; using MediaBrowser.ServerApplication;
using MediaBrowser.ServerApplication.Native; using MediaBrowser.ServerApplication.Native;
using MediaBrowser.ServerApplication.IO;
using Microsoft.Win32; using Microsoft.Win32;
using System; using System;
using System.Diagnostics; using System.Diagnostics;
@ -41,8 +42,10 @@ namespace MediaBrowser.Server.Mono
var applicationPath = Assembly.GetEntryAssembly ().Location; var applicationPath = Assembly.GetEntryAssembly ().Location;
#endif #endif
var options = new StartupOptions();
// Allow this to be specified on the command line. // Allow this to be specified on the command line.
var customProgramDataPath = ParseProgramDataPathFromCommandLine(); var customProgramDataPath = options.GetOption("-programdata");
var appPaths = CreateApplicationPaths(applicationPath, customProgramDataPath); var appPaths = CreateApplicationPaths(applicationPath, customProgramDataPath);
@ -52,7 +55,7 @@ namespace MediaBrowser.Server.Mono
var logger = _logger = logManager.GetLogger("Main"); var logger = _logger = logManager.GetLogger("Main");
BeginLog(logger); BeginLog(logger, appPaths);
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
@ -73,20 +76,6 @@ namespace MediaBrowser.Server.Mono
_appHost.Dispose(); _appHost.Dispose();
} }
} }
private static string ParseProgramDataPathFromCommandLine()
{
var commandArgs = Environment.GetCommandLineArgs().ToList();
var programDataPathIndex = commandArgs.IndexOf("-programdata");
if (programDataPathIndex != -1)
{
return commandArgs.ElementAtOrDefault(programDataPathIndex + 1);
}
return null;
}
private static ServerApplicationPaths CreateApplicationPaths(string applicationPath, string programDataPath) private static ServerApplicationPaths CreateApplicationPaths(string applicationPath, string programDataPath)
{ {
@ -169,14 +158,11 @@ namespace MediaBrowser.Server.Mono
/// Begins the log. /// Begins the log.
/// </summary> /// </summary>
/// <param name="logger">The logger.</param> /// <param name="logger">The logger.</param>
private static void BeginLog(ILogger logger) private static void BeginLog(ILogger logger, IApplicationPaths appPaths)
{ {
logger.Info("Media Browser Server started"); logger.Info("Media Browser Server started");
logger.Info("Command line: {0}", string.Join(" ", Environment.GetCommandLineArgs())); ApplicationHost.LogEnvironmentInfo(logger, appPaths);
}
logger.Info("Server: {0}", Environment.MachineName);
logger.Info("Operating system: {0}", Environment.OSVersion.ToString());
}
/// <summary> /// <summary>
/// Handles the UnhandledException event of the CurrentDomain control. /// Handles the UnhandledException event of the CurrentDomain control.

View file

@ -219,6 +219,8 @@ namespace MediaBrowser.ServerApplication
private ISyncRepository SyncRepository { get; set; } private ISyncRepository SyncRepository { get; set; }
private ITVSeriesManager TVSeriesManager { get; set; } private ITVSeriesManager TVSeriesManager { get; set; }
private StartupOptions _startupOptions;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="ApplicationHost" /> class. /// Initializes a new instance of the <see cref="ApplicationHost" /> class.
/// </summary> /// </summary>
@ -226,9 +228,15 @@ namespace MediaBrowser.ServerApplication
/// <param name="logManager">The log manager.</param> /// <param name="logManager">The log manager.</param>
/// <param name="supportsRunningAsService">if set to <c>true</c> [supports running as service].</param> /// <param name="supportsRunningAsService">if set to <c>true</c> [supports running as service].</param>
/// <param name="isRunningAsService">if set to <c>true</c> [is running as service].</param> /// <param name="isRunningAsService">if set to <c>true</c> [is running as service].</param>
public ApplicationHost(ServerApplicationPaths applicationPaths, ILogManager logManager, bool supportsRunningAsService, bool isRunningAsService) /// <param name="options">The options.</param>
public ApplicationHost(ServerApplicationPaths applicationPaths,
ILogManager logManager,
bool supportsRunningAsService,
bool isRunningAsService,
StartupOptions options)
: base(applicationPaths, logManager) : base(applicationPaths, logManager)
{ {
_startupOptions = options;
_isRunningAsService = isRunningAsService; _isRunningAsService = isRunningAsService;
SupportsRunningAsService = supportsRunningAsService; SupportsRunningAsService = supportsRunningAsService;
} }
@ -548,7 +556,7 @@ namespace MediaBrowser.ServerApplication
/// <returns>Task.</returns> /// <returns>Task.</returns>
private async Task RegisterMediaEncoder(IProgress<double> progress) private async Task RegisterMediaEncoder(IProgress<double> progress)
{ {
var info = await new FFMpegDownloader(Logger, ApplicationPaths, HttpClient, ZipClient, FileSystemManager).GetFFMpegInfo(progress).ConfigureAwait(false); var info = await new FFMpegDownloader(Logger, ApplicationPaths, HttpClient, ZipClient, FileSystemManager).GetFFMpegInfo(_startupOptions, progress).ConfigureAwait(false);
MediaEncoder = new MediaEncoder(LogManager.GetLogger("MediaEncoder"), JsonSerializer, info.EncoderPath, info.ProbePath, info.Version); MediaEncoder = new MediaEncoder(LogManager.GetLogger("MediaEncoder"), JsonSerializer, info.EncoderPath, info.ProbePath, info.Version);
RegisterSingleInstance(MediaEncoder); RegisterSingleInstance(MediaEncoder);

View file

@ -14,6 +14,7 @@ using System.Threading.Tasks;
#if __MonoCS__ #if __MonoCS__
using Mono.Unix.Native; using Mono.Unix.Native;
#endif #endif
using MediaBrowser.ServerApplication.IO;
namespace MediaBrowser.ServerApplication.FFMpeg namespace MediaBrowser.ServerApplication.FFMpeg
{ {
@ -39,8 +40,21 @@ namespace MediaBrowser.ServerApplication.FFMpeg
_fileSystem = fileSystem; _fileSystem = fileSystem;
} }
public async Task<FFMpegInfo> GetFFMpegInfo(IProgress<double> progress) public async Task<FFMpegInfo> GetFFMpegInfo(StartupOptions options, IProgress<double> progress)
{ {
var customffMpegPath = options.GetOption("-ffmpeg");
var customffProbePath = options.GetOption("-ffprobe");
if (!string.IsNullOrWhiteSpace(customffMpegPath) && !string.IsNullOrWhiteSpace(customffProbePath))
{
return new FFMpegInfo
{
ProbePath = customffProbePath,
EncoderPath = customffMpegPath,
Version = "custom"
};
}
var rootEncoderPath = Path.Combine(_appPaths.ProgramDataPath, "ffmpeg"); var rootEncoderPath = Path.Combine(_appPaths.ProgramDataPath, "ffmpeg");
var versionedDirectoryPath = Path.Combine(rootEncoderPath, FFMpegDownloadInfo.Version); var versionedDirectoryPath = Path.Combine(rootEncoderPath, FFMpegDownloadInfo.Version);

View file

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace MediaBrowser.ServerApplication.IO
{
public class StartupOptions
{
private readonly List<string> _options = Environment.GetCommandLineArgs().ToList();
public bool ContainsOption(string option)
{
return _options.Contains(option, StringComparer.OrdinalIgnoreCase);
}
public string GetOption(string name)
{
var index = _options.IndexOf(name);
if (index != -1)
{
return _options.ElementAtOrDefault(index + 1);
}
return null;
}
}
}

View file

@ -2,6 +2,7 @@
using MediaBrowser.Common.Implementations.Logging; using MediaBrowser.Common.Implementations.Logging;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
using MediaBrowser.Server.Implementations; using MediaBrowser.Server.Implementations;
using MediaBrowser.ServerApplication.IO;
using MediaBrowser.ServerApplication.Native; using MediaBrowser.ServerApplication.Native;
using MediaBrowser.ServerApplication.Splash; using MediaBrowser.ServerApplication.Splash;
using MediaBrowser.ServerApplication.Updates; using MediaBrowser.ServerApplication.Updates;
@ -32,8 +33,8 @@ namespace MediaBrowser.ServerApplication
/// </summary> /// </summary>
public static void Main() public static void Main()
{ {
var startFlag = Environment.GetCommandLineArgs().ElementAtOrDefault(1); var options = new StartupOptions();
_isRunningAsService = string.Equals(startFlag, "-service", StringComparison.OrdinalIgnoreCase); _isRunningAsService = options.ContainsOption("-service");
var applicationPath = Process.GetCurrentProcess().MainModule.FileName; var applicationPath = Process.GetCurrentProcess().MainModule.FileName;
@ -48,7 +49,7 @@ namespace MediaBrowser.ServerApplication
BeginLog(logger, appPaths); BeginLog(logger, appPaths);
// Install directly // Install directly
if (string.Equals(startFlag, "-installservice", StringComparison.OrdinalIgnoreCase)) if (options.ContainsOption("-installservice"))
{ {
logger.Info("Performing service installation"); logger.Info("Performing service installation");
InstallService(applicationPath, logger); InstallService(applicationPath, logger);
@ -56,7 +57,7 @@ namespace MediaBrowser.ServerApplication
} }
// Restart with admin rights, then install // Restart with admin rights, then install
if (string.Equals(startFlag, "-installserviceasadmin", StringComparison.OrdinalIgnoreCase)) if (options.ContainsOption("-installserviceasadmin"))
{ {
logger.Info("Performing service installation"); logger.Info("Performing service installation");
RunServiceInstallation(applicationPath); RunServiceInstallation(applicationPath);
@ -64,7 +65,7 @@ namespace MediaBrowser.ServerApplication
} }
// Uninstall directly // Uninstall directly
if (string.Equals(startFlag, "-uninstallservice", StringComparison.OrdinalIgnoreCase)) if (options.ContainsOption("-uninstallservice"))
{ {
logger.Info("Performing service uninstallation"); logger.Info("Performing service uninstallation");
UninstallService(applicationPath, logger); UninstallService(applicationPath, logger);
@ -72,7 +73,7 @@ namespace MediaBrowser.ServerApplication
} }
// Restart with admin rights, then uninstall // Restart with admin rights, then uninstall
if (string.Equals(startFlag, "-uninstallserviceasadmin", StringComparison.OrdinalIgnoreCase)) if (options.ContainsOption("-uninstallserviceasadmin"))
{ {
logger.Info("Performing service uninstallation"); logger.Info("Performing service uninstallation");
RunServiceUninstallation(applicationPath); RunServiceUninstallation(applicationPath);
@ -99,7 +100,7 @@ namespace MediaBrowser.ServerApplication
try try
{ {
RunApplication(appPaths, logManager, _isRunningAsService); RunApplication(appPaths, logManager, _isRunningAsService, options);
} }
finally finally
{ {
@ -205,9 +206,10 @@ namespace MediaBrowser.ServerApplication
/// <param name="appPaths">The app paths.</param> /// <param name="appPaths">The app paths.</param>
/// <param name="logManager">The log manager.</param> /// <param name="logManager">The log manager.</param>
/// <param name="runService">if set to <c>true</c> [run service].</param> /// <param name="runService">if set to <c>true</c> [run service].</param>
private static void RunApplication(ServerApplicationPaths appPaths, ILogManager logManager, bool runService) /// <param name="options">The options.</param>
private static void RunApplication(ServerApplicationPaths appPaths, ILogManager logManager, bool runService, StartupOptions options)
{ {
_appHost = new ApplicationHost(appPaths, logManager, true, runService); _appHost = new ApplicationHost(appPaths, logManager, true, runService, options);
var initProgress = new Progress<double>(); var initProgress = new Progress<double>();

View file

@ -105,6 +105,7 @@
<Compile Include="FFMpeg\FFMpegInfo.cs" /> <Compile Include="FFMpeg\FFMpegInfo.cs" />
<Compile Include="IO\FileSystemFactory.cs" /> <Compile Include="IO\FileSystemFactory.cs" />
<Compile Include="IO\NativeFileSystem.cs" /> <Compile Include="IO\NativeFileSystem.cs" />
<Compile Include="IO\StartupOptions.cs" />
<Compile Include="Logging\LogForm.cs"> <Compile Include="Logging\LogForm.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>