Commit graph

248 commits

Author SHA1 Message Date
Daniel
3c8ad63f99 feat: YouTube/Instagram/MP3 download with modal + yt-dlp support
Sync from gaming-hub soundboard plugin:
- Add yt-dlp URL detection (YouTube, Instagram) + direct MP3 support
- downloadWithYtDlp() with verbose logging, error detection, fallback scan
- handleUrlDownload() shared logic with custom filename + rename
- Download modal: filename input, progress spinner, success/error phases
- URL type badges (YT/IG/MP3) in toolbar input
- Auto-prepend https:// for URLs without protocol
- Fix Dockerfile: yt-dlp_linux standalone binary (no Python needed)
- download-url route (admin-only, save without playing)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 00:13:48 +01:00
Daniel
4875747dc5 Feat: Show member count in channel dropdown
Add voice channel member count (non-bot users) to channel API
response and display it in the dropdown button and menu options.
Shows (N) suffix when users are in a channel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 20:04:27 +01:00
Claude Code
ac96896055 fix: prevent RAM spike from large PCM files (e.g. 2h elevator)
- Check file size with statSync BEFORE reading into memory
- Files >50MB (~4.5min PCM) are never loaded into RAM, always streamed
- Also skip if total cache would exceed limit (no more read-then-discard)
- Fixes 1GB+ RAM spike when playing long audio files
2026-03-05 21:29:43 +01:00
Claude Code
390d6eb575 fix: solid background for connection modal 2026-03-05 21:16:37 +01:00
Claude Code
197af92909 fix: restore overflow on sound cards + fix connectedSince uptime
- Restore overflow:hidden on html/body, sound-card, modal, admin items
- Only .now-playing and .np-name keep unbounded width (Last Played bubble)
- Fix Verbunden seit 0s: auto-set connectedSince when connection is ready
  but timestamp was not recorded (e.g. after redeploy)
