From 14ecbfa1b831b5e0be9999f4e8fd3d8941421a53 Mon Sep 17 00:00:00 2001 From: Glenn Thompson Date: Fri, 24 Oct 2025 05:54:26 +0300 Subject: [PATCH] Fix: Add dynamic stream URL detection for multi-environment support - Add get-stream-base-url() function that detects host from HTTP request - Replace hardcoded *stream-base-url* with dynamic function calls in all templates - Supports localhost, Tailscale, and VPS deployments automatically - Fixes JavaScript error 'streamBaseUrl is null' on remote access - Maintains backward compatibility with ASTEROID_STREAM_URL env var --- asteroid.lisp | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/asteroid.lisp b/asteroid.lisp index 7f61005..d42def2 100644 --- a/asteroid.lisp +++ b/asteroid.lisp @@ -21,6 +21,17 @@ (defparameter *supported-formats* '("mp3" "flac" "ogg" "wav")) (defparameter *stream-base-url* "http://localhost:8000") +(defun get-stream-base-url () + "Get the stream base URL, using the request host if available" + (if (boundp 'radiance:*request*) + (let* ((host (or (header "Host") "localhost:8080")) + ;; Remove port if present and add :8000 + (host-without-port (if (position #\: host) + (subseq host 0 (position #\: host)) + host))) + (format nil "http://~a:8000" host-without-port)) + *stream-base-url*)) + ;; Configure JSON as the default API format (define-api-format json (data) "JSON API format for Radiance" @@ -528,8 +539,8 @@ :status-message "🟢 LIVE - Broadcasting asteroid music for hackers" :listeners "0" :stream-quality "128kbps MP3" - :stream-base-url *stream-base-url* - :default-stream-url (concatenate 'string *stream-base-url* "/asteroid.aac") + :stream-base-url (get-stream-base-url) + :default-stream-url (concatenate 'string (get-stream-base-url) "/asteroid.aac") :default-stream-encoding "audio/aac" :default-stream-encoding-desc "AAC 96kbps Stereo" :now-playing-artist "The Void" @@ -558,7 +569,7 @@ :status-message "🟢 LIVE - Broadcasting asteroid music for hackers" :listeners "0" :stream-quality "128kbps MP3" - :stream-base-url *stream-base-url* + :stream-base-url (get-stream-base-url) :now-playing-artist "The Void" :now-playing-track "Silence" :now-playing-album "Startup Sounds" @@ -571,8 +582,8 @@ (asdf:system-source-directory :asteroid)))) (clip:process-to-string (plump:parse (alexandria:read-file-into-string template-path)) - :stream-base-url *stream-base-url* - :default-stream-url (concatenate 'string *stream-base-url* "/asteroid.aac") + :stream-base-url (get-stream-base-url) + :default-stream-url (concatenate 'string (get-stream-base-url) "/asteroid.aac") :default-stream-encoding "audio/aac"))) ;; Configure static file serving for other files @@ -622,8 +633,8 @@ :icecast-status (check-icecast-status) :track-count (format nil "~d" track-count) :library-path "/home/glenn/Projects/Code/asteroid/music/library/" - :stream-base-url *stream-base-url* - :default-stream-url (concatenate 'string *stream-base-url* "/asteroid.aac")))) + :stream-base-url (get-stream-base-url) + :default-stream-url (concatenate 'string (get-stream-base-url) "/asteroid.aac")))) ;; User Management page (requires authentication) (define-page users-management #@"/admin/user" () @@ -867,8 +878,8 @@ (clip:process-to-string (plump:parse (alexandria:read-file-into-string template-path)) :title "Asteroid Radio - Web Player" - :stream-base-url *stream-base-url* - :default-stream-url (concatenate 'string *stream-base-url* "/asteroid.aac") + :stream-base-url (get-stream-base-url) + :default-stream-url (concatenate 'string (get-stream-base-url) "/asteroid.aac") :bitrate "128kbps MP3" :now-playing-artist "The Void" :now-playing-track "Silence" @@ -883,8 +894,8 @@ (clip:process-to-string (plump:parse (alexandria:read-file-into-string template-path)) :title "Asteroid Radio - Web Player" - :stream-base-url *stream-base-url* - :default-stream-url (concatenate 'string *stream-base-url* "/asteroid.aac") + :stream-base-url (get-stream-base-url) + :default-stream-url (concatenate 'string (get-stream-base-url) "/asteroid.aac") :default-stream-encoding "audio/aac"))) (define-page popout-player #@"/popout-player" () @@ -893,8 +904,8 @@ (asdf:system-source-directory :asteroid)))) (clip:process-to-string (plump:parse (alexandria:read-file-into-string template-path)) - :stream-base-url *stream-base-url* - :default-stream-url (concatenate 'string *stream-base-url* "/asteroid.aac") + :stream-base-url (get-stream-base-url) + :default-stream-url (concatenate 'string (get-stream-base-url) "/asteroid.aac") :default-stream-encoding "audio/aac"))) (define-api asteroid/status () ()