Skip to content

Conversation

@kikkia
Copy link
Contributor

@kikkia kikkia commented Oct 21, 2025

Wanted to take a shot at better organizing error messages for failed tracks or at least start the conversation.
This pr, rather than only watching the last exception surfaces all exceptions from all clients in the logs.

Changes in error handling

Also do note that I removed some of the more specific error handling to determine if an error is possible to send to the next client. Rather than fail fast it seems that trying all clients would be preferable. Rather than letting one client failure potentially stop retries from other clients. One of the cases I could see wanting this check is the errors that manifest after track start some time into the track. Rather than restarting the track with a new client, just killing it doesn't sound too bad, if we want to add that check back in.

Error format

Open to messing some more with the formatting if wanted, not sure I am totally sold on it as is and am fine with iterating. It also probably makes sense to move the yt-source version out of the client info to not repeat itself a ton
Example new stack trace: (invalid oauth token)
Edit: Current state as of 74e0aa6

2025-10-22T15:16:45.981Z  WARN 1 --- [Lavalink] [back-1-thread-1] c.s.d.l.t.p.LocalAudioTrackExecutor      : Suspicious exception for playback of Ly7uj0JwgKg
dev.lavalink.youtube.AllClientsFailedException: (yts.version: c07f6bf30d6f34000934177ba1ee67470ea14b59) All clients failed to load the item.
Client [WEB] failed: Something went wrong when decoding the track.Something went wrong when decoding the track.
	at com.sedmelluq.discord.lavaplayer.tools.ExceptionTools.wrapUnfriendlyExceptions(ExceptionTools.java:45)
	at com.sedmelluq.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.executeProcessingLoop(LocalAudioTrackExecutor.java:279)
	at com.sedmelluq.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.executeProcessingLoop(LocalAudioTrackExecutor.java:234)
	at dev.lavalink.youtube.track.YoutubeMpegStreamAudioTrack.process(YoutubeMpegStreamAudioTrack.java:68)
	at com.sedmelluq.discord.lavaplayer.track.DelegatedAudioTrack.processDelegate(DelegatedAudioTrack.java:25)
Caused by: Expected decoding to halt, got: 5
	at com.sedmelluq.discord.lavaplayer.natives.aac.AacDecoder.resolveStreamInfo(AacDecoder.java:229)
	at com.sedmelluq.discord.lavaplayer.container.common.AacPacketRouter.processInput(AacPacketRouter.java:43)
	at com.sedmelluq.discord.lavaplayer.container.mpeg.MpegAacTrackConsumer.consume(MpegAacTrackConsumer.java:79)
	at com.sedmelluq.discord.lavaplayer.container.mpeg.reader.standard.MpegStandardFileTrackProvider.provideFrames(MpegStandardFileTrackProvider.java:75)
	at dev.lavalink.youtube.track.YoutubeMpegStreamAudioTrack.processSegmentStream(YoutubeMpegStreamAudioTrack.java:216)
Client [TVHTML5_SIMPLY_EMBEDDED_PLAYER] failed: Invalid status code for player api response: 401Invalid status code for player api response: 401
	at com.sedmelluq.discord.lavaplayer.tools.io.HttpClientTools.assertSuccessWithContent(HttpClientTools.java:168)
	at dev.lavalink.youtube.clients.skeleton.NonMusicClient.loadJsonResponse(NonMusicClient.java:66)
	at dev.lavalink.youtube.clients.skeleton.NonMusicClient.loadTrackInfoFromInnertube(NonMusicClient.java:140)
	at dev.lavalink.youtube.clients.skeleton.StreamingNonMusicClient.loadFormats(StreamingNonMusicClient.java:35)
	at dev.lavalink.youtube.track.YoutubeAudioTrack.loadBestFormatWithUrl(YoutubeAudioTrack.java:197)
Client [TVHTML5] failed: Invalid status code for player api response: 401Invalid status code for player api response: 401
	at com.sedmelluq.discord.lavaplayer.tools.io.HttpClientTools.assertSuccessWithContent(HttpClientTools.java:168)
	at dev.lavalink.youtube.clients.skeleton.NonMusicClient.loadJsonResponse(NonMusicClient.java:66)
	at dev.lavalink.youtube.clients.skeleton.NonMusicClient.loadTrackInfoFromInnertube(NonMusicClient.java:140)
	at dev.lavalink.youtube.clients.skeleton.StreamingNonMusicClient.loadFormats(StreamingNonMusicClient.java:35)
	at dev.lavalink.youtube.track.YoutubeAudioTrack.loadBestFormatWithUrl(YoutubeAudioTrack.java:197)
	at dev.lavalink.youtube.track.YoutubeAudioTrack.process(YoutubeAudioTrack.java:123) ~[youtube-plugin-c07f6bf30d6f34000934177ba1ee67470ea14b59.jar!/:na]
	at com.sedmelluq.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.execute(LocalAudioTrackExecutor.java:109) ~[lavaplayer-2.2.3.jar!/:na]
	at com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager.lambda$executeTrack$2(DefaultAudioPlayerManager.java:339) ~[lavaplayer-2.2.3.jar!/:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[na:na]
	at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]

