#nullable enable using System.Threading.Tasks; using Jellyfin.Api.Models.ConfigurationDtos; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.MediaEncoding; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Serialization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ModelBinding; namespace Jellyfin.Api.Controllers { /// /// Configuration Controller. /// [Route("System")] [Authenticated] public class ConfigurationController : BaseJellyfinApiController { private readonly IServerConfigurationManager _configurationManager; private readonly IMediaEncoder _mediaEncoder; private readonly IJsonSerializer _jsonSerializer; /// /// Initializes a new instance of the class. /// /// Instance of the interface. /// Instance of the interface. /// Instance of the interface. public ConfigurationController( IServerConfigurationManager configurationManager, IMediaEncoder mediaEncoder, IJsonSerializer jsonSerializer) { _configurationManager = configurationManager; _mediaEncoder = mediaEncoder; _jsonSerializer = jsonSerializer; } /// /// Gets application configuration. /// /// Application configuration. [HttpGet("Configuration")] [ProducesResponseType(StatusCodes.Status200OK)] public ActionResult GetConfiguration() { return Ok(_configurationManager.Configuration); } /// /// Updates application configuration. /// /// Configuration. /// Status. [HttpPost("Configuration")] [Authenticated(Roles = "Admin")] [ProducesResponseType(StatusCodes.Status200OK)] public ActionResult UpdateConfiguration([FromBody, BindRequired] ServerConfiguration configuration) { _configurationManager.ReplaceConfiguration(configuration); return Ok(); } /// /// Gets a named configuration. /// /// Configuration key. /// Configuration. [HttpGet("Configuration/{Key}")] [ProducesResponseType(StatusCodes.Status200OK)] public ActionResult GetNamedConfiguration([FromRoute] string key) { return Ok(_configurationManager.GetConfiguration(key)); } /// /// Updates named configuration. /// /// Configuration key. /// Status. [HttpPost("Configuration/{Key}")] [Authenticated(Roles = "Admin")] [ProducesResponseType(StatusCodes.Status200OK)] public async Task UpdateNamedConfiguration([FromRoute] string key) { var configurationType = _configurationManager.GetConfigurationType(key); /* // TODO switch to System.Text.Json when https://github.com/dotnet/runtime/issues/30255 is fixed. var configuration = await JsonSerializer.DeserializeAsync(Request.Body, configurationType); */ var configuration = await _jsonSerializer.DeserializeFromStreamAsync(Request.Body, configurationType) .ConfigureAwait(false); _configurationManager.SaveConfiguration(key, configuration); return Ok(); } /// /// Gets a default MetadataOptions object. /// /// MetadataOptions. [HttpGet("Configuration/MetadataOptions/Default")] [Authenticated(Roles = "Admin")] [ProducesResponseType(StatusCodes.Status200OK)] public ActionResult GetDefaultMetadataOptions() { return Ok(new MetadataOptions()); } /// /// Updates the path to the media encoder. /// /// Media encoder path form body. /// Status. [HttpPost("MediaEncoder/Path")] [Authenticated(Roles = "Admin", AllowBeforeStartupWizard = true)] [ProducesResponseType(StatusCodes.Status200OK)] public ActionResult UpdateMediaEncoderPath([FromForm, BindRequired] MediaEncoderPathDto mediaEncoderPath) { _mediaEncoder.UpdateEncoderPath(mediaEncoderPath.Path, mediaEncoderPath.PathType); return Ok(); } } }