Selaa lähdekoodia

Use CommandLineParser package for handling CLI args

PloughPuff 6 vuotta sitten
vanhempi
sitoutus
fd361421b1

+ 2 - 2
Emby.Server.Implementations/ApplicationHost.cs

@@ -141,7 +141,7 @@ namespace Emby.Server.Implementations
                     return false;
                 }
 
-                if (StartupOptions.ContainsOption("-service"))
+                if (StartupOptions.Service)
                 {
                     return false;
                 }
@@ -1747,7 +1747,7 @@ namespace Emby.Server.Implementations
                 EncoderLocationType = MediaEncoder.EncoderLocationType,
                 SystemArchitecture = EnvironmentInfo.SystemArchitecture,
                 SystemUpdateLevel = SystemUpdateLevel,
-                PackageName = StartupOptions.GetOption("-package")
+                PackageName = StartupOptions.PackageName
             };
         }
 

+ 1 - 0
Emby.Server.Implementations/Emby.Server.Implementations.csproj

@@ -22,6 +22,7 @@
   </ItemGroup>
 
   <ItemGroup>
+    <PackageReference Include="CommandLineParser" Version="2.4.3" />
     <PackageReference Include="ServiceStack.Text.Core" Version="5.4.0" />
     <PackageReference Include="sharpcompress" Version="0.22.0" />
     <PackageReference Include="SimpleInjector" Version="4.4.2" />

+ 1 - 1
Emby.Server.Implementations/EntryPoints/StartupWizard.cs

