perf(재생지연): 유튜브 URL 음성접속 전 프리워밍 + 리졸버 진행요청 합치기(coalescing)로 첫 재생 지연 ~2초 단축
This commit is contained in:
@@ -76,6 +76,22 @@ export class LavalinkManager {
|
||||
return !!this.shoukaku.options.nodeResolver(this.shoukaku.nodes);
|
||||
}
|
||||
|
||||
/**
|
||||
* 유튜브 URL을 음성 접속 전에 미리 ytresolver에 걸어둔다(fire-and-forget).
|
||||
* 리졸버가 진행 중 요청을 합쳐주므로(coalescing), 음성 접속(~2초) 동안 리졸브(~2.5초)가
|
||||
* 겹쳐 진행돼 실제 재생 시점엔 캐시 적중 → 첫 재생 지연이 크게 줄어든다.
|
||||
* resolvePlayable이 쓰는 캐시 키(info.uri = https://www.youtube.com/watch?v=ID)와 맞추기 위해
|
||||
* 표준 watch URL로 변환해 요청한다.
|
||||
*/
|
||||
public prewarmYoutubeUrl(raw: string) {
|
||||
try {
|
||||
const m = raw.match(/(?:youtu\.be\/|[?&]v=|\/shorts\/|\/embed\/|\/live\/)([A-Za-z0-9_-]{11})/);
|
||||
if (!m) return;
|
||||
const canonical = `https://www.youtube.com/watch?v=${m[1]}`;
|
||||
fetch(`${Config.ytresolverUrl}/resolve?url=${encodeURIComponent(canonical)}`, { signal: AbortSignal.timeout(45000) }).catch(() => {});
|
||||
} catch { /* prewarm 실패는 무시 (실제 재생 시 정상 경로로 리졸브) */ }
|
||||
}
|
||||
|
||||
getPlayer(guildId: string) {
|
||||
return this.players.get(guildId);
|
||||
}
|
||||
|
||||
@@ -51,6 +51,8 @@ async function handleMessage(message: Message): Promise<void> {
|
||||
const gdb = DB.guild.get(message.guild.id);
|
||||
if (!gdb?.channel_id) return;
|
||||
if (gdb.channel_id !== message.channel.id) return;
|
||||
// 유튜브 URL이면 음성 접속 전에 미리 리졸브를 걸어 첫 재생 지연을 줄인다(리졸버가 진행분을 합쳐줌).
|
||||
lavalinkManager.prewarmYoutubeUrl(message.content);
|
||||
let player = lavalinkManager.getPlayer(message.guild.id);
|
||||
const voiceChannel = getVoiceChannel(message.member);
|
||||
if (!player) {
|
||||
|
||||
Reference in New Issue
Block a user