Initial commit: self-hosted personal radio station

Flask + React web UI with audio player, podcast queue, feed management,
episode browser, music library, schedule viewer, and log tail.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-13 19:01:33 -07:00
co-authored by Claude Opus 4.6
commit 3d635b742c
53 changed files with 7023 additions and 0 deletions
+17
View File
@@ -0,0 +1,17 @@
[Unit]
Description=Local Radio - Icecast Streaming Server
After=network.target
Wants=network.target
[Service]
Type=simple
ExecStart=/usr/bin/icecast2 -c /opt/localradio/config/icecast.xml
Restart=always
RestartSec=5
User=localradio
Group=localradio
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
+20
View File
@@ -0,0 +1,20 @@
[Unit]
Description=Local Radio - RSS Feed Poller
After=localradio-stream.service
Wants=localradio-stream.service
[Service]
Type=simple
ExecStart=/opt/localradio/venv/bin/python /opt/localradio/scripts/poll_feeds.py
Restart=always
RestartSec=30
User=localradio
Group=localradio
EnvironmentFile=-/opt/localradio/config/localradio.env
Environment=LOCALRADIO_BASE=/opt/localradio
Environment=PYTHONPATH=/opt/localradio/scripts
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
+21
View File
@@ -0,0 +1,21 @@
[Unit]
Description=Local Radio - Liquidsoap Stream Engine
After=localradio-icecast.service
Requires=localradio-icecast.service
[Service]
Type=simple
ExecStart=/usr/bin/liquidsoap /opt/localradio/config/station.liq
Restart=always
RestartSec=10
User=localradio
Group=localradio
EnvironmentFile=-/opt/localradio/config/localradio.env
StandardOutput=journal
StandardError=journal
# Give Liquidsoap time to initialize
TimeoutStartSec=30
[Install]
WantedBy=multi-user.target
+20
View File
@@ -0,0 +1,20 @@
[Unit]
Description=Local Radio - Web Dashboard
After=localradio-stream.service
Wants=localradio-stream.service
[Service]
Type=simple
ExecStart=/opt/localradio/venv/bin/python -m web.app
Restart=always
RestartSec=10
User=localradio
Group=localradio
EnvironmentFile=-/opt/localradio/config/localradio.env
Environment=LOCALRADIO_BASE=/opt/localradio
WorkingDirectory=/opt/localradio
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target