2026-03-05 21:12:20 +01:00
Claude Code
de67a15050 fix: use port 9080 for internal registry (nginx proxy)
Port 5050 binds to 127.0.0.1 inside container, unreachable externally.
Port 9080 (nginx) proxies /v2/ correctly and returns 401 as expected.
Combined with network_mode=host runner, all traffic stays on LAN.
2026-03-05 17:15:37 +01:00
Claude Code
8d663f2392 perf: route registry traffic through LAN instead of internet
Use internal registry at 10.10.10.10:5050 instead of git.daddelolymp.de
which routes through Pangolin proxy over internet (40Mbit bottleneck).
All layer cache pulls/pushes and image pushes now stay on LAN.
2026-03-05 17:07:33 +01:00
Claude Code
852bda73f6 fix: remove slow Kaniko snapshot-mode=redo and compressed-caching flags
These flags caused build time regression from ~2:48 to 6:30.
snapshot-mode=redo does full filesystem walks per layer (slowest mode).
Default time-based mode is much faster for CI builds.
2026-03-05 16:53:56 +01:00
Claude Code
8598fe46aa fix: Last Played Bubble dynamische Breite, voller Dateiname sichtbar
- max-width entfernt (desktop + mobile)
- overflow:hidden + text-overflow:ellipsis entfernt
- Bubble waechst dynamisch mit Dateinamen-Laenge
2026-03-05 16:42:58 +01:00
Claude Code
f3b858452e perf: Kaniko layer caching + CI version bump to 2.0.0
- --cache=true: Docker-Layer werden zwischen Builds gecached
- --cache-repo: Cache-Layers in der Registry gespeichert
- --snapshot-mode=redo: schnellere Snapshot-Erstellung
- --compressed-caching=false: weniger CPU fuer Cache-Kompression
- Runner: 8 CPUs + 8GB RAM + 256MB SHM zugewiesen
- Version strings auf 2.0.0 aktualisiert
2026-03-05 16:34:44 +01:00
Claude Code
149b97e511 rename: Soundboard -> Jukebox420 2026-03-05 16:33:28 +01:00
Claude Code
1a1fdf69c8 feat: Verbindungsdetails Modal mit Live-Ping
- 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
2026-03-05 16:28:35 +01:00
Claude Code
761032a280 v2.0.0 🚀
Highlights:
- Node 24 LTS Runtime (npm 11)
- Static ffmpeg Binary (Image -45%, 892MB -> 493MB)
- In-Memory PCM Cache (instant Sound-Playback nach erstem Abspielen)
- InlineVolume Bypass bei Volume 1.0
- sodium-native v5, Express v5, @discordjs/voice 0.19 (DAVE E2EE)
- Alle Dependencies auf aktuellem Stand
2026-03-05 16:04:15 +01:00
Claude Code
5ef5598758 merge nightly: v2.0.0 - Node 24, static ffmpeg, in-memory PCM cache
Major changes since v1.1.1:
- Node 20 -> 24 LTS (npm 11, @types/node v24)
- sodium-native v5, @types/multer v2
- Static ffmpeg binary (Image 892MB -> 493MB, -45%)
- ffprobe entfernt (nicht benutzt)
- In-Memory PCM Cache (kein Disk-I/O bei wiederholtem Abspielen)
- InlineVolume skip bei Volume 1.0
- TimeoutNegativeWarning unterdrueckt (Node 24 Kompatibilitaet)
2026-03-05 16:03:44 +01:00
Claude Code
546d28c8fa fix: Dockerfile ffmpeg-fetch + drop ffprobe + suppress TimeoutNegativeWarning
- ffmpeg-fetch Stage war versehentlich leer (sed-Fehler) - jetzt korrekt
- ffprobe entfernt (wird nirgends benutzt, spart ~200MB)
- TimeoutNegativeWarning aus @discordjs/voice unterdrueckt (Node 24 Kompatibilitaet)
2026-03-05 15:31:25 +01:00
Claude Code
4884691e7d perf: static ffmpeg binary statt apt-get install (~600MB gespart)
- Neuer multi-stage: ffmpeg-fetch laedt statisch gelinkte ffmpeg/ffprobe Binary
- Quelle: yt-dlp/FFmpeg-Builds (GPL, alle Codecs enthalten)
- Runtime braucht kein apt-get install ffmpeg mehr (kein libavcodec etc.)
- curl wird nach yt-dlp Download wieder entfernt (apt purge)
- Erwartete Image-Groesse: ~280MB statt ~890MB
2026-03-05 15:20:20 +01:00
Claude Code
901f0bf1dd perf: in-memory PCM cache + skip InlineVolume at vol 1.0
- 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
2026-03-05 15:10:18 +01:00
Claude Code
2a72f0f000 merge nightly: Node 24 LTS, sodium-native v5, @types/multer v2, @types/node v24 2026-03-05 15:03:48 +01:00
Claude Code
cde29698ca upgrade to Node 24 LTS + @types/node v24
- Dockerfile: node:20-slim → node:24-slim (all 3 stages)
- @types/node: ^20.12.12 → ^24.0.0
- Fixes EBADENGINE warning (@discordjs/voice requires Node >=22)
- Brings npm 11 automatically
- Node 24 LTS supported until April 2028
2026-03-05 14:52:44 +01:00
Claude Code
5d01d3b4db Update: sodium-native v4->v5, @types/multer v1->v2 2026-03-05 14:09:40 +01:00
Claude Code
de57f37393 Merge branch 'nightly' 2026-03-05 14:07:30 +01:00
Claude Code
5c45c098e2 Fix: Express v5 wildcard route, add global error handlers 2026-03-05 11:30:21 +01:00
Claude Code
f043ff97bb Update: express v4->v5, @types/express v4->v5 2026-03-05 11:21:01 +01:00
Claude Code
c7cdf98efc docs: README komplett ueberarbeitet 2026-03-05 11:13:03 +01:00
Claude Code
531ee85b2f Update: discord.js 14.25.1, typescript 5.9.3, @discordjs/opus 0.10.0 2026-03-05 10:42:49 +01:00
Claude Code
84bf0bea51 Fix: Most Played zeigt 10 statt 3, Playstate Label zu Last Played 2026-03-05 01:26:51 +01:00
Claude Code
2e7f3bca7c Upgrade @discordjs/voice to 0.19 for DAVE E2EE negotiation 2026-03-05 01:12:35 +01:00
Claude Code
a34cc7e08d Add @snazzah/davey for Discord DAVE E2EE voice support 2026-03-05 00:54:44 +01:00
Claude Code
8cef19f724 Fix: ensureConnectionReady raeumt kaputte Connection auf statt sie zurueckzugeben 2026-03-05 00:31:55 +01:00
Claude Code
f26f90e0dc ci: use git.daddelolymp.de as registry 2026-03-05 00:09:49 +01:00
Claude Code
b0070bb972 ci: trigger nightly build 2026-03-04 23:52:14 +01:00
Claude Code
0b849b7775 Fix: Voice reconnect Endlosschleife verhindern
- Re-Entranz-Guard (isReconnecting) verhindert parallele Handler
- Max 3 Reconnect-Versuche bevor fresh join
- Exponentieller Backoff (2s, 4s, 6s) zwischen Retries
- Ready-State setzt Counter zurueck

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:34:10 +01:00
Bot
4c95cce611 Revert "ci: switch to rootless dind for insecure local registry"
This reverts commit c957c68f62.
2026-03-02 00:16:53 +01:00
Bot
c957c68f62 ci: switch to rootless dind for insecure local registry 2026-03-02 00:14:50 +01:00
Bot
beb6dc3113 ci: use kaniko for local registry pushes 2026-03-02 00:11:27 +01:00
Bot
9ca62566cb ci: configure dind for local insecure registry 2026-03-02 00:09:57 +01:00
Bot
99181d8965 ci: push jukebox images to local gitlab registry 2026-03-02 00:07:28 +01:00
Bot
df58b5cc93 Merge branch 'feature/nightly' into main 2026-03-02 00:05:17 +01:00
Bot
db9a18b367 Fix: TypeScript-Fehler im multer Upload-Endpoint
- @types/multer zu devDependencies hinzugefügt (fehlte → TS7016)
- Explizite Callback-Typen in diskStorage/fileFilter (TS7006)
- Express.Multer.File durch lokalen MulterFile-Type ersetzt (TS2694)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 22:25:10 +01:00
Bot
52c86240af Feat: Drag & Drop MP3/WAV Upload mit Progress-Tracking
Backend:
- multer reaktiviert (war auskommentiert) mit diskStorage + Collision-Handling
- /api/upload (POST, admin-protected): bis zu 20 Dateien gleichzeitig
- MP3/WAV-Filter (50MB Limit), sofortige Hintergrund-Normalisierung nach Upload