@@ -47,7 +47,7 @@ namespace Emby.Server.Implementations.EntryPoints
             {
                 var options = ((ApplicationHost)_appHost).StartupOptions;
 
-                if (!options.ContainsOption("-noautorunwebapp"))
+                if (!options.NoAutoRunWebApp)
                 {
                     BrowserLauncher.OpenWebApp(_appHost);
                 }

+ 2 - 2
Emby.Server.Implementations/FFMpeg/FFMpegLoader.cs

@@ -30,8 +30,8 @@ namespace Emby.Server.Implementations.FFMpeg
 
         public FFMpegInfo GetFFMpegInfo(StartupOptions options)
         {
-            var customffMpegPath = options.GetOption("-ffmpeg");
-            var customffProbePath = options.GetOption("-ffprobe");
+            var customffMpegPath = options.FFmpeg;
+            var customffProbePath = options.FFprobe;
 
             if (!string.IsNullOrWhiteSpace(customffMpegPath) && !string.IsNullOrWhiteSpace(customffProbePath))
             {

+ 33 - 20
Emby.Server.Implementations/StartupOptions.cs

@@ -1,30 +1,43 @@
-using System;
-using System.Linq;
-
 namespace Emby.Server.Implementations
 {
+    using CommandLine;
+
+    /// <summary>
+    /// Class used by CommandLine package when parsing the command line arguments.
+    /// </summary>
     public class StartupOptions
     {
-        private readonly string[] _options;
+        [Option('d', "programdata", Required = false, HelpText = "Path to use for program data (databases files etc.).")]
+        public string PathProgramData { get; set; }
+
+        [Option('c', "configdir", Required = false, HelpText = "Path to use for config data (user policies and puctures).")]
+        public string PathConfig { get; set; }
+
+        [Option('l', "logdir", Required = false, HelpText = "Path to use for writing log files.")]
+        public string PathLog { get; set; }
+
+
+        [Option("ffmpeg", Required = false, HelpText = "Path to external FFmpeg exe to use in place of built-in.")]
+        public string FFmpeg { get; set; }
+
+        [Option("ffprobe", Required = false, HelpText = "ffmpeg and ffprobe switches must be supplied together.")]
+        public string FFprobe { get; set; }
+
+
+        [Option("service", Required = false, HelpText = "Run as headless service.")]
+        public bool Service { get; set; }
 
-        public StartupOptions(string[] commandLineArgs)
-        {
-            _options = commandLineArgs;
-        }
+        [Option("noautorunwebapp", Required = false, HelpText = "Run headless if startup wizard is complete.")]
+        public bool NoAutoRunWebApp { get; set; }
 
-        public bool ContainsOption(string option)
-            => _options.Contains(option, StringComparer.OrdinalIgnoreCase);
+        [Option("package-name", Required = false, HelpText = "Used when packaging Jellyfin (example, synology).")]
+        public string PackageName { get; set; }
 
-        public string GetOption(string name)
-        {
-            int index = Array.IndexOf(_options, name);
 
-            if (index == -1)
-            {
-                return null;
-            }
+        [Option("restartpath", Required = false, HelpText = "Path to reset script.")]
+        public string RestartPath { get; set; }
 
-            return _options.ElementAtOrDefault(index + 1);
-        }
+        [Option("restartargs", Required = false, HelpText = "Arguments for restart script.")]
+        public string RestartArgs { get; set; }
     }
-}
+ }

+ 1 - 1
Jellyfin.Server/CoreAppHost.cs

@@ -16,7 +16,7 @@ namespace Jellyfin.Server
         {
         }
 
-        public override bool CanSelfRestart => StartupOptions.ContainsOption("-restartpath");
+        public override bool CanSelfRestart => StartupOptions.RestartPath != null;
 
         protected override void RestartInternal() => Program.Restart();
 

+ 24 - 18
Jellyfin.Server/Program.cs

@@ -26,6 +26,8 @@ using ILogger = Microsoft.Extensions.Logging.ILogger;
 
 namespace Jellyfin.Server
 {
+    using CommandLine;
+
     public static class Program
     {
         private static readonly CancellationTokenSource _tokenSource = new CancellationTokenSource();
@@ -35,14 +37,18 @@ namespace Jellyfin.Server
 
         public static async Task Main(string[] args)
         {
-            StartupOptions options = new StartupOptions(args);
-            Version version = Assembly.GetEntryAssembly().GetName().Version;
-
-            if (options.ContainsOption("-v") || options.ContainsOption("--version"))
-            {
-                Console.WriteLine(version.ToString());
-            }
+            // For CommandLine package, change default behaviour to output errors to stdout (instead of stderr)
+            var parser = new Parser(config => config.HelpWriter = Console.Out);
+
+            // Parse the command line arguments and either start the app or exit indicating error
+            await parser.ParseArguments<StartupOptions>(args)
+                .MapResult(
+                    options => StartApp(options),
+                    errs => Task.FromResult(0)).ConfigureAwait(false);
+        }
 
+        private static async Task StartApp(StartupOptions options)
+        {
             ServerApplicationPaths appPaths = CreateApplicationPaths(options);
 
             // $JELLYFIN_LOG_DIR needs to be set for the logger configuration manager
@@ -78,7 +84,7 @@ namespace Jellyfin.Server
                 Shutdown();
             };
 
-            _logger.LogInformation("Jellyfin version: {Version}", version);
+            _logger.LogInformation("Jellyfin version: {Version}", Assembly.GetEntryAssembly().GetName().Version);
 
             EnvironmentInfo environmentInfo = new EnvironmentInfo(getOperatingSystem());
             ApplicationHost.LogEnvironmentInfo(_logger, appPaths, environmentInfo);
@@ -133,9 +139,9 @@ namespace Jellyfin.Server
             string programDataPath = Environment.GetEnvironmentVariable("JELLYFIN_DATA_PATH");
             if (string.IsNullOrEmpty(programDataPath))
             {
-                if (options.ContainsOption("-programdata"))
+                if (options.PathProgramData != null)
                 {
-                    programDataPath = options.GetOption("-programdata");
+                    programDataPath = options.PathProgramData;
                 }
                 else
                 {
@@ -171,9 +177,9 @@ namespace Jellyfin.Server
             string configDir = Environment.GetEnvironmentVariable("JELLYFIN_CONFIG_DIR");
             if (string.IsNullOrEmpty(configDir))
             {
-                if (options.ContainsOption("-configdir"))
+                if (options.PathConfig != null)
                 {
-                    configDir = options.GetOption("-configdir");
+                    configDir = options.PathConfig;
                 }
                 else
                 {
@@ -190,9 +196,9 @@ namespace Jellyfin.Server
             string logDir = Environment.GetEnvironmentVariable("JELLYFIN_LOG_DIR");
             if (string.IsNullOrEmpty(logDir))
             {
-                if (options.ContainsOption("-logdir"))
+                if (options.PathLog != null)
                 {
-                    logDir = options.GetOption("-logdir");
+                    logDir = options.PathLog;
                 }
                 else
                 {
@@ -315,11 +321,11 @@ namespace Jellyfin.Server
             Shutdown();
         }
 
-        private static void StartNewInstance(StartupOptions startupOptions)
+        private static void StartNewInstance(StartupOptions options)
         {
             _logger.LogInformation("Starting new instance");
 
-            string module = startupOptions.GetOption("-restartpath");
+            string module = options.RestartPath;
 
             if (string.IsNullOrWhiteSpace(module))
             {
@@ -328,9 +334,9 @@ namespace Jellyfin.Server
 
             string commandLineArgsString;
 
-            if (startupOptions.ContainsOption("-restartargs"))
+            if (options.RestartArgs != null)
             {
-                commandLineArgsString = startupOptions.GetOption("-restartargs") ?? string.Empty;
+                commandLineArgsString = options.RestartArgs ?? string.Empty;
             }
             else
             {