crabidy/crabidy-server
Test User ef1e56e1f4 Playback: exponential read-ahead when resolving a queue
The resolve forwarder walked the paths one at a time. That starts the
first track quickly, but refills the rest only as fast as a single
provider resolve -- so when enumeration is slow and the leading tracks
are very short or skipped, playback drains the resolved queue faster
than it fills and stalls into silence.

Resolve the paths concurrently under a read-ahead window that starts at
1 and doubles after each path completes (1, 2, 4, 8, 16, then steady
16). The first path still resolves alone, so time-to-first-track is
unchanged; the window then grows geometrically, so the resolved queue
runs exponentially ahead of linear playback and a short/skipped head
cannot catch it. The cap bounds concurrent provider load.

Chunks are still forwarded in strict path order -- the forwarder fully
drains the oldest in-flight resolve before the next -- so concurrency
never reorders the queue, and the per-op cursor and "first chunk starts
the player" semantics are untouched. Cancellation drops the in-flight
receivers, stopping every concurrent resolve at once.

This is a read-ahead over paths; a single collection is still enumerated
by its provider's page streaming, so the win is for multi-item
selections. Documented as architecture/progressive-queueing.md D8.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 19:46:31 +02:00
..
src Playback: exponential read-ahead when resolving a queue 2026-07-23 19:46:31 +02:00
tests Web client: prompt for login on visit when auth is enabled 2026-07-23 17:51:55 +02:00
Cargo.lock Add cargo-server with liby service draft 2023-05-22 22:05:38 +02:00
Cargo.toml Add the fyyd podcast provider (/fyyd) 2026-07-23 17:29:13 +02:00
build.rs Implement the comprehensive CLI (stage 5) 2026-07-22 12:13:51 +02:00