SelfTest 확장: 관찰시간(SELFTEST_WATCH_SEC), 곡전환(SELFTEST_SECOND_QUERY) 지원.
position 샘플링 주기를 Lavalink 보고 주기(5초)에 맞춰 멈춤 오탐 제거.
격리 Lavalink(.9:2334, SABR 빌드) + ytresolver OFF 결과:
일반곡(K-pop) 성공 첫소리 1455ms 20초 관찰 끊김 0
해외곡 성공 첫소리 1696ms 20초 관찰 끊김 0
직접 URL 성공 첫소리 932ms 20초 관찰 끊김 0
긴 곡(1시간) 성공 첫소리 3865ms 20초 관찰 끊김 0
플레이리스트(120곡) 성공 첫소리 5656ms 20초 관찰 끊김 0
곡 전환 성공 (Ditto → HEYA, 6.0s)
라이브 스트림 실패 ※ 현행 방식(1.18.2+ytresolver)도 동일 실패 → 기존 한계
장시간 90초 실패 50초 재생 후 정지, 2곡 재현
장시간 실패 원인: 재생 중 googlevideo 403
(PersistentHttpStream.connect → "Not success status code: 403")
대조군(현행 방식) 동일 90초 테스트: 85초 진행, 끊김 0 → 현행이 안정적.
결론: SABR 빌드는 첫 재생이 약 3초 빠르지만 곡 길이(3~4분)를 못 버티므로 적용 불가.
프로덕션(Lavalink .6, 리졸버, master)은 변경하지 않았다.
이전 결론(직결 불가)은 youtube-source 1.18.2 '릴리스' 기준이었다. upstream 에
feat/sabr-support 브랜치(커밋 02f536d "SABR stream support")가 있고, 스냅샷
저장소에 빌드가 배포돼 있어 격리 Lavalink(.9:2334)에 올려 재검증했다.
빌드 확인: 1.18.2 에 없던 dev/lavalink/youtube/sabr/* 클래스 14개 추가(SabrStream 등).
(참고: main 최신 스냅샷 f45bbb7 에는 SABR 미포함 — 감지 문자열만 존재)
실측(자가 테스트, 동일 3곡 + 1곡, 프로덕션 무영향):
A) 현재 방식(.6 Lavalink 1.18.2 + ytresolver): 4437~4884ms, 성공
B) SABR 빌드 + ytresolver OFF(직결) : 1155~2816ms, 성공
→ 첫 소리까지 약 3초 단축. yt-dlp 단계 자체가 사라져 구조도 단순해진다.
미검증/주의: 연령제한곡·라이브·장시간 재생 안정성, 비공식 브랜치(미병합) 빌드 사용.
프로덕션 Lavalink(.6)·리졸버·master 는 변경하지 않았다.
POTOKEN_INJECT 플래그 추가(기본 true). 격리 테스트 Lavalink(.9:2334)를 별도로 띄워
클라이언트/OAuth/poToken 조합을 바꿔가며 직결 재생을 검증했다. 프로덕션 무영향.
[직결 재생 — 전부 실패]
- ANDROID_VR 우선 + OAuth + poToken : 실패
- ANDROID_VR 단독 + OAuth off : 실패
- ANDROID_VR 단독 + OAuth/poToken off: 실패
Lavalink 측 실패 사유(클라이언트별):
ANDROID_VR "This video requires login" / TVHTML5 "page needs to be reloaded"
WEB "No supported audio streams available"(응답이 sabr=1 + serverAbrStreamingUrl 뿐)
WEB_EMBEDDED "player configuration error" / MWEB 403
→ youtube-source 1.18.2(최신)는 SABR 미지원. 어떤 조합으로도 직결 불가 → ytresolver 필수.
[리졸버 고속화 — 유효한 개선 발견]
yt-dlp 클라이언트별 실측(동일 영상 5개, --get-url):
현재 default,web_safari,tv : 5/5 성공, 평균 2.95s, itag 251
default 단독 : 5/5 성공, 평균 2.00s, itag 251 ← 약 1.0s 단축
android_vr 단독 : 1.6s로 가장 빠르나 오디오 전용 포맷 없음(항상 itag 18)
→ Lavalink loadtracks 실패, 사용 불가
검증: default 단독 URL을 Lavalink가 loadType=track 로 정상 로드,
실제 재생까지 성공(자가 테스트 position 증가 확인).
4번 안(yt-dlp 단계 제거) 독립 검증용 실험 브랜치. master 에는 병합하지 않는다.
- Config.ytresolverEnabled 플래그 추가(YTRESOLVER_ENABLED, 기본 true=기존 동작).
false 면 resolvePlayable 이 Lavalink youtube-source(poToken) encoded 를 그대로 사용.
- SelfTest 추가: 사람이 음성채널에 없어도 봇이 스스로 입장→재생→position 증가를
확인해 실제 오디오 흐름 여부를 판정(환경변수 미설정 시 비활성).
실측 결과(테스트봇, Redis off, 프로덕션 무영향):
- A) ytresolver ON : 재생 성공, 첫 소리까지 4779ms (오디오 리졸브 3166ms)
- B) ytresolver OFF: 첫 소리까지 1279~1391ms 로 빠르지만 재생 실패.
Lavalink 예외 "All clients failed to load the item." 반복, position 0 고정.
서로 다른 2곡에서 동일 재현 → 곡 특성 아닌 구조적 차단(SABR).
결론: poToken 주입만으로는 스트림 로드가 안 되므로 ytresolver 는 계속 필요.