crowny-class MP4 하이브리드 복구 — E2E 라이브 실증
개요
CVF 1080p가 실측상 실용불가(원본보다 팽창·134배·인코딩 9~10시간) 판정에 따라, 사장님 규칙 "안되면 MP4"로 강의 재생을 MP4(원본 h264 1920x1080)로 복구. CVF 파이프라인(encode-upload.sh· handleCvf·handleCvfAudio)은 삭제하지 않고 아카이브/관리자용으로 병행 보존하는 하이브리드 구조.이번 세션은 구현이 아니라 라이브 E2E 검증(모듈 5개는 이전 세션에서 이미 하이브리드로 배선 완료 상태였음 — modules/video/routes.js의 handleStream이 데이터/영상/파일/<id>.mp4를 Range(206)로 직접 서빙, handleCvf/handleCvfAudio는 그대로 유지되어 아카이브 경로로 살아있음을 확인).
검증 결과 (전부 PASS)
게이트 상태코드
| 케이스 | 기대 | 실측 |
|---|---|---|
| 무료(o1-1=mrgilkb817j8) 무로그인 Range | 206 | 206 |
| 유료(o3-1=mrgilm7qqxjf) 무로그인 | 401 | 401 |
유료 ?owner=가짜 | 401 | 401 |
| 유료 admin Bearer Range | 206 | 206 |
mp4 내용 실측
- 응답 청크 hexdump 앞부분:
... ftyp isom....isomiso2avc1mp41— 진짜 mp4 컨테이너 확인. - ffprobe: FV(mrgilkb817j8) =
h264,1920,1080, PV(mrgilm7qqxjf) =h264,1920,1080— 1080p 네이티브 확인.
CVF 아카이브 생존
/api/video/cvf/mrgilkb817j8(무료) → 206/api/video/cvfaudio/mrgilkb817j8(무료) → 206- 실파일
데이터/영상/cvf/class_o1-1.cvf(138.6MB),class_o1-1.cvf.mp3(1.9MB) 존재 확인 — 파이프라인 미삭제, 아카이브 경로 살아있음.
페이월 유지
https://video.crowny.org/api/download/class_o3-1.cvf→ 403 (class_ 접두 방어 유지)- 정적 우회
/데이터/영상/파일/<PV>.mp4직접 URL(원문+URL인코딩 둘 다) → 200이지만 SPA index.html 폴백(21857바이트,<!DOCTYPE html>로 시작) — 실 mp4 바이트 미유출 확인.데이터/디렉토리는 PUBLIC 서빙 루트 밖.
회귀
/api/lesson/curriculum→ lessons 95개 확인/api/enroll/status→ 200,{capacity:150, enrolled:0, remaining:150, open:true}/api/community/portfolios→ 200/api/lesson/wire-status(admin Bearer 필요, 무인증은 401이 정상) → Bearer로 200
관련 파일
/Users/ef/crowny-class/modules/video/routes.js— handleStream(mp4 Range), handleCvf/handleCvfAudio(아카이브), authForStream(공용 게이트)/Users/ef/crowny-class/한선씨/영상엔진.한선— 게이트 로직 개념 미러(컴파일 확인 완료, 실배선 아님— routes.js 주석에 명시)/Users/ef/crowny-class/scripts/encode-upload.sh— CVF 인코딩 파이프라인(유지)/Users/ef/crowny-class/데이터/영상/파일/*.mp4— 23편 원본 h264 1080p/Users/ef/crowny-class/데이터/영상/cvf/— CVF 아카이브 산출물/Users/ef/crowny-class/영상원본/업로드맵.psv— 슬러그(o1-1 등)↔실제 videoId(해시)↔free 매핑
잔여 이슈
- puppeteer 미설치로 캔버스(
<video>태그 실재생) 자동화 실증은 생략, 지시된 대로 206 상태코드 확인으로 갈음. - CVF 인코딩 잡(startEncodeJob)은 그대로 살아있어 신규 업로드마다 계속 인코딩 시도됨 — 아카이브 목적상 의도된 동작.