tkrmagid 5d5bf9b3f3 experiment: SABR 끊김은 업스트림 미완성으로 해결 불가 / 대안 '상주 리졸버' 검증 성공
[1] 재생 중 끊김(~55초) 해결 시도 — 전부 실패
  - poToken 정상 주입 + 프로덕션 동일 설정 : 55초 끊김 동일
  - 클라이언트 WEB 단독(SABR 경로 강제)    : 55초 끊김 동일(decode 오류)
  - 프록시(.4:3128) 제거                   : 55초 끊김 동일
  원인: 첫 청크 재생 후 '이어받기' 요청이 실패(정적 경로 403 / SABR 경로 decode).
  feat/sabr-support 는 열린 PR #229, 마지막 커밋 2026-07-27 로 미병합 진행 중 기능.
  => 우리 쪽 설정으로 고칠 수 없음. SABR 직결 보류 확정.

[2] 새 방식: yt-dlp 를 '상주 라이브러리'로 호출하는 리졸버(프로토타입 첨부)
  - zipapp(/usr/local/bin/yt-dlp) 을 sys.path 에 넣어 import, YoutubeDL 인스턴스 1회 생성
  - 매 요청 프로세스 기동(0.40s) 제거 + player_client=default 단독
  - 실패 시 기존 subprocess 경로로 자동 폴백(안전)
  리졸브 실측: 1.58~2.30s (기존 subprocess 3곡 평균 4.2~4.7s)
  재생 검증(프로덕션 Lavalink .6 + 이 리졸버):
    일반곡 2656ms / 해외곡 2968ms / 직접URL 1900ms / 곡전환 성공
    90초 장시간: 85초 진행, 끊김 0/17  ← SABR(55초 실패) 대비 안정
프로덕션(리졸버 8779, Lavalink, master)은 변경하지 않음. 테스트는 8780 포트로만 수행.
2026-09-17 15:29:21 +09:00

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
음악봇 v2
Readme 1.8 MiB
Languages
TypeScript 88.2%
Python 8.8%
JavaScript 1.9%
CSS 0.5%
Dockerfile 0.4%
Other 0.2%