|
@@ -1724,6 +1724,11 @@ namespace Jellyfin.Api.Controllers
|
|
[FromQuery, Range(0, 100)] int quality = 90)
|
|
[FromQuery, Range(0, 100)] int quality = 90)
|
|
{
|
|
{
|
|
var brandingOptions = _serverConfigurationManager.GetConfiguration<BrandingOptions>("branding");
|
|
var brandingOptions = _serverConfigurationManager.GetConfiguration<BrandingOptions>("branding");
|
|
|
|
+ if (!brandingOptions.SplashscreenEnabled)
|
|
|
|
+ {
|
|
|
|
+ return NotFound();
|
|
|
|
+ }
|
|
|
|
+
|
|
string splashscreenPath;
|
|
string splashscreenPath;
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(brandingOptions.SplashscreenLocation)
|
|
if (!string.IsNullOrWhiteSpace(brandingOptions.SplashscreenLocation)
|
|
@@ -1776,6 +1781,7 @@ namespace Jellyfin.Api.Controllers
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
/// Uploads a custom splashscreen.
|
|
/// Uploads a custom splashscreen.
|
|
|
|
+ /// The body is expected to the image contents base64 encoded.
|
|
/// </summary>
|
|
/// </summary>
|
|
/// <returns>A <see cref="NoContentResult"/> indicating success.</returns>
|
|
/// <returns>A <see cref="NoContentResult"/> indicating success.</returns>
|
|
/// <response code="204">Successfully uploaded new splashscreen.</response>
|
|
/// <response code="204">Successfully uploaded new splashscreen.</response>
|
|
@@ -1799,7 +1805,13 @@ namespace Jellyfin.Api.Controllers
|
|
return BadRequest("Error reading mimetype from uploaded image");
|
|
return BadRequest("Error reading mimetype from uploaded image");
|
|
}
|
|
}
|
|
|
|
|
|
- var filePath = Path.Combine(_appPaths.DataPath, "splashscreen-upload" + MimeTypes.ToExtension(mimeType.Value));
|
|
|
|
|
|
+ var extension = MimeTypes.ToExtension(mimeType.Value);
|
|
|
|
+ if (string.IsNullOrEmpty(extension))
|
|
|
|
+ {
|
|
|
|
+ return BadRequest("Error converting mimetype to an image extension");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var filePath = Path.Combine(_appPaths.DataPath, "splashscreen-upload" + extension);
|
|
var brandingOptions = _serverConfigurationManager.GetConfiguration<BrandingOptions>("branding");
|
|
var brandingOptions = _serverConfigurationManager.GetConfiguration<BrandingOptions>("branding");
|
|
brandingOptions.SplashscreenLocation = filePath;
|
|
brandingOptions.SplashscreenLocation = filePath;
|
|
_serverConfigurationManager.SaveConfiguration("branding", brandingOptions);
|
|
_serverConfigurationManager.SaveConfiguration("branding", brandingOptions);
|
|
@@ -1812,6 +1824,29 @@ namespace Jellyfin.Api.Controllers
|
|
return NoContent();
|
|
return NoContent();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// Delete a custom splashscreen.
|
|
|
|
+ /// </summary>
|
|
|
|
+ /// <returns>A <see cref="NoContentResult"/> indicating success.</returns>
|
|
|
|
+ /// <response code="204">Successfully deleted the custom splashscreen.</response>
|
|
|
|
+ /// <response code="403">User does not have permission to delete splashscreen..</response>
|
|
|
|
+ [HttpDelete("Branding/Splashscreen")]
|
|
|
|
+ [Authorize(Policy = Policies.RequiresElevation)]
|
|
|
|
+ [ProducesResponseType(StatusCodes.Status204NoContent)]
|
|
|
|
+ public ActionResult DeleteCustomSplashscreen()
|
|
|
|
+ {
|
|
|
|
+ var brandingOptions = _serverConfigurationManager.GetConfiguration<BrandingOptions>("branding");
|
|
|
|
+ if (!string.IsNullOrEmpty(brandingOptions.SplashscreenLocation)
|
|
|
|
+ && System.IO.File.Exists(brandingOptions.SplashscreenLocation))
|
|
|
|
+ {
|
|
|
|
+ System.IO.File.Delete(brandingOptions.SplashscreenLocation);
|
|
|
|
+ brandingOptions.SplashscreenLocation = null;
|
|
|
|
+ _serverConfigurationManager.SaveConfiguration("branding", brandingOptions);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return NoContent();
|
|
|
|
+ }
|
|
|
|
+
|
|
private static async Task<MemoryStream> GetMemoryStream(Stream inputStream)
|
|
private static async Task<MemoryStream> GetMemoryStream(Stream inputStream)
|
|
{
|
|
{
|
|
using var reader = new StreamReader(inputStream);
|
|
using var reader = new StreamReader(inputStream);
|