music.crowny.org 스트리밍 기둥 B2 완성
개요
music.crowny.org(:9886) 3기둥 중 B2(스트리밍) 기둥 전체 구현. 한선씨 VM 엔진 5종 + Node 어댑터 2종 + 프론트 SPA 5파일.
무엇을 했는지
한선씨 엔진 (모두 컴파일 완료)
한선/음악엔진.한선→.toau: 트랙등록/조회/검색/플레이리스트/재생기록/BGM매니페스트/프로필BGM/좋아요/앨범/아티스트한선/추천.한선→.toau: LCG 셔플 추천큐, plays.jsonl+likes.jsonl 가중치 집계, 일배치 통계한선/후원정산.한선→.toau: 4상 판정(티/옴/타/음), 맘/포네 도토리 정산, support.jsonl 원장한선/스트리밍.한선→.toau: 트랙메타/앨범/아티스트/embed메타한선/caf7.js.한선→.toau: JS caf7.js 동반 — 큐브언패킹/트릿정수/사인윈도우/CAF7헤더검증/loop포인트계산
Node 어댑터
api/stream.js: 공유 커머스 엔진 사용, normalizeTrack() Korean→English 변환, ensureIndex() 자동 샤드 생성, buildBGMManifest/buildFeedQueue/processSupport/setProfileBGMroutes/music.js:module.exports = function(req, res, pn, u, ctx)17개 엔드포인트
공개 SPA
public/music/library.html: 검색/탭/트랙카드/앨범행/미니플레이어public/music/player.js: IIFE CrownyPlayer, CAF7 UA감지, mp3 Range 폴백, 연속재생/셔플/큐public/music/player.css: 디자인토큰(gold/bg/panel/text/border/coral), dark modepublic/music/embed.html: 임베드 iframe 미니플레이어 (__TRACK_DATA__치환)public/music/caf7.js: edengo-caf.js 재사용 (CAF7 WebAudio MDCT 디코더)public/stream/index.html: 모바일 스트리밍 SPA (Now Playing 카드 + 큐 목록)public/stream/app.js: CrownyPlayer 통합, 스크롤 미니플레이어 표시/숨김
검증된 엔드포인트
GET /api/health → {"ok":true}
GET /api/music/tracks → 2트랙 페이징
GET /api/music/bgm → BGM 매니페스트 2트랙 (X-Service-Key 필수)
GET /api/music/track/:id → 단일 트랙 메타
GET /api/music/search?q= → 키워드 검색
GET /api/music/feed → LCG 추천 큐
GET /api/music/album/:id → 앨범 상세
GET /api/music/embed/:id → embed.html (placeholder 치환)
POST /api/music/play → 재생 기록
POST /api/music/like → 좋아요
POST /api/music/playlist → 플레이리스트 생성
POST /api/music/playlist/track → 곡 추가
POST /api/music/support → 후원 정산
GET /api/music/support/:user → 후원 내역
GET /api/music/profile-bgm/:user → 프로필 BGM
POST /api/music/profile-bgm → 프로필 BGM 설정
관련 파일 경로
/Users/ef/crowny-music/routes/music.js/Users/ef/crowny-music/api/stream.js/Users/ef/crowny-music/한선/음악엔진.한선+.toau/Users/ef/crowny-music/한선/추천.한선+.toau/Users/ef/crowny-music/한선/후원정산.한선+.toau/Users/ef/crowny-music/한선/스트리밍.한선+.toau/Users/ef/crowny-music/한선/caf7.js.한선+.toau/Users/ef/crowny-music/public/music/library.html/Users/ef/crowny-music/public/music/player.js/Users/ef/crowny-music/public/music/player.css/Users/ef/crowny-music/public/music/embed.html/Users/ef/crowny-music/public/music/caf7.js/Users/ef/crowny-music/public/stream/index.html/Users/ef/crowny-music/public/stream/app.js/Users/ef/crowny-music/data/tracks.seed.json
한선씨 VM 함정 적용 내역
계속예약어 충돌 →루프계속으로 우회유닉스시각()undefined →가져오기 "날짜.한선"추가아니면만약문법 오류 →혹시로 교체파일존재()항상 -1 →읽기() + 글자수()우회- 배열 1023 상한 → 800캡 유지
- Content-Length 한글 잘림 → ctx.sendJSON (Buffer.byteLength)
- 카탈로그 Korean 필드명 → normalizeTrack() 변환
잔여 이슈
- 실제 .mp3 오디오 파일 (
uploads/audio/hsp-courage.mp3등) 미업로드 — 아티스트 업로드 워크플로우(B3) 연계 필요 - .caf 사전인코딩 파일 없음 — CrownyBrowser UA 감지 후 mp3 자동 폴백으로 정상 동작
- golden.crowny.org(:9967) 노래방 연동 — B4 빌더 별도 작업 예정
- 프로필 이미지 서빙 라우트 미구현 (server.js static 핸들러가 uploads/covers/ 커버)