fix: resolve silent voice playback on VPS and queue screenshare streams
- Call unpause() when starting a stream in DiscordPlayer to prevent getting stuck in a paused state. - Call stop() instead of pause() in VoiceController on disconnect to fully reset the player. - Add user-agent header to ffmpeg calls in MusicPlayer and Transcoder to prevent YouTube 403 Forbidden on VPS. - Add screenshare streams to the media queue when successfully started. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
279ae07745
commit
3ae7a4c6ad
@@ -86,6 +86,10 @@ export class MediaController {
|
||||
this.playbackToken++;
|
||||
this.playback?.stop();
|
||||
this.playback = null;
|
||||
this.assertCanStartMusic();
|
||||
this.queueStore.clear();
|
||||
this.queueStore.add(resolved, mode, options.requestedBy);
|
||||
this.queueStore.startNext();
|
||||
return this.startScreen(resolved.source);
|
||||
}
|
||||
|
||||
@@ -179,6 +183,7 @@ export class MediaController {
|
||||
this.screenPlayback = await screenController.start(source);
|
||||
} catch (error) {
|
||||
this.activeMode = null;
|
||||
this.queueStore.failCurrent();
|
||||
throw error;
|
||||
}
|
||||
|
||||
@@ -193,6 +198,7 @@ export class MediaController {
|
||||
if (!this.screenPlayback || this.activeMode !== "screen") return;
|
||||
this.screenPlayback = null;
|
||||
this.activeMode = null;
|
||||
this.queueStore.completeCurrent();
|
||||
this.emitState();
|
||||
}
|
||||
|
||||
|
||||
@@ -77,10 +77,20 @@ export function createMusicPlayer(
|
||||
}
|
||||
|
||||
export function buildFfmpegArgs(source: string): string[] {
|
||||
return [
|
||||
const args = [
|
||||
"-hide_banner",
|
||||
"-loglevel",
|
||||
"warning",
|
||||
];
|
||||
|
||||
if (source.startsWith("http://") || source.startsWith("https://")) {
|
||||
args.push(
|
||||
"-user_agent",
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
|
||||
);
|
||||
}
|
||||
|
||||
args.push(
|
||||
"-i",
|
||||
source,
|
||||
"-vn",
|
||||
@@ -93,5 +103,7 @@ export function buildFfmpegArgs(source: string): string[] {
|
||||
"-f",
|
||||
"s16le",
|
||||
"pipe:1",
|
||||
];
|
||||
);
|
||||
|
||||
return args;
|
||||
}
|
||||
|
||||
@@ -76,6 +76,7 @@ export class DiscordPlayer {
|
||||
this.setResourceVolume(nextVolume);
|
||||
}
|
||||
this.player.play(resource);
|
||||
this.unpause(owner);
|
||||
this.connection?.subscribe(this.player);
|
||||
}
|
||||
|
||||
|
||||
@@ -35,6 +35,16 @@ export class Transcoder {
|
||||
"-hide_banner",
|
||||
"-loglevel",
|
||||
"warning",
|
||||
];
|
||||
|
||||
if (this.source.startsWith("http://") || this.source.startsWith("https://")) {
|
||||
args.push(
|
||||
"-user_agent",
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
|
||||
);
|
||||
}
|
||||
|
||||
args.push(
|
||||
"-i",
|
||||
this.source,
|
||||
"-c:v",
|
||||
@@ -53,8 +63,8 @@ export class Transcoder {
|
||||
"libopus",
|
||||
"-f",
|
||||
"matroska",
|
||||
"-",
|
||||
];
|
||||
"-"
|
||||
);
|
||||
|
||||
const cmd = spawn("ffmpeg", args, { stdio: ["ignore", "pipe", "pipe"] });
|
||||
const out = cmd.stdout ?? new PassThrough();
|
||||
|
||||
@@ -159,7 +159,7 @@ export class VoiceController {
|
||||
stopRecording(this.activeGuildId);
|
||||
}
|
||||
|
||||
discordPlayer.pause();
|
||||
discordPlayer.stop();
|
||||
this.activeGuildId = null;
|
||||
this.activeChannelId = null;
|
||||
this.activeChannelName = null;
|
||||
|
||||
@@ -56,6 +56,8 @@ describe("createMusicPlayer", () => {
|
||||
"-hide_banner",
|
||||
"-loglevel",
|
||||
"warning",
|
||||
"-user_agent",
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
|
||||
"-i",
|
||||
"https://example.com/song.mp3",
|
||||
"-vn",
|
||||
|
||||
Reference in New Issue
Block a user