cuts_from_state: sec를 압축 길이 기준으로 고정, 순환 임포트 주석 정정

sec가 build_highlight_cuts 안에서 start/end(원본 시각)로 계산되어 quota(압축
길이 기준)와 좌표계가 어긋났다 — 구간 탭·붙여넣기 탭처럼 무음 제거가 항상 켜진
경우 "20초인데 카드 3장"처럼 화면 표시가 매번 어긋났다. build_highlight_cuts는
다른 탭도 쓰므로 건드리지 않고, cuts_from_state가 결과를 받은 뒤 sec만 places
기준으로 덮어쓴다. 겸사겸사 순환 임포트 주석도 사실대로 고쳤다 — pipeline은
지금 recommend를 임포트하지 않아 순환이 아니고, 앞으로를 위한 예방 조치다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
hehihoho3@gmail.com 2026-08-05 10:39:11 +09:00
parent 3dd5eee684
commit b9d81acfce

View File

@ -359,14 +359,20 @@ def cuts_from_state(places, orig_ranges, captions, comments, *, key=None):
- `orig_ranges` = 원본 영상 시각 : 매칭 - `orig_ranges` = 원본 영상 시각 : 매칭
둘은 같은 길이여야 하고 인덱스로만 짝지어 다닌다. 둘은 같은 길이여야 하고 인덱스로만 짝지어 다닌다.
""" """
from .pipeline import captions_for_places # 순환 임포트 회피: pipeline은 draft·comments를 # pipeline은 지금 recommend를 임포트하지 않아 상단 임포트도 동작한다. 다만 앞으로
# 임포트하고 app.py가 pipeline·recommend를 둘 다 임포트하므로, 파일 상단에서 # pipeline이 추천을 쓰게 되면 순환이 되므로 함수 안에서 가져와 미리 끊어 둔다.
# pipeline을 가져오면 임포트 순환이 생긴다. 호출 시점(함수 안)에서만 가져온다. from .pipeline import captions_for_places
if not places or len(places) != len(orig_ranges): if not places or len(places) != len(orig_ranges):
return [], 0, False return [], 0, False
bottoms = captions_for_places(captions, places) bottoms = captions_for_places(captions, places)
quotas = [max(1, int((p1 - p0) // CARD_SEC)) for p0, p1 in places] quotas = [max(1, int((p1 - p0) // CARD_SEC)) for p0, p1 in places]
cuts = [{"start": s, "end": e, "bottom": b, "effect": ""} cuts = [{"start": s, "end": e, "bottom": b, "effect": ""}
for (s, e), b in zip(orig_ranges, bottoms)] for (s, e), b in zip(orig_ranges, bottoms)]
return build_highlight_cuts({"paste": {"cuts": cuts}}, comments, cuts_out, need, ai_failed = build_highlight_cuts(
key=key, quotas=quotas) {"paste": {"cuts": cuts}}, comments, key=key, quotas=quotas)
# sec 는 화면에서 quota 바로 옆에 찍힌다. quota 가 압축 길이 기준이므로
# sec 도 압축 길이여야 "20초인데 왜 3장?"이 안 생긴다.
# (start/end 는 ⭐ 매칭용이라 원본 시각 그대로 둔다 — 좌표계가 둘인 이유)
for c, (p0, p1) in zip(cuts_out, places):
c["sec"] = round(p1 - p0, 1)
return cuts_out, need, ai_failed