Skip to content

Commit e84e76e

Browse files
mkschulzeclaude
andcommitted
feat(11): add music-themed virtual backgrounds to companion page
- 5 SVG backgrounds: Studio Neon, Concert Stage, Vinyl Wall, Synthwave, Jam Room - Dropdown offers: No Effect, Blur, Green Screen, plus the 5 backgrounds - Uses VDO.Ninja &effects=4&imageSrc= for virtual backgrounds - Removed &webcam so VDO.Ninja shows setup/preview before joining - User picks background first, then clicks START in VDO.Ninja - Selection persists via localStorage Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 7f54563 commit e84e76e

14 files changed

Lines changed: 538 additions & 13 deletions

File tree

companion/index.html

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ <h1>JamWide Video</h1>
2424
<option value="none">No Effect</option>
2525
<option value="blur">Blur Background</option>
2626
<option value="greenscreen">Green Screen</option>
27-
<option value="image">Virtual Background</option>
27+
<option value="bg-studio-neon">Studio Neon</option>
28+
<option value="bg-concert-stage">Concert Stage</option>
29+
<option value="bg-vinyl-wall">Vinyl Wall</option>
30+
<option value="bg-synth-wave">Synthwave</option>
31+
<option value="bg-jam-room">Jam Room</option>
2832
</select>
2933
<span id="status-badge" class="badge-disconnected">Disconnected</span>
3034
</header>
Lines changed: 39 additions & 0 deletions
Loading
Lines changed: 66 additions & 0 deletions
Loading
Lines changed: 34 additions & 0 deletions
Loading
Lines changed: 51 additions & 0 deletions
Loading
Lines changed: 63 additions & 0 deletions
Loading

companion/src/ui.ts

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,18 @@ export function setSessionInfo(roomId: string): void {
6969

7070
// ── Background Effects ──
7171

72-
export type BgEffect = 'none' | 'blur' | 'greenscreen' | 'image';
72+
export type BgEffect = 'none' | 'blur' | 'greenscreen' | 'bg-studio-neon' | 'bg-concert-stage' | 'bg-vinyl-wall' | 'bg-synth-wave' | 'bg-jam-room';
7373

7474
const EFFECT_STORAGE_KEY = 'jamwide-bg-effect';
75+
const BG_BASE_URL = 'https://jamwide.audio/video/backgrounds/';
76+
77+
const BACKGROUND_IMAGES: Record<string, string> = {
78+
'bg-studio-neon': 'studio-neon.svg',
79+
'bg-concert-stage': 'concert-stage.svg',
80+
'bg-vinyl-wall': 'vinyl-wall.svg',
81+
'bg-synth-wave': 'synth-wave.svg',
82+
'bg-jam-room': 'jam-room.svg',
83+
};
7584

7685
export function getSavedEffect(): BgEffect {
7786
return (localStorage.getItem(EFFECT_STORAGE_KEY) as BgEffect) || 'none';
@@ -81,20 +90,22 @@ export function saveEffect(effect: BgEffect): void {
8190
localStorage.setItem(EFFECT_STORAGE_KEY, effect);
8291
}
8392

84-
function effectToParam(effect: BgEffect): string {
85-
switch (effect) {
86-
case 'blur': return '&effects=3';
87-
case 'greenscreen': return '&effects=5';
88-
case 'image': return '&effects=4';
89-
default: return '';
93+
function effectToParams(effect: BgEffect): string {
94+
if (effect === 'blur') return '&effects=3';
95+
if (effect === 'greenscreen') return '&effects=5';
96+
const bgFile = BACKGROUND_IMAGES[effect];
97+
if (bgFile) {
98+
const imgUrl = BG_BASE_URL + bgFile;
99+
return '&effects=4&imageSrc=' + encodeURIComponent(imgUrl);
90100
}
101+
return '';
91102
}
92103

93104
// ── VDO.Ninja URL Builder ──
94105

95106
export function buildVdoNinjaUrl(room: string, push: string, effect?: BgEffect): string {
96-
const base = `https://vdo.ninja/?room=${encodeURIComponent(room)}&push=${encodeURIComponent(push)}&noaudio&cleanoutput&webcam`;
97-
const fx = effectToParam(effect ?? getSavedEffect());
107+
const base = `https://vdo.ninja/?room=${encodeURIComponent(room)}&push=${encodeURIComponent(push)}&noaudio&cleanoutput`;
108+
const fx = effectToParams(effect ?? getSavedEffect());
98109
return base + fx;
99110
}
100111

0 commit comments

Comments
 (0)