diff --git a/server/app.py b/server/app.py index dfe2f3b..7b62f71 100644 --- a/server/app.py +++ b/server/app.py @@ -553,10 +553,12 @@ async def auto_stream(aid: str) -> StreamingResponse: if cuts: h["cuts"], h["need"] = cuts, need if ai_failed: - # cuts 는 타임스탬프만으로 채워져 비지 않는다 — 이 신호가 없으면 - # 429·타임아웃이 조용히 삼켜져 아무도 모른다. + # cuts 는 분:초·단어겹침·좋아요만으로 채워져 비지 않는다 — 이 신호가 없으면 + # 429·503(재시도까지 소진)이 조용히 삼켜져 아무도 모른다. "무엇이 안 됐고 + # 그래서 어떻게 됐는지"를 한 문장에 담는다(사용자가 로그 영역만 보고 지나침). warnings.append( - f"ID {h.get('id')} AI 추천 실패 — 타임스탬프만으로 배정했습니다") + f"ID {h.get('id')} AI 추천 실패(Gemini 응답 없음) — " + "분:초·자막단어·좋아요로 배정했습니다") except Exception as exc: # noqa: BLE001 — 추천 실패가 생성을 막으면 안 된다 warnings.append( f"ID {h.get('id')} 컷별 추천 실패 — 기존 방식으로 표시 " diff --git a/server/static/auto.js b/server/static/auto.js index 30f3c7f..729cda1 100644 --- a/server/static/auto.js +++ b/server/static/auto.js @@ -194,7 +194,7 @@ function cutGroup(ci,title,sec,quota,isOpen){ 갈라 두면 한 곳만 고치는 실수가 난다(배지·검색·선택 상한이 전부 여기 모여 있다). ── */ function renderCutPanel(box,panelId,data,opts){ const unit=(opts&&opts.unit)||"컷"; - const WHY={ts:"⭐",ai:"🤖",like:"➕"}; + const WHY={ts:"⭐",ai:"🤖",word:"🔤",like:"➕"}; box.appendChild(searchBar(panelId)); // 카드 섹션들 위 — cardSection 보다 먼저 만들어야 SECS 초기화됨 const cand=(data.candidates||[]).filter(i=>byIdx[i]!==undefined); if(data.cuts){