Skip to content

Music Bot: URL Theme Engine + Overlay WebAudio Visualizer + Configurable Max Song Duration Gate#269

Merged
Loggableim merged 5 commits into
mainfrom
copilot/feature-37-theme-engine-32-audio-visualizer
Apr 16, 2026
Merged

Music Bot: URL Theme Engine + Overlay WebAudio Visualizer + Configurable Max Song Duration Gate#269
Loggableim merged 5 commits into
mainfrom
copilot/feature-37-theme-engine-32-audio-visualizer

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 16, 2026

  • Merge-Konflikte mit origin/main reproduziert und analysiert
  • Konflikte in app/CHANGELOG.md aufgelöst (beide Changelog-Blöcke beibehalten)
  • Konflikte in app/plugins/music-bot/overlay.html aufgelöst (Visualizer + Up-Next Variablen konsolidiert)
  • Merge-Commit erstellt, sodass der PR-Branch wieder sauber mit main zusammengeführt ist
  • Gezielte Music-Bot-Tests nach Konfliktauflösung ausgeführt (music-bot-overlay-theme-visualizer, music-bot-queue-duration-limit)
Original prompt

Implementiere die folgenden 3 Features (Theme-Engine, Audio-Visualizer und Songlängen-Limit) für das Music Bot Plugin im ltth_desktop2 Ökosystem als Pull Request. Achte auf eine absolut produktionsreife, fehlerfreie und vollständige Umsetzung ohne Platzhalter oder gekürzten Code.

Anforderungen im Detail:

  1. Theme-Engine (Feature 37):

    • Das OBS-Overlay soll per URL-Parameter dynamisch gestylt werden können (z. B. http://localhost:port/plugins/musicbot/overlay.html?theme=cyberpunk).
    • Implementiere ein System, das basierend auf dem URL-Parameter unterschiedliche CSS-Variablen oder Stylesheets lädt (z. B. default, cyberpunk, minimal, neon).
    • Die Themes sollen das gesamte Overlay beeinflussen (Farben, Fonts, Layout-Akzente).
  2. Visualizer via Web Audio API (Feature 32):

    • Einbau eines Echtzeit-Audio-Visualizers (Frequenzbänder wie Bars, Waves oder Circles), der direkt im OBS-Overlay auf die laufende Audio-Ausgabe reagiert.
    • Nutze die Web Audio API (AnalyserNode), um die Audiodaten des aktuellen HTML5 Audio-Elements oder Streams auszulesen und in ein <canvas> zu rendern.
    • Der Visualizer soll sich farblich/stilistisch in die neue Theme-Engine integrieren.
  3. Maximale Songlänge (Feature 43):

    • Implementiere ein Limit (Backend/Queue-Logik), um Troll-Videos (z. B. 10 Stunden Nyan Cat) zu blockieren.
    • Bevor ein Song via Chat-Command (!sr) zur Queue hinzugefügt wird, muss die Metadaten-Länge geprüft werden.
    • Die maximale Länge (in Sekunden, Default z. B. 360) muss über das Dashboard konfigurierbar sein und via this.api.setConfig()/getConfig() geladen werden.
    • Bei Überschreitung soll der User ein entsprechendes Feedback (via Chat oder Toast) erhalten und der Request verworfen werden.

Technischer Kontext & Architektur-Regeln:

  • Die Architektur für Plugins, WebSockets und das Overlay muss zwingend respektiert werden.
  • Canvas-Rendering für den Visualizer muss performant sein (nutze requestAnimationFrame) und ressourcenschonend für OBS.
  • Vollständiger, marktreifer Code, keine Todo-Kommentare. Alle Randfälle (z. B. fehlende Dauer in Metadaten) müssen abgefangen werden.

The following is the prior conversation context from the user's chat exploration (may be truncated):

User: Music Bot verbessern, wie? mach vorschläge. 50 mind.

Assistant: Hier sind 53 professionelle, produktionstaugliche und technische Vorschläge zur Verbesserung und Skalierung eines Music Bot Plugins für das LTTH-Ökosystem (TikTok LIVE Connector, Node.js, SQLite, Websockets, OBS Overlays).

Die Liste ist in Architektur, Audio-Engine, Interaktion, UI/Overlays und Moderation unterteilt.

1. Core Audio-Engine & Playback

  1. Audio-Ducking: Automatische Reduzierung der Musiklautstärke (Sidechain-Effekt), wenn TTS-Nachrichten oder TikTok-Alerts getriggert werden.
  2. Crossfading: Einstellbare Überblendzeiten (z. B. 3–5 Sekunden) zwischen zwei Tracks für nahtlose Übergänge.
  3. ReplayGain / Normalisierung: Analyse und Angleichung der Lautstärke (LUFS) aller Tracks, um extreme Lautstärkesprünge zu vermeiden.
  4. Equalizer (EQ) & Filter: Integration von Web Audio API Biquad-Filtern (Bass Boost, Low-Pass für „Underwater“-Effekte).
  5. Pitch- & Tempo-Shifting: Funktionen für Nightcore- (Pitch Up/Speed Up) oder Vaporwave-Modus (Pitch Down/Slow Down), steuerbar via Chat.
  6. Multi-Channel-Routing: Trennung von Audio-Outputs (Virtual Audio Cables), damit der Stream die Musik hört, VOD-Spuren in OBS aber separiert bleiben (Twitch/TikTok VOD-Track).
  7. Hardware-Accelerated Decoding: Nutzung von FFmpeg-Child-Prozessen (spawn) für ressourcenschonendes Decoding von Audiostreams.
  8. Seamless Looping: Puffer-basierter Loop für Fallback-Beats ohne hörbare Unterbrechung (Gapless Playback).
  9. Fallback-Playlist: Automatische Wiedergabe vordefinierter (DMCA-freier) lokaler Tracks, wenn die Request-Queue leer ist.
  10. Pre-Caching: Herunterladen/Buffern der nächsten 2 Tracks in this.api.getPluginDataDir(), um Ladezeiten oder Aussetzer bei Netzwerkschwankungen zu verhindern.

2. Quellen & API-Integrationen

  1. Spotify API Integration: Steuerung des lokalen Spotify-Clients oder Nutzung der Web Playback SDK inkl. OAuth2 Token-Refresh-Handling.
  2. YouTube Audio-Extraktion: Robuste Anbindung von yt-dlp als Child-Process mit automatischem Fallback auf alternative Instanzen (z. B. Invidious API) bei Rate-Limits.
  3. SoundCloud API: Natives Streaming von SoundCloud-Links für DMCA-sichere DJ-Mixes.
  4. Lokale Dateien (Local Media Server): Rekursives Einlesen von MP3/FLAC/WAV aus dem Data-Dir inkl. automatischem ID3-Tag-Scraping (Cover, Artist, Title).
  5. Pretzel Rocks / Epidemic Sound: API-Anbindung für garantierte DMCA-freie Creator-Musik.
  6. Webradio / Icecast Support: Direkter Stream-Support (z. B. Lofi Girl Live-Streams) als Hintergrundmusik.
  7. Dead-Link Detection: Vorab-Prüfung von URLs auf HTTP 404 oder Geo-Blocking,...

This pull request was created from Copilot chat.

Copilot AI changed the title [WIP] Implement features for Music Bot plugin: Theme engine and audio visualizer Music Bot: URL Theme Engine + Overlay WebAudio Visualizer + Configurable Max Song Duration Gate Apr 16, 2026
Copilot AI requested a review from Loggableim April 16, 2026 11:58
@Loggableim
Copy link
Copy Markdown
Owner

@copilot resolve the merge conflicts in this pull request

Co-authored-by: Loggableim <160679982+Loggableim@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 16, 2026

@copilot resolve the merge conflicts in this pull request

Merge-Konflikte sind aufgelöst und als Merge-Commit 7c2cedc in den PR-Branch gepusht. Konflikte in app/CHANGELOG.md und app/plugins/music-bot/overlay.html wurden konsolidiert, anschließend liefen die gezielten Music-Bot-Tests erfolgreich. UI-Referenz-Screenshot: https://github.com/user-attachments/assets/2cfa178f-2cf1-4f47-8ce5-0f66d5c4f48b

@Loggableim Loggableim marked this pull request as ready for review April 16, 2026 12:57
Copilot AI review requested due to automatic review settings April 16, 2026 12:58
@Loggableim Loggableim merged commit 5da8148 into main Apr 16, 2026
1 check passed
Copilot stopped work on behalf of Loggableim due to an error April 16, 2026 12:58
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the Music Bot plugin with (1) URL-driven overlay theming, (2) a Web Audio API canvas visualizer in the overlay, and (3) a configurable maximum song duration gate enforced in queue logic, with accompanying UI and Jest tests.

Changes:

  • Add max song duration config (default 360s) with dashboard input + QueueManager validation + Jest coverage.
  • Implement overlay theme engine via URL params (with legacy theme alias mapping) and add new theme variable sets.
  • Add overlay visualizer wiring (AnalyserNode + requestAnimationFrame) and basic HTML-level tests.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
app/plugins/music-bot/lib/queue-manager.js Enforces max duration + minimum threshold; rejects missing duration metadata.
app/plugins/music-bot/main.js Updates default queue duration limit to 360s.
app/plugins/music-bot/ui.html Adds dashboard field for max song duration; updates theme dropdown options.
app/plugins/music-bot/assets/ui.js Persists duration limit setting; updates overlay URL builder default theme.
app/plugins/music-bot/overlay.html Adds theme variables/aliases and a canvas visualizer loop.
app/test/music-bot-queue-duration-limit.test.js Tests duration gate (missing metadata, over limit, clamp behavior).
app/test/music-bot-overlay-theme-visualizer.test.js Smoke-tests overlay HTML for theme/visualizer wiring strings.
app/CHANGELOG.md Documents the new overlay theme/visualizer and duration limit.

Comment on lines +278 to +286
if (!Number.isFinite(duration) || duration <= 0) {
return {
success: false,
error: 'Songdauer konnte nicht ermittelt werden. Bitte einen anderen Song wählen.'
};
}
if (duration > maxSongDurationSeconds) {
return {
success: false,
Comment on lines +1119 to +1127
function findVisualizerMediaElement() {
// Optional extension point: external scripts may set window.musicBotVisualizerAudio
// to a HTMLMediaElement that carries the overlay audio source.
if (window.musicBotVisualizerAudio && window.musicBotVisualizerAudio instanceof HTMLMediaElement) {
return window.musicBotVisualizerAudio;
}
return document.querySelector('audio[data-musicbot-visualizer], video[data-musicbot-visualizer], audio, video');
}

Comment on lines +1155 to +1160
const gradient = visualizerCtx.createLinearGradient(0, y, 0, height);
gradient.addColorStop(0, visualizerAccentColor);
gradient.addColorStop(1, visualizerAccentStrongColor);
visualizerCtx.fillStyle = gradient;
visualizerCtx.fillRect(x, y, barWidth, barHeight);
}
Comment on lines +1128 to +1167
function startVisualizerLoop() {
if (visualizerAnimationFrame) cancelAnimationFrame(visualizerAnimationFrame);
const draw = () => {
visualizerAnimationFrame = requestAnimationFrame(draw);
if (!visualizerCtx || !visualizerAnalyser || !visualizerData) return;
const width = visualizerCanvas.clientWidth || visualizerCanvas.width;
const height = visualizerCanvas.clientHeight || visualizerCanvas.height;
if (visualizerCanvas.width !== width || visualizerCanvas.height !== height) {
visualizerCanvas.width = width;
visualizerCanvas.height = height;
}

visualizerAnalyser.getByteFrequencyData(visualizerData);
visualizerCtx.clearRect(0, 0, width, height);
const barCount = VISUALIZER_BAR_COUNT;
const gap = VISUALIZER_BAR_GAP;
const barWidth = Math.max(2, (width - (barCount - 1) * gap) / barCount);
const active = state === 'playing' && visualizerCanvas.classList.contains('active');

for (let i = 0; i < barCount; i += 1) {
const idx = Math.floor((i / barCount) * visualizerData.length);
const value = visualizerData[idx] / 255;
const eased = Math.pow(value, VISUALIZER_EASING_EXPONENT);
const minHeight = active ? 2 : 1;
const barHeight = active ? Math.max(minHeight, eased * (height - 6)) : minHeight;
const x = i * (barWidth + gap);
const y = height - barHeight;
const gradient = visualizerCtx.createLinearGradient(0, y, 0, height);
gradient.addColorStop(0, visualizerAccentColor);
gradient.addColorStop(1, visualizerAccentStrongColor);
visualizerCtx.fillStyle = gradient;
visualizerCtx.fillRect(x, y, barWidth, barHeight);
}
};
draw();
}

function setVisualizerActive(isActive) {
if (!visualizerCanvas) return;
visualizerCanvas.classList.toggle('active', Boolean(isActive && visualizerAnalyser));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants