# Kord - YouTube 음악 재생 Phase 1 구현

## 변경 개요

`@discordjs/voice + youtubei.js` 조합을 기준으로 YouTube 음악 재생 기능의 1차 구현을 추가했다.

이번 단계에서는 길드별 메모리 큐와 음성 연결 세션을 도입하고, 검색 또는 영상 URL로 곡을 추가해 바로 재생할 수 있는 최소 워크플로우를 구현했다.

---

## 구현 범위

- `/music add`
  - `query`로 YouTube 검색 후 첫 번째 영상 추가
  - `url`로 YouTube 영상 링크 직접 추가
- `/music queue`
  - 현재 재생 곡과 대기열 조회
- `/music skip`
  - 현재 곡 스킵
- `/music leave`
  - 봇 음성 채널 퇴장 및 큐 정리
- 재생 컨트롤 버튼
  - `⏭ Skip`
  - `⏹ Stop`
  - `👋 Leave`

---

## 기술 구현

### 1. MusicService 추가

`src/services/MusicService.ts`

- 길드별 음악 세션을 메모리에서 관리
- `youtubei.js`를 lazy import로 초기화
- `getBasicInfo()`로 메타데이터 조회
- `getInfo()`의 `server_abr_streaming_url` 또는 `hls_manifest_url`을 재생 소스로 사용
- `ffmpeg-static`으로 원격 스트림을 PCM으로 디코딩
- `@discordjs/voice` 플레이어에 연결

### 2. Slash Command 추가

`src/commands/music.ts`

- `/music add`
- `/music queue`
- `/music skip`
- `/music leave`

### 3. 버튼 상호작용 연결

`src/events/interactionCreate.ts`

- 재생 메시지의 `music_*` 버튼 상호작용 처리 추가

### 4. i18n 반영

- `src/i18n/types.ts`
- `src/i18n/locales/en.ts`
- `src/i18n/locales/ko.ts`

음악 명령/재생 상태/오류 안내에 필요한 번역 키를 추가했다.

### 5. 테스트 추가

`tests/services/MusicService.test.ts`

- YouTube URL 파싱
- 재생 시간 포맷팅

---

## 검증

- `yarn build`
- `yarn test --runInBand`

두 명령 모두 정상 통과했다.

---

## 현재 한계

- 이번 단계는 단일 영상 단위 큐 처리 기준이다.
- YouTube 재생 목록 URL 전체 추가, 인덱스 삭제, 상세한 권한 제어는 아직 포함하지 않았다.
- 스트림 URL은 `youtubei.js`의 현재 응답 구조에 의존하므로 향후 YouTube 응답 변경 시 보완이 필요할 수 있다.
