Kamerafenster: Groesse und Ecke lassen sich stellen
Filipe: "und danach perfektionierst du auch die verschiedenen groessen von kamera und so, perfektionier das alles bitte." Sechs Groessen (0,6x bis 2x) und vier Ecken, beide an der SENDUNG und nicht am Browser: Was Filipe einstellt, sehen alle. Waere es eine Einstellung je Geraet, redete er ueber ein Bild, das bei den Zusehenden anders aussieht -- und im Stream stuende ein drittes. Anordnung, Groesse und Ecke gehen jetzt EINEN Weg (/layout), weil sie zusammen eine einzige Frage beantworten: Wie sieht das Bild aus? Drei getrennte Aufrufe waeren drei Rundrufe, und dazwischen saehen die Zusehenden eine Mischung -- neue Anordnung, alte Ecke. Eine falsche Angabe laesst auch das Gute stehen, statt halb umzustellen. Die Ecke gibt es, weil unten rechts bei TikTok die Knopfreihe liegt, bei YouTube die Fortschrittsleiste, und Untertitel fast immer unten stehen. Eine feste Ecke ist eine, die bei jeder zweiten Plattform im Weg ist. Die OBS-Videoquelle kennt jetzt die Anordnung und blendet sich bei "Nur Kamera" aus -- sonst laege im Stream ein stehengebliebenes YouTube-Bild unter den Kameras, und Filipe saehe es nicht, weil er auf seine Szene schaut und nicht auf die Quelle. VIER BEFUNDE, ALLE VON DEN PRUEFUNGEN UND KEINER VOM AUGE: 1. Die Knoepfe fuer Groesse und Ecke gab es gar nicht. HTML und Stilblatt waren da, das Programm nicht. Gemessen: "0 von 0 Eckknoepfen gesperrt", und der Hinweistext stand noch wortgleich wie im HTML -- zwei leere Kaesten, die aussahen, als sei alles in Ordnung. 2. Bei "Nur Kamera" war der Stapel 493 px breit statt 1072. Der neue Deckel max-width: 46% -- richtig gegen ein zu grosses Fenster bei "Video gross" -- galt still auch dort, wo die Kameras die ganze Flaeche fuellen sollen. 3. Am Handy haette die Groesseneinstellung ueberhaupt nichts bewirkt: Dort stand weiterhin width: clamp(88px, 26vw, 140px) am Fenster selbst. Das ist die dritte Wiederholung derselben Sache an einem Tag (die Saalzeilen, die Tafeln, jetzt die Kamerabreite): Zwei Regeln fuer dieselbe Frage sind die Garantie, dass eine davon irgendwo falsch gewinnt. Breite und Rand gehen jetzt ueber --kam-grund/--kam-rand, --kam wird an genau EINER Stelle gerechnet, und eine Pruefung zaehlt das nach. 4. Die Pruefung schlug auf ihren EIGENEN Kommentar an, der die entfernte Zeile zitiert. Ein Werkzeug, das bei jedem Lauf meckert, wird nach dem zweiten Mal weggeklickt -- samt dem echten Befund darin. Gezaehlt werden jetzt Regeln, nicht Prosa. Gemessen beim Zuschauer und nicht in der Datenbank: 1x -> 208 px, 2x -> 416 px, alle Fenster innerhalb der Leinwand, und jede der vier Ecken am Abstand zu den Kanten nachgewiesen statt an ihrem eigenen Namen. Ein Knopf, der gerade nichts bewirken kann, ist grau, und der Satz darunter sagt warum. pruef-reaktion 320/0 - pruef-buehne 36/0 - pruef-css-klassen ok - pruef-tippziele 11/0 - mess-reaktion ohne Beanstandung Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -48,6 +48,7 @@ import { einstellung } from "./workspace.js";
|
||||
import { mitZugangsdaten, wegeAusfaechern } from "./workspace-turn.js";
|
||||
import {
|
||||
SICHT_PLAETZE, GAESTE_MAX, TEXT_MAX, SCHREIB_BREMSE, STAENDE, LAYOUTS, TEMPI,
|
||||
KAMERA_GROESSEN, KAMERA_ECKEN,
|
||||
MELDUNG_TAGE,
|
||||
VERLAUF_TAGE, LISTE_MAX, CHAT_MODI, STUMM_MAX_MINUTEN, MASSNAHMEN,
|
||||
} from "./reaktion-tabellen.js";
|
||||
@@ -257,6 +258,14 @@ function lage(person) {
|
||||
nach fuenf Minuten zwei Minuten woanders. */
|
||||
tempo: Number(s.tempo) || 1,
|
||||
tempi: TEMPI,
|
||||
/* GROESSE UND ECKE DER KAMERAS GEHEN AN ALLE. Sie sind Teil des
|
||||
Bildes, nicht der Regie -- wer sie nicht bekaeme, saehe die
|
||||
Fenster woanders und in einer anderen Groesse als der, der
|
||||
darueber redet. */
|
||||
kamera_gross: Number(s.kamera_gross) || 1,
|
||||
kamera_ecke: s.kamera_ecke || "ur",
|
||||
kamera_groessen: KAMERA_GROESSEN,
|
||||
kamera_ecken: KAMERA_ECKEN,
|
||||
gestartet_am: s.gestartet_am,
|
||||
/* WER GERADE SEIN BILD AUS HAT -- fuer den Host und fuer jeden
|
||||
Gast. Ohne diese Auskunft waere ein abgeschaltetes Bild von
|
||||
@@ -1265,11 +1274,49 @@ reaktionRouter.post("/workspace/api/reaktion/chatmodus", nurHost, express.json({
|
||||
reaktionRouter.post("/workspace/api/reaktion/layout", nurHost, express.json({ limit: "2kb" }),
|
||||
(req, res) => {
|
||||
try {
|
||||
const l = String(req.body?.layout ?? "");
|
||||
if (!LAYOUTS.includes(l)) return res.status(400).json({ fehler: "layout_unbekannt" });
|
||||
db().prepare("UPDATE reaktion SET layout = ? WHERE id = 1").run(l);
|
||||
melden("reaktion", { was: "layout", layout: l });
|
||||
res.json({ ok: true, layout: l });
|
||||
/* ==== DREI EINSTELLUNGEN, EIN WEG =========================
|
||||
|
||||
Anordnung, Groesse und Ecke beantworten zusammen eine
|
||||
einzige Frage: „Wie sieht das Bild aus?" Drei Wege dafuer
|
||||
waeren drei Rundrufe, und zwischen ihnen gaebe es
|
||||
Augenblicke, in denen die Zusehenden eine Mischung sehen --
|
||||
neue Anordnung, alte Ecke.
|
||||
|
||||
JEDES FELD IST FREIWILLIG, aber eines muss dabei sein. Ein
|
||||
Aufruf, der nichts aendert, ist ein Rundruf ohne Anlass. */
|
||||
const aendern = [];
|
||||
const werte = [];
|
||||
|
||||
if (req.body?.layout !== undefined) {
|
||||
const l = String(req.body.layout);
|
||||
if (!LAYOUTS.includes(l)) return res.status(400).json({ fehler: "layout_unbekannt" });
|
||||
aendern.push("layout = ?"); werte.push(l);
|
||||
}
|
||||
if (req.body?.kamera_gross !== undefined) {
|
||||
const g = Number(req.body.kamera_gross);
|
||||
if (!KAMERA_GROESSEN.includes(g)) {
|
||||
return res.status(400).json({ fehler: "kameragroesse_unklar" });
|
||||
}
|
||||
aendern.push("kamera_gross = ?"); werte.push(g);
|
||||
}
|
||||
if (req.body?.kamera_ecke !== undefined) {
|
||||
const e = String(req.body.kamera_ecke);
|
||||
if (!KAMERA_ECKEN.includes(e)) {
|
||||
return res.status(400).json({ fehler: "ecke_unklar" });
|
||||
}
|
||||
aendern.push("kamera_ecke = ?"); werte.push(e);
|
||||
}
|
||||
if (!aendern.length) return res.status(400).json({ fehler: "nichts_zu_tun" });
|
||||
|
||||
db().prepare(`UPDATE reaktion SET ${aendern.join(", ")} WHERE id = 1`).run(...werte);
|
||||
const n = sendung();
|
||||
const bild = {
|
||||
layout: n.layout,
|
||||
kamera_gross: Number(n.kamera_gross) || 1,
|
||||
kamera_ecke: n.kamera_ecke || "ur",
|
||||
};
|
||||
melden("reaktion", { was: "layout", ...bild });
|
||||
res.json({ ok: true, ...bild });
|
||||
} catch (fehler) {
|
||||
console.error("[reaktion] Layout:", fehler?.message);
|
||||
res.status(503).json({ fehler: "nicht_verfuegbar" });
|
||||
|
||||
Reference in New Issue
Block a user