From 70472ac84e608a9cc7d41c5ad0f18815e4365750 Mon Sep 17 00:00:00 2001
From: Jason Dove <1695733+jasongdove@users.noreply.github.com>
Date: Mon, 14 Apr 2025 18:21:05 +0000
Subject: [PATCH] add public port env vars; allow streaming through ui port
 (#1993)

---
 CHANGELOG.md                            |  2 ++
 ErsatzTV.Core/Settings.cs               |  3 ++
 ErsatzTV/Program.cs                     | 37 +++++++++++++++++++------
 ErsatzTV/Properties/launchSettings.json |  4 ++-
 ErsatzTV/Startup.cs                     | 16 ++---------
 5 files changed, 38 insertions(+), 24 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 19746635..1bdf0110 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - Add environment variables to allow ETV to run UI and streaming on separate ports
     - `ETV_STREAMING_PORT`: port used for streaming requests, defaults to 8409
     - `ETV_UI_PORT`: port used for admin UI, defaults to 8409
+    - `ETV_PUBLIC_STREAMING_PORT`: port used for streaming requests at reverse proxy, defaults to 8409
+    - `ETV_PUBLIC_UI_PORT`: port used for admin UI at reverse proxy, defaults to 8409
 
 ### Fixed
 - Fix error message about synchronizing Plex collections from a Plex server that has zero collections
diff --git a/ErsatzTV.Core/Settings.cs b/ErsatzTV.Core/Settings.cs
index 519cc720..2cae0b98 100644
--- a/ErsatzTV.Core/Settings.cs
+++ b/ErsatzTV.Core/Settings.cs
@@ -4,4 +4,7 @@ public static class Settings
 {
     public static int UiPort { get; set; }
     public static int StreamingPort { get; set; }
+
+    public static int PublicUiPort { get; set; }
+    public static int PublicStreamingPort { get; set; }
 }
diff --git a/ErsatzTV/Program.cs b/ErsatzTV/Program.cs
index 2599a60d..30b77d43 100644
--- a/ErsatzTV/Program.cs
+++ b/ErsatzTV/Program.cs
@@ -138,31 +138,50 @@ public class Program
         {
             uiPort = 8409;
         }
+
         Settings.UiPort = uiPort;
 
+        string publicUiPortVariable = Environment.GetEnvironmentVariable("ETV_PUBLIC_UI_PORT");
+        if (!int.TryParse(publicUiPortVariable, out int publicUiPort))
+        {
+            publicUiPort = 8409;
+        }
+
+        Settings.PublicUiPort = publicUiPort;
+
         string streamingPortVariable = Environment.GetEnvironmentVariable("ETV_STREAMING_PORT");
         if (!int.TryParse(streamingPortVariable, out int streamingPort))
         {
             streamingPort = 8409;
         }
+
         Settings.StreamingPort = streamingPort;
 
+        string publicStreamingPortVariable = Environment.GetEnvironmentVariable("ETV_PUBLIC_STREAMING_PORT");
+        if (!int.TryParse(publicStreamingPortVariable, out int publicStreamingPort))
+        {
+            publicStreamingPort = 8409;
+        }
+
+        Settings.PublicStreamingPort = publicStreamingPort;
+
         return Host.CreateDefaultBuilder(args)
             .ConfigureServices(services => services.AddSingleton(LoggingLevelSwitches))
             .ConfigureWebHostDefaults(
                 webBuilder => webBuilder.UseStartup<Startup>()
                     .UseConfiguration(Configuration)
-                    .UseKestrel(options =>
-                    {
-                        options.ListenAnyIP(Settings.UiPort);
-
-                        if (Settings.StreamingPort != Settings.UiPort)
+                    .UseKestrel(
+                        options =>
                         {
-                            options.ListenAnyIP(Settings.StreamingPort);
-                        }
+                            options.ListenAnyIP(Settings.UiPort);
+
+                            if (Settings.StreamingPort != Settings.UiPort)
+                            {
+                                options.ListenAnyIP(Settings.StreamingPort);
+                            }
 
-                        options.AddServerHeader = false;
-                    })
+                            options.AddServerHeader = false;
+                        })
                     .UseContentRoot(BasePath))
             .UseSerilog();
     }
diff --git a/ErsatzTV/Properties/launchSettings.json b/ErsatzTV/Properties/launchSettings.json
index b8b4d58b..0a3a74d9 100644
--- a/ErsatzTV/Properties/launchSettings.json
+++ b/ErsatzTV/Properties/launchSettings.json
@@ -7,7 +7,9 @@
         "ASPNETCORE_ENVIRONMENT": "Development",
         "DOTNET_ENVIRONMENT": "Development",
         "ETV_STREAMING_PORT": "8409",
-        "ETV_UI_PORT": "8410"
+        "ETV_UI_PORT": "8410",
+        "ETV_PUBLIC_STREAMING_PORT": "8409",
+        "ETV_PUBLIC_UI_PORT": "8410"
       }
     }
   }
diff --git a/ErsatzTV/Startup.cs b/ErsatzTV/Startup.cs
index eed819d5..ff0c3b68 100644
--- a/ErsatzTV/Startup.cs
+++ b/ErsatzTV/Startup.cs
@@ -592,23 +592,11 @@ public class Startup
         else
         {
             app.MapWhen(
-                ctx => ctx.Request.Host.Port == Settings.UiPort,
+                ctx => ctx.Request.Host.Port == Settings.UiPort || ctx.Request.Host.Port == Settings.PublicUiPort,
                 uiApp =>
                 {
                     uiApp.UseRouting();
 
-                    uiApp.UseWhen(
-                        c => c.Request.Path.StartsWithSegments("/iptv"), // && !IPAddress.IsLoopback(c.Connection.RemoteIpAddress ?? IPAddress.None),
-                        a =>
-                        {
-                            a.Run(
-                                c =>
-                                {
-                                    c.Response.StatusCode = 404;
-                                    return Task.CompletedTask;
-                                });
-                        });
-
                     if (OidcHelper.IsEnabled)
                     {
                         uiApp.UseAuthentication();
@@ -627,7 +615,7 @@ public class Startup
                 });
 
             app.MapWhen(
-                ctx => ctx.Request.Host.Port == Settings.StreamingPort,
+                ctx => ctx.Request.Host.Port == Settings.StreamingPort || ctx.Request.Host.Port == Settings.PublicStreamingPort,
                 streamingApp =>
                 {
                     streamingApp.UseRouting();