From b9d81acfceb11029d808a7b4f42f3f8a10da7dc4 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Wed, 5 Aug 2026 10:39:11 +0900 Subject: [PATCH] =?UTF-8?q?cuts=5Ffrom=5Fstate:=20sec=EB=A5=BC=20=EC=95=95?= =?UTF-8?q?=EC=B6=95=20=EA=B8=B8=EC=9D=B4=20=EA=B8=B0=EC=A4=80=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EA=B3=A0=EC=A0=95,=20=EC=88=9C=ED=99=98=20?= =?UTF-8?q?=EC=9E=84=ED=8F=AC=ED=8A=B8=20=EC=A3=BC=EC=84=9D=20=EC=A0=95?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- capcut_agent/recommend.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/capcut_agent/recommend.py b/capcut_agent/recommend.py index 02c57e7..7ea48c4 100644 --- a/capcut_agent/recommend.py +++ b/capcut_agent/recommend.py @@ -359,14 +359,20 @@ def cuts_from_state(places, orig_ranges, captions, comments, *, key=None): - `orig_ranges` = 원본 영상 시각 → ⭐ 분:초 매칭 둘은 같은 길이여야 하고 인덱스로만 짝지어 다닌다. """ - from .pipeline import captions_for_places # 순환 임포트 회피: pipeline은 draft·comments를 - # 임포트하고 app.py가 pipeline·recommend를 둘 다 임포트하므로, 파일 상단에서 - # pipeline을 가져오면 임포트 순환이 생긴다. 호출 시점(함수 안)에서만 가져온다. + # pipeline은 지금 recommend를 임포트하지 않아 상단 임포트도 동작한다. 다만 앞으로 + # pipeline이 추천을 쓰게 되면 순환이 되므로 함수 안에서 가져와 미리 끊어 둔다. + from .pipeline import captions_for_places if not places or len(places) != len(orig_ranges): return [], 0, False bottoms = captions_for_places(captions, places) quotas = [max(1, int((p1 - p0) // CARD_SEC)) for p0, p1 in places] cuts = [{"start": s, "end": e, "bottom": b, "effect": ""} for (s, e), b in zip(orig_ranges, bottoms)] - return build_highlight_cuts({"paste": {"cuts": cuts}}, comments, - key=key, quotas=quotas) + cuts_out, need, ai_failed = build_highlight_cuts( + {"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