diff --git a/Makefile b/Makefile index 3f08f63..05f852f 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,7 @@ PACKAGE=asteroid PACKAGEUTILS=asteroid.app-utils OUT=asteroid ENTRY=-main +BROWN_MM="Nil" .PHONY: $(OUT) $(OUT): clean diff --git a/asteroid.asd b/asteroid.asd index 6bb8fb7..65e5951 100644 --- a/asteroid.asd +++ b/asteroid.asd @@ -11,25 +11,28 @@ :class "radiance:virtual-module" :depends-on (:slynk :lparallel + :alexandria + :cl-json :radiance - :i-log4cl - :r-clip - :r-simple-rate - :r-simple-profile :lass :parenscript - :cl-json - :alexandria :local-time :taglib - :r-data-model :ironclad :babel :cl-fad :bordeaux-threads :drakma + ;; radiance interfaces + :i-log4cl + ;; :i-postmodern + :r-clip + :r-data-model + :r-simple-profile + :r-simple-rate (:interface :auth) (:interface :database) + (:interface :relational-database) (:interface :user)) :pathname "./" :components ((:file "app-utils") diff --git a/asteroid.lisp b/asteroid.lisp index 8ff938f..c9f0b1f 100644 --- a/asteroid.lisp +++ b/asteroid.lisp @@ -924,11 +924,10 @@ (compile-styles) ; Generate CSS file using LASS ;; Ensure RADIANCE environment is properly set before startup - (unless (radiance:environment) - (setf (radiance:environment) "default")) + ;; (unless (radiance:environment) + ;; (setf (radiance:environment) "asteroid")) - (radiance:startup) - (format t "Server started! Visit http://localhost:~a/asteroid/~%" port)) + (radiance:startup)) (defun stop-server () "Stop the Asteroid Radio RADIANCE server" @@ -950,13 +949,19 @@ (defun ensure-radiance-environment () "Ensure RADIANCE environment is properly configured for persistence" (unless (radiance:environment) - (setf (radiance:environment) "default")) - - ;; Ensure the database directory exists - (let ((db-dir (merge-pathnames ".config/radiance/default/i-lambdalite/radiance.db/" - (user-homedir-pathname)))) - (ensure-directories-exist db-dir) - (format t "Database directory: ~a~%" db-dir))) + (setf (radiance:environment) "asteroid")) + + (log:info "~2&~15A - ~A~%~15A - ~A~%~15A - ~A~%~15A - ~A~%~15A - ~A~2%" + ":configuration" + (radiance:environment-directory (radiance-core:environment) :configuration) + ":cache" + (radiance:environment-directory (radiance-core:environment) :cache) + ":data" + (radiance:environment-directory (radiance-core:environment) :data) + ":template" + (radiance:environment-directory (radiance-core:environment) :template) + ":static" + (radiance:environment-directory (radiance-core:environment) :static))) (defun -main (&optional args (debug t)) (declare (ignorable args)) diff --git a/auth-routes.lisp b/auth-routes.lisp index f8db8db..6aa5aec 100644 --- a/auth-routes.lisp +++ b/auth-routes.lisp @@ -22,9 +22,9 @@ (user-role (if (listp user-role-raw) (first user-role-raw) user-role-raw)) (redirect-path (cond ;; Admin users go to admin dashboard - ((string-equal user-role "admin") "/asteroid/admin") + ((string-equal user-role "admin") "/admin") ;; All other users go to their profile - (t "/asteroid/profile")))) + (t "/profile")))) (format t "User ID from DB: ~a~%" user-id) (format t "User role: ~a, redirecting to: ~a~%" user-role redirect-path) (setf (session:field "user-id") (if (listp user-id) (first user-id) user-id)) diff --git a/build-asteroid.lisp b/build-asteroid.lisp index de1614c..e347646 100755 --- a/build-asteroid.lisp +++ b/build-asteroid.lisp @@ -1,36 +1,65 @@ ;; -*-lisp-*- -(unless *load-pathname* - (error "Please LOAD this file.")) - -;; Commented out to allow building with Quicklisp already loaded -;; (when (find-package :quicklisp) -;; (error "Please run this file as a script or from the Makefile.")) - (defpackage #:asteroid-bootstrap + (:nicknames #:ab) (:use #:cl) (:export #:*root* #:path)) +(in-package #:asteroid-bootstrap) + +(defvar *root* (make-pathname :name NIL :type NIL :defaults *load-pathname*)) + +(defun path (pathname) + (merge-pathnames pathname *root*)) + ;; we require quicklisp to load our transitive dependencies. (load "~/quicklisp/setup.lisp") + ;; Build script for creating asteroid executable using save-lisp-and-die ;; ASDF will automatically find the project via source-registry.conf ;; Load RADIANCE first, then handle environment (ql:quickload :radiance) +;; (defmethod radiance:environment-directory (environment (kind (eql :configuration))) +;; (ab:path (make-pathname :directory `(:relative "config" ,environment)))) + +;; (defmethod radiance:environment-directory (environment (kind (eql :cache))) +;; (ab:path (make-pathname :directory `(:relative "cache" ,environment)))) + +;; (defmethod radiance:environment-directory (environment (kind (eql :data))) +;; (ab:path (make-pathname :directory `(:relative "data" ,environment)))) + +;; (defmethod radiance:environment-directory (environment (kind (eql :template))) +;; (ab:path (make-pathname :directory `(:relative "override" ,environment "template")))) + +;; (defmethod radiance:environment-directory (environment (kind (eql :static))) +;; (ab:path (make-pathname :directory `(:relative "override" ,environment "static")))) + ;; Ensure RADIANCE environment is set before loading (unless (radiance:environment) - (setf (radiance:environment) "default")) + (setf (radiance:environment) "asteroid")) ;; Load the system with RADIANCE environment handling (handler-bind ((radiance-core:environment-not-set - (lambda (c) - (declare (ignore c)) - (invoke-restart 'continue)))) + (lambda (c) + (declare (ignore c)) + (invoke-restart 'continue)))) (ql:quickload :asteroid)) +(log:info "~2&~15A - ~A~%~15A - ~A~%~15A - ~A~%~15A - ~A~%~15A - ~A~2%" + ":configuration" + (radiance:environment-directory (radiance-core:environment) :configuration) + ":cache" + (radiance:environment-directory (radiance-core:environment) :cache) + ":data" + (radiance:environment-directory (radiance-core:environment) :data) + ":template" + (radiance:environment-directory (radiance-core:environment) :template) + ":static" + (radiance:environment-directory (radiance-core:environment) :static)) + ;; Define the main function for the executable (defun main () (asteroid:-main)) @@ -39,4 +68,5 @@ (sb-ext:save-lisp-and-die "asteroid" :toplevel #'main :executable t - :compression 22) + :compression 12) + diff --git a/static/asteroid.png b/static/asteroid.png new file mode 100644 index 0000000..248c270 Binary files /dev/null and b/static/asteroid.png differ diff --git a/stream-queue.m3u b/stream-queue.m3u index fcd7187..babf3f8 100644 --- a/stream-queue.m3u +++ b/stream-queue.m3u @@ -1 +1,163 @@ #EXTM3U +#EXTINF:370,Vector Lovers - City Lights From a Train +/app/music/Vector Lovers/City Lights From a Train.flac +#EXTINF:400,The Black Dog - Psil-Cosyin +/app/music/The Black Dog/Psil-Cosyin.flac +#EXTINF:320,Plaid - Eyen +/app/music/Plaid/Eyen.flac +#EXTINF:330,ISAN - Birds Over Barges +/app/music/ISAN/Birds Over Barges.flac +#EXTINF:360,Ochre - Bluebottle Farm +/app/music/Ochre/Bluebottle Farm.flac +#EXTINF:390,Arovane - Theme +/app/music/Arovane/Theme.flac +#EXTINF:380,Proem - Deep Like Airline Failure +/app/music/Proem/Deep Like Airline Failure.flac +#EXTINF:310,Solvent - My Radio (Remix) +/app/music/Solvent/My Radio (Remix).flac +#EXTINF:350,Bochum Welt - Marylebone (7th) +/app/music/Bochum Welt/Marylebone (7th).flac +#EXTINF:290,Mrs Jynx - Shibuya Lullaby +/app/music/Mrs Jynx/Shibuya Lullaby.flac +#EXTINF:340,Kettel - Whisper Me Wishes +/app/music/Kettel/Whisper Me Wishes.flac +#EXTINF:360,Christ. - Perlandine Friday +/app/music/Christ./Perlandine Friday.flac +#EXTINF:330,Cepia - Ithaca +/app/music/Cepia/Ithaca.flac +#EXTINF:340,Datassette - Vacuform +/app/music/Datassette/Vacuform.flac +#EXTINF:390,Plant43 - Dreams of the Sentient City +/app/music/Plant43/Dreams of the Sentient City.flac +#EXTINF:410,Claro Intelecto - Peace of Mind (Electrosoul) +/app/music/Claro Intelecto/Peace of Mind (Electrosoul).flac +#EXTINF:430,E.R.P. - Evoked +/app/music/E.R.P./Evoked.flac +#EXTINF:310,Der Zyklus - Formenverwandler +/app/music/Der Zyklus/Formenverwandler.flac +#EXTINF:330,Dopplereffekt - Infophysix +/app/music/Dopplereffekt/Infophysix.flac +#EXTINF:350,Drexciya - Wavejumper +/app/music/Drexciya/Wavejumper.flac +#EXTINF:375,The Other People Place - Sorrow & A Cup of Joe +/app/music/The Other People Place/Sorrow & A Cup of Joe.flac +#EXTINF:340,Arpanet - Wireless Internet +/app/music/Arpanet/Wireless Internet.flac +#EXTINF:380,Legowelt - Sturmvogel +/app/music/Legowelt/Sturmvogel.flac +#EXTINF:310,DMX Krew - Space Paranoia +/app/music/DMX Krew/Space Paranoia.flac +#EXTINF:360,Skywave Theory - Nova Drift +/app/music/Skywave Theory/Nova Drift.flac +#EXTINF:460,Pye Corner Audio - Transmission Four +/app/music/Pye Corner Audio/Transmission Four.flac +#EXTINF:390,B12 - Heaven Sent +/app/music/B12/Heaven Sent.flac +#EXTINF:450,Higher Intelligence Agency - Tortoise +/app/music/Higher Intelligence Agency/Tortoise.flac +#EXTINF:420,Biosphere - Kobresia +/app/music/Biosphere/Kobresia.flac +#EXTINF:870,Global Communication - 14:31 +/app/music/Global Communication/14:31.flac +#EXTINF:500,Monolake - Cyan +/app/music/Monolake/Cyan.flac +#EXTINF:660,Deepchord - Electromagnetic +/app/music/Deepchord/Electromagnetic.flac +#EXTINF:1020,GAS - Pop 4 +/app/music/GAS/Pop 4.flac +#EXTINF:600,Yagya - Rigning Nýju +/app/music/Yagya/Rigning Nýju.flac +#EXTINF:990,Voices From The Lake - Velo di Maya +/app/music/Voices From The Lake/Velo di Maya.flac +#EXTINF:3720,ASC - Time Heals All +/app/music/ASC/Time Heals All.flac +#EXTINF:540,36 - Room 237 +/app/music/36/Room 237.flac +#EXTINF:900,Loscil - Endless Falls +/app/music/Loscil/Endless Falls.flac +#EXTINF:450,Kiasmos - Looped +/app/music/Kiasmos/Looped.flac +#EXTINF:590,Underworld - Rez +/app/music/Underworld/Rez.flac +#EXTINF:570,Orbital - Halcyon + On + On +/app/music/Orbital/Halcyon + On + On.flac +#EXTINF:1080,The Orb - A Huge Ever Growing Pulsating Brain +/app/music/The Orb/A Huge Ever Growing Pulsating Brain.flac +#EXTINF:360,Autechre - Slip +/app/music/Autechre/Slip.flac +#EXTINF:400,Labradford - S (Mi Media Naranja) +/app/music/Labradford/S (Mi Media Naranja).flac +#EXTINF:350,Vector Lovers - Rusting Cars and Wildflowers +/app/music/Vector Lovers/Rusting Cars and Wildflowers.flac +#EXTINF:390,The Black Dog - Raxmus +/app/music/The Black Dog/Raxmus.flac +#EXTINF:315,Plaid - Hawkmoth +/app/music/Plaid/Hawkmoth.flac +#EXTINF:320,ISAN - What This Button Did +/app/music/ISAN/What This Button Did.flac +#EXTINF:370,Ochre - Circadies +/app/music/Ochre/Circadies.flac +#EXTINF:420,Arovane - Tides +/app/music/Arovane/Tides.flac +#EXTINF:370,Proem - Nothing is as It Seems +/app/music/Proem/Nothing is as It Seems.flac +#EXTINF:300,Solvent - Loss For Words +/app/music/Solvent/Loss For Words.flac +#EXTINF:340,Bochum Welt - Saint (77sunset) +/app/music/Bochum Welt/Saint (77sunset).flac +#EXTINF:280,Mrs Jynx - Stay Home +/app/music/Mrs Jynx/Stay Home.flac +#EXTINF:330,Kettel - Church +/app/music/Kettel/Church.flac +#EXTINF:370,Christ. - Cordate +/app/music/Christ./Cordate.flac +#EXTINF:350,Datassette - Computers Elevate +/app/music/Datassette/Computers Elevate.flac +#EXTINF:420,Plant43 - The Cold Surveyor +/app/music/Plant43/The Cold Surveyor.flac +#EXTINF:380,Claro Intelecto - Section +/app/music/Claro Intelecto/Section.flac +#EXTINF:440,E.R.P. - Vox Automaton +/app/music/E.R.P./Vox Automaton.flac +#EXTINF:300,Dopplereffekt - Z-Boson +/app/music/Dopplereffekt/Z-Boson.flac +#EXTINF:380,Drexciya - Digital Tsunami +/app/music/Drexciya/Digital Tsunami.flac +#EXTINF:350,The Other People Place - You Said You Want Me +/app/music/The Other People Place/You Said You Want Me.flac +#EXTINF:370,Legowelt - Star Gazing +/app/music/Legowelt/Star Gazing.flac +#EXTINF:440,Pye Corner Audio - Electronic Rhythm Number 3 +/app/music/Pye Corner Audio/Electronic Rhythm Number 3.flac +#EXTINF:460,B12 - Infinite Lites (Classic Mix) +/app/music/B12/Infinite Lites (Classic Mix).flac +#EXTINF:390,Biosphere - The Things I Tell You +/app/music/Biosphere/The Things I Tell You.flac +#EXTINF:580,Global Communication - 9:39 +/app/music/Global Communication/9:39.flac +#EXTINF:460,Monolake - T-Channel +/app/music/Monolake/T-Channel.flac +#EXTINF:690,Deepchord - Vantage Isle (Variant) +/app/music/Deepchord/Vantage Isle (Variant).flac +#EXTINF:840,GAS - Königsforst 5 +/app/music/GAS/Königsforst 5.flac +#EXTINF:520,Yagya - The Salt on Her Cheeks +/app/music/Yagya/The Salt on Her Cheeks.flac +#EXTINF:720,Voices From The Lake - Dream State +/app/music/Voices From The Lake/Dream State.flac +#EXTINF:510,36 - Night Rain +/app/music/36/Night Rain.flac +#EXTINF:470,Loscil - First Narrows +/app/music/Loscil/First Narrows.flac +#EXTINF:400,Kiasmos - Burnt +/app/music/Kiasmos/Burnt.flac +#EXTINF:570,Underworld - Jumbo (Extended) +/app/music/Underworld/Jumbo (Extended).flac +#EXTINF:480,Orbital - Belfast +/app/music/Orbital/Belfast.flac +#EXTINF:540,The Orb - Little Fluffy Clouds (Ambient Mix) +/app/music/The Orb/Little Fluffy Clouds (Ambient Mix).flac +#EXTINF:390,Autechre - Nine +/app/music/Autechre/Nine.flac +#EXTINF:380,Labradford - G (Mi Media Naranja) +/app/music/Labradford/G (Mi Media Naranja).flac