Map: no audio anywhere on the live wall — click-to-listen on spine, path stops and rail (plus media.py Range) #233

Closed
opened 2026-10-05 02:08:33 -04:00 by logan · 0 comments
Owner

Problem

The wall is text-only: no <audio> or player in LiveView.tsx, MapView.tsx or components/live/*. The IncidentPanel call spine (WallPanels.tsx:276) shows transcripts only; 'ON AIR' says someone is talking with no way to hear them. A player already exists (CallSpineEntry.tsx:26 InlinePlayer, CallRow.tsx). Long calls are slow because media.py:51-57 serves Accept-Ranges: none (DEFERRED.md media.py row — FLAC ~1.3 MB/min, a 600 s call is ~13 MB downloaded before playback).

Who asked

TOC, RCC, GSOC, FD, HOBBY, NEWS (6 of 8). Every operator persona wants to hear the transmission before acting on a machine transcript the screen itself labels unverified.

Proposal

Phase 1 (this issue): play button on each spine row, each path-stop popup and a 'play latest' on rail cards; 'Play incident' queues calls oldest-first and highlights the matching path stop. Reuse InlinePlayer (fix #109 item 2's conditional-hook bug while touching it). Add HTTP Range to media.py (StreamingResponse against the GCS blob).
Phase 2 (LATER, separate): low-latency live talkgroup monitor off the node's PulseAudio path, never Icecast (drifts 100 s+).

Data source and terms

Own recordings in GCS via routers/media.py. Tier gating per BUSINESS_MODEL.md §3: Public tier gets no audio; Scanner and up get playback.

Effort

M (S frontend + S/M Range support)

Acceptance criteria

  • Clicking a spine row / path stop plays that call without leaving /live.
  • A 600 s FLAC call starts playing in < 2 s and seeks (Range 206 responses).
  • Nothing autoplays on page load; Public-tier viewers see no player.
  • DEFERRED.md media.py row updated to reference this issue (or removed when shipped).

Notes

Closes the gap in the DEFERRED.md media.py entry; that row should link here.


Reviewed against Server origin/main c4e1f9a (2026-10-05), from code only. Source: map persona panel 2026-10-05 (tracking issue lists all items).
Persona key: TOC = county PD real-time crime center supervisor; NOC = Con Ed electric ops NOC; RCC = MTA rail/bus control desk; GSOC = corporate security operations analyst; OEM = county emergency management duty officer; NEWS = TV newsroom assignment editor; FD = volunteer fire chief / county fire dispatcher; HOBBY = scanner power user / local journalist.

## Problem The wall is text-only: no `<audio>` or player in `LiveView.tsx`, `MapView.tsx` or `components/live/*`. The IncidentPanel call spine (`WallPanels.tsx:276`) shows transcripts only; 'ON AIR' says someone is talking with no way to hear them. A player already exists (`CallSpineEntry.tsx:26` `InlinePlayer`, `CallRow.tsx`). Long calls are slow because `media.py:51-57` serves `Accept-Ranges: none` (DEFERRED.md media.py row — FLAC ~1.3 MB/min, a 600 s call is ~13 MB downloaded before playback). ## Who asked TOC, RCC, GSOC, FD, HOBBY, NEWS (6 of 8). Every operator persona wants to hear the transmission before acting on a machine transcript the screen itself labels unverified. ## Proposal Phase 1 (this issue): play button on each spine row, each path-stop popup and a 'play latest' on rail cards; 'Play incident' queues calls oldest-first and highlights the matching path stop. Reuse `InlinePlayer` (fix #109 item 2's conditional-hook bug while touching it). Add HTTP Range to `media.py` (`StreamingResponse` against the GCS blob). Phase 2 (LATER, separate): low-latency live talkgroup monitor off the node's PulseAudio path, never Icecast (drifts 100 s+). ## Data source and terms Own recordings in GCS via `routers/media.py`. Tier gating per BUSINESS_MODEL.md §3: Public tier gets no audio; Scanner and up get playback. ## Effort M (S frontend + S/M Range support) ## Acceptance criteria - Clicking a spine row / path stop plays that call without leaving `/live`. - A 600 s FLAC call starts playing in < 2 s and seeks (Range 206 responses). - Nothing autoplays on page load; Public-tier viewers see no player. - DEFERRED.md media.py row updated to reference this issue (or removed when shipped). ## Notes Closes the gap in the DEFERRED.md media.py entry; that row should link here. --- Reviewed against Server origin/main c4e1f9a (2026-10-05), from code only. Source: map persona panel 2026-10-05 (tracking issue lists all items). Persona key: TOC = county PD real-time crime center supervisor; NOC = Con Ed electric ops NOC; RCC = MTA rail/bus control desk; GSOC = corporate security operations analyst; OEM = county emergency management duty officer; NEWS = TV newsroom assignment editor; FD = volunteer fire chief / county fire dispatcher; HOBBY = scanner power user / local journalist.
logan added the
type
feature
area/recording-audioarea/maparea/frontend
priority
p1
labels 2026-10-05 02:08:34 -04:00
logan closed this issue 2026-10-05 02:47:09 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: logan/server-26#233