// Auswertung einer OBS-Szene gegen den 9:16-Ausschnitt. // // Der Anlass: In einem fertigen Clip lagen fremde Untertitel im Bild, und // niemand wusste, woher sie kommen. Raten hilft da nicht - sie sind ins // Streambild eingebrannt, also muss man nachsehen, welche Quelle sie malt. // Die reine Rechnerei steht hier, damit sie pruefbar ist; das Anzeigen und // das Reden mit OBS bleibt im Entrypoint. import type { Rect } from '#core/config.ts'; export type Box = { x: number; y: number; w: number; h: number }; /** * Quellenarten und Namen, hinter denen erfahrungsgemaess Untertitel stecken. * Bewusst weit gefasst: ein Fehlalarm kostet einen Blick, eine uebersehene * Quelle kostet jeden Clip. */ export const CAPTION_HINTS = /caption|untertitel|subtitle|transcri|speech|vocal|stt|dictat|closed.?cc|(^|\W)cc(\W|$)/i; /** Wie viel Prozent des Ausschnitts die Quelle ueberdeckt. */ export function overlapPercent(box: Box, r: Rect): number { const w = Math.max(0, Math.min(box.x + box.w, r.x + r.w) - Math.max(box.x, r.x)); const h = Math.max(0, Math.min(box.y + box.h, r.y + r.h) - Math.max(box.y, r.y)); const area = r.w * r.h; return area > 0 ? Math.round(((w * h) / area) * 100) : 0; } export type SourceVerdict = { cam: number; game: number; /** Steht die Quelle im fertigen Short? */ inShort: boolean; /** Sieht sie nach fremden Untertiteln aus? */ suspectCaption: boolean; }; /** * Urteil ueber eine einzelne Quelle. * * Ausgeblendete Quellen sind nie im Bild - egal wo sie liegen. Und eine * Untertitelquelle ausserhalb des Ausschnitts ist kein Problem, sondern genau * das, was docs/obs-layout.md vorschlaegt: im Stream sichtbar lassen, aus dem * Gameplay-Band herausschieben. */ export function judgeSource(args: { box: Box; enabled: boolean; name: string; kind: string; url?: string; cam: Rect; game: Rect; }): SourceVerdict { const cam = overlapPercent(args.box, args.cam); const game = overlapPercent(args.box, args.game); const inShort = args.enabled && (cam > 0 || game > 0); return { cam, game, inShort, suspectCaption: inShort && CAPTION_HINTS.test(`${args.name} ${args.kind} ${args.url ?? ''}`), }; }