Desktop: configurable auto-DJ — keep the queue topped up as it runs out #45

Open
opened 2026-08-18 05:57:03 +00:00 by logan · 0 comments
Collaborator

Report

Feature request: an auto-DJ that can be toggled on and automatically queues things when the queue is about to end, based on configurable parameters.

Findings

Most of the machinery exists already:

  • backend/queue/queue.go defines FallbackSource / FallbackContext (ResolveFallback(ctx, fctx) ([]string, Source, error)), resolved when the queue exhausts, with PreviousSource and SeedPaths.
  • backend/queuefallback.go implements it with three modes from config: stop, favorites, dynamicMix. A dynamic mix in progress keeps extending itself regardless of a later mode change.

So the gap is (a) parameters, and (b) that it fires when the queue is exhausted rather than when it is about to run out.

Direction

  1. Top up ahead of exhaustion (n tracks remaining) so playback never stops while resolving — the resolve is already async (go q.resolveFallback(...)).
  2. Parameters for the dynamic mix: seed (current track / whole queue / an artist or genre), how similar vs. exploratory, restrict to a library, include/exclude unplayed, avoid recently played, block explicit repeats.
  3. A UI: a toggle plus settings, and the queue panel should say the tail is auto-generated (the Source already carries a dynamicMix type — see the "Playing from" issue for making that line honest).
**Report** Feature request: an auto-DJ that can be toggled on and automatically queues things when the queue is about to end, based on configurable parameters. **Findings** Most of the machinery exists already: - `backend/queue/queue.go` defines `FallbackSource` / `FallbackContext` (`ResolveFallback(ctx, fctx) ([]string, Source, error)`), resolved when the queue exhausts, with `PreviousSource` and `SeedPaths`. - `backend/queuefallback.go` implements it with three modes from config: `stop`, `favorites`, `dynamicMix`. A dynamic mix in progress keeps extending itself regardless of a later mode change. So the gap is (a) parameters, and (b) that it fires when the queue is *exhausted* rather than when it is about to run out. **Direction** 1. Top up *ahead* of exhaustion (n tracks remaining) so playback never stops while resolving — the resolve is already async (`go q.resolveFallback(...)`). 2. Parameters for the dynamic mix: seed (current track / whole queue / an artist or genre), how similar vs. exploratory, restrict to a library, include/exclude unplayed, avoid recently played, block explicit repeats. 3. A UI: a toggle plus settings, and the queue panel should say the tail is auto-generated (the `Source` already carries a `dynamicMix` type — see the "Playing from" issue for making that line honest).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: yonlu/yellowjacket#45