Copy link
Member

@devoxin devoxin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't say I'm fond of the changes to the audio track code. If an exception bubbles up high enough to hit the for loop to move to the next client, the stream restarts from 0, which is especially problematic in situations where the track has played, say, 50-90% through.

@kikkia
Copy link
Contributor Author

kikkia commented Oct 22, 2025

Current formatting

2025-10-22T15:16:45.981Z  WARN 1 --- [Lavalink] [back-1-thread-1] c.s.d.l.t.p.LocalAudioTrackExecutor      : Suspicious exception for playback of Ly7uj0JwgKg
dev.lavalink.youtube.AllClientsFailedException: (yts.version: c07f6bf30d6f34000934177ba1ee67470ea14b59) All clients failed to load the item.
Client [WEB] failed: Something went wrong when decoding the track.Something went wrong when decoding the track.
	at com.sedmelluq.discord.lavaplayer.tools.ExceptionTools.wrapUnfriendlyExceptions(ExceptionTools.java:45)
	at com.sedmelluq.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.executeProcessingLoop(LocalAudioTrackExecutor.java:279)
	at com.sedmelluq.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.executeProcessingLoop(LocalAudioTrackExecutor.java:234)
	at dev.lavalink.youtube.track.YoutubeMpegStreamAudioTrack.process(YoutubeMpegStreamAudioTrack.java:68)
	at com.sedmelluq.discord.lavaplayer.track.DelegatedAudioTrack.processDelegate(DelegatedAudioTrack.java:25)
Caused by: Expected decoding to halt, got: 5
	at com.sedmelluq.discord.lavaplayer.natives.aac.AacDecoder.resolveStreamInfo(AacDecoder.java:229)
	at com.sedmelluq.discord.lavaplayer.container.common.AacPacketRouter.processInput(AacPacketRouter.java:43)
	at com.sedmelluq.discord.lavaplayer.container.mpeg.MpegAacTrackConsumer.consume(MpegAacTrackConsumer.java:79)
	at com.sedmelluq.discord.lavaplayer.container.mpeg.reader.standard.MpegStandardFileTrackProvider.provideFrames(MpegStandardFileTrackProvider.java:75)
	at dev.lavalink.youtube.track.YoutubeMpegStreamAudioTrack.processSegmentStream(YoutubeMpegStreamAudioTrack.java:216)
Client [TVHTML5_SIMPLY_EMBEDDED_PLAYER] failed: Invalid status code for player api response: 401Invalid status code for player api response: 401
	at com.sedmelluq.discord.lavaplayer.tools.io.HttpClientTools.assertSuccessWithContent(HttpClientTools.java:168)
	at dev.lavalink.youtube.clients.skeleton.NonMusicClient.loadJsonResponse(NonMusicClient.java:66)
	at dev.lavalink.youtube.clients.skeleton.NonMusicClient.loadTrackInfoFromInnertube(NonMusicClient.java:140)
	at dev.lavalink.youtube.clients.skeleton.StreamingNonMusicClient.loadFormats(StreamingNonMusicClient.java:35)
	at dev.lavalink.youtube.track.YoutubeAudioTrack.loadBestFormatWithUrl(YoutubeAudioTrack.java:197)
Client [TVHTML5] failed: Invalid status code for player api response: 401Invalid status code for player api response: 401
	at com.sedmelluq.discord.lavaplayer.tools.io.HttpClientTools.assertSuccessWithContent(HttpClientTools.java:168)
	at dev.lavalink.youtube.clients.skeleton.NonMusicClient.loadJsonResponse(NonMusicClient.java:66)
	at dev.lavalink.youtube.clients.skeleton.NonMusicClient.loadTrackInfoFromInnertube(NonMusicClient.java:140)
	at dev.lavalink.youtube.clients.skeleton.StreamingNonMusicClient.loadFormats(StreamingNonMusicClient.java:35)
	at dev.lavalink.youtube.track.YoutubeAudioTrack.loadBestFormatWithUrl(YoutubeAudioTrack.java:197)
	at dev.lavalink.youtube.track.YoutubeAudioTrack.process(YoutubeAudioTrack.java:123) ~[youtube-plugin-c07f6bf30d6f34000934177ba1ee67470ea14b59.jar!/:na]
	at com.sedmelluq.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.execute(LocalAudioTrackExecutor.java:109) ~[lavaplayer-2.2.3.jar!/:na]
	at com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager.lambda$executeTrack$2(DefaultAudioPlayerManager.java:339) ~[lavaplayer-2.2.3.jar!/:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[na:na]
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[na:na]
	at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]

@Nansess
Copy link
Contributor

Nansess commented Oct 22, 2025

i think it looks clean with the current state having the errors separate per client makes it slightly more readable

@kikkia
Copy link
Contributor Author

kikkia commented Oct 23, 2025

i think it looks clean with the current state having the errors separate per client makes it slightly more readable

Yeah I think maybe the only other thing to do might be to put some spaces in front of caused by lines for a little more visual separation, but unfortunately it isn't east to make such big logs look good

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants