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
This commit is contained in:
Glenn Thompson 2025-10-24 05:54:26 +03:00
parent a795680e99
commit 14ecbfa1b8
1 changed files with 24 additions and 13 deletions

View File

@ -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 () ()