Pult: Handy als Stream Deck mit Soundboard und Szenenwechsel
Paket bauen und veroeffentlichen / paket (push) Failing after 1m21s
Paket bauen und veroeffentlichen / paket (push) Failing after 1m21s
- /pult als installierbare Web-App (Manifest, Service Worker, Symbole) - Soundboard: Sounds vom Handy hochladen, bearbeiten, im Stream spielen ueber die neue Browser-Source /sounds - Szenen, Clip und Stummschalter: der Stream-PC waehlt sich mit eigenem Schluessel beim Hub ein (fern:verbinden), Befehle warten auf OBS - Browser-Sources melden, welche Seite sie sind Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
70448967f5
commit
8be195d938
29 files changed
+2935
-28
No files matched your search
@@ -78,6 +78,25 @@ export type LiegestuetzeEvent = {
|
||||
name?: string;
|
||||
};
|
||||
|
||||
/**
|
||||
* Was der Stream-PC ueber OBS meldet. Kommt ueber die Fernsteuerung
|
||||
* (fern.ts) herein und steht im Schnappschuss, damit das Pult nach dem
|
||||
* Neuverbinden sofort die Szenen kennt.
|
||||
*/
|
||||
export type ObsStandEvent = {
|
||||
kind: 'obs';
|
||||
/** Ist der Stream-PC ueberhaupt mit dem Hub verbunden? */
|
||||
pc: boolean;
|
||||
/** Und hat er OBS erreicht? */
|
||||
obs: boolean;
|
||||
szenen: string[];
|
||||
aktuell: string | null;
|
||||
/** Toneingaenge, die sich stummschalten lassen. */
|
||||
ton: Array<{ name: string; stumm: boolean }>;
|
||||
/** Laeuft der Wiedergabepuffer? Ohne ihn gibt es keinen Clip. */
|
||||
puffer: boolean;
|
||||
};
|
||||
|
||||
export type OverlayEvent =
|
||||
| ChatEvent
|
||||
| AlertEvent
|
||||
@@ -103,12 +122,24 @@ export type OverlayEvent =
|
||||
| { kind: 'still' }
|
||||
| LiegestuetzeEvent
|
||||
| { kind: 'scene'; scene: string }
|
||||
/**
|
||||
* Ein Sound vom Pult. Wie beim Vorlesen geht nur die ID hinaus; die Datei
|
||||
* holt sich die Seite /sounds einzeln, damit Chat und Statusleiste keine
|
||||
* Megabytes mitschleppen.
|
||||
*/
|
||||
| { kind: 'sound'; id: string; name: string; laut: number }
|
||||
/** Alle laufenden Sounds abbrechen. Vorlesen bleibt davon unberuehrt. */
|
||||
| { kind: 'sound-stopp' }
|
||||
/** Die Liste der Sounds hat sich geaendert - offene Pulte laden neu. */
|
||||
| { kind: 'sounds-geaendert' }
|
||||
| ObsStandEvent
|
||||
| { kind: 'clear'; userId?: string; messageId?: string }
|
||||
| { kind: 'beat'; t: number }
|
||||
| {
|
||||
kind: 'state'; stream: StreamEvent; chat: ChatEvent[]; alerts: AlertEvent[];
|
||||
/** Liegestuetze, damit der Zaehler nach dem Neuverbinden stimmt. */
|
||||
liegestuetze: { offen: number; gemacht: number };
|
||||
obs: ObsStandEvent;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -137,6 +168,9 @@ export function createBus(): Bus {
|
||||
kind: 'stream', live: false, title: '', category: '', viewers: 0, startedAt: null,
|
||||
};
|
||||
let liegestuetze = { offen: 0, gemacht: 0 };
|
||||
let obs: ObsStandEvent = {
|
||||
kind: 'obs', pc: false, obs: false, szenen: [], aktuell: null, ton: [], puffer: false,
|
||||
};
|
||||
|
||||
return {
|
||||
publish(ev) {
|
||||
@@ -152,6 +186,8 @@ export function createBus(): Bus {
|
||||
stream = ev;
|
||||
} else if (ev.kind === 'liegestuetze') {
|
||||
liegestuetze = { offen: ev.offen, gemacht: ev.gemacht };
|
||||
} else if (ev.kind === 'obs') {
|
||||
obs = ev;
|
||||
} else if (ev.kind === 'clear') {
|
||||
// Geloeschtes verschwindet auch aus dem Rueckblick, sonst holt der
|
||||
// naechste Neustart der Browser-Source es zurueck ins Bild.
|
||||
@@ -174,7 +210,7 @@ export function createBus(): Bus {
|
||||
return () => { listeners.delete(fn); };
|
||||
},
|
||||
|
||||
snapshot: () => ({ kind: 'state', stream, chat: [...chat], alerts: [...alerts], liegestuetze }),
|
||||
snapshot: () => ({ kind: 'state', stream, chat: [...chat], alerts: [...alerts], liegestuetze, obs }),
|
||||
clients: () => listeners.size,
|
||||
};
|
||||
}
|
||||
Reference in new issue
Block a user