목차
개요
FredBot 등 유명한 봇들에는 항상 음악 기능이 들어가있다. 그럼 이 기능은 어떻게 구현되는 것일까?
음악을 입력하면 키워드를 받아서 유튜브 등 음원사이트에 검색을 하여
1. 음악 파일을 다운받아서 재생 시켜준다.
2. 스트리밍을 해준다.
1번의 경우에는 음원을 다운받는데에 시간이 걸려 여러가지 음악을 신청시에 서버에 부하가 걸릴수 있다. 또한 재생까지에 시간이 걸린다.
2번의 경우에는 버퍼링이 걸릴수 있고 음질 이슈가 있을수 있다. (단일 노드 스트리밍일시)
그래서 FredBot 등이나 유명한 봇에서는 lavalink 라는 API를 따로 사용한다.
그 lavalink라는 API의 깃허브에 들어가보면
요약하자면 재생에 있어서 안정적으로 실행이 된다는 뜻이다.
lavalink 설치
1. lavalink API 설치
터미널 창에 (온라인 기반, VSCode 기반 모두)
pip install lavalink
pip 으로 lavalink를 설치하여준다.
2. lavalink.jar 파일을 다운로드 받아 폴더에 저장해준다.
https://github.com/freyacodes/Lavalink/releases/
가장 최신 release 버전을 이용해서 Assets 의 가장 처음 파일을 다운받아준다.
이를 제작하고 있는 봇의 코드가 들어있는 폴더 내에 server 폴더를 생성하여 넣어놓는다.
3. application.yml 파일을 동일 폴더 내에 생성
yml 파일 내에
server: # REST and WS server
port: 2333 서버가 열린 포트
address: 0.0.0.0
lavalink:
server:
password: "패스워드 입력란"
sources:
youtube: true
bandcamp: true
soundcloud: true
twitch: true
vimeo: true
http: true
local: false
bufferDurationMs: 400 # The duration of the NAS buffer. Higher values fare better against longer GC pauses. Minimum of 40ms, lower values may introduce pauses.
frameBufferDurationMs: 5000 # How many milliseconds of audio to keep buffered
opusEncodingQuality: 10 # Opus encoder quality. Valid values range from 0 to 10, where 10 is best quality but is the most expensive on the CPU.
resamplingQuality: LOW # Quality of resampling operations. Valid values are LOW, MEDIUM and HIGH, where HIGH uses the most CPU.
trackStuckThresholdMs: 10000 # The threshold for how long a track can be stuck. A track is stuck if does not return any audio data.
useSeekGhosting: true # Seek ghosting is the effect where whilst a seek is in progress, the audio buffer is read from until empty, or until seek is ready.
youtubePlaylistLoadLimit: 6 # Number of pages at 100 each
playerUpdateInterval: 5 # How frequently to send player updates to clients, in seconds
youtubeSearchEnabled: true
soundcloudSearchEnabled: true
gc-warnings: true
#ratelimit:
#ipBlocks: ["1.0.0.0/8", "..."] # list of ip blocks
#excludedIps: ["...", "..."] # ips which should be explicit excluded from usage by lavalink
#strategy: "RotateOnBan" # RotateOnBan | LoadBalance | NanoSwitch | RotatingNanoSwitch
#searchTriggersFail: true # Whether a search 429 should trigger marking the ip as failing
#retryLimit: -1 # -1 = use default lavaplayer value | 0 = infinity | >0 = retry will happen this numbers times
#youtubeConfig: # Required for avoiding all age restrictions by YouTube, some restricted videos still can be played without.
#email: "" # Email of Google account
#password: "" # Password of Google account
#httpConfig: # Useful for blocking bad-actors from ip-grabbing your music node and attacking it, this way only the http proxy will be attacked
#proxyHost: "localhost" # Hostname of the proxy, (ip or domain)
#proxyPort: 3128 # Proxy port, 3128 is the default for squidProxy
#proxyUser: "" # Optional user for basic authentication fields, leave blank if you don't use basic auth
#proxyPassword: "" # Password for basic authentication
metrics:
prometheus:
enabled: false
endpoint: /metrics
sentry:
dsn: ""
environment: ""
# tags:
# some_key: some_value
# another_key: another_value
logging:
file:
path: ./logs/
level:
root: INFO
lavalink: INFO
logback:
rollingpolicy:
max-file-size: 1GB
max-history: 30
이 코드를 삽입한다. 서버를 구동시에 할당되는 포트나 구동시에 필요한 패스워드 설정이나 버퍼의 길이 등등 프록시 옵션도 있고 여러가지 있다. 나중에 개인 NAS 로 구동하는 포스팅도 해봐야겠다.
위와 동일한 코드가 lavalink git에 주어져있다.
https://github.com/freyacodes/Lavalink/blob/master/LavalinkServer/application.yml.example/
4. .jar 파일 실행을 위한 start.bat 만들기
매번 jar파일을 관리자권한으로 실행하는 것 보다 bat 파일로 java로 자동실행되게 만들어놓았다.
java -jar Lavalink.jar
pause
모든 작업과 폴더별 정리 상황은 깃허브에 올려놓았다.
https://github.com/ChoMinGi/Discord-bot
한번 start.bat을 클릭해서 정상적으로 작동되는지 확인해본다.
'미사용 > Discord bot' 카테고리의 다른 글
디스코드 봇 만들기 :: 1일 1명언 기능 구현하기 (0) | 2022.08.07 |
---|---|
디스코드 봇 만들기 :: API 사용법 및 연결 테스트 (0) | 2022.08.05 |
디스코드 봇 만들기 :: 봇 생성 및 개발환경 세팅 (0) | 2022.08.03 |