crowny-class mp4 스트리밍 복구 (하이브리드: mp4 실재생 + CVF 아카이브 병행)
개요
CVF 1080p 인코딩이 실측상 실용불가(원본보다 큰 팽창·134배·인코딩 9~10시간)로 판정되어,
사장님 규칙 "안되면 MP4"에 따라 강의 재생 경로를 mp4 Range 스트리밍으로 복구했다.
CVF 파이프라인(encode-upload.sh·handleCvf·handleCvfAudio)은 삭제하지 않고 아카이브/관리자용으로 유지한다.
무엇을 했는지
modules/video/routes.js의 handleStream(기존 410 Gone 스텁)을 mp4 Range(206) 스트리밍으로 복구.
handleCvf와 동형 게이트: meta 없으면 404, meta.free !== true면 authForStream 게이트(실패 시 401).
파일 서빙은 기존 streamRange(filePath, "video/mp4", req, res) 헬퍼 재사용(신규 로직 최소, 없는 파일은 streamRange 내부 statSync catch → 404).
cvfStatus 409 가드는 handleStream에는 넣지 않음 — mp4는 CVF 인코딩 상태와 무관하게 항상 서빙 가능(소스 원본).
콜사이트(handle 디스패치의 /api/video/stream/<id> 라우트)에 searchParams 인자 전달 추가(?owner= 쿼리 인증 지원).
handleCvf/handleCvfAudio/encode-status/업로드 후 비동기 인코딩 잡(startEncodeJob)은 그대로 유지 — CVF 아카이브 경로 보존, handleCvf의 cvfStatus 409 가드도 유지.
한선씨 동반: 한선씨/영상엔진.한선의 시청접근() 함수/헤더 주석을 "mp4(handleStream)/CVF(handleCvf)/CVF오디오(handleCvfAudio) 공용 게이트"로 명시 갱신(이미 있던 로직 미러, 실배선 없음 — JS의 authForStream()이 실제 판정 수행).페이월 불변식 (재확인)
mp4도 CVF와 동일 게이트:
meta.free !== true면 인증 필요 (
X-Crowny-Owner 헤더 또는
?owner= 쿼리 또는 admin). 무료 영상만 무로그인 접근.
데이터/영상/파일/은 PUBLIC 정적서빙 경로 밖이라 URL 직접 도달 불가 — 재확인 완료(server.js PUBLIC 상수가
public/만 정적서빙,
데이터/는 별도 DATA 상수 경로).
관련 파일
/Users/ef/crowny-class/modules/video/routes.js — handleStream 복구 + 디스패치 searchParams 전달
/Users/ef/crowny-class/한선씨/영상엔진.한선 — 시청접근() 헤더/주석 갱신(mp4/cvf 공용 게이트 명시)
/Users/ef/crowny-class/API-CONTRACT.md — video 섹션 계약(참조, 미수정)
- CVF 파이프라인(변경 없음, 아카이브용 유지):
scripts/encode-upload.sh, handleCvf/handleCvfAudio(routes.js)
검증
node --check modules/video/routes.js → 통과
cd /Users/ef/CrownyOS/crownyc && ./hanseonc_high 한선씨/영상엔진.한선 > /tmp/t.toau && ./crownyc run /tmp/t.toau → 컴파일/실행 정상, 시청접근()/cvf게이트() 4상 테스트 출력 확인
- class.html/admin 프론트 파일은 미변경(침범 금지 준수)
크라우니코드
lookup MISS 2건(mp4range스트리밍게이트, 영상스트림게이트) / learn add 1건(mp4range스트리밍게이트)
잔여 이슈
- 서버 재기동은 이 작업 범위 밖(Integrate 단계에서 별도 처리 필요) — 현재 서버는 여전히 410 Gone 코드로 기동 중일 수 있음.
- class.html 프론트가
/api/video/stream/<id>를 호출하는지, 아니면 여전히 /api/video/cvf/<id>를 호출하는지 미확인(프론트 배선은 이 작업 범위 밖).