playreel/backend
Haewon Kam 0e53fa294b fix(compose): 상세페이지 스크롤을 롱이미지로 되돌린다
조각을 화면에 얹는 방식이라 스크롤이 한 번도 일어나지 않았다.
심규선 상세페이지 실측 — 19조각 중 1920px를 넘는 것이 0개라
scroll_scene의 span이 항상 0이었다. 화면의 13~44%만 조각이고
나머지는 블러 포스터로 남았으며, 같은 정지컷이 6초 넘게 이어졌다.

정본(tech_spec §5)에 있던 extend_to_height가 이식에서 빠진 것이 원인이다.
그것이 없으니 조각이 짧을 때 블러 배경에 상단 정렬로 얹는 수밖에 없었다.

- to_surface: 롱이미지를 폭 1080으로. trim_blank를 태우지 않는다 —
  위를 깎으면 섹션 y좌표가 전부 어긋난다
- extend_to_height + blank_band: 글자 없는 배경 띠를 거울 타일링,
  이음매 페더 40px. 프레임보다 짧아도 풀프레임을 채운다
- scroll_scene: 배경 합성 없이 surface.crop() — 블러가 섞일 여지를 없앤다
- build_scene_plan: 섹션은 훑기 시작점, 큐 길이가 훑는 거리.
  섹션이 떨어지면 앞 씬이 멈춘 자리에서 이어 읽는다(커서)
- SCROLL_TAG_PRIORITY에서 notice·crossbanner 제거 — 약관을 읽히는 영상이 아니다
- final_checks: 씬 종류가 scroll이라고 적힌 것이 아니라 실제 이동 거리를 본다.
  이 검사가 물러서 0픽셀 스크롤이 게이트를 통과했다

실측(심규선 자산 전체 합성, 569프레임 23.72초):
  콘텐츠 비율 t=8s 23%→99% · t=11s 13%→92% · t=17s 44%→99%
  프레임 간 변화량 0.01(정지) → 22~31

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 15:24:58 +09:00
..
answers 스타일링 1차 기능 추가 2026-09-09 10:34:58 +09:00
assets (WIP) config 자동 생성 및 gate4 / 동작 검증 실패 (local RAM 부족) 2026-09-07 17:20:27 +09:00
models fix(compose): 상세페이지 스크롤을 롱이미지로 되돌린다 2026-09-09 15:24:58 +09:00
pipelines fix(compose): 상세페이지 스크롤을 롱이미지로 되돌린다 2026-09-09 15:24:58 +09:00
raw_prompt posteralive gate 조정 2026-09-09 11:32:24 +09:00
routers low resolution 예외처리 앞으로 2026-09-09 11:13:13 +09:00
services fix(compose): 상세페이지 스크롤을 롱이미지로 되돌린다 2026-09-09 15:24:58 +09:00
tables backend api 추가 2026-09-08 13:00:23 +09:00
tests fix(compose): 상세페이지 스크롤을 롱이미지로 되돌린다 2026-09-09 15:24:58 +09:00
utils fix frontend bug 2026-09-08 15:57:35 +09:00
.dockerignore add docker 2026-09-08 08:50:28 +09:00
Dockerfile 포트 변경 및 테스프 폴더 볼륨 추가 2026-09-08 09:41:37 +09:00
main.py add archive 2026-09-09 09:19:22 +09:00
pyproject.toml api 의존성 추가 및 DB 설정 변경 2026-09-08 13:11:53 +09:00
README.md 포트 변경 및 테스프 폴더 볼륨 추가 2026-09-08 09:41:37 +09:00
settings.py api 의존성 추가 및 DB 설정 변경 2026-09-08 13:11:53 +09:00
uv.lock api 의존성 추가 및 DB 설정 변경 2026-09-08 13:11:53 +09:00

poster-alive

Requirements

Python

Python 3.14와 uv를 쓴다.

uv python install 3.14      # 없을 때만
cd backend
uv sync

uv syncpyproject.toml·uv.lock 기준으로 .venv를 만들고 패키지를 깐다. uv run은 실행 전에 알아서 sync 한다.

.env

backend/.env에 둔다. CHATGPT_API_KEY만 없으면 기동이 안 되고, 나머지는 해당 단계를 쓸 때 필요하다.

쓰는 곳
CHATGPT_API_KEY detect · narration · motion · split 태깅 · 캐스트 · 제목 게이트
TYPECAST_API_KEY 롱컷 tts (축제는 OpenAI를 써서 필요 없다)
SUNO_API_KEY · SUNO_CALLBACK_URL bgm
HIGGSFIELD_ACCOUNT upscale · i2v 계정 가드
MYSQL_URL DB 세션
AZURE_BLOB_BASE_URL · AZURE_BLOB_SAS_TOKEN blob 업로드

Docker

cd backend
docker build -t poster-alive-backend .
docker run --rm -p 30101:30101 \
  --env-file .env \
  -v ~/.config/higgsfield:/root/.config/higgsfield \
  poster-alive-backend

Higgsfield CLI 토큰은 컨테이너가 켜질 때 호스트의 것을 참조한다.

Higgsfield CLI

③ upscale과 ⑨ i2v가 Higgsfield CLI를 서브프로세스로 부른다. 인증이 API 키가 아니라 ~/.config/higgsfield/credentials.json의 CLI 토큰이라 머신마다 한 번씩 로그인해야 한다.

npm i -g @higgsfield/cli
higgsfield auth login
higgsfield workspace set <workspace-id>

로그인 후 higgsfield account status --json이 돌려주는 이메일을 .envHIGGSFIELD_ACCOUNT에 넣는다. 계정 가드가 이 값과 대조해, 다른 계정 토큰으로 남의 크레딧이 빠지는 것을 막는다.

실행

파이프라인 둘은 게이트에서 끊어 돌린다. 게이트에서 사람이 확인하고 다음 스크립트를 부른다.

축제 숏폼 — 포스터 1장

tests/run_poster_alive.sh            test_image/<poster>.jpg   # detect · narration · motion
tests/run_poster_alive_after_gate.sh test_image/<poster>.jpg   # tts · bgm · i2v · render

Playreel 롱컷 — NOL 상품 id

tests/run_playreel.sh             26007416   # fetch · split · 캐스트
tests/run_playreel_after_gate1.sh 26007416   # upscale · analyze
tests/run_playreel_after_gate2.sh 26007416   # motion · narration
tests/run_playreel_after_gate3.sh 26007416   # tts · bgm · i2v
tests/run_playreel_after_gate4.sh 26007416   # hybrid · compose

단계 하나만 돌리려면 모듈로 부른다. backend/에서 실행해야 한다.

uv run python -m tests.playreel.test_tts 26007416

산출물은 tests/test_result/<플로우>/ 아래에 쌓인다.