Mopidy-JukeboxLights
A Mopidy extension that drives WLED LED strips with colors pulled from the album art of whatever is playing.
What it does
- Color from the sleeve. Averaging album art gives brown every time. Instead this buckets pixels, discards anything too dark or too washed out to register as light, and scores the rest by pixel count weighted by saturation — so a small bright detail on a black sleeve still wins.
- Two-color cabinets. Picks an accent from the strongest hue at least ~29° away from the dominant, and paints nominated segments with it. A red-and-blue sleeve lights red and blue, not two shades of purple.
- Event driven. A Mopidy frontend actor listening for
track_playback_started, so the lights change the instant the track does. Network calls run on a worker thread and never block Mopidy's event loop. - Idle and dark states. Breathes amber when nothing is playing, and goes
fully dark when a kiosk panel blanks — see
follow_displaybelow.
Status page
Once running, http://<your-host>:6680/jukeboxlights/ shows what the lights
are doing and, more usefully, why — whether WLED is reachable, which
segments were discovered, and whether the strip is following music, breathing
amber, or dark because the kiosk panel blanked. It also has a button to cycle
red/green/blue/amber for checking wiring without needing to play anything.
Installation
python3 -m pip install Mopidy-JukeboxLights
Configuration
[jukeboxlights]
enabled = true
wled_host = 172.20.25.44 # IP or host:port of your WLED device
brightness = 160 # 1-255
idle_after = 45 # seconds of silence before the idle effect
idle_color = amber # name, hex, or r,g,b
accent_segments = 1,2,3 # segment ids that get the accent color
follow_display = true
display_flag = /run/jukebox/display-off
Segments are read from WLED at startup, so a strip run in one uncut piece with hidden stretches behind a door frame works without any config here — define the visible runs as WLED segments and this follows them.
Idle color
idle_color accepts a name, a hex string, or an r,g,b triplet — amber,
#f0a830, f0a830, #fa3 and 240,168,48 are all the same colour. Named
options: amber, warm-white, candle, gold, red, oxblood, pink,
purple, blue, cyan, teal, green, lime, white.
The status page has a swatch grid and a colour picker that apply immediately,
so you can try colours against the actual cabinet before committing one to
mopidy.conf. Changes made there are not persisted — the config file stays
the source of truth across restarts, and the page shows the line to paste.
Turning the lights off with the screen
If something else on the machine creates the file named by display_flag when
a kiosk display blanks, the strip goes fully dark rather than breathing — but
only while nothing is playing. Remove the file and it comes back. Set
follow_display = false to ignore this entirely.
Project resources
Credits
- Original author: King Butter
- Current maintainer: King Butter x
Release files for Mopidy-JukeboxLights 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mopidy_jukeboxlights-1.0.1.tar.gz | 245.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mopidy_jukeboxlights-1.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 261.1 kB
Release files / mopidy_jukeboxlights-1.0.1.tar.gz
| Download URL | mopidy_jukeboxlights-1.0.1.tar.gz |
|---|---|
| Size | 245.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
67f12993a28c9704229030cab456477e2116a62a6ea3c6c1687db700ccb98428
|
|
BLAKE2b-256 checksum How to use checksums |
366b226b894bcf7d71ff3529cfaf4bd275486e49e7afd95b2cd7db72e69cfa0d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.
Transparency logRelease files / mopidy_jukeboxlights-1.0.1-py3-none-any.whl
| Download URL | mopidy_jukeboxlights-1.0.1-py3-none-any.whl |
|---|---|
| Size | 15.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
49ac678053dac3269f3a9eb89a4d1554e785cdcb41a1ea3a0831cb4d7ca3906c
|
|
BLAKE2b-256 checksum How to use checksums |
d9d854a4c5ecd3ed5dc696b6ad998f20de15ba65c52af6285520510ef9b98ad0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.
Transparency log