secubox-deb/packages/secubox-fmrelay/api
CyberMind-FR 14a7590c82 fix(fmrelay): start path + JSON API + mounts XML + inline live preview
Four bugs surfaced when actually running a relay live (#377):

1. cmd_start sanity check still referenced lame_present after the
   ffmpeg switch — every start failed with
   `fmrelayctl: line 209: lame_present: command not found`.
   Renamed to ffmpeg_present.

2. log()/warn() wrote the human banner to stdout, which the API's
   subprocess.check_output(..., stderr=subprocess.STDOUT) merged into
   the JSON parser. /start returned 500 even when the runner spawned
   correctly. log() now writes to stderr; api/_ctl_json switches to
   subprocess.run(capture_output=True) so stdout stays clean JSON
   and stderr is only surfaced on failure.

3. emit_mounts_json grep'd `<mount>...</mount>` elements but icecast2
   /admin/listmounts uses `<source mount="...">` attribute form. The
   mounts table always showed empty. New parser handles the real XML
   shape + reports connected_sec + content_type alongside listeners.

4. admin webui had only the "Open Webradio →" link (which targets a
   vhost that doesn't exist yet). Added a card with `<audio controls>`
   that auto-binds to the active LAN mount via /access + /mounts,
   so the operator can verify playback without leaving the dashboard.
2026-05-24 15:13:26 +02:00
..
main.py fix(fmrelay): start path + JSON API + mounts XML + inline live preview 2026-05-24 15:13:26 +02:00