Releases: nilicule/rustyIce
Releases · nilicule/rustyIce
v1.0.3
Fixed
- Linux release binaries and
.deb/.rpmpackages are now built withcargo-zigbuildagainst glibc 2.17, so they run on older distributions such as CentOS/RHEL 7 — previously they failed at startup withGLIBC_2.xx not found.
Removed
- Dropped the Intel macOS (
darwin-amd64) prebuilt binary; GitHub retired themacos-13build runner. Apple Silicon (darwin-arm64) builds remain.
Full Changelog: v1.0.2...v1.0.3
v1.0.2
v1.0.1
- Adding link to Github repo on public page
Full Changelog: v1.0.0...v1.0.1
v1.0.0
Added
Admin console — full config editor
- New
#admin/configview with per-section editors for server, transcode, mounts, relays, autodjs, and users. Saves go throughPUT /api/config/<section>, round-trip viatoml_editto preserve comments and key order, write atomically, and apply through the same diff pipeline SIGHUP uses (sharing a write lock to avoid races). - Mounts / relays / autodjs / users use a collapsed list with one-at-a-time inline editing and an in-row confirm prompt for removal. Blank password fields resolve to the existing values server-side, so editing one entry doesn't require re-entering everyone else's secrets.
- AutoDJ folders are picked via a server-side filesystem browser (
BROWSE…); a browser file picker would point at the operator's machine, not the server. apply_confignow adds and removes mounts at runtime to match[[mounts]]— previously only metadata updates worked without a restart.
Role-based access
[[auth.users]]entries gainrole = "admin" | "operator"(missing role defaults toadmin, so existing configs upgrade cleanly). Operators can edit mounts, autodjs, and relays; admin-only sections are hidden from their sidebar, write attempts return403, andGET /api/configstrips those fields server-side.- The logged-in admin can't remove or demote themselves, and the user list is rejected if it contains no admins at all.
Fixed
- Listener disconnects (broken pipe / connection reset) now log at
debuginstead ofwarn— that's normal player behavior, not a server problem.
v0.3.0
Added
Relay
- New
[[relays]]config block — each entry pulls from a remote Icecast-compatible URL and re-broadcasts on a local mount. Optional HTTP Basic auth, optional per-relay[relays.transcode](falls back to global[transcode], passthrough when unset). - Reconnect-on-failure with exponential backoff (1 s → 30 s cap). Resets on successful connect.
- Live Icecast sources connecting to a relay-owned mount preempt the relay until they disconnect, then the relay reconnects automatically.
/api/mountsexposessource_kind = "relay"to disambiguate from live and AutoDJ sources.
Stream detail page
- Public per-stream detail page, reached by clicking a stream on the landing page (landing entries now open this page instead of the raw stream URL).
- Built-in in-browser player — a custom play/stop control driving an HTML5
<audio>element, with an offline state for mounts with no live source. - Real-time audio visualizer with a bars (frequency spectrum) / line (oscilloscope waveform) toggle, driven by the Web Audio API; synthetic-motion fallback when Web Audio is unavailable.
- Now-playing card showing the live title, description, genre, listener count, uptime, and a compact codec / bitrate / sample-rate / channels spec line.
- Stream responses now send
Access-Control-Allow-Origin: *so the browser can analyse the audio cross-origin for the visualizer.
Fixed
- Suppress
symphonia_metadataINFO noise from the default logger so AutoDJ folders with tagged audio no longer flood the console withunsupported frame GEOB(and similar) lines. - Live sources can now preempt an AutoDJ or Relay on a mount that has no
[[mounts]]entry of its own.verify_sourcefalls back to the global[auth].source_passwordwhen no per-mount password is configured — previously such PUTs were always rejected with401, so the live-source preemption promised by the AutoDJ feature never actually worked.
v0.2.0
Added
Server
- Show clickable admin link under banner when starting up server.
AutoDJ
- New
[[autodjs]]config block — each entry registers its own mount and plays a folder of MP3 / Ogg Vorbis files automatically - Recursive folder scan, rescanned + reshuffled at the end of each loop pass so files added between passes are picked up.
- Live Icecast sources connecting to an AutoDJ-owned mount preempt the rotation: the AutoDJ releases the slot, parks, and resumes from the next track once the live source disconnects.
- Admin kick-source on an AutoDJ mount cancels the current track (skip-track semantics).
Fixed
- Classic Icecast-2 source clients (libshout 2.x via Mixxx, EdCast, …) now receive an upfront
HTTP/1.0 200 OKso they actually start streaming audio instead of hanging inSHOUT_STATE_RESPand disconnecting with zero bytes. - Source-protocol handler now decodes HTTP/1.1
Transfer-Encoding: chunkedrequest bodies. Previously chunked PUTs would hang indefinitely as the handler couldn't see end-of-body.
v0.1.0
- Icecast2-compatible source ingest (
SOURCEandPUT) - MP3 and Ogg Vorbis streaming with automatic bitrate detection and real-time pacing
- Burst-on-connect — new listeners get an immediate prefill of recent audio (Icecast-compatible
burst_size, default 64 KiB, per-mount override) - Transcoding — decode/re-encode to a consistent output; per-mount or global, passthrough when unset. Any combination of MP3 / Ogg Vorbis source and MP3 / Ogg Vorbis target.
- Per-mount source passwords, plus an optional global password for dynamic mounts
- Public landing page with one-click playback
- Admin dashboard + REST API — kick-source / kick-listener, per-mount listener detail, Prometheus
/metrics - Hot-reload via
SIGHUP— no listener drops - Single static binary, async (Tokio), with an optional config file (boots on sensible defaults with randomly-generated credentials when none is provided)
Full Changelog: https://github.com/nilicule/rustyIce/commits/v0.1.0