← 목록
기타 2026-06-28 4KB 읽기 5분

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/setProfileBGM
  • routes/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 mode
  • public/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/ 커버)