Files
pgsql-jellyfin/Jellyfin.Server/StartupOptions.cs
wjones c38adfc0f7 Add file-based startup config & temp dir option
Added support for configuring all major Jellyfin paths (data, config, cache, log, temp, web) via a `startup.json` file, with priority after CLI and environment variables. Introduced a new `TempDir` option, configurable through CLI, env var, or config file, with backward-compatible defaults. Refactored path resolution logic to integrate file-based config and ensure directory creation. Updated constructors and CLI options to support temp directory. Improved EF Core migration error handling and logging. Added comprehensive documentation and example config files. All changes are backward compatible.
2026-02-25 15:18:23 -05:00

125 lines
5.0 KiB
C#

// <copyright file="StartupOptions.cs" company="PlaceholderCompany">
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
namespace Jellyfin.Server
{
using System.Collections.Generic;
using CommandLine;
using Emby.Server.Implementations;
using static MediaBrowser.Controller.Extensions.ConfigurationExtensions;
/// <summary>
/// Class used by CommandLine package when parsing the command line arguments.
/// </summary>
public class StartupOptions : IStartupOptions
{
/// <summary>
/// Gets or sets the path to the data directory.
/// </summary>
/// <value>The path to the data directory.</value>
[Option('d', "datadir", Required = false, HelpText = "Path to use for the data folder (database files, etc.).")]
public string? DataDir { get; set; }
/// <summary>
/// Gets or sets a value indicating whether the server should not host the web client.
/// </summary>
[Option("nowebclient", Required = false, HelpText = "Indicates that the web server should not host the web client.")]
public bool NoWebClient { get; set; }
/// <summary>
/// Gets or sets the path to the web directory.
/// </summary>
/// <value>The path to the web directory.</value>
[Option('w', "webdir", Required = false, HelpText = "Path to the Jellyfin web UI resources.")]
public string? WebDir { get; set; }
/// <summary>
/// Gets or sets the path to the cache directory.
/// </summary>
/// <value>The path to the cache directory.</value>
[Option('C', "cachedir", Required = false, HelpText = "Path to use for caching.")]
public string? CacheDir { get; set; }
/// <summary>
/// Gets or sets the path to the config directory.
/// </summary>
/// <value>The path to the config directory.</value>
[Option('c', "configdir", Required = false, HelpText = "Path to use for configuration data (user settings and pictures).")]
public string? ConfigDir { get; set; }
/// <summary>
/// Gets or sets the path to the log directory.
/// </summary>
/// <value>The path to the log directory.</value>
[Option('l', "logdir", Required = false, HelpText = "Path to use for writing log files.")]
public string? LogDir { get; set; }
/// <summary>
/// Gets or sets the path to the temp directory.
/// </summary>
/// <value>The path to the temp directory.</value>
[Option('t', "tempdir", Required = false, HelpText = "Path to use for temporary files.")]
public string? TempDir { get; set; }
/// <inheritdoc />
[Option("ffmpeg", Required = false, HelpText = "Path to external FFmpeg executable to use in place of default found in PATH.")]
public string? FFmpegPath { get; set; }
/// <inheritdoc />
[Option("service", Required = false, HelpText = "Run as headless service.")]
public bool IsService { get; set; }
/// <inheritdoc />
[Option("package-name", Required = false, HelpText = "Used when packaging Jellyfin (example, synology).")]
public string? PackageName { get; set; }
/// <inheritdoc />
[Option("published-server-url", Required = false, HelpText = "Jellyfin Server URL to publish via auto discover process")]
public string? PublishedServerUrl { get; set; }
/// <summary>
/// Gets or sets a value indicating whether the server should not detect network status change.
/// </summary>
[Option("nonetchange", Required = false, HelpText = "Indicates that the server should not detect network status change.")]
public bool NoDetectNetworkChange { get; set; }
/// <summary>
/// Gets or sets the path to an jellyfin backup archive to restore the application to.
/// </summary>
[Option("restore-archive", Required = false, HelpText = "Path to a Jellyfin backup archive to restore from")]
public string? RestoreArchive { get; set; }
/// <summary>
/// Gets the command line options as a dictionary that can be used in the .NET configuration system.
/// </summary>
/// <returns>The configuration dictionary.</returns>
public Dictionary<string, string?> ConvertToConfig()
{
var config = new Dictionary<string, string?>();
if (NoWebClient)
{
config.Add(HostWebClientKey, bool.FalseString);
}
if (PublishedServerUrl is not null)
{
config.Add(AddressOverrideKey, PublishedServerUrl);
}
if (FFmpegPath is not null)
{
config.Add(FfmpegPathKey, FFmpegPath);
}
if (NoDetectNetworkChange)
{
config.Add(DetectNetworkChangeKey, bool.FalseString);
}
return config;
}
}
}