Sfoglia il codice sorgente

Add redirect page for old backend routes

- Create redirect.html template with 3-second countdown
- Replace all old Jinja template routes (/, /settings, /playlists,
  /image2sand, /led, /table_control) with redirect to port 80
- Helps users who access port 8080 directly find the new React frontend

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
tuanchris 3 settimane fa
parent
commit
ccd8841b22
2 ha cambiato i file con 127 aggiunte e 12 eliminazioni
  1. 16 12
      main.py
  2. 111 0
      templates/redirect.html

+ 16 - 12
main.py

@@ -554,14 +554,19 @@ async def clear_logs():
     return {"status": "ok", "message": "Logs cleared"}
 
 
-# FastAPI routes
+# FastAPI routes - Redirect old frontend routes to new React frontend on port 80
+def get_redirect_response(request: Request):
+    """Return redirect page pointing users to the new frontend."""
+    host = request.headers.get("host", "localhost").split(":")[0]  # Remove port if present
+    return templates.TemplateResponse("redirect.html", {"request": request, "host": host})
+
 @app.get("/")
 async def index(request: Request):
-    return templates.TemplateResponse("index.html", {"request": request, "app_name": state.app_name, "custom_logo": state.custom_logo})
+    return get_redirect_response(request)
 
 @app.get("/settings")
-async def settings(request: Request):
-    return templates.TemplateResponse("settings.html", {"request": request, "app_name": state.app_name, "custom_logo": state.custom_logo})
+async def settings_page(request: Request):
+    return get_redirect_response(request)
 
 # ============================================================================
 # Unified Settings API
@@ -2352,17 +2357,16 @@ async def preview_thr_batch(request: dict):
     return JSONResponse(content=results, headers=headers)
 
 @app.get("/playlists")
-async def playlists(request: Request):
-    logger.debug("Rendering playlists page")
-    return templates.TemplateResponse("playlists.html", {"request": request, "app_name": state.app_name, "custom_logo": state.custom_logo})
+async def playlists_page(request: Request):
+    return get_redirect_response(request)
 
 @app.get("/image2sand")
-async def image2sand(request: Request):
-    return templates.TemplateResponse("image2sand.html", {"request": request, "app_name": state.app_name, "custom_logo": state.custom_logo})
+async def image2sand_page(request: Request):
+    return get_redirect_response(request)
 
 @app.get("/led")
 async def led_control_page(request: Request):
-    return templates.TemplateResponse("led.html", {"request": request, "app_name": state.app_name, "custom_logo": state.custom_logo})
+    return get_redirect_response(request)
 
 # DW LED control endpoints
 @app.get("/api/dw_leds/status")
@@ -2721,8 +2725,8 @@ async def dw_leds_get_idle_timeout():
     }
 
 @app.get("/table_control")
-async def table_control(request: Request):
-    return templates.TemplateResponse("table_control.html", {"request": request, "app_name": state.app_name, "custom_logo": state.custom_logo})
+async def table_control_page(request: Request):
+    return get_redirect_response(request)
 
 @app.get("/cache-progress")
 async def get_cache_progress_endpoint():

+ 111 - 0
templates/redirect.html

@@ -0,0 +1,111 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Dune Weaver - Redirecting</title>
+    <meta http-equiv="refresh" content="3;url=/">
+    <style>
+        * {
+            margin: 0;
+            padding: 0;
+            box-sizing: border-box;
+        }
+        body {
+            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
+            background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
+            min-height: 100vh;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            color: #e4e4e7;
+        }
+        .container {
+            text-align: center;
+            padding: 2rem;
+            max-width: 500px;
+        }
+        .icon {
+            font-size: 4rem;
+            margin-bottom: 1.5rem;
+            animation: pulse 2s infinite;
+        }
+        @keyframes pulse {
+            0%, 100% { opacity: 1; }
+            50% { opacity: 0.5; }
+        }
+        h1 {
+            font-size: 1.75rem;
+            font-weight: 600;
+            margin-bottom: 1rem;
+            color: #f4f4f5;
+        }
+        p {
+            font-size: 1rem;
+            color: #a1a1aa;
+            margin-bottom: 1.5rem;
+            line-height: 1.6;
+        }
+        .highlight {
+            color: #60a5fa;
+            font-weight: 500;
+        }
+        .countdown {
+            font-size: 2rem;
+            font-weight: bold;
+            color: #60a5fa;
+            margin: 1rem 0;
+        }
+        a {
+            color: #60a5fa;
+            text-decoration: none;
+            font-weight: 500;
+        }
+        a:hover {
+            text-decoration: underline;
+        }
+        .note {
+            font-size: 0.875rem;
+            color: #71717a;
+            margin-top: 2rem;
+            padding-top: 1rem;
+            border-top: 1px solid #27272a;
+        }
+    </style>
+</head>
+<body>
+    <div class="container">
+        <div class="icon">🏜️</div>
+        <h1>Dune Weaver Has a New Home!</h1>
+        <p>
+            The frontend has moved to <span class="highlight">port 80</span>.<br>
+            You're currently on port 8080 (API only).
+        </p>
+        <p>Redirecting in <span class="countdown" id="countdown">3</span> seconds...</p>
+        <p><a href="/" id="redirect-link">Click here</a> if not redirected automatically.</p>
+        <p class="note">
+            Tip: Access Dune Weaver directly at <strong>http://{{ host }}</strong> (no port needed)
+        </p>
+    </div>
+    <script>
+        // Countdown timer
+        let seconds = 3;
+        const countdownEl = document.getElementById('countdown');
+        const redirectLink = document.getElementById('redirect-link');
+
+        // Build redirect URL (same host, port 80)
+        const currentHost = window.location.hostname;
+        const newUrl = 'http://' + currentHost + '/';
+        redirectLink.href = newUrl;
+
+        const timer = setInterval(() => {
+            seconds--;
+            countdownEl.textContent = seconds;
+            if (seconds <= 0) {
+                clearInterval(timer);
+                window.location.href = newUrl;
+            }
+        }, 1000);
+    </script>
+</body>
+</html>