Claude cdf56b96b7 fix(youtube): split progress 0-50/50-99 and report ffmpeg conversion %
다운로드 후 바가 한 번에 99% 로 튄 뒤 멈춰 있던 문제 두 가지를 같이 고침.

1) 진행률 구간 분리
   - 다운로드: 0 ~ 50% (yt-dlp 의 0-100% 를 절반으로 매핑)
   - 60fps 변환: 50 ~ 99%
   - yt-dlp 가 video+audio 두 스트림을 받으면 각 스트림이 0→100% 를
     반복하므로 단조 증가만 인정 (downloadPctRaw = max(...)).

2) ffmpeg minterpolate 진행률 실시간 보고
   - editor.ts 에 `probeVideoDuration` 추가, `runFfmpegWithProgress`
     도입해 ffmpeg `-progress pipe:1` 의 out_time_us/ms 를 파싱.
   - `upscaleOriginalTo60Fps` 에 `onProgress(pct)` 콜백 추가.
   - youtube.ts 가 콜백을 받아 50~99% 로 매핑하고 job.message 를
     "60fps 변환 NN%" 로 갱신. persistJob 은 2초 throttle.

3) mci 옵션 단순화로 속도 개선
   - 기존: `mci:mc_mode=aobmc:me_mode=bidir` (가장 느린 조합)
   - 현재: `mci` 기본값 (obmc + bilat). 화질 약간 양보, 속도 수 배 개선.
   - 여전히 mci 자체가 무거워 5분 30fps 영상 변환에 수십 분 단위 시간이
     걸릴 수 있음 — 이제 그 동안 진행률은 실시간으로 움직임.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-16 02:57:33 +09:00

비디오 사이트

영상 업로드 및 저장을 위한 사이트

실행

처음 한 번은 setup 으로 의존성 + yt-dlp 바이너리 + 빌드까지 한 번에 끝낼 수 있어요:

cp .env.example .env   # 포트/호스트 등 환경변수 편집
npm run setup          # npm install + ./bin/yt-dlp 다운로드 + tsc
npm start              # .env 의 HOST:PORT 로 바인딩

수동으로 단계별로 하고 싶다면:

npm install
npm run build
npm start

설정은 전부 .env 한 파일로 모았습니다 (.env.example 참고).

  • HOST — 바인딩 주소. 외부 노출이 필요하면 0.0.0.0, 로컬 전용이면 127.0.0.1.
  • PORT — 바인딩 포트 (기본 3000).
  • SESSION_SECRET — 운영 시 반드시 충분히 긴 랜덤 문자열로 교체.
  • UPLOAD_MAX_BYTES — 업로드 용량 한도(바이트). 비우거나 미설정이면 기본 1073741824 (1 GiB). 무제한으로 두려면 0 또는 Infinity. 잘못된 값은 기본 1 GiB 로 fallback.
  • HTTP_REQUEST_TIMEOUT_MS — 대용량 업로드용 HTTP 요청 타임아웃(밀리초). 0/미설정이면 무제한.
  • 관리자 비밀번호는 account.jsonpassword 값 (초기값 admin, 운영 시 반드시 변경).

외부 의존

  • yt-dlp — YouTube 영상 가져오기. npm run setup./bin/yt-dlp 로 자동 설치하지만 PATH 에 이미 있어도 됩니다. Alpine / distroless 같이 glibc 가 없는 슬림 도커 베이스에서는 번들 바이너리가 안 도니 apk add yt-dlp (또는 apt-get install yt-dlp, pip install yt-dlp) 로 PATH 에 직접 설치하세요. 도커 빌드에서 아예 받지 않으려면 SKIP_YT_DLP=1 npm run setup. (검증 실패해도 setup 은 경고만 출력하고 빌드는 계속 진행됩니다.)
  • ffmpeg — 영상 트림 저장 (PATH 에 설치). 없으면 trim 설정만 저장됩니다. npm run setup 이 설치 여부를 검사해 안내 메시지를 출력합니다.

데이터 위치

data/
  folders/<폴더이름>/<videoId>/
    meta.json        # 영상 메타 (제목, trim, 원본/편집본 파일명)
    original.<ext>   # 원본 (항상 보존)
    edited.<ext>     # 편집본 (저장 시 생성)
  jobs/<jobId>.json  # YouTube 다운로드 작업 상태

스펙

메인 페이지 (/)

  • 동영상이 저장되어있는 폴더를 나열합니다.
  • 폴더를 선택해 안에 영상을 확인할수있습니다.
  • 폴더를 선택하면 /folder/:폴더이름 으로 이동합니다.

폴더 화면 페이지 (/folder/:폴더이름)

  • 폴더 내부에 영상을 유튜브처럼 목록으로 보여줍니다.
  • 누르면 재생 플레이어가 뜨며 영상이 재생됩니다.
  • 재생플레이어는 /player/:videoId로 합니다.
  • 플레이어는 내부팝업처럼 띄워줍니다.

관리자 페이지 (/op)

  • 동영상을 추가, 삭제, 관리하는 페이지입니다.
  • https://git.tkrmagid.kr/tkrmagid/minecraft_launcher repo에 사이트에 있는 op페이지에 로그인 로직을 똑같이 가져와서 적용합니다. (navbar도 채택해서 가져오기)
  • 메인 페이지처럼 폴더를 나열하고 우클릭으로 폴더 이름 수정, 삭제가 가능하도록 합니다.
  • 폴더를 선택하면 /op/folder/:폴더이름 으로 이동합니다.
  • 오른쪽위에 폴더추가버튼으로 폴더를 추가할수있도록 합니다.
  • 폴더추가버튼 누르면 팝업으로 생성할 폴더이름을 작성한뒤 생성누르면 폴더 생성되게 설정합니다.

관리자 폴더 화면 (/op/folder/:폴더이름)

  • 폴더 화면 페이지처럼 유튜브형식으로 영상을 나열하고 우클릭으로 수정, 삭제가 가능하도록 합니다.
  • 오른쪽위에 영상추가버튼으로 영상을 추가할수있도록 합니다.
  • 영상추가버튼 누르면 /op/folder/:폴더이름/video/editor 로 이동합니다.

영상추가 화면 (/op/folder/:폴더이름/video/editor)

  • 예시1: https://github.com/boostcamp-2020/Project13-Web-Video-Editor
  • 예시2: https://github.com/mifi/lossless-cut
  • 예시1, 예시2 처럼 영상을 수정할수있는 편집기 페이지를 보여줍니다.
  • 영상 추가는 컴퓨터에있는 영상을 드래그 드랍 하거나, 직접 폴더에서 찾거나, 유튜브 영상 주소를 추가해서 영상을 추가할수있도록 합니다.
  • 유튜브에서 영상 가져오는건 백그라운드에서도 진행 되도록해서 하면서 다른걸 할수있도록 합니다.
  • 영상 가져오는 시간을 미리 계산해서 5분 이상 걸릴거같으면 미리 경고를 보냅니다.
  • 위쪽에 네비게이션바를 만듭니다.
  • 네비게이션바 왼쪽에서 영상 이름을 수정합니다.
  • 오른쪽 위에 저장을 누르면 수정한 영상이 저장됩니다.
  • 원본 영상과 수정한 내용을 전부 저장해두고, 관리자폴더화면에서 영상을 우클릭해 수정을 누르면 수정하던 화면을 보여줍니다.
Description
No description provided
Readme 262 KiB
Languages
TypeScript 45.2%
JavaScript 31.5%
EJS 12.9%
CSS 10.4%