From b85571b15969d604bbb5f1591b010d8264bf2a3b Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Tue, 15 Jul 2025 13:51:26 +0000 Subject: [PATCH] allow uploading large watermarks (#2151) --- CHANGELOG.md | 2 + ErsatzTV.Core/FileSystemLayout.cs | 4 +- ErsatzTV.Core/SystemEnvironment.cs | 48 +++++++++++++++++++ .../Plex/PlexTvApiClient.cs | 3 +- ErsatzTV/Pages/WatermarkEditor.razor | 10 ++-- ErsatzTV/Program.cs | 17 +------ .../RunOnce/EndpointValidatorService.cs | 4 +- ErsatzTV/Startup.cs | 2 +- 8 files changed, 63 insertions(+), 27 deletions(-) create mode 100644 ErsatzTV.Core/SystemEnvironment.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a745038e..5d3cfdb81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -81,6 +81,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - `num`: the mid-roll point number, starting with 1 - Add `Disable Watermarks` checkbox to block items - Block items that have this checked will never display a watermark, even with Deco set to override watermark +- Add `ETV_MAXIMUM_UPLOAD_MB` environment variable to allow uploading large watermarks + - Default value is 10 ### Changed - Allow `Other Video` libraries and `Image` libraries to use the same folders diff --git a/ErsatzTV.Core/FileSystemLayout.cs b/ErsatzTV.Core/FileSystemLayout.cs index 3f639bb14..793f8c524 100644 --- a/ErsatzTV.Core/FileSystemLayout.cs +++ b/ErsatzTV.Core/FileSystemLayout.cs @@ -75,7 +75,7 @@ public static class FileSystemLayout Environment.SpecialFolderOption.DoNotVerify), "ersatztv"); - string customConfigFolder = Environment.GetEnvironmentVariable("ETV_CONFIG_FOLDER"); + string customConfigFolder = SystemEnvironment.ConfigFolder; bool useCustomConfigFolder = !string.IsNullOrWhiteSpace(customConfigFolder); if (useCustomConfigFolder && isDocker) @@ -101,7 +101,7 @@ public static class FileSystemLayout Environment.SpecialFolderOption.DoNotVerify), "etv-transcode"); - string customTranscodeFolder = Environment.GetEnvironmentVariable("ETV_TRANSCODE_FOLDER"); + string customTranscodeFolder = SystemEnvironment.TranscodeFolder; bool useCustomTranscodeFolder = !string.IsNullOrWhiteSpace(customTranscodeFolder); if (useCustomTranscodeFolder && isDocker) diff --git a/ErsatzTV.Core/SystemEnvironment.cs b/ErsatzTV.Core/SystemEnvironment.cs new file mode 100644 index 000000000..e6d5633cf --- /dev/null +++ b/ErsatzTV.Core/SystemEnvironment.cs @@ -0,0 +1,48 @@ +namespace ErsatzTV.Core; + +public class SystemEnvironment +{ + static SystemEnvironment() + { + BaseUrl = Environment.GetEnvironmentVariable("ETV_BASE_URL"); + + ConfigFolder = Environment.GetEnvironmentVariable("ETV_CONFIG_FOLDER"); + + TranscodeFolder = Environment.GetEnvironmentVariable("ETV_TRANSCODE_FOLDER"); + + string uiPortVariable = Environment.GetEnvironmentVariable("ETV_UI_PORT"); + if (!int.TryParse(uiPortVariable, out int uiPort)) + { + uiPort = 8409; + } + + UiPort = uiPort; + + string streamingPortVariable = Environment.GetEnvironmentVariable("ETV_STREAMING_PORT"); + if (!int.TryParse(streamingPortVariable, out int streamingPort)) + { + streamingPort = 8409; + } + + StreamingPort = streamingPort; + + AllowSharedPlexServers = + !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("ETV_ALLOW_SHARED_PLEX_SERVERS")); + + string maximumUploadMbVariable = Environment.GetEnvironmentVariable("ETV_MAXIMUM_UPLOAD_MB"); + if (!int.TryParse(maximumUploadMbVariable, out int maximumUploadMb)) + { + maximumUploadMb = 10; + } + + MaximumUploadMb = maximumUploadMb; + } + + public static string BaseUrl { get; } + public static string ConfigFolder { get; } + public static string TranscodeFolder { get; } + public static int UiPort { get; } + public static int StreamingPort { get; } + public static bool AllowSharedPlexServers { get; } + public static int MaximumUploadMb { get; } +} diff --git a/ErsatzTV.Infrastructure/Plex/PlexTvApiClient.cs b/ErsatzTV.Infrastructure/Plex/PlexTvApiClient.cs index ae7da382c..f12bcb080 100644 --- a/ErsatzTV.Infrastructure/Plex/PlexTvApiClient.cs +++ b/ErsatzTV.Infrastructure/Plex/PlexTvApiClient.cs @@ -48,8 +48,7 @@ public class PlexTvApiClient : IPlexTvApiClient IEnumerable ownedServers = allServers; - string allowSharedServers = Environment.GetEnvironmentVariable("ETV_ALLOW_SHARED_PLEX_SERVERS"); - if (string.IsNullOrWhiteSpace(allowSharedServers)) + if (!SystemEnvironment.AllowSharedPlexServers) { ownedServers = ownedServers.Filter(r => r.Owned); } diff --git a/ErsatzTV/Pages/WatermarkEditor.razor b/ErsatzTV/Pages/WatermarkEditor.razor index 10a2589a3..5bae97150 100644 --- a/ErsatzTV/Pages/WatermarkEditor.razor +++ b/ErsatzTV/Pages/WatermarkEditor.razor @@ -67,7 +67,9 @@ @if (!string.IsNullOrWhiteSpace(_model.Image?.Path) && _model.ImageSource == ChannelWatermarkImageSource.Custom) { - +
+ +
} @@ -250,7 +252,7 @@ try { Either maybeCacheFileName = await Mediator.Send( - new SaveArtworkToDisk(e.File.OpenReadStream(10 * 1024 * 1024), ArtworkKind.Watermark, e.File.ContentType), + new SaveArtworkToDisk(e.File.OpenReadStream(SystemEnvironment.MaximumUploadMb * 1024 * 1024), ArtworkKind.Watermark, e.File.ContentType), _cts.Token); maybeCacheFileName.Match( relativeFileName => @@ -266,8 +268,8 @@ } catch (IOException) { - Snackbar.Add("Watermark exceeds maximum allowed file size of 10 MB", Severity.Error); - Logger.LogError("Watermark exceeds maximum allowed file size of 10 MB"); + Snackbar.Add($"Watermark exceeds maximum allowed file size of {SystemEnvironment.MaximumUploadMb} MB", Severity.Error); + Logger.LogError("Watermark exceeds maximum allowed file size of {MaximumUploadMb} MB", SystemEnvironment.MaximumUploadMb); } catch (Exception ex) { diff --git a/ErsatzTV/Program.cs b/ErsatzTV/Program.cs index 623d14b5e..9ee149227 100644 --- a/ErsatzTV/Program.cs +++ b/ErsatzTV/Program.cs @@ -134,21 +134,8 @@ public class Program private static IHostBuilder CreateHostBuilder(string[] args) { - string uiPortVariable = Environment.GetEnvironmentVariable("ETV_UI_PORT"); - if (!int.TryParse(uiPortVariable, out int uiPort)) - { - uiPort = 8409; - } - - Settings.UiPort = uiPort; - - string streamingPortVariable = Environment.GetEnvironmentVariable("ETV_STREAMING_PORT"); - if (!int.TryParse(streamingPortVariable, out int streamingPort)) - { - streamingPort = 8409; - } - - Settings.StreamingPort = streamingPort; + Settings.UiPort = SystemEnvironment.UiPort; + Settings.StreamingPort = SystemEnvironment.StreamingPort; return Host.CreateDefaultBuilder(args) .ConfigureServices(services => services.AddSingleton(LoggingLevelSwitches)) diff --git a/ErsatzTV/Services/RunOnce/EndpointValidatorService.cs b/ErsatzTV/Services/RunOnce/EndpointValidatorService.cs index 5b812b626..d40b9a983 100644 --- a/ErsatzTV/Services/RunOnce/EndpointValidatorService.cs +++ b/ErsatzTV/Services/RunOnce/EndpointValidatorService.cs @@ -17,12 +17,10 @@ public class EndpointValidatorService : BackgroundService { await Task.Yield(); - string baseUrl = Environment.GetEnvironmentVariable("ETV_BASE_URL"); - _logger.LogInformation( "Server will listen on streaming port {StreamingPort}, UI port {UiPort} - try UI at {UI}", Settings.StreamingPort, Settings.UiPort, - $"http://localhost:{Settings.UiPort}{baseUrl}"); + $"http://localhost:{Settings.UiPort}{SystemEnvironment.BaseUrl}"); } } diff --git a/ErsatzTV/Startup.cs b/ErsatzTV/Startup.cs index 373aa78bb..abd7472f4 100644 --- a/ErsatzTV/Startup.cs +++ b/ErsatzTV/Startup.cs @@ -451,7 +451,7 @@ public class Startup public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { - string baseUrl = Environment.GetEnvironmentVariable("ETV_BASE_URL"); + string baseUrl = SystemEnvironment.BaseUrl; if (!string.IsNullOrWhiteSpace(baseUrl)) { try