Show the queued show and its start time in the index.php sidebar
- Shows get a description and an icon upload; broadcasts get a scheduled_at start time. schema.sql adds the columns to existing databases and seeds the descriptions from the old hand-written sidebar. - The dashboard and cli/set_show.php take an optional date and Eastern start time when queuing; index.php shows it with the UTC conversion. - liveBroadcast() and currentShow() ignore broadcasts unseen for longer than the grace period, so a stopped poller can't leave a show stuck as live. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
3fb49e816c
commit
f659b09a0b
9 files changed
+297
-77
No files matched your search
@@ -20,15 +20,15 @@ The one approved exception is [cli/poll_icecast.php](cli/poll_icecast.php), a cr
|
||||
## Key Files
|
||||
|
||||
Public pages:
|
||||
- [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.
|
||||
- [index.php](index.php) — Main page. The sidebar shows the queued (or live) show from the database: icon, name, scheduled start time in Eastern and UTC, and description. The main column has the about section.
|
||||
- [live.php](live.php) — Page to send listeners to while streaming. Player on the left, recently played list on the right; the sidebar background and the heading change with the current show.
|
||||
- [now_playing.php](now_playing.php) — Returns the currently playing track as HTML. Called by `index.php` and `live.php` every 15 seconds.
|
||||
- [recently_played.php](recently_played.php) — Returns the current broadcast's track history as table rows for `live.php`.
|
||||
|
||||
Admin backend ([admin/](admin/)):
|
||||
- [admin/login.php](admin/login.php), [admin/logout.php](admin/logout.php) — Username/password login.
|
||||
- [admin/index.php](admin/index.php) — Dashboard: broadcast status, queue the next show, switch the live show, clear the queue.
|
||||
- [admin/shows.php](admin/shows.php), [admin/show_edit.php](admin/show_edit.php) — List, add, edit and delete shows, including background image uploads.
|
||||
- [admin/index.php](admin/index.php) — Dashboard: broadcast status, queue the next show (with an optional date and Eastern start time), switch the live show, clear the queue.
|
||||
- [admin/shows.php](admin/shows.php), [admin/show_edit.php](admin/show_edit.php) — List, add, edit and delete shows, including the description and icon and background image uploads.
|
||||
|
||||
Shared includes:
|
||||
- [includes/db.php](includes/db.php) — `getDB()` returns a shared PDO connection (session time zone UTC).
|
||||
@@ -39,7 +39,7 @@ Shared includes:
|
||||
|
||||
Command-line tools (run over SSH from the site root):
|
||||
- [cli/poll_icecast.php](cli/poll_icecast.php) — Cron-run poller that records broadcasts and tracks.
|
||||
- [cli/set_show.php](cli/set_show.php) — Lists shows, or queues/sets the show by slug. Same behaviour as the dashboard control.
|
||||
- [cli/set_show.php](cli/set_show.php) — Lists shows, or queues/sets the show by slug, optionally with a start time (`php cli/set_show.php <slug> 2026-10-30 19:30`). Same behaviour as the dashboard control.
|
||||
- [cli/create_admin.php](cli/create_admin.php) — Creates an admin account or resets its password.
|
||||
|
||||
Other:
|
||||
@@ -59,13 +59,13 @@ Other:
|
||||
|
||||
MariaDB on localhost. Credentials live in `config/db_credentials.php`, which is gitignored and uploaded to the server separately. Tables (see [sql/schema.sql](sql/schema.sql)):
|
||||
|
||||
- `shows` — the shows, with a unique `slug` and an optional `background_image` (filename in `images/backgrounds/`).
|
||||
- `broadcasts` — one row per streaming session: pending (`started_at` NULL, queued from the dashboard or `cli/set_show.php`), live (`ended_at` NULL), or ended.
|
||||
- `shows` — the shows, with a unique `slug`, a plain-text `description` (blank lines separate paragraphs) and optional `icon_image` and `background_image` (filenames in `images/backgrounds/`).
|
||||
- `broadcasts` — one row per streaming session: pending (`started_at` NULL, queued from the dashboard or `cli/set_show.php`), live (`ended_at` NULL), or ended. `scheduled_at` is the advertised start time shown on `index.php`; the broadcast still starts whenever the stream comes online.
|
||||
- `played_tracks` — tracks per broadcast. Cleared ten minutes after the broadcast ends; no long-term history is kept.
|
||||
- `admins` — admin accounts (username + password hash).
|
||||
- `login_attempts` — failed logins by IP, used for throttling.
|
||||
|
||||
All DATETIME values are UTC. `recently_played.php` outputs `<time datetime="...Z">` and `live.php` reformats them in the listener's local time zone.
|
||||
All DATETIME values are UTC. Show start times are entered and displayed in the station time zone (`STATION_TIMEZONE`, America/New_York, in [includes/broadcasts.php](includes/broadcasts.php)) and converted with `stationTimeToUtc()`/`utcToStationTime()`. `recently_played.php` outputs `<time datetime="...Z">` and `live.php` reformats them in the listener's local time zone.
|
||||
|
||||
## Broadcasts and Track History
|
||||
|
||||
@@ -73,7 +73,7 @@ All DATETIME values are UTC. `recently_played.php` outputs `<time datetime="...Z
|
||||
|
||||
- When the stream comes online, the queued broadcast starts. If nothing was queued, a broadcast with no show is created so tracks are still recorded.
|
||||
- A new track is recorded whenever title/artist/album differ from the last one, with its album art URL looked up once.
|
||||
- A broadcast ends once it has been unseen for five minutes, so brief encoder drop-outs don't split a show.
|
||||
- A broadcast ends once it has been unseen for five minutes, so brief encoder drop-outs don't split a show. `liveBroadcast()` and `currentShow()` apply the same five-minute rule when reading, so if the poller isn't running (e.g. on a dev server without the cron job), a stale broadcast doesn't show as live.
|
||||
- Tracks are deleted ten minutes after their broadcast ends.
|
||||
- If the status API can't be reached, the poll is skipped entirely so an outage isn't mistaken for the stream ending.
|
||||
|
||||
@@ -88,9 +88,9 @@ When adding admin pages:
|
||||
- Every POST form must include `csrfField()`, and its handler must call `verifyCsrf()` before doing anything else.
|
||||
- Use post-redirect-get: handle the POST, call `flash()`, then redirect.
|
||||
|
||||
## Background Image Uploads
|
||||
## Image Uploads
|
||||
|
||||
Uploaded through `admin/show_edit.php`: JPEG, PNG or WebP up to 5 MB (PHP's `post_max_size` is 8 MB). Files are validated by content (finfo + `getimagesize`), not extension, and saved to `images/backgrounds/` as `<slug>-<random>.<ext>`. Replaced or removed images are deleted from disk. The web server user must be able to write to that directory. Uploads are gitignored — they belong to each server's database, so they're uploaded per server through the admin page.
|
||||
Show backgrounds and icons are uploaded through `admin/show_edit.php`: JPEG, PNG or WebP, backgrounds up to 5 MB and icons up to 1 MB (PHP's `post_max_size` is 8 MB). Files are validated by content (finfo + `getimagesize`), not extension, and saved to `images/backgrounds/` as `<slug>-<random>.<ext>` (icons `<slug>-icon-<random>.<ext>`). Replaced or removed images are deleted from disk. The web server user must be able to write to that directory. Uploads are gitignored — they belong to each server's database, so they're uploaded per server through the admin page.
|
||||
|
||||
## Conventions
|
||||
|
||||
@@ -128,9 +128,11 @@ Server-only setup (one-time, or when the schema changes):
|
||||
|
||||
## 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.
|
||||
The `index.php` sidebar is driven by the database. Before a show, queue it on the admin dashboard (or `php cli/set_show.php <slug> <date> <time>`) with its date and Eastern start time; the sidebar then shows its icon, name, start time (with the UTC conversion) and description, switches to "On the Air Now" while live, and falls back to a short "nothing scheduled" note once nothing is queued. Edit descriptions and icons on the show's admin page.
|
||||
|
||||
Before going live, queue the show on the admin dashboard (or `php cli/set_show.php <slug>`) and point listeners to `live.php`.
|
||||
The commented-out show blocks in the `#one` section of `index.php` are the hand-written history from before this; leave them as they are.
|
||||
|
||||
Point listeners to `live.php` while streaming.
|
||||
|
||||
## Planned Work
|
||||
|
||||
|
||||
Reference in new issue
Block a user