52 lines
3.1 KiB
Markdown
52 lines
3.1 KiB
Markdown
# Radio Free Elsewhere
|
|
|
|
## Project Overview
|
|
|
|
Radio Free Elsewhere is an Internet radio station streaming eclectic music (Celtic folk, ambient/space, surf rock, and more). It runs on Icecast hosted on a Yunohost server. Streams are live and occasional — a few times per week in the evenings, typically around 7:30pm Eastern, running roughly two hours. This is not a 24/7 automated station.
|
|
|
|
The shows have distinct themes and identities:
|
|
- **O'Morain's Pub** — Celtic folk
|
|
- **Cosmoeuphoria** — ambient and space music
|
|
- **Bisexual Surfers From the Twilight of Time** — surf rock and rockabilly
|
|
- **The Bollocks** - punk rock
|
|
- **The Spin** - eclectic tunes from all genres
|
|
|
|
## Scope
|
|
|
|
This repo covers the **frontend only** — the public-facing website. Icecast configuration, Yunohost server administration, and streaming software are out of scope. Do not look for or suggest changes to server-side streaming config.
|
|
|
|
## Key Files
|
|
|
|
- [index.php](index.php) — Main page. Contains the audio player, now-playing widget, upcoming schedule section, and about section. Show information is updated here manually before each broadcast.
|
|
- [now_playing.php](now_playing.php) — Fetches the currently playing track from the Icecast JSON status API and returns it as HTML. Called by the frontend every 15 seconds via `setInterval`.
|
|
|
|
## Architecture
|
|
|
|
- **Backend:** PHP only. No Composer, no package manager, no build step.
|
|
- **Frontend:** HTML5 UP Strata template with custom CSS additions. No npm, no webpack, no preprocessor — edit CSS directly in `assets/css/main.css` or inline `<style>` blocks.
|
|
- **Now-playing:** `index.php` fetches `now_playing.php` via JavaScript every 15 seconds and injects the result into `#now-playing`. The fetch uses `arrayBuffer` + `TextDecoder` to handle the UTF-8 encoding correctly on the client side.
|
|
|
|
## Icecast Integration
|
|
|
|
- **Stream URL:** `https://radio.cyberpunklibrarian.nohost.me/rfe`
|
|
- **Status API:** `https://radio.cyberpunklibrarian.nohost.me/status-json.xsl`
|
|
|
|
The status API returns JSON with track metadata under `icestats.source`. The `source` key may be a single object or an array depending on how many mountpoints are active; `now_playing.php` handles both cases.
|
|
|
|
## Known Encoding Quirk
|
|
|
|
Icecast double-encodes track metadata as Latin-1 interpreted as UTF-8. The fix in [now_playing.php:23-24](now_playing.php#L23-L24) deliberately converts the string from UTF-8 to ISO-8859-1 to strip the outer encoding layer and recover the correct UTF-8 byte sequence. Do not remove or "simplify" this conversion — it is intentional and necessary for non-ASCII characters (accented names, etc.) to display correctly.
|
|
|
|
## Deployment
|
|
|
|
There is no CI/CD pipeline. Deployment is manual:
|
|
|
|
1. Commit and push changes to the self-hosted Gitea repository.
|
|
2. Upload changed files to the Yunohost web server via SFTP.
|
|
|
|
There is no staging environment — changes go straight to production.
|
|
|
|
## Updating Show Information
|
|
|
|
Show info lives in the `#one` section of `index.php`. Previous shows are commented out rather than deleted, so there's a history of past broadcasts in the markup. When updating for a new show, comment out the current show block and add the new one above it.
|