ef16b678394ba08113a20e4da032b31b0463a195
운영 리졸버 + 내부API 0순위 조합을 테스트 포트(8780)에 올리고, 운영 Lavalink(.6)로 실제 재생을 검증했다. 프로덕션(8779/Lavalink/master)은 변경하지 않았다. 케이스별 결과(첫 소리 / 관찰 중 멈춤): 짧은영상 7초 성공 888ms (재생 후 정상 종료. 관찰창이 곡보다 길어 판정 오탐 1회 발생) 짧은영상 18초 성공 1437ms 0/2 일반곡(K-pop) 성공 2017ms 0/3 해외곡 성공 4209ms 0/3 스포티파이 URL 성공 2753ms 0/3 플레이리스트120 성공 3147ms 0/3 곡 전환 성공 2982ms 0/2 (Ditto -> HEYA, 6.0s) 긴 곡(1시간) 성공 1430ms 0/3 32분 연속재생 성공 888ms 0/383 <- position 5,180 -> 1,920,180ms 정확히 선형 증가 리졸버 경로 통계: 내부API 11회 / 폴백 0회 / 내부API 실패 0회 참고: SABR 직결은 55초에서 403으로 끊겼던 반면, 이 방식은 32분간 무결. 포맷도 itag 251 동일. 남은 과제(운영 적용 전): visitorData 를 봇이 2시간마다 갱신하는 값과 공유하도록 배선. 현재는 고정 파일(/tmp/vd.txt)을 읽는 프로토타입이라 만료 시 폴백으로 떨어진다. 연령제한곡은 샘플 확보 실패로 미검증(폴백 경로가 쿠키로 처리).
music_bot_v2
디스코드 음악봇 + 웹 대시보드 모노레포. 디스코드에서 명령으로 음악을 틀 수도 있고, 웹에서 로그인해 검색·재생·대기열을 제어할 수도 있다. 성인인증(연령제한) 영상 재생까지 지원한다.
구성
| 디렉터리 | 내용 | 문서 |
|---|---|---|
bot/ |
디스코드 봇 본체(discord.js + shoukaku/Lavalink). 검색·재생·대기열·자동재생·연령제한 우회. | bot/README.md |
page/ |
웹 대시보드(Next.js 16 + NextAuth + Redis). 브라우저에서 봇 제어·상태 표시. | page/README.md |
resolver/ |
ytresolver.py — yt-dlp 기반 오디오 URL 리졸버(+systemd 유닛). 봇이 연령제한/SABR 우회에 사용. |
아래 + bot/README §1·2 |
scripts/ |
refresh-cookies.mjs — 유튜브 쿠키(ytcookie.txt) 재발급 스크립트(Chromium). |
bot/README §4 |
전체 아키텍처
┌─────────────── 디스코드 제어 평면 ───────────────┐
[Discord 유저] ── 명령 ──▶ 봇(music1/2/3, .5 docker) ── shoukaku ──▶ Lavalink(.6:2333)
│ ▲ └ youtube-plugin(일반)
│ │ 재생 직전 리졸브
▼ │
ytresolver(.5:8779) ── yt-dlp(+쿠키) ──▶ 직접 오디오 URL
│ (Lavalink http 소스로 재생)
│
┌───────── Redis(.7) Pub/Sub + Key ─────────┐ ← 제어/상태 버스
│ │
[브라우저] ──▶ 웹 대시보드 page/(Next.js, NextAuth) ──┘
· site→bot: "site-bot" 명령 + 결과키 폴링(botRpc)
· bot→site: "bot-site" 이벤트 → SSE 실시간 표시
- 봇과 대시보드는 직접 연결되지 않고 Redis로 느슨하게 연동된다(대시보드는 Redis만 있으면 봇과 통신).
- 봇은 유튜브 연령제한 영상을 Lavalink만으로는 못 틀어서,
resolver/가 쿠키로 직접 오디오 URL을 뽑아 우회한다. - 봇 서버(.5)와 Lavalink(.6)가 같은 공인 IP라, .5에서 뽑은 스트림 URL을 .6이 그대로 재생한다.
빠르게 보기
- 봇 배포/쿠키/검색·재생 동작·성능·트러블슈팅 → bot/README.md
- 대시보드 개발/환경변수/Redis 통신 구조/API·UI → page/README.md
리포 규칙
bot/.gitignore가*.env,*.db를 제외 → 실제 토큰/DB는 커밋되지 않는다. 예시는bot/.env.example.- 원격: Gitea
git.tkrmagid.kr/tkrmagid/music_bot_v2(master).
Description
Languages
TypeScript
88.2%
Python
8.8%
JavaScript
1.9%
CSS
0.5%
Dockerfile
0.4%
Other
0.2%