GitHub 이력서 프로모션 비디오 (동형 파이프라인)
최종 구조 (총 재생 시간 ≤ 28초, 기본 약 24.5초):
- 동적 커버 (5.5초): 대상 계정의 GitHub 프로필 페이지 실제 스크린샷으로, '가로 단면으로 누워 있는 원경'에서 연속적인 원근 변환을 통해 '수직으로 기울어진 근경'으로 전환, 밝은 그라데이션 지면 + 부드러운 그림자, 흰색 플래시 전환.
- 프로젝트 카드 ×3 (각 6–6.5초): GitHub 흰색 저장소 카드, 동일 레이아웃 — 저장소 이름, 부제목, 빨간색/파란색 큰 숫자(0부터 실제 Star/Fork 수까지 롤링), README 요약 4개 항목 순차적 슬라이드 인, 하단 기술 태그 페이드 인. 카드 1, 2는 Star가 가장 높은 두 개의 프로젝트; 카드 3은 '추가 프로젝트' 개요(큰 숫자 = 총 저장소 수 / 최근 1년 기여 수).
- 쪽지 엔딩 (4.5초): 쪽지가 한 줄씩 붙여짐 (사용자 이름 / @github / 닉네임 / 대표작 · Star 수, 마지막 줄은 빨간색 배경), 오른쪽에 큰 원형 아바타(분홍색 테두리)가 확대되어 등장.
- 배경 음악: 사용자가 제공한 오디오 파일(주의사항 참조), 음성 없음.
엄격한 규칙
- 커버는 반드시 실제로 캡처한 프로필 페이지 프레임이어야 함:
scripts/capture_frame.py를 사용하여 직접 캡처하거나, 헤드리스 브라우저로 스크린샷. AI로 커버 생성/재구성 금지 (저장소 이름 조작, 데이터 위조), 타인이 제공한 스크린샷을 설명 없이 커버로 사용 금지. - 화면의 모든 텍스트는 config에서만 비롯됨: 숫자, 저장소 이름, 요약 줄은 모두 로컬에서 레이아웃(PIL), AI 비디오 생성에 텍스트 위탁 금지 — 이것이 이 파이프라인의 텍스트 오류 제로 및 관련 없는 브랜드 로고 미출현의 근본 원인.
- 프로젝트 소개는 반드시 README 실독 기반: Star 순으로 상위 2–3개 프로젝트를 선정하고, README를 열어 각 항목당 4줄의 한 문장 요약으로 정리한 후 config에 작성; 저장소 목록 설명으로 대충 채우는 것은 불합격. Star 3위가 내용이 빈약할 경우(예: README가 한 줄), 카드 3 개요에 포함하고 인계 시 설명.
- 인계 전 프레임 추출 자체 점검: 최소한 커버 시작 프레임, 각 카드 완성 프레임, 엔딩 프레임을 확인; 텍스트/숫자 문제 발견 시 반드시 수정 후 인계하고, 사용자에게 남은 결함을 솔직히 보고.
단계
1. 계정 조사
https://github.com/<user>?tab=repositories&sort=stargazers를 열어 Star 순위와 개수 확인.- 프로필 페이지를 열어 확인: 표시 이름, followers, 총 저장소 수, 최근 1년 기여 수, 고정 저장소.
- Star 상위 2–3개 저장소의 README를 각각 열어, 각 프로젝트에 대한 4줄 요약(기능/형태/기술/특징)과 기술 태그 4–6개 작성.
2. 자료 준비 (assets/)
python3 scripts/capture_frame.py <user> assets/page_frame.png # 프로필 페이지 스크린샷 (실제 프레임)
curl -L https://github.com/<user>.png -o assets/avatar.png # 아바타 (또는 프로필 페이지에서 캡처)
# BGM: 사용자가 제공한 오디오 파일을 assets/bgm.m4a에 배치 (선택 사항)
3. config 작성
examples/config.example.json을 config.json으로 복사하고, 1단계의 실제 데이터와 요약을 입력 (경로는 config 파일 기준 상대 경로 또는 절대 경로 사용).
4. 렌더링
python3 scripts/render_promo.py --config config.json --out out.mp4
필요 사항: Python 3 + Pillow + numpy, ffmpeg, Noto Sans CJK 폰트 (스크립트는 일반적인 경로에서 자동 검색).
5. 프레임 추출 자체 점검 후 인계
ffmpeg를 사용하여 0.4초 / 각 구간 중간 지점 / 엔딩에서 각각 한 프레임씩 추출하여 확인: 숫자가 Star 수와 일치하는지, 텍스트 위치가 올바른지, 커버가 실제 페이지인지, 엔딩 쪽지가 완전한지. 완성된 영상과 함께 '구조 설명 + 알려진 결함' 메시지를 사용자에게 전송.
config 필드 개요
| 필드 | 설명 |
|---|---|
username / display_name | 계정 이름 / 표시 이름 (엔딩 쪽지에 사용) |
page_frame / avatar / bgm | 자료 경로; bgm은 null 가능 (무음) |
cards | 정확히 3장: {name, sub, n1, l1, n2, l2, rows[4], chips[]}; n1/l1은 빨간색 큰 숫자+레이블 (예: 303 / Stars), n2/l2는 파란색 (예: 33 / Forks); 카드 3은 Repositories / Contributions 사용 가능 |
finale_strips | 4줄의 쪽지 텍스트, 마지막 줄은 자동으로 빨간색 배경 |
durations | 선택 사항: {cover, cards[3], finale} 초 단위, 합계에서 전환 시간을 제외하면 ≤28 |
주의사항
- 음악 저작권: 저장소에는 어떤 BGM도 포함되지 않습니다. 사용자가 직접 제공하거나 사용 권한이 있는 오디오 파일만 사용하세요. 타인의 비디오에서 추출한 오디오 트랙을 재배포하지 마세요.
- 프레임 캡처 서비스(thum.io) 첫 요청 시 자리 표시 이미지가 반환되는 것은 정상적인 대기 현상이며, 스크립트에서 '두 번 가져오기'를 처리합니다.
- 전체 영상에 Apple과 같은 관련 없는 브랜드 로고가 나타나지 않는 것은 설계 결과(로컬 렌더링으로 외부 자료 없음)이므로 추가 처리가 필요하지 않습니다.