docs: Comprehensive documentation update January 2026
- Update all #+DATE: and Last Updated lines to 2026-01-26 - Bump documentation version to 3.1 - Standardize author metadata (Glenn → Glenn Thompson where applicable) - Add Phase 9: Production Launch & Feature Expansion (Nov-Dec 2025) - Add Phase 10: Documentation Overhaul (January 2026) - Update PROJECT-HISTORY.org with accurate contributor stats: - 614 total commits, 88 PRs merged - Glenn Thompson: 354 commits, 59 PRs - Brian O'Reilly: 148 commits, 3 PRs - Luis Pereira: 109 commits, 26 PRs - Standardize API endpoints to /api/asteroid/ base path - Update UI routes to reflect root / mounting - Correct template extensions from .chtml to .ctml - Fix Docker music library paths (music/library/) - Update stream queue location to playlists/stream-queue.m3u - Expand API-ENDPOINTS.org with playlist, stream control, admin APIs
This commit is contained in:
parent
d894964c20
commit
2730a1e05d
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: AAC Streaming Support
|
#+TITLE: AAC Streaming Support
|
||||||
#+AUTHOR: Asteroid Radio Development Team
|
#+AUTHOR: Asteroid Radio Development Team
|
||||||
#+DATE: 2025-10-01
|
#+DATE: 2026-01-26
|
||||||
#+STARTUP: overview
|
#+STARTUP: overview
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
|
|
|
||||||
18
README.org
18
README.org
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: Asteroid Radio - Internet Radio Streaming Platform
|
#+TITLE: Asteroid Radio - Internet Radio Streaming Platform
|
||||||
#+AUTHOR: Asteroid Radio Development Team
|
#+AUTHOR: Asteroid Radio Development Team
|
||||||
#+DATE: 2025-10-26
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
|
|
||||||
|
|
@ -71,10 +71,10 @@ asteroid/
|
||||||
│ ├── icecast.xml # Icecast configuration
|
│ ├── icecast.xml # Icecast configuration
|
||||||
│ └── music/ # Music library mount
|
│ └── music/ # Music library mount
|
||||||
├── template/ # CLIP HTML templates
|
├── template/ # CLIP HTML templates
|
||||||
│ ├── front-page.chtml # Main page with live stream
|
│ ├── front-page.ctml # Main page with live stream
|
||||||
│ ├── admin.chtml # Admin dashboard
|
│ ├── admin.ctml # Admin dashboard
|
||||||
│ ├── player.chtml # Web player interface
|
│ ├── player.ctml # Web player interface
|
||||||
│ └── users.chtml # User management
|
│ └── users.ctml # User management
|
||||||
├── static/ # CSS and assets
|
├── static/ # CSS and assets
|
||||||
│ └── asteroid.lass # LASS stylesheet
|
│ └── asteroid.lass # LASS stylesheet
|
||||||
├── docs/ # Comprehensive documentation
|
├── docs/ # Comprehensive documentation
|
||||||
|
|
@ -104,8 +104,8 @@ curl -I http://localhost:8000/asteroid-low.mp3
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
** Access Points
|
** Access Points
|
||||||
- *Web Interface*: http://localhost:8080/asteroid/
|
- *Web Interface*: http://localhost:8080/
|
||||||
- *Admin Panel*: http://localhost:8080/asteroid/admin
|
- *Admin Panel*: http://localhost:8080/admin
|
||||||
- *High Quality MP3*: http://localhost:8000/asteroid.mp3 (128kbps)
|
- *High Quality MP3*: http://localhost:8000/asteroid.mp3 (128kbps)
|
||||||
- *High Quality AAC*: http://localhost:8000/asteroid.aac (96kbps)
|
- *High Quality AAC*: http://localhost:8000/asteroid.aac (96kbps)
|
||||||
- *Low Quality MP3*: http://localhost:8000/asteroid-low.mp3 (64kbps)
|
- *Low Quality MP3*: http://localhost:8000/asteroid-low.mp3 (64kbps)
|
||||||
|
|
@ -115,7 +115,7 @@ curl -I http://localhost:8000/asteroid-low.mp3
|
||||||
|
|
||||||
** Adding Music
|
** Adding Music
|
||||||
1. *Copy files*: Place MP3/FLAC files in =docker/music/= directory
|
1. *Copy files*: Place MP3/FLAC files in =docker/music/= directory
|
||||||
2. *Access admin panel*: Navigate to =http://localhost:8080/asteroid/admin=
|
2. *Access admin panel*: Navigate to =http://localhost:8080/admin=
|
||||||
3. *Scan library*: Click "Scan Library" to index new tracks
|
3. *Scan library*: Click "Scan Library" to index new tracks
|
||||||
4. *Metadata extraction*: Track information automatically extracted
|
4. *Metadata extraction*: Track information automatically extracted
|
||||||
5. *Stream queue*: Optionally add tracks to broadcast queue
|
5. *Stream queue*: Optionally add tracks to broadcast queue
|
||||||
|
|
@ -396,4 +396,4 @@ Special thanks to all contributors and the Common Lisp community.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*Last Updated: 2025-10-26*
|
*Last Updated: 2026-01-26*
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: Spectrum Analyzer Implementation
|
#+TITLE: Spectrum Analyzer Implementation
|
||||||
#+AUTHOR: Asteroid Radio
|
#+AUTHOR: Asteroid Radio
|
||||||
#+DATE: 2025-12-02
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
Real-time audio spectrum analyzer for Asteroid Radio, implemented using Parenscript (Lisp-to-JavaScript compiler).
|
Real-time audio spectrum analyzer for Asteroid Radio, implemented using Parenscript (Lisp-to-JavaScript compiler).
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: Asteroid Radio - Docker Streaming Setup
|
#+TITLE: Asteroid Radio - Docker Streaming Setup
|
||||||
#+AUTHOR: Asteroid Radio Team
|
#+AUTHOR: Asteroid Radio Team
|
||||||
#+DATE: 2025-09-30
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
This setup provides a complete streaming solution using Docker with Liquidsoap and Icecast2.
|
This setup provides a complete streaming solution using Docker with Liquidsoap and Icecast2.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: 🎵 Asteroid Radio - Docker Streaming Setup Complete!
|
#+TITLE: 🎵 Asteroid Radio - Docker Streaming Setup Complete!
|
||||||
#+AUTHOR: Asteroid Radio Team
|
#+AUTHOR: Asteroid Radio Team
|
||||||
#+DATE: 2025-09-30
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* ✅ What's Been Accomplished
|
* ✅ What's Been Accomplished
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: Asteroid Radio - API Endpoints Reference
|
#+TITLE: Asteroid Radio - API Endpoints Reference
|
||||||
#+AUTHOR: Asteroid Radio Development Team
|
#+AUTHOR: Asteroid Radio Development Team
|
||||||
#+DATE: 2025-10-26
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
|
|
||||||
|
|
@ -340,6 +340,43 @@ curl -X POST http://localhost:8080/api/asteroid/playlists/add-track \
|
||||||
}
|
}
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
|
** POST /api/asteroid/playlists/remove-track
|
||||||
|
|
||||||
|
Remove a track from a playlist.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required
|
||||||
|
|
||||||
|
*** Parameters
|
||||||
|
- =playlist-id= (required) - ID of the playlist
|
||||||
|
- =track-id= (required) - ID of the track to remove
|
||||||
|
|
||||||
|
*** Response
|
||||||
|
#+BEGIN_SRC json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"message": "Track removed from playlist"
|
||||||
|
}
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
** POST /api/asteroid/playlists/delete
|
||||||
|
|
||||||
|
Delete a playlist.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required
|
||||||
|
|
||||||
|
*** Parameters
|
||||||
|
- =playlist-id= (required) - ID of the playlist
|
||||||
|
|
||||||
|
*** Response
|
||||||
|
#+BEGIN_SRC json
|
||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"message": "Playlist deleted"
|
||||||
|
}
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
* Admin Endpoints
|
* Admin Endpoints
|
||||||
|
|
||||||
** POST /api/asteroid/admin/scan-library
|
** POST /api/asteroid/admin/scan-library
|
||||||
|
|
@ -353,11 +390,168 @@ Required (Admin role)
|
||||||
#+BEGIN_SRC json
|
#+BEGIN_SRC json
|
||||||
{
|
{
|
||||||
"status": "success",
|
"status": "success",
|
||||||
"message": "Library scan initiated",
|
"message": "Library scan completed",
|
||||||
"tracksFound": 42
|
"tracks-added": 42
|
||||||
}
|
}
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
|
** GET /api/asteroid/users
|
||||||
|
|
||||||
|
Get all users.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required (Admin role)
|
||||||
|
|
||||||
|
*** Response
|
||||||
|
Returns a JSON object with a =users= array.
|
||||||
|
|
||||||
|
** POST /api/asteroid/users/create
|
||||||
|
|
||||||
|
Create a new user.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required (Admin role)
|
||||||
|
|
||||||
|
*** Parameters
|
||||||
|
- =username= (required)
|
||||||
|
- =email= (required)
|
||||||
|
- =password= (required)
|
||||||
|
- =role= (required)
|
||||||
|
|
||||||
|
*** Response
|
||||||
|
Returns a JSON object indicating success or failure.
|
||||||
|
|
||||||
|
* Stream Playlist File Endpoints (Admin Only)
|
||||||
|
|
||||||
|
These endpoints manage playlist files in the =playlists/= directory, and control the currently active =playlists/stream-queue.m3u=.
|
||||||
|
|
||||||
|
** GET /api/asteroid/stream/playlists
|
||||||
|
|
||||||
|
List available playlist files in =playlists/= (excluding =stream-queue.m3u=).
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required (Admin role)
|
||||||
|
|
||||||
|
*** Response
|
||||||
|
Returns a JSON object with a =playlists= array of filenames.
|
||||||
|
|
||||||
|
** POST /api/asteroid/stream/playlists/load
|
||||||
|
|
||||||
|
Load a playlist file into =playlists/stream-queue.m3u= and return its paths.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required (Admin role)
|
||||||
|
|
||||||
|
*** Parameters
|
||||||
|
- =name= (required) - Playlist filename to load
|
||||||
|
|
||||||
|
** POST /api/asteroid/stream/playlists/save
|
||||||
|
|
||||||
|
Save the in-memory stream queue to =playlists/stream-queue.m3u=.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required (Admin role)
|
||||||
|
|
||||||
|
** POST /api/asteroid/stream/playlists/save-as
|
||||||
|
|
||||||
|
Save the current stream queue to a new playlist file.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required (Admin role)
|
||||||
|
|
||||||
|
*** Parameters
|
||||||
|
- =name= (required) - New playlist filename (=.m3u= suffix is optional)
|
||||||
|
|
||||||
|
** POST /api/asteroid/stream/playlists/clear
|
||||||
|
|
||||||
|
Clear =playlists/stream-queue.m3u= and empty the in-memory stream queue.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required (Admin role)
|
||||||
|
|
||||||
|
** GET /api/asteroid/stream/playlists/current
|
||||||
|
|
||||||
|
Return the current =playlists/stream-queue.m3u= contents with best-effort track info.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required (Admin role)
|
||||||
|
|
||||||
|
* Liquidsoap Control Endpoints (Admin Only)
|
||||||
|
|
||||||
|
** GET /api/asteroid/liquidsoap/status
|
||||||
|
|
||||||
|
Get Liquidsoap status including uptime, current metadata, and remaining time.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required (Admin role)
|
||||||
|
|
||||||
|
** POST /api/asteroid/liquidsoap/skip
|
||||||
|
|
||||||
|
Skip the current track in the stream queue.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required (Admin role)
|
||||||
|
|
||||||
|
** POST /api/asteroid/liquidsoap/reload
|
||||||
|
|
||||||
|
Force Liquidsoap to reload the playlist.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required (Admin role)
|
||||||
|
|
||||||
|
** POST /api/asteroid/liquidsoap/restart
|
||||||
|
|
||||||
|
Restart the Liquidsoap Docker container.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required (Admin role)
|
||||||
|
|
||||||
|
** POST /api/asteroid/icecast/restart
|
||||||
|
|
||||||
|
Restart the Icecast Docker container.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required (Admin role)
|
||||||
|
|
||||||
|
* Listener Statistics Endpoints
|
||||||
|
|
||||||
|
** GET /api/asteroid/stats/current
|
||||||
|
|
||||||
|
Get the current listener statistics.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Not required
|
||||||
|
|
||||||
|
** GET /api/asteroid/stats/daily
|
||||||
|
|
||||||
|
Get the daily listener statistics.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required (Admin role)
|
||||||
|
|
||||||
|
*** Response
|
||||||
|
Returns a JSON object containing daily listener statistics.
|
||||||
|
|
||||||
|
** GET /api/asteroid/stats/geo
|
||||||
|
|
||||||
|
Get the geographical listener statistics.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required (Admin role)
|
||||||
|
|
||||||
|
*** Response
|
||||||
|
Returns a JSON object containing geographical listener statistics.
|
||||||
|
|
||||||
|
** GET /api/asteroid/stats/geo/cities
|
||||||
|
|
||||||
|
Get the listener statistics by city.
|
||||||
|
|
||||||
|
*** Authentication
|
||||||
|
Required (Admin role)
|
||||||
|
|
||||||
|
*** Response
|
||||||
|
Returns a JSON object containing the country and a =cities= array with per-city aggregates.
|
||||||
|
|
||||||
* Error Responses
|
* Error Responses
|
||||||
|
|
||||||
All endpoints may return error responses in this format:
|
All endpoints may return error responses in this format:
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: Asteroid Radio - API Reference
|
#+TITLE: Asteroid Radio - API Reference
|
||||||
#+AUTHOR: Asteroid Radio Development Team
|
#+AUTHOR: Asteroid Radio Development Team
|
||||||
#+DATE: 2025-10-26
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* Current Interfaces
|
* Current Interfaces
|
||||||
|
|
||||||
|
|
@ -37,7 +37,7 @@ curl -I http://localhost:8000/asteroid-low.mp3 # 64kbps MP3
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
*** Playing Streams
|
*** Playing Streams
|
||||||
#+BEGIN_SRC bashfutu
|
#+BEGIN_SRC bash
|
||||||
# With VLC
|
# With VLC
|
||||||
vlc http://localhost:8000/asteroid.mp3
|
vlc http://localhost:8000/asteroid.mp3
|
||||||
|
|
||||||
|
|
@ -146,8 +146,8 @@ docker compose restart
|
||||||
** Music Library Management
|
** Music Library Management
|
||||||
#+BEGIN_SRC bash
|
#+BEGIN_SRC bash
|
||||||
# Add music files (container will detect automatically)
|
# Add music files (container will detect automatically)
|
||||||
cp ~/path/to/music/*.mp3 docker/music/
|
cp ~/path/to/music/*.mp3 music/library/
|
||||||
cp ~/path/to/music/*.flac docker/music/
|
cp ~/path/to/music/*.flac music/library/
|
||||||
|
|
||||||
# Check what Liquidsoap is seeing
|
# Check what Liquidsoap is seeing
|
||||||
echo "request.queue" | nc localhost 1234
|
echo "request.queue" | nc localhost 1234
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: Asteroid Radio - Development Guide
|
#+TITLE: Asteroid Radio - Development Guide
|
||||||
#+AUTHOR: Asteroid Radio Development Team
|
#+AUTHOR: Asteroid Radio Development Team
|
||||||
#+DATE: 2025-10-26
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* Development Setup
|
* Development Setup
|
||||||
|
|
||||||
|
|
@ -118,10 +118,10 @@ sbcl --eval "(ql:quickload :asteroid)" --eval "(asteroid:start-server)"
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
*** Development URLs
|
*** Development URLs
|
||||||
- *Web Interface*: http://localhost:8080/asteroid/
|
- *Web Interface*: http://localhost:8080/
|
||||||
- *Admin Panel*: http://localhost:8080/asteroid/admin
|
- *Admin Panel*: http://localhost:8080/admin
|
||||||
- *User Management*: http://localhost:8080/asteroid/admin/users
|
- *User Management*: http://localhost:8080/admin/user
|
||||||
- *Web Player*: http://localhost:8080/asteroid/player
|
- *Web Player*: http://localhost:8080/player
|
||||||
- *API Base*: http://localhost:8080/api/asteroid/
|
- *API Base*: http://localhost:8080/api/asteroid/
|
||||||
- *Live Stream*: http://localhost:8000/asteroid.mp3
|
- *Live Stream*: http://localhost:8000/asteroid.mp3
|
||||||
- *Icecast Admin*: http://localhost:8000/admin/ (admin/asteroid_admin_2024)
|
- *Icecast Admin*: http://localhost:8000/admin/ (admin/asteroid_admin_2024)
|
||||||
|
|
@ -228,7 +228,7 @@ We define a custom CLIP attribute processor in =template-utils.lisp= for dynamic
|
||||||
|
|
||||||
**** Using =data-text= in Templates
|
**** Using =data-text= in Templates
|
||||||
|
|
||||||
In your HTML templates (=.chtml= files):
|
In your HTML templates (=.ctml= files):
|
||||||
|
|
||||||
#+BEGIN_SRC html
|
#+BEGIN_SRC html
|
||||||
<!-- The data-text attribute gets replaced with the value from the plist -->
|
<!-- The data-text attribute gets replaced with the value from the plist -->
|
||||||
|
|
@ -341,7 +341,7 @@ See [[file:API-ENDPOINTS.org][API Endpoints Reference]] for complete API documen
|
||||||
- Check Docker container status: =docker compose ps=
|
- Check Docker container status: =docker compose ps=
|
||||||
- Check Liquidsoap container logs: =docker compose logs liquidsoap=
|
- Check Liquidsoap container logs: =docker compose logs liquidsoap=
|
||||||
- Check Icecast2 container logs: =docker compose logs icecast=
|
- Check Icecast2 container logs: =docker compose logs icecast=
|
||||||
- Verify music files exist in =docker/music/library/=
|
- Verify music files exist in =music/library/=
|
||||||
- Restart containers: =docker compose restart=
|
- Restart containers: =docker compose restart=
|
||||||
|
|
||||||
**** Database Errors
|
**** Database Errors
|
||||||
|
|
@ -418,11 +418,10 @@ docker compose logs -f icecast
|
||||||
** Performance Considerations
|
** Performance Considerations
|
||||||
|
|
||||||
*** Development vs Production
|
*** Development vs Production
|
||||||
- Use smaller music libraries in =docker/music/= for faster testing
|
- Use smaller music libraries in =music/library/= for faster testing
|
||||||
- Enable debug logging in Docker containers only when needed
|
- Enable debug logging in Docker containers only when needed
|
||||||
- Consider memory usage with large track collections in containers
|
- Consider memory usage with large track collections in containers
|
||||||
- Test with realistic concurrent user loads using Docker scaling
|
- Test with realistic concurrent user loads using Docker scaling
|
||||||
- Use =docker compose.dev.yml= for development-specific settings
|
|
||||||
|
|
||||||
*** Optimization Tips
|
*** Optimization Tips
|
||||||
- Cache database queries where appropriate
|
- Cache database queries where appropriate
|
||||||
|
|
@ -475,17 +474,17 @@ docker compose down
|
||||||
- Check port binding: =docker compose port icecast 8000=
|
- Check port binding: =docker compose port icecast 8000=
|
||||||
|
|
||||||
*** File Permission Issues
|
*** File Permission Issues
|
||||||
- Ensure =docker/music/= directory is accessible
|
- Ensure =music/library/= directory is accessible
|
||||||
- Check ownership: =ls -la docker/music/=
|
- Check ownership: =ls -la music/library/=
|
||||||
- Fix permissions: =sudo chown -R $USER:$USER docker/music/=
|
- Fix permissions: =sudo chown -R $USER:$USER music/library/=
|
||||||
- Verify container volume mounts in =docker-compose.yml=
|
- Verify container volume mounts in =docker-compose.yml=
|
||||||
- For remote mounts: ensure network storage is accessible
|
- For remote mounts: ensure network storage is accessible
|
||||||
|
|
||||||
*** Music Library Issues
|
*** Music Library Issues
|
||||||
- Check if music files exist: =find docker/music/ -name "*.mp3" -o -name "*.flac"=
|
- Check if music files exist: =find music/library/ -name "*.mp3" -o -name "*.flac"=
|
||||||
- Verify supported formats: MP3, FLAC, OGG, WAV
|
- Verify supported formats: MP3, FLAC, OGG, WAV
|
||||||
- Test recursive scanning: =curl -X POST http://localhost:8080/asteroid/api/scan-library=
|
- Test recursive scanning: =curl -X POST http://localhost:8080/api/asteroid/admin/scan-library=
|
||||||
- Check database for tracks: =curl http://localhost:8080/asteroid/api/tracks=
|
- Check database for tracks: =curl http://localhost:8080/api/asteroid/tracks=
|
||||||
- For large collections: avoid network mounts, use local storage (see memory about 175+ files causing timeouts)
|
- For large collections: avoid network mounts, use local storage (see memory about 175+ files causing timeouts)
|
||||||
|
|
||||||
** Getting Help
|
** Getting Help
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: Asteroid Radio - Docker Streaming Setup
|
#+TITLE: Asteroid Radio - Docker Streaming Setup
|
||||||
#+AUTHOR: Asteroid Radio Development Team
|
#+AUTHOR: Asteroid Radio Development Team
|
||||||
#+DATE: 2025-10-26
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* Docker Streaming Overview
|
* Docker Streaming Overview
|
||||||
|
|
||||||
|
|
@ -141,7 +141,7 @@ networks:
|
||||||
<max-listeners>50</max-listeners>
|
<max-listeners>50</max-listeners>
|
||||||
<public>1</public>
|
<public>1</public>
|
||||||
<stream-name>Asteroid Radio - High Quality</stream-name>
|
<stream-name>Asteroid Radio - High Quality</stream-name>
|
||||||
<stream-url>http://localhost:8080/asteroid/</stream-url>
|
<stream-url>http://localhost:8080/</stream-url>
|
||||||
<genre>Electronic/Alternative</genre>
|
<genre>Electronic/Alternative</genre>
|
||||||
<bitrate>128</bitrate>
|
<bitrate>128</bitrate>
|
||||||
</mount>
|
</mount>
|
||||||
|
|
@ -155,7 +155,7 @@ networks:
|
||||||
<public>1</public>
|
<public>1</public>
|
||||||
<stream-name>Asteroid Radio - AAC</stream-name>
|
<stream-name>Asteroid Radio - AAC</stream-name>
|
||||||
<stream-description>Music for Hackers - 96kbps AAC</stream-description>
|
<stream-description>Music for Hackers - 96kbps AAC</stream-description>
|
||||||
<stream-url>http://localhost:8080/asteroid/</stream-url>
|
<stream-url>http://localhost:8080/</stream-url>
|
||||||
<genre>Electronic/Alternative</genre>
|
<genre>Electronic/Alternative</genre>
|
||||||
<bitrate>96</bitrate>
|
<bitrate>96</bitrate>
|
||||||
</mount>
|
</mount>
|
||||||
|
|
@ -169,7 +169,7 @@ networks:
|
||||||
<public>1</public>
|
<public>1</public>
|
||||||
<stream-name>Asteroid Radio - Low Quality</stream-name>
|
<stream-name>Asteroid Radio - Low Quality</stream-name>
|
||||||
<stream-description>Music for Hackers - 64kbps</stream-description>
|
<stream-description>Music for Hackers - 64kbps</stream-description>
|
||||||
<stream-url>http://localhost:8080/asteroid/</stream-url>
|
<stream-url>http://localhost:8080/</stream-url>
|
||||||
<genre>Electronic/Alternative</genre>
|
<genre>Electronic/Alternative</genre>
|
||||||
<bitrate>64</bitrate>
|
<bitrate>64</bitrate>
|
||||||
</mount>
|
</mount>
|
||||||
|
|
@ -250,7 +250,7 @@ output.icecast(
|
||||||
name="Asteroid Radio",
|
name="Asteroid Radio",
|
||||||
description="Music for Hackers - Streaming from the Asteroid",
|
description="Music for Hackers - Streaming from the Asteroid",
|
||||||
genre="Electronic/Alternative",
|
genre="Electronic/Alternative",
|
||||||
url="http://localhost:8080/asteroid/",
|
url="http://localhost:8080/",
|
||||||
public=true,
|
public=true,
|
||||||
radio
|
radio
|
||||||
)
|
)
|
||||||
|
|
@ -265,7 +265,7 @@ output.icecast(
|
||||||
name="Asteroid Radio (AAC)",
|
name="Asteroid Radio (AAC)",
|
||||||
description="Music for Hackers - High efficiency AAC stream",
|
description="Music for Hackers - High efficiency AAC stream",
|
||||||
genre="Electronic/Alternative",
|
genre="Electronic/Alternative",
|
||||||
url="http://localhost:8080/asteroid/",
|
url="http://localhost:8080/",
|
||||||
public=true,
|
public=true,
|
||||||
radio
|
radio
|
||||||
)
|
)
|
||||||
|
|
@ -280,7 +280,7 @@ output.icecast(
|
||||||
name="Asteroid Radio (Low Quality)",
|
name="Asteroid Radio (Low Quality)",
|
||||||
description="Music for Hackers - Low bandwidth stream",
|
description="Music for Hackers - Low bandwidth stream",
|
||||||
genre="Electronic/Alternative",
|
genre="Electronic/Alternative",
|
||||||
url="http://localhost:8080/asteroid/",
|
url="http://localhost:8080/",
|
||||||
public=true,
|
public=true,
|
||||||
radio
|
radio
|
||||||
)
|
)
|
||||||
|
|
@ -447,11 +447,11 @@ docker compose logs --tail=10 liquidsoap
|
||||||
#+BEGIN_SRC bash
|
#+BEGIN_SRC bash
|
||||||
# Music directory already exists in repository
|
# Music directory already exists in repository
|
||||||
# Copy sample music directly to the music directory
|
# Copy sample music directly to the music directory
|
||||||
cp ~/path/to/music/*.mp3 docker/music/
|
cp ~/path/to/music/*.mp3 music/library/
|
||||||
|
|
||||||
# Set permissions
|
# Set permissions
|
||||||
chmod 755 docker/music/
|
chmod 755 music/library/
|
||||||
sudo chown -R $USER:$USER docker/music/
|
sudo chown -R $USER:$USER music/library/
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
** Persistent Data
|
** Persistent Data
|
||||||
|
|
@ -586,8 +586,8 @@ echo "request.queue" | nc localhost 1234
|
||||||
*** Permission Issues
|
*** Permission Issues
|
||||||
#+BEGIN_SRC bash
|
#+BEGIN_SRC bash
|
||||||
# Fix music directory permissions
|
# Fix music directory permissions
|
||||||
sudo chown -R $USER:$USER docker/music/
|
sudo chown -R $USER:$USER music/library/
|
||||||
chmod 755 docker/music/
|
chmod 755 music/library/
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
** Performance Tuning
|
** Performance Tuning
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: Asteroid Radio - Installation Guide
|
#+TITLE: Asteroid Radio - Installation Guide
|
||||||
#+AUTHOR: Asteroid Radio Development Team
|
#+AUTHOR: Asteroid Radio Development Team
|
||||||
#+DATE: 2025-10-26
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* Installation Overview
|
* Installation Overview
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: Listener Statistics Feature Design
|
#+TITLE: Listener Statistics Feature Design
|
||||||
#+AUTHOR: Glenn / Cascade
|
#+AUTHOR: Glenn Thompson / Cascade
|
||||||
#+DATE: 2025-12-08
|
#+DATE: 2026-01-26
|
||||||
#+OPTIONS: toc:2 num:t
|
#+OPTIONS: toc:2 num:t
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
|
|
@ -273,10 +273,9 @@ New admin page showing:
|
||||||
| Endpoint | Method | Description |
|
| Endpoint | Method | Description |
|
||||||
|---------------------------------+--------+--------------------------------|
|
|---------------------------------+--------+--------------------------------|
|
||||||
| /api/asteroid/stats/current | GET | Current listener count |
|
| /api/asteroid/stats/current | GET | Current listener count |
|
||||||
| /api/asteroid/stats/daily | GET | Daily stats (date range) |
|
| /api/asteroid/stats/daily | GET | Daily stats (admin only) |
|
||||||
| /api/asteroid/stats/hourly | GET | Hourly breakdown |
|
| /api/asteroid/stats/geo | GET | Geographic distribution (admin only) |
|
||||||
| /api/asteroid/stats/geo | GET | Geographic distribution |
|
| /api/asteroid/stats/geo/cities | GET | City breakdown for a country (admin only) |
|
||||||
| /api/asteroid/stats/export | GET | Export as CSV/JSON |
|
|
||||||
|
|
||||||
* Implementation Phases
|
* Implementation Phases
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: ParenScript Conversion Experiment
|
#+TITLE: ParenScript Conversion Experiment
|
||||||
#+AUTHOR: Glenn
|
#+AUTHOR: Glenn Thompson
|
||||||
#+DATE: 2025-11-06
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: Playlist System - Complete (MVP)
|
#+TITLE: Playlist System - Complete (MVP)
|
||||||
#+AUTHOR: Asteroid Radio Development Team
|
#+AUTHOR: Asteroid Radio Development Team
|
||||||
#+DATE: 2025-10-26
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
|
|
||||||
|
|
@ -52,7 +52,7 @@ Implemented user playlist system with creation, storage, and playback functional
|
||||||
|
|
||||||
** API Endpoints
|
** API Endpoints
|
||||||
|
|
||||||
*** GET /api/playlists
|
*** GET /api/asteroid/playlists
|
||||||
Get all playlists for current user
|
Get all playlists for current user
|
||||||
#+BEGIN_SRC json
|
#+BEGIN_SRC json
|
||||||
{
|
{
|
||||||
|
|
@ -69,16 +69,16 @@ Get all playlists for current user
|
||||||
}
|
}
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
*** POST /api/playlists/create
|
*** POST /api/asteroid/playlists/create
|
||||||
Create a new playlist
|
Create a new playlist
|
||||||
#+BEGIN_SRC
|
#+BEGIN_SRC
|
||||||
POST /asteroid/api/playlists/create
|
POST /api/asteroid/playlists/create
|
||||||
Content-Type: application/x-www-form-urlencoded
|
Content-Type: application/x-www-form-urlencoded
|
||||||
|
|
||||||
name=My Playlist&description=Optional description
|
name=My Playlist&description=Optional description
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
*** GET /api/playlists/:id
|
*** GET /api/asteroid/playlists/get
|
||||||
Get playlist details with tracks
|
Get playlist details with tracks
|
||||||
#+BEGIN_SRC json
|
#+BEGIN_SRC json
|
||||||
{
|
{
|
||||||
|
|
@ -98,10 +98,10 @@ Get playlist details with tracks
|
||||||
}
|
}
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
*** POST /api/playlists/add-track
|
*** POST /api/asteroid/playlists/add-track
|
||||||
Add track to playlist (limited by database backend)
|
Add track to playlist (limited by database backend)
|
||||||
#+BEGIN_SRC
|
#+BEGIN_SRC
|
||||||
POST /asteroid/api/playlists/add-track
|
POST /api/asteroid/playlists/add-track
|
||||||
Content-Type: application/x-www-form-urlencoded
|
Content-Type: application/x-www-form-urlencoded
|
||||||
|
|
||||||
playlist-id=12&track-id=1298
|
playlist-id=12&track-id=1298
|
||||||
|
|
@ -179,7 +179,7 @@ async function saveQueueAsPlaylist() {
|
||||||
formData.append('name', name);
|
formData.append('name', name);
|
||||||
formData.append('description', `Created from queue with ${playQueue.length} tracks`);
|
formData.append('description', `Created from queue with ${playQueue.length} tracks`);
|
||||||
|
|
||||||
const response = await fetch('/asteroid/api/playlists/create', {
|
const response = await fetch('/api/asteroid/playlists/create', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: formData
|
body: formData
|
||||||
});
|
});
|
||||||
|
|
@ -190,7 +190,7 @@ async function saveQueueAsPlaylist() {
|
||||||
addFormData.append('playlist-id', newPlaylist.id);
|
addFormData.append('playlist-id', newPlaylist.id);
|
||||||
addFormData.append('track-id', track.id);
|
addFormData.append('track-id', track.id);
|
||||||
|
|
||||||
await fetch('/asteroid/api/playlists/add-track', {
|
await fetch('/api/asteroid/playlists/add-track', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: addFormData
|
body: addFormData
|
||||||
});
|
});
|
||||||
|
|
@ -204,7 +204,7 @@ async function saveQueueAsPlaylist() {
|
||||||
*** Load Playlist
|
*** Load Playlist
|
||||||
#+BEGIN_SRC javascript
|
#+BEGIN_SRC javascript
|
||||||
async function loadPlaylist(playlistId) {
|
async function loadPlaylist(playlistId) {
|
||||||
const response = await fetch(`/asteroid/api/playlists/${playlistId}`);
|
const response = await fetch(`/api/asteroid/playlists/get?playlist-id=${playlistId}`);
|
||||||
const result = await response.json();
|
const result = await response.json();
|
||||||
|
|
||||||
if (result.status === 'success' && result.playlist) {
|
if (result.status === 'success' && result.playlist) {
|
||||||
|
|
@ -301,7 +301,7 @@ Database stores some values as lists when they should be scalars:
|
||||||
** Modified Files
|
** Modified Files
|
||||||
- =asteroid.asd= - Added playlist-management.lisp
|
- =asteroid.asd= - Added playlist-management.lisp
|
||||||
- =asteroid.lisp= - Added playlist API endpoints
|
- =asteroid.lisp= - Added playlist API endpoints
|
||||||
- =template/player.chtml= - Added playlist UI and functions
|
- =template/player.ctml= - Added playlist UI and functions
|
||||||
- =database.lisp= - Playlists collection schema
|
- =database.lisp= - Playlists collection schema
|
||||||
|
|
||||||
* Future Enhancements (Post-PostgreSQL)
|
* Future Enhancements (Post-PostgreSQL)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: PostgreSQL Setup for Asteroid Radio
|
#+TITLE: PostgreSQL Setup for Asteroid Radio
|
||||||
#+AUTHOR: Asteroid Radio Development Team
|
#+AUTHOR: Asteroid Radio Development Team
|
||||||
#+DATE: 2025-10-26
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: Asteroid Radio - Project Development History
|
#+TITLE: Asteroid Radio - Project Development History
|
||||||
#+AUTHOR: Asteroid Radio Development Team
|
#+AUTHOR: Asteroid Radio Development Team
|
||||||
#+DATE: 2025-10-26
|
#+DATE: 2026-01-26
|
||||||
#+DESCRIPTION: Comprehensive history of the Asteroid Radio project from inception to present
|
#+DESCRIPTION: Comprehensive history of the Asteroid Radio project from inception to present
|
||||||
|
|
||||||
* Project Overview
|
* Project Overview
|
||||||
|
|
@ -231,76 +231,178 @@ Asteroid Radio is a web-based internet radio station built with Common Lisp, fea
|
||||||
- Synchronized with upstream/main
|
- Synchronized with upstream/main
|
||||||
- Prepared comprehensive documentation PR
|
- Prepared comprehensive documentation PR
|
||||||
|
|
||||||
|
** Phase 9: Production Launch & Feature Expansion (November - December 2025)
|
||||||
|
|
||||||
|
*** Early November: Template & Deployment Stabilization
|
||||||
|
- *Lead*: Glenn Thompson, Brian O'Reilly
|
||||||
|
- Changed template extension to match CLIP documentation (.ctml)
|
||||||
|
- Updated all template paths in calling code
|
||||||
|
- Refactored for Lispy improvements (templates, strings, error handling)
|
||||||
|
- Deployment and post-deployment fixes
|
||||||
|
- Fixed redirection when navigating between frameset views
|
||||||
|
- Stream quality persistence in local storage
|
||||||
|
- Security: Removed hardcoded admin credentials from login page
|
||||||
|
- Stream service containers locked to localhost access
|
||||||
|
|
||||||
|
*** Mid-November: Password Management & Data Model Refactoring
|
||||||
|
- *Lead*: Glenn Thompson, Luis Pereira
|
||||||
|
- Password management and listener count fixes
|
||||||
|
- Database schema bug fixes from upstream merge
|
||||||
|
- User database methods moved to data-model
|
||||||
|
- Admin button visibility restricted to admin accounts
|
||||||
|
- Profile password change fixes
|
||||||
|
- Playlist creation fixes on frontend
|
||||||
|
|
||||||
|
*** Late November: Recently Played & MusicBrainz Integration
|
||||||
|
- *Lead*: Glenn Thompson
|
||||||
|
- Recently played tracks feature with MusicBrainz integration
|
||||||
|
- Favicon and asteroid.png graphics added to front page
|
||||||
|
- User activate/deactivate routes
|
||||||
|
- User role update routes
|
||||||
|
- Track name clickable with external link icon
|
||||||
|
- Audio player color matched to app panels
|
||||||
|
- Blinking live cursor added
|
||||||
|
|
||||||
|
*** Late November: Spectrum Analyzer & Parenscript Conversion
|
||||||
|
- *Lead*: Glenn Thompson
|
||||||
|
- Real-time spectrum analyzer using Web Audio API
|
||||||
|
- Parenscript (Lisp-to-JavaScript) implementation
|
||||||
|
- Spectrum analyzer theming and visualization styles
|
||||||
|
- Monotone theme and dynamic border color
|
||||||
|
- HTML entity decoding fixes in now playing titles
|
||||||
|
- JavaScript converted to Parenscript with stream fixes
|
||||||
|
|
||||||
|
*** Early December: PostgreSQL Integration & Database Work
|
||||||
|
- *Lead*: Brian O'Reilly, Glenn Thompson
|
||||||
|
- PostgreSQL interface integration (i-postmodern)
|
||||||
|
- Users table case sensitivity fixes
|
||||||
|
- Database credentials sourced from environment
|
||||||
|
- M3U files moved to dedicated playlists directory
|
||||||
|
- Database creation script corrections
|
||||||
|
- User dump/restore to CSV functionality
|
||||||
|
|
||||||
|
*** Mid-December: Player Improvements & Listener Statistics
|
||||||
|
- *Lead*: Glenn Thompson / Cascade
|
||||||
|
- Wedged player fix with reconnect button and volume preservation
|
||||||
|
- Status page for frameset mode with navigation fixes
|
||||||
|
- Listener statistics feature with geo stats collection
|
||||||
|
- City-level tracking in geo stats
|
||||||
|
- Expandable city breakdown in admin view
|
||||||
|
- Liquidsoap/Icecast controls added
|
||||||
|
- Library scan fixes
|
||||||
|
|
||||||
|
*** Mid-December: Shuffle Mount & Channel Selector
|
||||||
|
- *Lead*: Glenn Thompson
|
||||||
|
- Shuffle stream mount with separate recently-played tracking
|
||||||
|
- Channel/quality selector separation
|
||||||
|
- Dynamic playlist phase names
|
||||||
|
- Dynamic channel name updates
|
||||||
|
- Playlist crossfade transitions
|
||||||
|
- New playlists in support of variety
|
||||||
|
|
||||||
|
*** Late December: Playlist Scheduler & User Features
|
||||||
|
- *Lead*: Glenn Thompson
|
||||||
|
- Automatic playlist scheduler with cl-cron
|
||||||
|
- Admin UI for playlist scheduler with server time display
|
||||||
|
- Database persistence for playlist schedule
|
||||||
|
- Track favorites feature with star button
|
||||||
|
- Listening history tracking
|
||||||
|
- Listening activity chart on profile page
|
||||||
|
- Avatar upload functionality
|
||||||
|
- Track requests and profile enhancements
|
||||||
|
|
||||||
|
*** Late December: Custom Playlists & Rate Limiting
|
||||||
|
- *Lead*: Glenn Thompson, Luis Pereira
|
||||||
|
- Custom user playlists with submission and admin review
|
||||||
|
- YP directory listings for internet-radio.com and xiph.org
|
||||||
|
- Rate limiting macros for define-page and define-api
|
||||||
|
- Bigger rate limits for now-playing API routes
|
||||||
|
- Favorites sync between front page and frame player via postMessage
|
||||||
|
- Listening history refactored to data-model
|
||||||
|
- Timestamp normalization for PostgreSQL compatibility
|
||||||
|
|
||||||
|
*** December 31: Version 1.0 & Operations
|
||||||
|
- *Lead*: Brian O'Reilly
|
||||||
|
- Declared "Version 1.0" milestone
|
||||||
|
- TODO.org updated to reflect production launch
|
||||||
|
- Operations procedures instituted
|
||||||
|
- Repository cleanup of interstitial files
|
||||||
|
|
||||||
* Development Statistics
|
* Development Statistics
|
||||||
|
|
||||||
** Contributors (by commit count)
|
** Contributors (by commit count)
|
||||||
1. Glenn Thompson (glenneth/Glenneth) - 135+ commits
|
1. Glenn Thompson (glenneth/Glenneth) - 354 commits
|
||||||
2. Brian O'Reilly (Fade) - 55+ commits
|
2. Brian O'Reilly (Fade) - 148 commits
|
||||||
3. Luis Pereira (easilok) - 23+ commits
|
3. Luis Pereira (easilok) - 109 commits
|
||||||
|
|
||||||
** Total Commits: 213+ commits
|
** Total Commits: 614 commits
|
||||||
|
|
||||||
|
** Pull Requests Merged: 88
|
||||||
|
1. Glenn Thompson (glenneth1) - 59 PRs
|
||||||
|
2. Luis Pereira (easilok) - 26 PRs
|
||||||
|
3. Brian O'Reilly (fade) - 3 PRs
|
||||||
|
|
||||||
** Active Development Period
|
** Active Development Period
|
||||||
- Start: August 12, 2025
|
- Start: August 12, 2025
|
||||||
- Current: November 1, 2025
|
- Current: January 26, 2026
|
||||||
- Duration: ~2.75 months of active development
|
- Duration: ~5.5 months of active development
|
||||||
|
|
||||||
* Major Features Implemented
|
* Major Features Implemented
|
||||||
|
|
||||||
** Core Functionality
|
** Core Functionality
|
||||||
- ✅ Music library scanning and metadata extraction
|
- Music library scanning and metadata extraction
|
||||||
- ✅ PostgreSQL database integration (configured, ready for migration)
|
- PostgreSQL database integration (configured, ready for migration)
|
||||||
- ✅ Track search and filtering
|
- Track search and filtering
|
||||||
- ✅ Playlist management
|
- Playlist management
|
||||||
- ✅ Stream queue control
|
- Stream queue control
|
||||||
- ✅ Live streaming via Icecast/Liquidsoap
|
- Live streaming via Icecast/Liquidsoap
|
||||||
|
|
||||||
** User Management
|
** User Management
|
||||||
- ✅ User registration and authentication
|
- User registration and authentication
|
||||||
- ✅ Role-based access control (Admin, DJ, Listener)
|
- Role-based access control (Admin, DJ, Listener)
|
||||||
- ✅ User profiles with edit functionality
|
- User profiles with edit functionality
|
||||||
- ✅ Session management
|
- Session management
|
||||||
- ✅ Role-based page flow
|
- Role-based page flow
|
||||||
|
|
||||||
** Streaming Features
|
** Streaming Features
|
||||||
- ✅ Multiple quality options (AAC 96k, MP3 128k, MP3 64k)
|
- Multiple quality options (AAC 96k, MP3 128k, MP3 64k)
|
||||||
- ✅ ReplayGain volume normalization
|
- ReplayGain volume normalization
|
||||||
- ✅ Live now-playing information
|
- Live now-playing information
|
||||||
- ✅ Icecast integration
|
- Icecast integration
|
||||||
- ✅ Liquidsoap DJ controls
|
- Liquidsoap DJ controls
|
||||||
- ✅ Stream queue management
|
- Stream queue management
|
||||||
|
|
||||||
** Player Options
|
** Player Options
|
||||||
- ✅ Inline web player
|
- Inline web player
|
||||||
- ✅ Pop-out player window
|
- Pop-out player window
|
||||||
- ✅ Persistent frameset player
|
- Persistent frameset player
|
||||||
- ✅ Hybrid player system
|
- Hybrid player system
|
||||||
- ✅ Quality selector
|
- Quality selector
|
||||||
- ✅ Auto-reconnect on errors
|
- Auto-reconnect on errors
|
||||||
|
|
||||||
** API & Integration
|
** API & Integration
|
||||||
- ✅ RESTful JSON API
|
- RESTful JSON API
|
||||||
- ✅ API-aware authentication
|
- API-aware authentication
|
||||||
- ✅ Comprehensive test suite
|
- Comprehensive test suite
|
||||||
- ✅ Telnet integration with Liquidsoap
|
- Telnet integration with Liquidsoap
|
||||||
- ✅ Real-time status updates
|
- Real-time status updates
|
||||||
|
|
||||||
** UI/UX
|
** UI/UX
|
||||||
- ✅ Retro terminal aesthetic (VT323 font)
|
- Retro terminal aesthetic (VT323 font)
|
||||||
- ✅ Responsive design
|
- Responsive design
|
||||||
- ✅ CLIP templating system
|
- CLIP templating system
|
||||||
- ✅ LASS CSS preprocessing
|
- LASS CSS preprocessing
|
||||||
- ✅ Consistent navigation
|
- Consistent navigation
|
||||||
- ✅ HTML partial hydration
|
- HTML partial hydration
|
||||||
|
|
||||||
** Infrastructure
|
** Infrastructure
|
||||||
- ✅ Docker containerization (streams and application)
|
- Docker containerization (streams and application)
|
||||||
- ✅ Docker Compose orchestration
|
- Docker Compose orchestration
|
||||||
- ✅ Dockerfile for Asteroid application
|
- Dockerfile for Asteroid application
|
||||||
- ✅ Environment variable configuration
|
- Environment variable configuration
|
||||||
- ✅ PostgreSQL database (configured)
|
- PostgreSQL database (configured)
|
||||||
- ✅ Multi-environment support
|
- Multi-environment support
|
||||||
- ✅ Dynamic URL detection
|
- Dynamic URL detection
|
||||||
|
|
||||||
* Technical Milestones
|
* Technical Milestones
|
||||||
|
|
||||||
|
|
@ -325,7 +427,22 @@ Asteroid Radio is a web-based internet radio station built with Common Lisp, fea
|
||||||
- Parallel music scanning
|
- Parallel music scanning
|
||||||
- Client-side caching
|
- Client-side caching
|
||||||
|
|
||||||
* Current State (November 2025)
|
** Phase 10: Documentation Overhaul (January 2026)
|
||||||
|
|
||||||
|
*** 2026-01-26: Comprehensive Documentation Update
|
||||||
|
- *Lead*: Glenn Thompson / Cascade
|
||||||
|
- Major documentation alignment with current codebase
|
||||||
|
- Standardized all API endpoint references to `/api/asteroid/` base path
|
||||||
|
- Updated UI route documentation to reflect root `/` mounting
|
||||||
|
- Corrected template file extensions from `.chtml` to `.ctml`
|
||||||
|
- Fixed Docker music library paths (`music/library/` standardization)
|
||||||
|
- Updated stream queue file location to `playlists/stream-queue.m3u`
|
||||||
|
- Expanded API-ENDPOINTS.org with playlist management, stream control, and admin APIs
|
||||||
|
- Updated all metadata dates to 2026-01-26
|
||||||
|
- Bumped documentation version to 3.1
|
||||||
|
- Author metadata standardization (Glenn → Glenn Thompson where applicable)
|
||||||
|
|
||||||
|
* Current State (January 2026)
|
||||||
|
|
||||||
** Production Ready Features
|
** Production Ready Features
|
||||||
- Full music streaming platform
|
- Full music streaming platform
|
||||||
|
|
@ -344,12 +461,12 @@ Asteroid Radio is a web-based internet radio station built with Common Lisp, fea
|
||||||
- Performance optimization
|
- Performance optimization
|
||||||
- Feature expansion based on user feedback
|
- Feature expansion based on user feedback
|
||||||
|
|
||||||
** Recent Achievements
|
** Recent Achievements (January 2026)
|
||||||
- ✅ Complete Docker containerization
|
- Complete documentation overhaul aligning docs with codebase
|
||||||
- ✅ Environment variable configuration
|
- API endpoint standardization (`/api/asteroid/` base path)
|
||||||
- ✅ Comprehensive documentation overhaul
|
- Docker deployment fully documented
|
||||||
- ✅ Cross-distribution package manager support
|
- Documentation version 3.1 released
|
||||||
- ✅ Streamlined deployment process
|
- All metadata updated and consistent
|
||||||
|
|
||||||
** Known Issues & Future Work
|
** Known Issues & Future Work
|
||||||
- PostgreSQL migration (configured, pending data migration)
|
- PostgreSQL migration (configured, pending data migration)
|
||||||
|
|
@ -392,7 +509,7 @@ Asteroid Radio is a web-based internet radio station built with Common Lisp, fea
|
||||||
|
|
||||||
* Conclusion
|
* Conclusion
|
||||||
|
|
||||||
Asteroid Radio has evolved from a simple concept into a full-featured internet radio platform in just 2.75 months of active development. The project demonstrates the power of Common Lisp for web development and the collaborative nature of open-source development.
|
Asteroid Radio has evolved from a simple concept into a full-featured internet radio platform over 5+ months of active development. The project demonstrates the power of Common Lisp for web development and the collaborative nature of open-source development.
|
||||||
|
|
||||||
With complete Docker deployment, comprehensive documentation, and a growing feature set, Asteroid Radio is ready for production use while continuing to evolve with regular improvements, bug fixes, and new features based on user needs and technical requirements.
|
With complete Docker deployment, comprehensive documentation, and a growing feature set, Asteroid Radio is ready for production use while continuing to evolve with regular improvements, bug fixes, and new features based on user needs and technical requirements.
|
||||||
|
|
||||||
|
|
@ -403,4 +520,4 @@ With complete Docker deployment, comprehensive documentation, and a growing feat
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*Last Updated: 2025-11-01*
|
*Last Updated: 2026-01-26*
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
#+TITLE: Asteroid Radio - Project Overview
|
#+TITLE: Asteroid Radio - Project Overview
|
||||||
#+AUTHOR: Glenn Thompson & Brian O'Reilly (Fade)
|
#+AUTHOR: Glenn Thompson & Brian O'Reilly (Fade)
|
||||||
#+DATE: 2025-10-26
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* 🎯 Mission
|
* Mission
|
||||||
|
|
||||||
Asteroid Radio is a modern, web-based music streaming platform designed for hackers and music enthusiasts. Built with Common Lisp and the Radiance web framework, it combines the power of functional programming with contemporary web technologies.
|
Asteroid Radio is a modern, web-based music streaming platform designed for hackers and music enthusiasts. Built with Common Lisp and the Radiance web framework, it combines the power of functional programming with contemporary web technologies.
|
||||||
|
|
||||||
* 🏗️ Architecture
|
* Architecture
|
||||||
|
|
||||||
** Core Components
|
** Core Components
|
||||||
|
|
||||||
|
|
@ -30,9 +30,9 @@ Asteroid Radio is a modern, web-based music streaming platform designed for hack
|
||||||
│ ├── User Accounts & Profiles │
|
│ ├── User Accounts & Profiles │
|
||||||
│ └── Music Metadata │
|
│ └── Music Metadata │
|
||||||
└─────────────────────────────────────────────────────────────┘
|
└─────────────────────────────────────────────────────────────┘
|
||||||
```
|
#+END_EXAMPLE
|
||||||
|
|
||||||
### Technology Stack
|
* Technology Stack
|
||||||
|
|
||||||
**Backend:**
|
**Backend:**
|
||||||
- **Common Lisp** (SBCL) - Core application language
|
- **Common Lisp** (SBCL) - Core application language
|
||||||
|
|
@ -58,24 +58,29 @@ Asteroid Radio is a modern, web-based music streaming platform designed for hack
|
||||||
- **Python** - Performance analysis tools
|
- **Python** - Performance analysis tools
|
||||||
- **Bash** - Testing and deployment scripts
|
- **Bash** - Testing and deployment scripts
|
||||||
|
|
||||||
## 🎨 Design Philosophy
|
|
||||||
|
|
||||||
### Visual Theme
|
* 🎨 Design Philosophy
|
||||||
|
|
||||||
|
|
||||||
|
** Visual Theme
|
||||||
- **Dark terminal aesthetic** - Black background with colored text
|
- **Dark terminal aesthetic** - Black background with colored text
|
||||||
- **Hacker-friendly** - Monospace fonts and terminal-inspired UI
|
- **Hacker-friendly** - Monospace fonts and terminal-inspired UI
|
||||||
- **Color scheme** - Black → Blue-grey → Cyan → Blue progression
|
- **Color scheme** - Black → Blue-grey → Cyan → Blue progression
|
||||||
- **Minimalist** - Clean, functional interface without clutter
|
- **Minimalist** - Clean, functional interface without clutter
|
||||||
|
|
||||||
### Technical Principles
|
|
||||||
|
** Technical Principles
|
||||||
- **Functional programming** - Leveraging Lisp's strengths
|
- **Functional programming** - Leveraging Lisp's strengths
|
||||||
- **Modular architecture** - Radiance's interface system
|
- **Modular architecture** - Radiance's interface system
|
||||||
- **Performance first** - Sub-1% CPU usage for web app
|
- **Performance first** - Sub-1% CPU usage for web app
|
||||||
- **Self-contained** - Minimal external dependencies
|
- **Self-contained** - Minimal external dependencies
|
||||||
- **Docker-ready** - Containerized streaming infrastructure
|
- **Docker-ready** - Containerized streaming infrastructure
|
||||||
|
|
||||||
## 🚀 Features
|
|
||||||
|
|
||||||
### Current Features
|
* 🚀 Features
|
||||||
|
|
||||||
|
|
||||||
|
** Current Features
|
||||||
- ✅ **User Authentication** - Registration, login, profiles, role-based access (Admin/DJ/Listener)
|
- ✅ **User Authentication** - Registration, login, profiles, role-based access (Admin/DJ/Listener)
|
||||||
- ✅ **User Management** - Admin interface for user administration
|
- ✅ **User Management** - Admin interface for user administration
|
||||||
- ✅ **Music Library** - Track management with pagination, search, and filtering
|
- ✅ **Music Library** - Track management with pagination, search, and filtering
|
||||||
|
|
@ -93,7 +98,8 @@ Asteroid Radio is a modern, web-based music streaming platform designed for hack
|
||||||
- ✅ **Responsive Design** - Works on desktop and mobile
|
- ✅ **Responsive Design** - Works on desktop and mobile
|
||||||
- ✅ **Automated Testing** - Comprehensive test suite
|
- ✅ **Automated Testing** - Comprehensive test suite
|
||||||
|
|
||||||
### Planned Features
|
|
||||||
|
** Planned Features
|
||||||
- 🔄 **PostgreSQL Migration** - Full migration from Radiance DB to PostgreSQL
|
- 🔄 **PostgreSQL Migration** - Full migration from Radiance DB to PostgreSQL
|
||||||
- 🔄 **Enhanced Playlist Management** - Full CRUD operations with PostgreSQL
|
- 🔄 **Enhanced Playlist Management** - Full CRUD operations with PostgreSQL
|
||||||
- 🔄 **Social Features** - Playlist sharing and discovery
|
- 🔄 **Social Features** - Playlist sharing and discovery
|
||||||
|
|
@ -104,7 +110,8 @@ Asteroid Radio is a modern, web-based music streaming platform designed for hack
|
||||||
- 🔄 **Scheduled Programming** - Time-based queue switching
|
- 🔄 **Scheduled Programming** - Time-based queue switching
|
||||||
|
|
||||||
|
|
||||||
## 🔮 Vision
|
|
||||||
|
* 🔮 Vision
|
||||||
|
|
||||||
Asteroid Radio is the premier streaming platform for **Asteroid Music** - the perfect soundtrack for developers, hackers, and anyone who spends hours deep in code. Our mission is to curate and deliver music that enhances focus, creativity, and the flow state that every programmer knows.
|
Asteroid Radio is the premier streaming platform for **Asteroid Music** - the perfect soundtrack for developers, hackers, and anyone who spends hours deep in code. Our mission is to curate and deliver music that enhances focus, creativity, and the flow state that every programmer knows.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: Asteroid Radio - Documentation Index
|
#+TITLE: Asteroid Radio - Documentation Index
|
||||||
#+AUTHOR: Asteroid Radio Development Team
|
#+AUTHOR: Asteroid Radio Development Team
|
||||||
#+DATE: 2025-10-26
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* Welcome to Asteroid Radio Documentation
|
* Welcome to Asteroid Radio Documentation
|
||||||
|
|
||||||
|
|
@ -147,5 +147,5 @@ For detailed technical information, see the **[[file:PROJECT-OVERVIEW.org][Proje
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*Last Updated: 2025-10-26*
|
*Last Updated: 2026-01-26*
|
||||||
*Documentation Version: 3.0*
|
*Documentation Version: 3.1*
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: Stream Queue Control System
|
#+TITLE: Stream Queue Control System
|
||||||
#+AUTHOR: Asteroid Radio Development Team
|
#+AUTHOR: Asteroid Radio Development Team
|
||||||
#+DATE: 2025-10-26
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
|
|
||||||
|
|
@ -140,7 +140,7 @@ If you're working directly in the Lisp REPL:
|
||||||
|
|
||||||
* File Locations
|
* File Locations
|
||||||
|
|
||||||
- *Stream Queue File*: =stream-queue.m3u= (in project root)
|
- *Stream Queue File*: =playlists/stream-queue.m3u=
|
||||||
- *Docker Mount*: =/app/stream-queue.m3u= (inside Liquidsoap container)
|
- *Docker Mount*: =/app/stream-queue.m3u= (inside Liquidsoap container)
|
||||||
- *Liquidsoap Config*: =docker/asteroid-radio-docker.liq=
|
- *Liquidsoap Config*: =docker/asteroid-radio-docker.liq=
|
||||||
|
|
||||||
|
|
@ -184,7 +184,7 @@ The system also tracks recently played tracks:
|
||||||
** Queue changes not taking effect
|
** Queue changes not taking effect
|
||||||
|
|
||||||
- Wait up to 60 seconds for Liquidsoap to reload
|
- Wait up to 60 seconds for Liquidsoap to reload
|
||||||
- Check that =stream-queue.m3u= was generated correctly
|
- Check that =playlists/stream-queue.m3u= was generated correctly
|
||||||
- Verify Docker volume mount is working: =docker exec asteroid-liquidsoap ls -la /app/stream-queue.m3u=
|
- Verify Docker volume mount is working: =docker exec asteroid-liquidsoap ls -la /app/stream-queue.m3u=
|
||||||
- Check Liquidsoap logs: =docker logs asteroid-liquidsoap=
|
- Check Liquidsoap logs: =docker logs asteroid-liquidsoap=
|
||||||
|
|
||||||
|
|
@ -196,7 +196,7 @@ This is expected behavior. The system will play random tracks from the music lib
|
||||||
|
|
||||||
- Ensure Asteroid server has write permissions to the project directory
|
- Ensure Asteroid server has write permissions to the project directory
|
||||||
- Check that =regenerate-stream-playlist= is being called after queue modifications
|
- Check that =regenerate-stream-playlist= is being called after queue modifications
|
||||||
- Verify the file exists: =ls -la stream-queue.m3u=
|
- Verify the file exists: =ls -la playlists/stream-queue.m3u=
|
||||||
|
|
||||||
* Integration with Admin Interface
|
* Integration with Admin Interface
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -156,5 +156,5 @@ The =attr= function of the =lquery= s-expression allows customization of any val
|
||||||
- =target= which only has a value when the variable =framesetp= is true
|
- =target= which only has a value when the variable =framesetp= is true
|
||||||
|
|
||||||
#+begin_src html
|
#+begin_src html
|
||||||
<a lquery='(attr :href (eval (format nil "/asteroid/~a" status-href)) :target (when framesetp "_self"))'>
|
<a lquery='(attr :href (eval (format nil "/~a" status-href)) :target (when framesetp "_self"))'>
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: Asteroid Radio Testing Guide
|
#+TITLE: Asteroid Radio Testing Guide
|
||||||
#+AUTHOR: Asteroid Radio Development Team
|
#+AUTHOR: Asteroid Radio Development Team
|
||||||
#+DATE: 2025-10-26
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
|
|
||||||
|
|
@ -83,15 +83,15 @@ VERBOSE=1 ./test-server.sh
|
||||||
- =/api/asteroid/admin/scan-library= - Library scan
|
- =/api/asteroid/admin/scan-library= - Library scan
|
||||||
|
|
||||||
*** 7. HTML Pages
|
*** 7. HTML Pages
|
||||||
- =/asteroid/= - Front page
|
- =/= - Front page
|
||||||
- =/asteroid/admin= - Admin dashboard
|
- =/admin= - Admin dashboard
|
||||||
- =/asteroid/player= - Web player
|
- =/player= - Web player
|
||||||
- =/asteroid/profile= - User profile
|
- =/profile= - User profile
|
||||||
- =/asteroid/register= - Registration page
|
- =/register= - Registration page
|
||||||
|
|
||||||
*** 8. Static Files
|
*** 8. Static Files
|
||||||
- CSS files (=/asteroid/static/*.css=)
|
- CSS files (=/static/*.css=)
|
||||||
- JavaScript files (=/asteroid/static/js/*.js=)
|
- JavaScript files (=/static/js/*.js=)
|
||||||
|
|
||||||
** Example Output
|
** Example Output
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: Track Pagination System - Complete
|
#+TITLE: Track Pagination System - Complete
|
||||||
#+AUTHOR: Asteroid Radio Development Team
|
#+AUTHOR: Asteroid Radio Development Team
|
||||||
#+DATE: 2025-10-26
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
|
|
||||||
|
|
@ -52,7 +52,7 @@ Web player options:
|
||||||
|
|
||||||
* Technical Implementation
|
* Technical Implementation
|
||||||
|
|
||||||
** Admin Dashboard (admin.chtml)
|
** Admin Dashboard (admin.ctml)
|
||||||
|
|
||||||
*** Pagination Variables
|
*** Pagination Variables
|
||||||
#+BEGIN_SRC javascript
|
#+BEGIN_SRC javascript
|
||||||
|
|
@ -109,7 +109,7 @@ function nextPage() {
|
||||||
}
|
}
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
** Web Player (player.chtml)
|
** Web Player (player.ctml)
|
||||||
|
|
||||||
*** Track Index Management
|
*** Track Index Management
|
||||||
Critical fix for pagination with playback:
|
Critical fix for pagination with playback:
|
||||||
|
|
@ -184,25 +184,25 @@ This ensures correct track playback even when viewing paginated/filtered results
|
||||||
* Testing Results
|
* Testing Results
|
||||||
|
|
||||||
** Admin Dashboard
|
** Admin Dashboard
|
||||||
- ✅ 64 tracks paginated successfully
|
- 64 tracks paginated successfully
|
||||||
- ✅ 4 pages at 20 tracks/page
|
- 4 pages at 20 tracks/page
|
||||||
- ✅ All navigation buttons working
|
- All navigation buttons working
|
||||||
- ✅ Page size changes work correctly
|
- Page size changes work correctly
|
||||||
- ✅ Search maintains pagination
|
- Search maintains pagination
|
||||||
|
|
||||||
** Web Player
|
** Web Player
|
||||||
- ✅ Track library paginated
|
- Track library paginated
|
||||||
- ✅ Play button works on all pages
|
- Play button works on all pages
|
||||||
- ✅ Add to queue works on all pages
|
- Add to queue works on all pages
|
||||||
- ✅ Search resets to page 1
|
- Search resets to page 1
|
||||||
- ✅ Correct track indices maintained
|
- Correct track indices maintained
|
||||||
|
|
||||||
* Files Modified
|
* Files Modified
|
||||||
|
|
||||||
- =template/admin.chtml= - Admin pagination implementation
|
- =template/admin.ctml= - Admin pagination implementation
|
||||||
- =template/player.chtml= - Player pagination implementation
|
- =template/player.ctml= - Player pagination implementation
|
||||||
- =asteroid.lisp= - No backend changes needed (client-side pagination)
|
- =asteroid.lisp= - No backend changes needed (client-side pagination)
|
||||||
|
|
||||||
* Status: ✅ COMPLETE
|
* Status: COMPLETE
|
||||||
|
|
||||||
Track pagination fully implemented and tested in both admin dashboard and web player. Handles 64+ tracks efficiently with excellent UX.
|
Track pagination fully implemented and tested in both admin dashboard and web player. Handles 64+ tracks efficiently with excellent UX.
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: User Management System - Complete
|
#+TITLE: User Management System - Complete
|
||||||
#+AUTHOR: Asteroid Radio Development Team
|
#+AUTHOR: Asteroid Radio Development Team
|
||||||
#+DATE: 2025-10-26
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
|
|
||||||
|
|
@ -9,7 +9,7 @@ Complete user management system with dedicated admin interface, user creation, r
|
||||||
* What Was Completed
|
* What Was Completed
|
||||||
|
|
||||||
** User Management Page
|
** User Management Page
|
||||||
- Created dedicated =/admin/users= route
|
- Created dedicated =/admin/user= route
|
||||||
- Separate page from main admin dashboard
|
- Separate page from main admin dashboard
|
||||||
- Clean, organized interface for user administration
|
- Clean, organized interface for user administration
|
||||||
|
|
||||||
|
|
@ -43,7 +43,7 @@ Complete user management system with dedicated admin interface, user creation, r
|
||||||
|
|
||||||
** API Endpoints
|
** API Endpoints
|
||||||
|
|
||||||
*** GET /api/users
|
*** GET /api/asteroid/users
|
||||||
Returns all users in the system
|
Returns all users in the system
|
||||||
#+BEGIN_SRC json
|
#+BEGIN_SRC json
|
||||||
{
|
{
|
||||||
|
|
@ -61,7 +61,7 @@ Returns all users in the system
|
||||||
}
|
}
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
*** GET /api/users/stats
|
*** GET /api/asteroid/users/stats
|
||||||
Returns user statistics
|
Returns user statistics
|
||||||
#+BEGIN_SRC json
|
#+BEGIN_SRC json
|
||||||
{
|
{
|
||||||
|
|
@ -75,10 +75,10 @@ Returns user statistics
|
||||||
}
|
}
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
*** POST /api/users/create
|
*** POST /api/asteroid/users/create
|
||||||
Creates a new user (requires admin authentication)
|
Creates a new user (requires admin authentication)
|
||||||
#+BEGIN_SRC
|
#+BEGIN_SRC
|
||||||
POST /asteroid/api/users/create
|
POST /api/asteroid/users/create
|
||||||
Content-Type: application/x-www-form-urlencoded
|
Content-Type: application/x-www-form-urlencoded
|
||||||
|
|
||||||
username=newuser&email=user@example.com&password=pass123&role=listener
|
username=newuser&email=user@example.com&password=pass123&role=listener
|
||||||
|
|
@ -87,7 +87,7 @@ username=newuser&email=user@example.com&password=pass123&role=listener
|
||||||
** Files Created/Modified
|
** Files Created/Modified
|
||||||
|
|
||||||
*** New Files
|
*** New Files
|
||||||
- =template/users.chtml= - User management template
|
- =template/users.ctml= - User management template
|
||||||
- =test-user-api.sh= - API testing script
|
- =test-user-api.sh= - API testing script
|
||||||
|
|
||||||
*** Modified Files
|
*** Modified Files
|
||||||
|
|
@ -125,10 +125,10 @@ Users stored in USERS collection with fields:
|
||||||
Created =test-user-api.sh= for comprehensive testing:
|
Created =test-user-api.sh= for comprehensive testing:
|
||||||
#+BEGIN_SRC bash
|
#+BEGIN_SRC bash
|
||||||
# Test user statistics
|
# Test user statistics
|
||||||
curl -s http://localhost:8080/asteroid/api/users/stats | jq .
|
curl -s http://localhost:8080/api/asteroid/users/stats | jq .
|
||||||
|
|
||||||
# Test user creation (with authentication)
|
# Test user creation (with authentication)
|
||||||
curl -s -b cookies.txt -X POST http://localhost:8080/asteroid/api/users/create \
|
curl -s -b cookies.txt -X POST http://localhost:8080/api/asteroid/users/create \
|
||||||
-d "username=testuser" \
|
-d "username=testuser" \
|
||||||
-d "email=test@example.com" \
|
-d "email=test@example.com" \
|
||||||
-d "password=testpass123" \
|
-d "password=testpass123" \
|
||||||
|
|
@ -145,7 +145,7 @@ curl -s -b cookies.txt -X POST http://localhost:8080/asteroid/api/users/create \
|
||||||
* Usage
|
* Usage
|
||||||
|
|
||||||
** Creating a User
|
** Creating a User
|
||||||
1. Navigate to =/asteroid/admin/users=
|
1. Navigate to =/admin/user=
|
||||||
2. Fill in the user creation form
|
2. Fill in the user creation form
|
||||||
3. Select appropriate role
|
3. Select appropriate role
|
||||||
4. Click "Create User"
|
4. Click "Create User"
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#+TITLE: Asteroid Radio Web Server Implementation Summary
|
#+TITLE: Asteroid Radio Web Server Implementation Summary
|
||||||
#+DATE: 2025-08-20
|
#+DATE: 2026-01-26
|
||||||
#+AUTHOR: Development Session Summary
|
#+AUTHOR: Development Session Summary
|
||||||
|
|
||||||
* Project Overview
|
* Project Overview
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#+TITLE: Asteroid Low Orbit Playlist
|
#+TITLE: Asteroid Low Orbit Playlist
|
||||||
#+AUTHOR: Glenn
|
#+AUTHOR: Glenn Thompson
|
||||||
#+DATE: 2025-11-06
|
#+DATE: 2026-01-26
|
||||||
|
|
||||||
* Files
|
* Files
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue