Skip to content

Releases: Toni19944/obs-foobar-spotify-overlay

0.4.1 - Updated exe bundle

Choose a tag to compare

@Toni19944 Toni19944 released this 29 Sep 14:17

⚠️ Looking for the foobar2000 component? The latest component is in release 0.4.0. This 0.4.1 release is the standalone desktop app / Spotify bundle only — it does not include a newer component.


0.4.1 — Updated exe bundle

The standalone desktop app (bundled exe, no foobar2000 required). Download FoobarOverlay-v0.4.1-win64.zip, extract the whole folder, and run FoobarOverlay.exe (keep it next to its _internal/ folder).

What's new

  • Spotify now-playing via Windows SMTC (default). Reads the Spotify desktop app's local playback (title, artist, play/pause, position/duration) straight from Windows — no login, no developer app, and no rate limits. Just have Spotify running.
  • Spotify Web API kept as an optional, hardened fallback (metadataSource: "webapi" in settings.json): throttled, honors Retry-After on HTTP 429, caches the last track, and only blanks on a genuine "nothing playing" — so it can't spiral into a long rate-limit ban.
  • Per-scene overlay URL flags (both overlays): mirror / mirrorSize / mirrorOpacity / mirrorBlur (mirrored outward glow), cardWidth / cardHeight / cardRadius / cardOpacity, imgOpacity, bgMotion, bgMotionTarget=card, hideWhenPaused, port, spectrumPort. A second OBS browser source can render a differently-styled card without touching your main scene.
  • Brighter, volume-independent visualizer glow on the Spotify overlay — a fast auto-gain so the glow level no longer dims with playback volume.

Notes

  • Windows only. SMTC mode needs the Spotify desktop app running.
  • Album art via SMTC isn't wired up yet (only matters if you enable album-art-as-background).

Full usage in the archive/exe-bundle branch README and its docs/2026-09-29-smtc-metadata-source-design.md.

0.4.0 — Mirrored visualizer glow

Choose a tag to compare

@Toni19944 Toni19944 released this 02 Aug 08:00

Added

Mirrored visualizer glow — the border glow can now also run outside the card, instead of only inside it.

