discord developer

디스코드 레니 봇 개발 일지_(비트레이트 높이는 방법,@distube/ytdl-core 사용, many request 해결)

yjlee06 2024. 1. 19. 11:29
반응형

지금까지는 ytdl-core를 사용하면서 음악봇을 운영했지만
해당 라이브러리는 버그가 많다..;;
 
대표적인 건 
ECONNRESET, 429, 403 또는 스트리밍 멈춤,, 불안정함...
 
아주 환장하겠다.

(이래서.. 라바링크나 다른 사람이 만들걸 사용하나..?)
 

해당 포스트에서는
1. ytd-core의 일부 문제를 해결한 라이브러리
2.  many request 문제를 해결하는 방법
에 대해 다룰 것이다. 
 
 

1. ytld-core 문제점을 극복한 라이브러리

해당 라이브러리에 정체는 @distube/ytdl-core이다.
이름에서 보다시피 ytdl-core를 포크 한 라이브러리다.
 
그렇지만 렉이나 불안정한 것이 많이 잡혔으며
ytdl-core 버그들도 많이 픽스된 점이 포인트다.
실제로 사용해 본 결과 ytdl-core보다 안정적으로 작동했다.
 
그래도 안 잡히는 렉은 ytdl 스트림 옵션으로 어찌어찌 해결했다.
해당 옵션은 아래와 같다.
 
liveBuffer: 4900,
highWaterMark: 1 << 25

위의 옵션은 특정 스트리밍에서만 영향을 준것으로 확인되었다.


아래는 수정된 옵션이다.
해당 옵션의 자세한 설명은 아래의 블로그를 참조하기를 바란다.
ytdl-core로 높은 퀄리티의 디스코드 음악 스트리밍하기 (tistory.com)

 filter: format =>
 format.audioQuality == "AUDIO_QUALITY_MEDIUM" &&
 format.hasVideo == false &&
 format.hasAudio == true &&	
 format.container == "mp4",
 highWaterMark: 1 << 62,
 liveBuffer: 1 << 62,
 dlChunkSize: 0,
 requestOptions: {
  maxRedirections: 5
 }

 

주의

해당 방식은 일부 스트리밍에서 불안정한 것이 확인되었기에 추천하지 않는 방식이다.

위의 옵션만으로도 충분히 준수한 오디오 품질을 끌어올릴수있는다는것이 확인되었기에

오디오 비트레이트에 관한 글은 이런 방법이 있구나라는 느낌으로 읽고 넘어가길 바란다.

 

다시 글로 돌아오자면

 

아래의 코드로 오디오 비트레이트를  160까지 올릴 수 있다.
filter: format => format.itag === 251

추가적으로

알아낸 사실인데 아래의 테이블에서 itag가 96일 때
오디오 비트레이트가 256이 되다고 한다. 그래서 아래와 같이 구현하였다.
yt-itag/data.md at master · leonbrandt/yt-itag (github.com)

const _stream = ytdl(url, {
 filter: format => format.itag === 96,
 .
 .
 .
})

전체 코드는 아래에 적어놓겠다.
 

2. 과도한 요청으로 인한 거부 발생

해당 부분은 라이브러리로 할 수 있는 게 없으며
이미 차단당했을 경우엔 기다릴 수밖에 없다.
그러니 차단당하기 전에 미리 방지해 보자.
 
해당 방법은 유튜브 쿠키를 이용한 방식이다.
해당 방법은 총 2가지만 하면 할 수 있다.
 
1. 유튜브 쿠키 가져오기
2. 가져온 쿠키를 파일로 저장한 다음 ytdl-core에서 불러와 사용하기
 

1. 유튜브 쿠키 가져오기

아래의 확장자를 설치한다.
EditThisCookie (google.com)
그다음 유튜브 사이트에 간다음
 
확장자에서 쿠키를 찾아 클릭한다.
그러면  아래의 사진과 같은 화면이 되는데
위의 오른쪽에서 세 번째에 있는 것을 클릭하여
쿠키를 클립보드에 복사할 수 있다.

EditThisCookie 확장 프로그램

 

2. 가져온 쿠키를 파일로 저장한 다음 ytdl-core에서 불러와 사용하기

복사된 쿠키를 소스코드가 있는 폴더에
cookie. json 파일을 생성하여 안에 붙여 넣기를 한다.
 
그다음 ytdl-core를 사용하는 파일에 아래와 같은 코드를 작성하면 된다.

const agent = ytdl.createAgent(JSON.parse(fs.readFileSync(__dirname +"\\cookie.json", {encoding: 'utf-8'})));

상황에 따라 / cookie.json으로 입력해야 할 수도 있다.
 
그리고 ytdl stream option에 agent: agent를 하면 끝!

const agent = ytdl.createAgent(JSON.parse(fs.readFileSync(__dirname +"\\cookie.json", {encoding: 'utf-8'})));

const _stream = ytdl(url, {
 agent: agent,
.
.
.
})

 
포스팅은 이만 줄이도록 하겠다.