Velvet v0.3.22 — Auto-DJ scoring engine + TV parity
A smarter Auto-DJ brain for the web player, now also running on the Samsung TV app.
Auto-DJ — weighted scoring engine, year/era continuity, smarter fallback
Auto-DJ used to accept whatever song the server handed back first. It now asks
for up to 5 candidates per pick and scores each one before queuing the best:
| Signal | Weight | What it checks |
|---|---|---|
| Harmonic (Camelot) fit | 25% | Same key, adjacent key, or two steps away |
| Genre compatibility | 15% | A matrix of transition scores (e.g. electronic↔disco 0.7, electronic↔hard 0.05) rather than a strict same/different check |
| Last.fm similarity rank | 20% | How close the artist is to the seed artist on Last.fm's similar-artist list |
| BPM proximity | 20% | Blended against a rolling tempo average |
| Year/era proximity | 10% | New — a rolling average of the last 8 picked years, so a run of similar-artist hops can't quietly drift from 2005 to 2023 |
| Artist diversity | 10% | Penalises artists played recently in the session |
Fixes bundled with the new engine
- BPM/harmonic anchors no longer seed from a manually-played song. Previously, switching Auto-DJ on while listening to an unrelated track (e.g. a slow ballad) could lock the whole session to that tempo, exhausting the similar-artist pool almost immediately. The very first Auto-DJ pick is now unconstrained and lets artist/genre/harmonic signals guide it — BPM continuity kicks in naturally once the first real DJ pick plays.
- Tier-3 "free pick" fallback (used when nothing matches BPM/key constraints) now retries up to 3 times and still enforces the keyword filter and hard genre-group jump guard, instead of accepting anything unconditionally.
- Genre-escape fallback (used to break out of a stuck genre run) now validates its candidate the same way as every other pick; if the escape candidate is itself blocked, the original pick is kept.
- Artist-cooldown list capped at 15 entries sent to the server (was up to 500). On smaller libraries the full history could exhaust the whole catalog, silently disabling the cooldown constraint server-side.
- Compound artist names (
"A & B","A vs. B","A pres. B","A x B") are now split and tried individually against Last.fm until one returns results, and each match now carries its similarity rank for the new scoring engine.
Velvet TV — Auto-DJ parity
The Samsung TV app's Auto-DJ was a simple "pick a random unplayed song" loop.
It now runs the same scoring/continuity engine as the web player: similar-artist
matching, BPM continuity, harmonic mixing, year/era continuity, artist diversity,
and the same 3-tier fallback (similar+BPM+key → library-wide BPM+key → free pick).
The TV has no settings screen, so there's nothing to configure — these all run
with fixed defaults tuned to match the web app's behaviour. The keyword and
genre whitelist/blacklist filters remain web/desktop-only, since editing a list
of words or genres needs a UI the remote doesn't have.
Downloads
Samsung TV app (.wgt)
velvet-tv-0.3.22.wgt— attached to this release.- Side-load it with Apps2Samsung (Developer Mode → Custom WGT file). Full guide:
docs/tizen-tv.md.
Docker image
docker pull ghcr.io/aroundmyroom/velvet:v0.3.22
docker pull ghcr.io/aroundmyroom/velvet:latest