Daeseon Yoo
Back to project
·Tech retro·3 min·Review needed

영상을 4번째 콘텐츠 타입으로 — §1.1 단순성에서 의도적으로 벗어난 결정

owner 결정으로 음성/사진/글에 더해 짧은 영상(20초)을 추가. 스펙의 단순성 가드레일에서 의도적 이탈임을 플래그하고, 기존 캡처 패턴을 그대로 확장. 미해결 재생 호환성 caveat 명시.

AI version

맥락: 스펙과의 긴장

work.md §1.1은 콘텐츠 타입을 **음성/사진/글 셋만, "의심스러우면 뺀다"**로 못 박았다. 영상은 그 가드레일에 정면으로 어긋난다(펜던트=작고 친밀 → 영상은 "영상 메시지 앱"쪽으로 결을 민다). 이 긴장을 명시적으로 플래그했고, owner가 추가를 선택 → 절제 버전(20초 캡)으로 구현.

정직한 기록: 이건 AI가 권한 게 아니라, 제품 주인이 스펙을 의도적으로 확장한 결정이다. 깊이=정확도라는 §1.1 정신과는 트레이드오프.

구현 (1f14c0e) — 기존 패턴 그대로 확장

오디오 캡처 패턴을 미러링해서 일관성 유지:

  • components/VideoRecorder.tsxgetUserMedia({video,audio}), 라이브 미리보기, 20초 캡, 다시 녹화, 권한거부/실패 구분, 언마운트 안전.
  • lib/items.ts saveVideoItem + MIME 화이트리스트(isAllowedVideoMime, video/ 접두).
  • 스키마/init: type CHECK에 'video' 추가 + 기존 DB용 idempotent 마이그레이션(ALTER TABLE … DROP/ADD CONSTRAINT) — CREATE TABLE IF NOT EXISTS가 기존 테이블 제약을 안 바꾸므로.
  • add/기여 화면 4번째 탭, ItemCard·SurfaceClient 렌더, 업로드 조기차단 한도 상향(MAX_UPLOAD_BYTES 45MB, 영상 ≤40MB).
  • 미디어 라우트의 Range/206는 이미 영상 탐색을 커버.

검증 (직접 실행)

  • '영상' 탭 노출 확인.
  • 더미 영상 업로드 → 201 (= DB CHECK 마이그레이션이 기존 DB에 'video'를 실제로 허용함을 확인, 제약 위반 0).
  • 보관함에 video 항목 표시, 미디어 206/video/webm/nosniff.
  • 거부: video 자리에 text/html400.

⚠️ 미해결 caveat — 재생 호환성

ffmpeg가 이 머신에 없어 서버 트랜스코딩 없음. 데스크톱 Chrome은 webm 녹화 → 아이폰에서 재생 안 됨(반대도). 같은 기기/브라우저에선 정상. 이건 §12 오디오 이슈의 영상판이고, 오디오는 mp4 우선+서버 변환으로 풀려 했지만 영상은 미해결. 프로덕션 호스트에 ffmpeg + webm→mp4 변환(오디오 코드 lib/audio.ts 패턴 재사용)으로 해결 가능.

이 caveat는 실기기 교차 재생을 테스트하지 않은 상태에서 코드/포맷 지식으로 예측한 것 — 실제 아이폰↔데스크톱 교차 재생은 미검증.

Review needed

No human review on this entry yet.