Conversation
…ate machine. Failed tracks now retry the same logical item instead of consuming the next song, while preserving upstream start/end offsets, listen history, and caller TRACK-loop behavior. Co-authored-by: Cursor <cursoragent@cursor.com>
Bind seq from the stale-op snapshot so queue advancement after a failed retry no longer crashes. Co-authored-by: Cursor <cursoragent@cursor.com>
Keep the TRACK_EXCEPTION grep key and leave playback policy unchanged. Co-authored-by: Cursor <cursoragent@cursor.com>
… changing playback. Surface installed plugin versions from GET /v4/info and escalate only repeated source-wide errors, so admins can tell a source/node outage from a broken bot. Co-authored-by: Cursor <cursoragent@cursor.com>
Keep the distinct-item window for persistence and recovery, so track-specific errors still do not mark YouTube unhealthy. Co-authored-by: Cursor <cursoragent@cursor.com>
…g playback recovery. Co-authored-by: Cursor <cursoragent@cursor.com>
…g warnings. Co-authored-by: Cursor <cursoragent@cursor.com>
… request text channel. Co-authored-by: Cursor <cursoragent@cursor.com>
|
Hey, I ran into an issue with Vocard silently eating through the queue when Lavalink failed a track, so I ended up fixing the playback/retry handling and a few related issues I found while live testing it. (WARNING: heavy AI usage, doesnt bother me personally) 107 tests passing. If you want any of it upstream, feel free to merge it, cherry-pick what you want, or ask me to split anything out. If not, all good, I'm running the fork for myself anyway. |
|
Thank you for the pull request and for working on improving queue stability! However, we can't accept this PR in its current state. Please review the feedback below before resubmitting:
|
|
and the new test cases seem aimed at testing Lavalink itself rather than Vocard code. We should stick to tests that cover Vocard's own functions. |
|
Thanks for the review notes — targeting This PR was larger than it should have been, so I am closing it in favor of focused
Later slices (optional notices, optional health IPC, optional stuck retry) will be opened against My personal |
Problem
On Lavalink
loadFailed/TrackException, Vocard treated everyTrackEndas "play the next song". A YouTube (or other source) failure could skip the current track, then keep consuming later queue items, with no useful user message.Symptom
Root cause
on_voicelink_track_endalways calleddo_next(), ignoringreason. There was no single owner for "this logical queue item is still the current attempt", soTrackStuck/TrackException/TrackEnd/ a failed play PATCH could each advance the queue. Lavalink v4 close frames andNodeNotAvailablewere also handled as generic failures.Before
loadFailed→ skip to next item (and sometimes more)After
TrackEndQUEUE_ADVANCENodeNotAvailablerecovers in place (no retry burn, no advance)json.loadsCouldn't play **TITLE**. Skipping to the next track.)YouTube/source outages are surfaced (health + user notice) instead of silently skipping through the queue. This does not change Lavalink/YouTube plugin configuration.
Compatibility
Unrelated behavior is intentionally unchanged:
/play, skip, forceplay, back, skipTo, controller jump, repeat TRACK/QUEUE, autoplay, request channel, session restore, IPC, Mongo history, start/end offsets, controller refresh, voice status, votes, inactive timer.Player.currentremains aTrack;QueueItemis internal.Tests
107 passed (
tests/: playback transitions, notifications, tasks, health, Lavalink websocket).