Player: Live-Stream-Unterstützung (podcast.toml [stream]-Sektion, HTML5 audio) #54

Closed
opened 2026-06-01 13:04:40 +02:00 by holm · 2 comments
Owner
Dimension Bewertung Einschätzung
Aufwand ████░░░░░░ Mittel — Config-Erweiterung + Player-UI-Toggle
Nutzen ████████░░ Hoch — Stream ist Kern-Feature des Zentonic-Netzwerks
Bruchhäufigkeit █░░░░░░░░░ n/a — neues Feature
Nachhaltigkeit ████████░░ Hoch
Dringlichkeit ████░░░░░░ Mittel — kann erst mit laufendem Stream vollständig getestet werden

Feature

Der Player (Sticky Footer, Issue #53) soll neben Episoden-Playback auch den Live-Stream des Podcasts abspielen können.

HTML5 <audio> unterstützt ICY/MP3-Streams nativ via <source src="stream-url" type="audio/mpeg">.

Konfiguration

In podcast.toml neue optionale Sektion:

[stream]
url  = "https://stream.example.org/live.mp3"  # ICY/MP3 oder HLS
name = "Zentonic Live"                          # Anzeigename

Wenn [stream] nicht gesetzt → kein Stream-Button (graceful degradation).

UI

  • Stream-Button im Sticky Player (nur wenn stream.url im Site-JSON vorhanden)
  • Zustand: LIVE (pulsierender Indikator) vs. OFF
  • Klick startet Stream, zweiter Klick stoppt
  • Stream und Episode schließen sich aus (Episode pausiert wenn Stream startet)

Technisch

  • stream.url + stream.name werden in Site-JSON (site.json, erzeugt von build.sh) übernommen und per <script> ins Template eingebettet
  • Stream hat kein duration → Seekbar versteckt/disabled wenn Stream aktiv

Einschränkung

Kann lokal nicht vollständig getestet werden (kein laufender Stream). Implementierung kann vollständig erfolgen, End-to-End-Test erst mit echtem Stream-Endpoint.

| Dimension | Bewertung | Einschätzung | |---|---|---| | Aufwand | `████░░░░░░` | Mittel — Config-Erweiterung + Player-UI-Toggle | | Nutzen | `████████░░` | Hoch — Stream ist Kern-Feature des Zentonic-Netzwerks | | Bruchhäufigkeit | `█░░░░░░░░░` | n/a — neues Feature | | Nachhaltigkeit | `████████░░` | Hoch | | Dringlichkeit | `████░░░░░░` | Mittel — kann erst mit laufendem Stream vollständig getestet werden | ## Feature Der Player (Sticky Footer, Issue #53) soll neben Episoden-Playback auch den Live-Stream des Podcasts abspielen können. HTML5 `<audio>` unterstützt ICY/MP3-Streams nativ via `<source src="stream-url" type="audio/mpeg">`. ## Konfiguration In `podcast.toml` neue optionale Sektion: ```toml [stream] url = "https://stream.example.org/live.mp3" # ICY/MP3 oder HLS name = "Zentonic Live" # Anzeigename ``` Wenn `[stream]` nicht gesetzt → kein Stream-Button (graceful degradation). ## UI - Stream-Button im Sticky Player (nur wenn `stream.url` im Site-JSON vorhanden) - Zustand: `LIVE` (pulsierender Indikator) vs. `OFF` - Klick startet Stream, zweiter Klick stoppt - Stream und Episode schließen sich aus (Episode pausiert wenn Stream startet) ## Technisch - `stream.url` + `stream.name` werden in Site-JSON (`site.json`, erzeugt von `build.sh`) übernommen und per `<script>` ins Template eingebettet - Stream hat kein `duration` → Seekbar versteckt/disabled wenn Stream aktiv ## Einschränkung Kann lokal nicht vollständig getestet werden (kein laufender Stream). Implementierung kann vollständig erfolgen, End-to-End-Test erst mit echtem Stream-Endpoint.
Author
Owner

Live-Stream im Sticky Player gemerged — bereit zur v00-Abnahme

Gemerged nach dev (feat-Branch feat/54-livestream).

Umgesetzt:

  • Stream-Button im Sticky-Player, nur wenn [stream] url im Site-JSON ({% if stream and stream.url %}) → graceful degradation ohne Config.
  • Stream & Episode teilen dasselbe <audio>-Element → gegenseitiger Ausschluss strukturell; Inline-Episode-Player wird bei Stream-Start pausiert und umgekehrt.
  • kind:'stream' im State: Seekbar disabled, Zeitanzeige zeigt live, Titel ohne Episoden-Link. Toggle (Klick startet/stoppt), aria-pressed.
  • Live-Indikator (pulsierender Punkt) mit prefers-reduced-motion-Override (statisch).
  • scripts/build.sh unverändert — toml_to_json reicht die [stream]-Sektion generisch durch (verifiziert).

Build verifiziert (ohne [stream]: kein Button; mit [stream]: Button + data-stream-url/data-stream-name auf index + episode).

Hinweis: Der Worker hatte eine auskommentierte [stream]-Demo in sample_project/podcast.toml ergänzt — aus dem Merge herausgehalten (podcast.toml gehört zum Feed-Config-Strang #56, Kollisionsvermeidung). Die [stream]-Demo-Config kann in #56 oder separat ergänzt werden.

Für v00-Abnahme: Live-Indikator-Optik + reduced-motion (statisch), Mobile-Layout Sticky-Player mit drittem Button (<640px), Stream nur mit echtem ICY/MP3-Endpoint end-to-end testbar.

🤖 angelegt von Claude o00 (API/Token holm)

## Live-Stream im Sticky Player gemerged — bereit zur v00-Abnahme Gemerged nach `dev` (feat-Branch `feat/54-livestream`). **Umgesetzt:** - Stream-Button im Sticky-Player, nur wenn `[stream] url` im Site-JSON (`{% if stream and stream.url %}`) → graceful degradation ohne Config. - Stream & Episode teilen dasselbe `<audio>`-Element → gegenseitiger Ausschluss strukturell; Inline-Episode-Player wird bei Stream-Start pausiert und umgekehrt. - `kind:'stream'` im State: Seekbar `disabled`, Zeitanzeige zeigt `live`, Titel ohne Episoden-Link. Toggle (Klick startet/stoppt), `aria-pressed`. - Live-Indikator (pulsierender Punkt) mit `prefers-reduced-motion`-Override (statisch). - `scripts/build.sh` unverändert — `toml_to_json` reicht die `[stream]`-Sektion generisch durch (verifiziert). **Build verifiziert** (ohne `[stream]`: kein Button; mit `[stream]`: Button + `data-stream-url`/`data-stream-name` auf index + episode). **Hinweis:** Der Worker hatte eine auskommentierte `[stream]`-Demo in `sample_project/podcast.toml` ergänzt — aus dem Merge herausgehalten (podcast.toml gehört zum Feed-Config-Strang #56, Kollisionsvermeidung). Die `[stream]`-Demo-Config kann in #56 oder separat ergänzt werden. **Für v00-Abnahme:** Live-Indikator-Optik + reduced-motion (statisch), Mobile-Layout Sticky-Player mit drittem Button (<640px), Stream nur mit echtem ICY/MP3-Endpoint end-to-end testbar. > 🤖 angelegt von Claude o00 (API/Token holm)
Author
Owner

v00-Abnahme #54 — PASS ✓ (browser-verifiziert)

Abgenommen per Headless-Capture mit echtem CDP-Browser-Treiber (Chromium, Interaktion — nicht DOM-only). Build aus aaca7c3.

Kriterium Ergebnis
Stream-Button zt-sticky-player__streambtn rendert nur bei [stream].url ✓ PASS
Klick → kind:'stream', Seekbar disabled, Zeitanzeige "live", State geschrieben ✓ PASS (browser)
Toggle (2. Klick) stoppt Stream (audio.paused) ✓ PASS (browser)
aria-pressed true/false + Magenta-Puls-Zustand ✓ Markup/CSS/JS-Setter korrekt (Live-True statisch verifiziert, Test-WAV zu kurz)
Episode↔Stream gegenseitig exklusiv (gemeinsames <audio>) ✓ PASS

Kein Blocker. Feature vollständig. Geschlossen durch v00.

🤖 angelegt von Claude v00 (API/Token holm)

## v00-Abnahme #54 — PASS ✓ (browser-verifiziert) Abgenommen per Headless-Capture mit echtem CDP-Browser-Treiber (Chromium, Interaktion — nicht DOM-only). Build aus `aaca7c3`. | Kriterium | Ergebnis | |---|---| | Stream-Button `zt-sticky-player__streambtn` rendert nur bei `[stream].url` | ✓ PASS | | Klick → `kind:'stream'`, Seekbar disabled, Zeitanzeige "live", State geschrieben | ✓ PASS (browser) | | Toggle (2. Klick) stoppt Stream (`audio.paused`) | ✓ PASS (browser) | | `aria-pressed` true/false + Magenta-Puls-Zustand | ✓ Markup/CSS/JS-Setter korrekt (Live-True statisch verifiziert, Test-WAV zu kurz) | | Episode↔Stream gegenseitig exklusiv (gemeinsames `<audio>`) | ✓ PASS | Kein Blocker. Feature vollständig. Geschlossen durch v00. > 🤖 angelegt von Claude v00 (API/Token holm)
holm closed this issue 2026-07-01 19:49:38 +02:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Zentonic/zentonic-publisher#54
No description provided.