Frontend:
- Globale window dragenter/dragleave/drop Listener mit Counter gegen false-positives
- Drag-Overlay: Vollbild-Blur + animierter Drop-Zone (pulsierender Accent-Border, bouncing Icon)
- Upload-Queue: floating Card bottom-right mit Per-Datei Progressbar + Status-Icons
  (sync-Animation beim Hochladen, check_circle grün, error rot)
- Auto-Refresh der Soundliste + Analytics nach Upload
- Auto-Dismiss der Queue nach 3.5s

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 22:15:07 +01:00
Bot
a61663166f Config: NORM_CONCURRENCY Default auf 2 (i5/i7 Zielplattform)
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>
2026-03-01 21:30:37 +01:00
Bot
7a7056d72b Perf: Paralleler Norm-Cache-Sync mit Worker-Pool
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>
2026-03-01 21:29:53 +01:00
Bot
68414ac257 Perf: Vollständiger Norm-Cache-Sync beim Start + Auto-Cache bei Upload/Import
- 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>
2026-03-01 21:27:33 +01:00
Bot
83b8f1acac Fix: Loudnorm-Cache korrekt als Stream lesen + Tee-Caching
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>
2026-03-01 21:24:47 +01:00
Bot
4b4a61b2bd Perf: Loudnorm-Cache für minimale Play-Latenz
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>
2026-03-01 21:16:56 +01:00
Bot
9130a205f0 Refactor: Backend-Optimierungen + Volume-Debounce
- /api/play delegiert an playFilePath() statt ~120 Zeilen Duplikat-Code (inkl. fehlende Loudnorm)
- safeSoundsPath() Helfer gegen Path-Traversal bei Admin delete/rename
- writePersistedStateDebounced() reduziert Disk-I/O bei Play-Countern (2s Debounce)
- /api/sounds nutzt listAllSounds() statt duplizierte Dateisystem-Scans
- /api/play-url vor catch-all Route verschoben (war unreachable in Produktion)
- Frontend Volume-Slider mit 120ms Debounce (weniger API-Calls beim Ziehen)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 21:08:38 +01:00
Bot
5a41b6a622 Add MP3 URL import and analytics widgets 2026-03-01 18:56:37 +01:00
Bot
e200087a73 Restore admin sound management UI in web app 2026-03-01 16:14:46 +01:00
Bot
f90401a009 Feat: Now-Playing serverseitig syncen + in Topbar verschieben
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>
2026-03-01 16:00:22 +01:00
Bot
4661c366fb UI: Volume-Regler in Toolbar verschoben, Spielt-Anzeige persistent
- 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>
2026-03-01 15:37:40 +01:00