- Backend: Voice-Stats (Ping, Gateway, Status, Uptime) via SSE alle 5s
- Frontend: Klick auf Verbunden oeffnet Modal mit allen Verbindungsdetails
- Ping-Anzeige direkt im Header neben Verbunden
- Farbcodierte Ping-Dots (gruen <80ms, gelb <150ms, rot >=150ms)
- Uptime-Zaehler seit letztem VoiceConnection Ready
- connectedSince Tracking pro Guild
- PCM-Dateien werden beim ersten Abspielen in den RAM geladen (Map<string, Buffer>)
- Nachfolgende Plays lesen aus RAM statt Disk -> eliminiert I/O-Latenz
- InlineVolume Transform wird bei Volume 1.0 uebersprungen (unnoetige Sample-Verarbeitung)
- Fallback createReadStream mit 256KB highWaterMark fuer schnelleres Buffering
- Memory-Cache-Limit konfigurierbar via PCM_CACHE_MAX_MB env (default 512MB)
- Cache-Invalidierung bei Quelldatei-Aenderungen
Standard von 4 auf 2 gesenkt – passend für i5-13400 (10-Kern Target).
Lässt mehr Headroom für Discord-Wiedergabe und Node.js-Event-Loop.
Per NORM_CONCURRENCY env var weiterhin anpassbar.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sequentieller Sync ersetzt durch parallele Worker:
- Standard: 4 gleichzeitige ffmpeg-Prozesse (NORM_CONCURRENCY=4)
- Konfigurierbar per NORM_CONCURRENCY env var
- Sync-Zeit bei vielen Sounds 4x schneller (linear mit Parallelität)
- Logging gibt Parallelität und Dauer aus
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- syncNormCache() beim Serverstart: normalisiert ALLE Sounds (nicht nur Top 50)
und räumt verwaiste Cache-Dateien automatisch auf
- DM-Upload: neue Datei wird sofort im Hintergrund normalisiert
- URL-Import: Datei wird vor dem Abspielen normalisiert → direkt aus Cache
- Detailliertes Logging: neu/vorhanden/fehlgeschlagen/verwaist + Dauer
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Zwei Fehler behoben:
1. Gecachte PCM-Datei wurde als Pfad-String an createAudioResource übergeben
→ discord.js versuchte die headerlose PCM als Container zu proben → Rauschen/Stille
Fix: fs.createReadStream() + StreamType.Raw
2. Erster Play wartete auf komplette ffmpeg-Verarbeitung bevor Wiedergabe startete
Fix: Tee-Stream — ffmpeg-Output wird gleichzeitig an Player UND Cache-Datei geschrieben
→ Sofortige Wiedergabe auch beim ersten Mal, Cache wird nebenbei gefüllt
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ffmpeg loudnorm läuft jetzt nur noch beim allerersten Play eines Sounds.
Das Ergebnis wird als PCM in .norm-cache/ gespeichert und danach direkt
abgespielt (kein ffmpeg-Spawn mehr → praktisch null Overhead).
- .norm-cache/ Verzeichnis mit automatischer Invalidierung (Quell-mtime)
- Cache-Cleanup bei Admin delete/rename
- Hintergrund-Warmup beim Serverstart: Top-50 Sounds vorab normalisieren
- Fallback auf direktes Abspielen wenn ffmpeg fehlschlägt
- .norm-cache wird aus Soundliste gefiltert
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Backend:
- nowPlaying Map trackt aktuell gespielten Sound pro Guild
- SSE broadcast { type: 'nowplaying' } bei play und stop
- nowplaying im SSE-Snapshot für neue Clients
- playFilePath Helper broadcastet ebenfalls (Party Mode)
Frontend:
- SSE-Handler für nowplaying Events (sync über alle Clients)
- Now-Playing als Pill-Badge in der Topbar (rechts, neben Channel)
- Bottombar komplett entfernt
- Fade-in Animation und accent-farbige Pill
- --accent-rgb CSS Variable für alle Themes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Volume-Control von Bottom-Bar in Toolbar verschoben (links von Random)
- Pill-förmiges Design passend zu Size-Slider
- "Spielt" Anzeige bleibt bis Stop oder neuer Sound sichtbar
- Anfangsbuchstaben nur beim ersten Sound jeder Gruppe
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instead of displaying the letter (A, B, C...) on every sound card,
only show it on the first card that starts with that letter. Makes
the grid much cleaner and easier to scan.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Complete rewrite of App.tsx and styles.css to match the Discord-style
soundboard mockup design:
- Topbar: logo, custom channel dropdown, centered live clock, connection status
- Toolbar: category tabs (Alle/Neu/Favoriten), search, Random/Party/Stop
buttons, card size slider, theme color dots (5 themes)
- Main: responsive square card grid with initial letter avatars, ripple
effects, playing animations, favorite stars, NEW badges
- Bottom bar: now-playing wave indicator, volume slider
- Context menu on right-click (play, favorite, admin delete)
- Party mode overlay, toast notifications, admin panel
- All API integration preserved (SSE, channels, volume, play, party)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a size selector in the header bar that allows users to choose
between Small, Medium, and Large sound buttons. Choice persists
via localStorage. Responsive breakpoints also respect the setting.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Redesigned the entire frontend with a new "DECK" aesthetic:
- 5 distinctive themes: Midnight, Daylight, Neon, Vapor, Matrix
- Compact pill-shaped sound buttons with category color bars
- Tab navigation: All Sounds / Favorites / Recently Added
- Horizontal category filter chips with color coding
- Fixed bottom control bar: Stop, Random, Party, Volume
- Responsive layout optimized for 800+ sounds
- Syne + Outfit typography pairing
- Party mode with animated gradient effects
- Search with clear button, "Now Playing" indicator
- Admin panel as modal overlay
- Subtle dot grid background pattern on dark themes
Replaces the previous Apple Music-style card layout with a dense,
efficient grid that scales properly for large sound libraries.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>