🌌 HANDOFF — Hörraum-Player & Cue-Timecodes (fĂŒr die Crew / Ansible-Katze)

Stand 2026-08-26. Der animierte Season-Player lĂ€uft als erster Test — schön genug zum Weiterbauen.
Live-Demo (ep10, EN-Master): https://claude.ai/code/artifact/d722966d-07b8-48e5-b1f2-bd6f96a67140

Quelle im Repo: hoerraum/season_player_ep10.html (Player-HĂŒlle; Audio per relativem Pfad,
Untertitel-Text aus raw_stems/
/script.json, Bild/Text-Sync ĂŒber eine Cue-Timeline).


Was gebraucht wird: Zeilen-Timecodes im cue_sheet (Schema /2)

Das cue_sheet.json hat schon Section-Timecodes (sections[].t_start/t_end/beats). FĂŒr
wortgenaue Untertitel-Sync fehlt nur das Zeilen-Timing. Neu: ein beat vom kind:"line".

// schema: "crumcast.cue_sheet/2"   (Bump, sobald line-beats drin sind)
{ "kind": "line",
  "t": 30.4,          // Startsekunde im Master
  "dur": 6.2,         // Dauer des gesprochenen Stems
  "character": "bugsy",
  "slug": "ich-bin-da" }   // JOIN zu script.json → Text (de/en/fr/ko), NICHT duplizieren
  • Text bleibt in script.json (per character+slug gejoint). Ein SoT, kein doppelter Text.
  • t/dur liegen der Katze schon vor: es sind die kumulierten dauer_s aus
    render_episode.py → build_timeline (die EintrĂ€ge mit Voice-Stem). Kumulativ aufsummieren,
    Startzeit = Summe davor, dur = eigener dauer_s. Beim Render einfach mit rausschreiben.
  • Emit-Ort: entweder als line-beats in die passende Section, oder — noch simpler fĂŒr den
    Player — flach als episodes/episode_XX.cues.json ([{t,dur,character,slug}]). Player nimmt beides.

Warum: der Player skaliert die Timings heute nur proportional (Story 0–152 → echte 282 s) —
grob, driftet. Mit echten t/dur sitzt jede Zeile wortgenau. Das ist der einzige offene Punkt.


Barrierefrei — kein KrĂŒmel geht verloren ❀

Das Medium ist von sich aus zweikanalig, wenn wir es sauber halten:

  • Blinder KrĂŒmel: das Hörspiel ist audio-vollstĂ€ndig — die ganze Geschichte steckt im Ton.
    Die animierte BĂŒhne ist Zugabe, nie TrĂ€ger. SVG trĂ€gt role="img" + aria-label.
  • Tauber KrĂŒmel: die Untertitel tragen die ganze Geschichte — wenn sie vollstĂ€ndig und
    synchron sind. Genau deshalb sind die Zeilen-Timecodes keine Spielerei, sondern die
    Barrierefreiheit selbst.

Also: Untertitel vollstĂ€ndig (jede Sprechzeile) + synchron (Schema /2) = jeder KrĂŒmel dabei,
ob taub oder blind. prefers-reduced-motion respektiert der Player bereits.


NĂ€chste Schritte

  1. Katze: beim Render line-Timecodes mit rausschreiben (Schema /2 oder .cues.json).
  2. Player: .cues.json laden → proportionale Skalierung ersetzen (eine if(cues)-Abzweigung).
  3. Pro Season ein Szenen-Modul (Palette + SVG-BĂŒhne + Cue-Map); HĂŒlle bleibt gleich. Statisches
    HTML pro Season und der Anime-Weg leben nebeneinander.

Update 2026-08-26 — ep10 live auf eigener Season-Subdomain

Live: http://s02.mondgeschichten.branko.de/season_player_ep10.html (Strato-Webhosting,
81.169.145.93 — nicht die VPS; nur FTP). SSL folgt, wenn die Pipeline auf dem Core liegt.

Struktur — Subdomain pro Season (erste Trennung, Grundlage fĂŒr S03+):
sNN.mondgeschichten.branko.de → eigener docroot sNN/ mit index.html, season_player_*.html,
episodes/ (nur die WAVs der Season, keine Duplikate) und hoerraum/ (js + Bilder). Jede Season
= ein abgeschlossener, weiterreichbarer Ordner (offline-tauglich, #allein #ohne).

Player-Fixes (in hoerraum/season_player_ep10.html verankert):
- Sprachknöpfe schalten jetzt Audio + Untertitel (vorher nur Untertitel, Ton hing auf EN).
Standard DE; SRC-Map de/en/fr, Position bleibt beim Wechsel erhalten.
- LI={de:3,en:4,fr:5} (war 2,3,4 — um eins verschoben; DE zeigte den Sprecher-Buchstaben,
FR den englischen Text). CAP-Zeile ist [start,end,speaker,DE,EN,FR].
- <meta charset="utf-8"> ergĂ€nzt (fehlte ganz → „Hörraum", verhunzte Umlaute/Akzente).
- ⚠ Diese drei Fehler stecken in der Player-Vorlage — bei ep11+ (S03) mit demselben Muster
kĂ€men sie wieder. Verankert in hoerraum/season_player.template.html (kanonische HĂŒlle,
Fixe fest, Platzhalter {{SEASON}}/{{EP}}/{{EP_TITLE}}/{{WAV_BASE}} + markierte Season-Slots
CAP/STORY/Szenen-Modul). ep11 aus DIESER Vorlage kopieren, nicht aus ep10. Ein Generator in
render_episode.py (CAP aus .cues.json+script.json = echte Sync) bleibt der spÀtere,
grĂ¶ĂŸere Schritt — bewusst noch nicht gebaut.

Lore (Crew-Frage, festgehalten): Die Sternenkarte ist KEIN Hexagon. Kodex (ep05) =
Hexagon, geschlossen/innen/6. Sternbild (ep10) = Crew, offen/außen/5. Ein geschlossenes Symbol in
der Karte wĂ€re RĂŒckschritt. Der Kreis schließt erst ep45.

đŸ„· Easter-Egg #kekshandbuch: „ninja 
 wollte nicht gesehen werden." Bleibt bewusst versteckt —
nicht wegdokumentieren, nur wissen, dass es da ist. (Vermutlich Faden zu ninja_tune-Interstitials.)

Richtung — #container #ĂŒbersee: „am Ende wird diese Pipeline rostig werden." Der FTP-Handweg
hier ist die Demo-KrĂŒcke; das Ziel ist der Rust-Core im Container (rostig = Rust), Auslieferung ĂŒbers
Core statt Strato-FTP. Dann kommt auch SSL. Bis dahin: stumpf der fertige Ordner per FTP.