When every candidate is within the anti-repeat window, the fallback replayed at random, ignoring how long ago each was heard. With a small feed (or a window larger than a source's pool) this is the *normal* path, and random picking clusters the same tracks together. Play the least-recently-heard candidate instead, so tracks rotate at the widest spacing the pool allows. - db: add last_played_at(keys) -> key -> most-recent play timestamp. - providers/listenbrainz: sort the exhausted pool oldest-first. - scheduler: on exhaustion, return the oldest-played of the drawn candidates rather than the last one drawn. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| radieo | ||
| Dockerfile | ||
| requirements.txt | ||