New browser-source URL flags:

  • mirror=1 — enable the mirrored outward glow (default off)
  • mirrorSize=<px> — outward bar depth (default 22, matching the inner glow's depth)
  • mirrorOpacity=<0-1> — opacity of the mirrored layer (default 0.55)
  • mirrorBlur=<px> — blur radius (default 12, matching the inner glow's blur)

Both layers run through a single shared renderer and read the same smoothed band values in the same frame, so they are frame-locked and cannot drift apart as the look is tuned. The mirrored layer is masked to the region outside the card, which gives it the same hard cut at the card's edge that overflow: hidden gives the inner glow — same cut, opposite direction. It never washes over the card or dilutes the inner glow.

Defaults deliberately mirror the inner glow, so ?mirror=1 alone reads as a true reflection. For something tighter, try ?mirror=1&mirrorSize=14&mirrorBlur=8.

The existing inner glow is unchanged. With no mirror flag the page renders identically to 0.3.1 — verified by a bit-exact canvas fingerprint that held across every commit, including through the extraction of the shared renderer out of the existing draw code.

Fixed

Glow residue after a player-poll failure. The overlay hides the card when a poll to foobar2000 fails — the player closing, or an HTTP hiccup — but it cancelled the render loop without clearing either glow canvas. Since neither canvas is a child of the card, the card's fade-out never took them with it, so the final frame's glow stayed lit on a transparent OBS scene until a poll succeeded again. If foobar2000 stayed shut, that was indefinitely.

This predates the mirror but the mirror made it worse, since the mirrored layer renders outside the card and had nothing left to hide behind once the card faded — it read as a halo with no card under it. Both layers are now cleared together, and the band state is reset so playback resuming rises from silence rather than out of a stale amplitude.

Notes

Enabling the mirror shifts and grows the overlay. The page reserves room for the outward glow by growing its outer padding from 16px to max(16, mirrorSize + 2 * mirrorBlur) px — 46px at defaults. So with mirror=1 the card renders 30px further down and right, and the overlay's total footprint grows by 60px on each axis. You need to both reposition and enlarge the browser source in OBS; repositioning alone leaves the outward glow clipped at the source's right and bottom edges. With mirror off, padding stays 16px and nothing about the existing layout changes.

Known issue — cardRadius=0 is ignored by the glow geometry. The card's outline goes square, but both glow layers keep following a rounded R=20 path, giving a rounded halo around a square card. This predates the mirror; the mirror only makes it easier to see.

Workaround: use ?cardRadius=1. A 1px radius is visually square and takes the normal code path, so the card, its clip and both glow layers all agree.

A proper fix is scoped for a later release. It is deliberately not bundled here because correcting it shifts the inner glow's geometry for anyone already passing cardRadius=0, and this release's whole guarantee is that the existing glow renders identically — so that change wants its own release and its own before/after baseline.

configurator.html does not emit these new flags; a configurator-exported overlay needs the mirror code copied across to support them.

Install

Replace foo_obs_overlay.dll in …\foobar2000-v2\user-components-x64\foo_obs_overlay\ (or install the attached .fb2k-component via Preferences → Components), then restart foobar2000.

Full changelog: v0.3.1...v0.4.0

0.3.1 — cardRadius URL flag

Choose a tag to compare

@Toni19944 Toni19944 released this 01 Aug 23:06

Added

New browser-source URL flag:

  • cardRadius=<px> — card corner radius in pixels (default 20; 0 = square corners)

It's applied to --card-radius on :root, so the card, its overflow clip and the visualizer glow canvas all round together — no mismatch between the card edge and the glow.

Combine with the existing flags as usual, e.g. ?cardWidth=480&cardRadius=0. Full flag table in the README.

Notes

Picking up the "more flags to be added later" thread from 0.3.0. No behavior changes to anything else — with no cardRadius in the query string the page renders exactly as it did in 0.3.0.

Unlike bgMotionTarget, this flag rides on a CSS variable configurator.html already emits (--card-radius), so a configurator-exported overlay only needs the applyRuntimeOverrides() block copied back to support it — no extra CONFIG keys.

Install

Replace foo_obs_overlay.dll in …\foobar2000-v2\user-components-x64\foo_obs_overlay\ (or install the attached .fb2k-component via Preferences → Components), then restart foobar2000.

Full changelog: v0.3.0...v0.3.1

0.3.0 — URL flags + card glow effect

Choose a tag to compare

@Toni19944 Toni19944 released this 31 Jul 05:16

Added

New browser-source URL flags for per-scene tuning without a rebuild:

  • cardWidth=<px>, cardHeight=<px>, cardOpacity=<0-1>, imgOpacity=<0-1> — card sizing/opacity and background-image opacity
  • bgMotion=1|0 — force the background FFT motion on/off
  • bgMotionTarget=card — redirect bgMotion's audio-reactive pulse from the background image to a subtle white glow washing across the card itself instead (an additive inset box-shadow, driven by the mid-band signal, mutually exclusive with image motion)

more flags to be added later once I have time. I just wanted these out of the way right now.

Combine flags with &, e.g. ?cardWidth=480&bgMotion=1&bgMotionTarget=card. Full flag table in the README.

Also retuned BG_MOTION to be a bit more aggressive/snappier.

Notes

bgMotionTarget's card-effect value went through a couple of false starts during development — actual backdrop-filter and filter: brightness() were both tried and both failed against OBS's transparent browser source (nothing behind the element for either to sample/scale). It shipped as an additive inset glow instead, and the value name was corrected from the leftover backdrop to card to match. Breaking: bgMotionTarget=backdrop is no longer recognized and silently falls back to the default (image) — update any saved URLs to bgMotionTarget=card.

Known gap: configurator.html doesn't support bgMotionTarget/CARD_FLASH_GLOW_* yet — exporting from it drops these keys. Documented in the README; not yet closed.

Install

Replace foo_obs_overlay.dll in …\foobar2000-v2\user-components-x64\foo_obs_overlay\ (or install the attached .fb2k-component via Preferences → Components), then restart foobar2000.

Full changelog: v0.2.1...v0.3.0

0.2.1 — Fix foobar close hang

Choose a tag to compare

@Toni19944 Toni19944 released this 12 Jul 20:52
a266c25

Fixed

foobar2000 close hang (~2–4 s) — closing foobar stalled for a few seconds ever since the native component shipped in v0.2.0.

Cause: on_quit stopped the two in-process CivetWeb servers (overlay HTTP :8081, spectrum WebSocket :9001) sequentially, and each mg_stop() waited up to one SOCKET_TIMEOUT_QUANTUM (2000 ms default) for its blocked accept/worker threads to notice the stop flag — two servers, summed → ~2–4 s.

Fix — two localized shutdown-path edits:

  • Lowered the civetweb stop-flag re-check quantum 2000 → 450 ms (compile-def on the vendored target; no vendored source edit).
  • Run both server stops concurrently on two short-lived threads, joined before return, so the quanta overlap instead of summing (contexts are disjoint → race-free; teardown stays synchronous inside on_quit).

Close is now prompt — teardown ≈ one quantum (~450 ms), under the 500 ms budget. Overlay output is byte-for-byte unchanged (DSP parity oracle passes; WS 64-band, /api/player, bg-list, / HTML all identical).
You can still kind of see the 450ms delay on shutdown. But I figured that was a good middle ground to minimal polling and not-too-bad feeling shutdown.

Install

Replace foo_obs_overlay.dll in …\foobar2000-v2\user-components-x64\foo_obs_overlay\ (or install the attached .fb2k-component via Preferences → Components), then restart foobar2000.

Full changelog: v0.2.0...v0.2.1

Future Plans

  • URL flags for everything that matters. Rebuilding every time you want to tweak the overlay is pain... I just need to see to which extent I can allow the configuration via URL flags. -- bg_motion and visualizer toggles are at least currently on the list.
  • implementing bg_motion to work with the backdrop filter, instead of needing a static background image for bg_motion visualizer.
    • Very resource hungry, will default to OFF in release build. Backdrop filter is currently defaulted to off anyways because it's the single most expensive feature in the entire component.

0.2.0 - Foobar-component

Choose a tag to compare

@Toni19944 Toni19944 released this 12 Jul 01:46

The overlay is now a native foobar2000 component — no external servers, no Python, no Beefweb.

Install

  1. Download foo_obs_overlay.fb2k-component below.
  2. Double-click it (or foobar2000 → Preferences → Components → Install) and let foobar2000 restart.
  3. In OBS, add a Browser Source at http://localhost:8081/ with a transparent background (RGBA 0,0,0,0).

Requires foobar2000 v2.x 64-bit on Windows.

What's new

  • Everything is served in-process by the component: overlay page, background images, now-playing metadata, and the 64-band spectrum (WebSocket, 30 fps). Servers live and die with foobar2000.
  • Settings page under Preferences → Tools → OBS Overlay: ports, enable/disable, background folder, and a ±500 ms spectrum timing-offset slider. Apply takes effect without restarting foobar2000.
  • Default backgrounds are extracted to <profile>\foo_obs_overlay\bg on first run — drop your own images there (or point the setting at any folder).
  • Visuals are unchanged by design: the overlay HTML is embedded byte-for-byte and the spectrum pipeline replicates the previous DSP exactly (offline parity-tested against the legacy implementation).
  • Steady-state footprint ≈ 0–0.2% CPU, ~22 MB.
  • The legacy overlay-server.ps1 / spectrum-server.py runtime is removed from the tree.

Spotify / standalone desktop app

Not part of this line — use v0.1.1 (prebuilt exe + source) or the archive/exe-bundle branch.

v0.1.1

Choose a tag to compare

@Toni19944 Toni19944 released this 24 Jun 20:26

Fixes

  • Configurator Save buttons now update the live overlay. Save in the configurator overwrites the carried nowplaying-overlay.html, nowplaying-spotify.html, and spectrum-server.py directly, instead of dropping orphan copies in the Downloads folder. The Copy CSS/HTML buttons now work via clipboard access, and a confirmation dialog appears on save.

Download

Grab FoobarOverlay-v0.1.1-win64.zip, extract the whole FoobarOverlay folder, and run FoobarOverlay.exe (keep it next to its _internal/ folder).

v0.1.0

Choose a tag to compare

@Toni19944 Toni19944 released this 21 Jun 16:16

First public release. Download the zip, extract, and run FoobarOverlay.exe (keep it next to _internal/). Or run from source — see README.