
읽기 전에
본 글은 Nest.js로 노래하는 Discord봇을 만들며 생겼던 Trouble Shooting에 관한 글입니다.
"nestjs": "^10.0.0",
"discord.js": "^14.16.3",
봇을 만든 이유?
저는 Discord를 정말 많이 사용합니다. 팀원들과 회의를 하거나 친구와 수다를 떨거나 친구들과 게임을 하거나 거의 매일 디스코드를 사용하고 있습니다. 그럴 때 잔잔하게 노래를 틀어놓고 작업을 하거나 공부나 게임을 하는걸 좋아해서 노래봇을 정말 많이 사용합니다.
하지만 요즘 배포되어있는 노래봇이 마음에 들지 않았습니다. 노래하는하리보 는 버그가 너무 많습니다. 노래가 자주 끊기고 작동이 안될때가 자주 있습니다. 뽀삐 나 알로항 도 써 봤지만 무료로 사용할 경우 뮤직 노드의 최대 수용 가능량이 있어서 사람들이 이용하고 있으면 저는 이용하지 못하는 문제가 있었습니다.
그래서 너무 답답해서 직접 만들기로 결심을 했습니다. 디스코드 봇을 만드는거 자체는 그렇게 어렵지 않고 마침 요즘 공부중인 Nest.js로 만드는게 가능하더라고요! 그래서 공부도 할 겸 재미있어 보여서 나만의 Discord봇, 솜사탕 을 만들어 보기로 결심했습니다~!
이땐 몰랐죠 이게 이렇게 어려울 줄...
Trouble Shooting
첫 번째로 만난 문제는 음악이 재생되지 않는것이었습니다.
/play <노래 이름>
이렇게 디스코드 채팅 채널에 명령어를 작성하면 솜사탕 이 음성 채널에 참가를 하긴 했습니다. 하지만 아무런 소리도 내지 않고 가만히 있는 문제가 있었습니다...
그래서 원인을 알고보니

이러한 403오류가 발생하고 있었습니다. 그래서 음악의 데이터를 불러오지 못하고 있었습니다.
사실 유튜브의 음악을 스트리밍 하기 위해서는 ytdl-core 라이브러리를 사용하는데 이 라이브러리가 버그가 굉장히 많다고 하더라고요. 많은 레퍼런스를 찾아본 결과 해당 라이브러리가 유튜브 인증을 해주는데 매끄럽지 않게 처리를 하고 있다고 하네요. 게다가 이 라이브러리는 이제 개발을 중지해서 업데이트가 안되고 있다고 합니다 ㅋㅋㅋ
그래서 그 문제를 해결하기 위해 stack overflow글을 보게 되었는데 해당 라이브러리는 개발이 중지 되었으므로 @distube/ytdl-core라이브러리를 사용해보라고 하더라고요. 이 라이브러리는 ytdl-core를 fork해서 버그도 고치고 계속 업데이트 하고 있는 포크 라이브러리라고 합니다. 덕분에 그 후 부터 음악이 처음으로 재생되기 시작했습니다!

첫 번째 문제를 해결하고 음악이 나오는걸 보고 정말 기뻤습니다. 그래서 싱글벙글 하고 음악을 듣고 있는데 갑자기 음악이 일시정지가 됩니다??
우선 음악이 멈추는 규칙이 있는지 시간을 재보았습니다. 정확히 60초에 멈추더라고요. 그래서 네트워크 문제는 아닌것 같다고 생각했습니다.
그래서 403에러로 인해 스트리밍이 중단되는게 아닐까...?라고 의심을 하기 시작해서 코드 다양한 곳에서 로그를 출력하도록 찍어보았습니다. try/catch문을 사용해 catch문에서 에러 로그를 확인하려했는데 catch문이 실행이 되지 않았습니다. 에러가 아니라는거죠. 그래서 더 어려웠던것 같습니다.
this.player.on('stateChange', (oldState, newState) => {
if (newState.status === 'autopaused') {
console.log('자동 일시 정지 상태 감지. 다시 재생을 시도합니다.');
this.player.unpause();
}
});
그래서 GPT의 힘을 조금 빌렸습니다. 문제를 해결해달라고 물어보기 보다는 이 문제의 원인을 알 수 있는 방법을 알려달라고 부탁했죠. 그래서 저렇게 위와 같은 코드를 포함해 많은 로그를 보여주도록 만들어 주더라고요. 그래서 테스트를 해 보니

처음으로 서버에 로그가 나왔습니다...! 그래서 이걸 보고 Discord에서 스트리밍을 하는데 자꾸 일시정지를 하고 있구나 라는 원인을 찾아냈습니다.
해결을 위해 정말 정말 많은 시간을 들였습니다. 아마 10시간...? 결론은 삽질한거였지만 ㅋㅋ큐ㅠㅠ
결론부터 말씀드리자면

네 Discord 라이브러리간의 버전 충돌이었습니다. 최신화를 습관화 합시다 ^^^
겨우 음악이 일시정지 하는 문제를 해결했더니...이번엔 10분이 좀 안돼서 음악이 멈추기 시작했습니다... 이번 문제는 규칙도 없고 라이브러리도 최신화를 해 줬지만 여전히 10분정도 지나면 음성 채널에서 연결이 해제됐습니다.
이번엔 다행히 오류가 날 시 로그가 나오더라고요. 그리고 저와 같은 문제가 있는 외국인 형님들이 많았습니다.

저와 같은 문제가 있는분들이 많긴 했지만 명확한 답을 알고 계신 분은 없는것 같더라고요. 꽤 고생을 많이 했습니다. highWaterMark 값을 최대 버퍼 크기로 바꿔보기도 하고 requestOptions 옵션의 keep-alive 헤더를 추가해 보고 node 버전도 변경해봤는데 v15, v16, v18, v20에서 모두 실패했습니다...
결론
일주일 정도 붙잡아 보았지만 아직도 이 문제에 해결을 하지 못했습니다. 계속 8분 정도 후에 음악이 끊기는 문제가 발생하는데 유튜브에서 스트리밍을 강제로 정지하는 이유 때문일까요. 도저히 해결책이 보이지 않네요. 나중에 이 문제를 해결한다면 글을 수정하도록 하겠습니다.