From 10cb5a8bf6a32a84819e841719e2dcc958aec513 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 14 Sep 2014 11:26:33 -0400 Subject: [PATCH] add ability to customize ffmpeg path --- MediaBrowser.Server.Mono/Program.cs | 34 ++++++------------- .../ApplicationHost.cs | 12 +++++-- .../FFMpeg/FFMpegDownloader.cs | 16 ++++++++- .../IO/StartupOptions.cs | 28 +++++++++++++++ MediaBrowser.ServerApplication/MainStartup.cs | 20 ++++++----- .../MediaBrowser.ServerApplication.csproj | 1 + 6 files changed, 75 insertions(+), 36 deletions(-) create mode 100644 MediaBrowser.ServerApplication/IO/StartupOptions.cs diff --git a/MediaBrowser.Server.Mono/Program.cs b/MediaBrowser.Server.Mono/Program.cs index 6040f06090..a803a50b61 100644 --- a/MediaBrowser.Server.Mono/Program.cs +++ b/MediaBrowser.Server.Mono/Program.cs @@ -5,6 +5,7 @@ using MediaBrowser.Model.Logging; using MediaBrowser.Server.Implementations; using MediaBrowser.ServerApplication; using MediaBrowser.ServerApplication.Native; +using MediaBrowser.ServerApplication.IO; using Microsoft.Win32; using System; using System.Diagnostics; @@ -41,8 +42,10 @@ namespace MediaBrowser.Server.Mono var applicationPath = Assembly.GetEntryAssembly ().Location; #endif + var options = new StartupOptions(); + // Allow this to be specified on the command line. - var customProgramDataPath = ParseProgramDataPathFromCommandLine(); + var customProgramDataPath = options.GetOption("-programdata"); var appPaths = CreateApplicationPaths(applicationPath, customProgramDataPath); @@ -52,7 +55,7 @@ namespace MediaBrowser.Server.Mono var logger = _logger = logManager.GetLogger("Main"); - BeginLog(logger); + BeginLog(logger, appPaths); AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; @@ -73,20 +76,6 @@ namespace MediaBrowser.Server.Mono _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) { @@ -169,14 +158,11 @@ namespace MediaBrowser.Server.Mono /// Begins the log. /// /// The logger. - private static void BeginLog(ILogger logger) - { - logger.Info("Media Browser Server started"); - logger.Info("Command line: {0}", string.Join(" ", Environment.GetCommandLineArgs())); - - logger.Info("Server: {0}", Environment.MachineName); - logger.Info("Operating system: {0}", Environment.OSVersion.ToString()); - } + private static void BeginLog(ILogger logger, IApplicationPaths appPaths) + { + logger.Info("Media Browser Server started"); + ApplicationHost.LogEnvironmentInfo(logger, appPaths); + } /// /// Handles the UnhandledException event of the CurrentDomain control. diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs index 0d76e95b9b..25d410bfc7 100644 --- a/MediaBrowser.ServerApplication/ApplicationHost.cs +++ b/MediaBrowser.ServerApplication/ApplicationHost.cs @@ -219,6 +219,8 @@ namespace MediaBrowser.ServerApplication private ISyncRepository SyncRepository { get; set; } private ITVSeriesManager TVSeriesManager { get; set; } + private StartupOptions _startupOptions; + /// /// Initializes a new instance of the class. /// @@ -226,9 +228,15 @@ namespace MediaBrowser.ServerApplication /// The log manager. /// if set to true [supports running as service]. /// if set to true [is running as service]. - public ApplicationHost(ServerApplicationPaths applicationPaths, ILogManager logManager, bool supportsRunningAsService, bool isRunningAsService) + /// The options. + public ApplicationHost(ServerApplicationPaths applicationPaths, + ILogManager logManager, + bool supportsRunningAsService, + bool isRunningAsService, + StartupOptions options) : base(applicationPaths, logManager) { + _startupOptions = options; _isRunningAsService = isRunningAsService; SupportsRunningAsService = supportsRunningAsService; } @@ -548,7 +556,7 @@ namespace MediaBrowser.ServerApplication /// Task. private async Task RegisterMediaEncoder(IProgress 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); RegisterSingleInstance(MediaEncoder); diff --git a/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs b/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs index ae11712a5d..a026f9a497 100644 --- a/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs +++ b/MediaBrowser.ServerApplication/FFMpeg/FFMpegDownloader.cs @@ -14,6 +14,7 @@ using System.Threading.Tasks; #if __MonoCS__ using Mono.Unix.Native; #endif +using MediaBrowser.ServerApplication.IO; namespace MediaBrowser.ServerApplication.FFMpeg { @@ -39,8 +40,21 @@ namespace MediaBrowser.ServerApplication.FFMpeg _fileSystem = fileSystem; } - public async Task GetFFMpegInfo(IProgress progress) + public async Task GetFFMpegInfo(StartupOptions options, IProgress 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 versionedDirectoryPath = Path.Combine(rootEncoderPath, FFMpegDownloadInfo.Version); diff --git a/MediaBrowser.ServerApplication/IO/StartupOptions.cs b/MediaBrowser.ServerApplication/IO/StartupOptions.cs new file mode 100644 index 0000000000..e74151e4c4 --- /dev/null +++ b/MediaBrowser.ServerApplication/IO/StartupOptions.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MediaBrowser.ServerApplication.IO +{ + public class StartupOptions + { + private readonly List _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; + } + } +} diff --git a/MediaBrowser.ServerApplication/MainStartup.cs b/MediaBrowser.ServerApplication/MainStartup.cs index 685e60c8a5..33529a31a0 100644 --- a/MediaBrowser.ServerApplication/MainStartup.cs +++ b/MediaBrowser.ServerApplication/MainStartup.cs @@ -2,6 +2,7 @@ using MediaBrowser.Common.Implementations.Logging; using MediaBrowser.Model.Logging; using MediaBrowser.Server.Implementations; +using MediaBrowser.ServerApplication.IO; using MediaBrowser.ServerApplication.Native; using MediaBrowser.ServerApplication.Splash; using MediaBrowser.ServerApplication.Updates; @@ -32,8 +33,8 @@ namespace MediaBrowser.ServerApplication /// public static void Main() { - var startFlag = Environment.GetCommandLineArgs().ElementAtOrDefault(1); - _isRunningAsService = string.Equals(startFlag, "-service", StringComparison.OrdinalIgnoreCase); + var options = new StartupOptions(); + _isRunningAsService = options.ContainsOption("-service"); var applicationPath = Process.GetCurrentProcess().MainModule.FileName; @@ -48,7 +49,7 @@ namespace MediaBrowser.ServerApplication BeginLog(logger, appPaths); // Install directly - if (string.Equals(startFlag, "-installservice", StringComparison.OrdinalIgnoreCase)) + if (options.ContainsOption("-installservice")) { logger.Info("Performing service installation"); InstallService(applicationPath, logger); @@ -56,7 +57,7 @@ namespace MediaBrowser.ServerApplication } // Restart with admin rights, then install - if (string.Equals(startFlag, "-installserviceasadmin", StringComparison.OrdinalIgnoreCase)) + if (options.ContainsOption("-installserviceasadmin")) { logger.Info("Performing service installation"); RunServiceInstallation(applicationPath); @@ -64,7 +65,7 @@ namespace MediaBrowser.ServerApplication } // Uninstall directly - if (string.Equals(startFlag, "-uninstallservice", StringComparison.OrdinalIgnoreCase)) + if (options.ContainsOption("-uninstallservice")) { logger.Info("Performing service uninstallation"); UninstallService(applicationPath, logger); @@ -72,7 +73,7 @@ namespace MediaBrowser.ServerApplication } // Restart with admin rights, then uninstall - if (string.Equals(startFlag, "-uninstallserviceasadmin", StringComparison.OrdinalIgnoreCase)) + if (options.ContainsOption("-uninstallserviceasadmin")) { logger.Info("Performing service uninstallation"); RunServiceUninstallation(applicationPath); @@ -99,7 +100,7 @@ namespace MediaBrowser.ServerApplication try { - RunApplication(appPaths, logManager, _isRunningAsService); + RunApplication(appPaths, logManager, _isRunningAsService, options); } finally { @@ -205,9 +206,10 @@ namespace MediaBrowser.ServerApplication /// The app paths. /// The log manager. /// if set to true [run service]. - private static void RunApplication(ServerApplicationPaths appPaths, ILogManager logManager, bool runService) + /// The options. + 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(); diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj index 6c255f2a87..33bdea0f6c 100644 --- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj +++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj @@ -105,6 +105,7 @@ + Form