From 9a960be66390ccabc9752dc64773af3f23b08076 Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Mon, 3 Aug 2026 12:48:47 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=88=8F=ED=8F=BC=20=ED=81=90=EC=97=90?= =?UTF-8?q?=20=EC=A0=84=EC=B2=B4=20Output=20=EB=B3=B5=EC=82=AC=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=E2=80=94=20capcut2=20=EC=98=A4=ED=8C=94=20JSON=20?= =?UTF-8?q?=ED=83=AD=20=ED=86=B5=EC=A7=9C=20=EB=B6=99=EC=97=AC=EB=84=A3?= =?UTF-8?q?=EA=B8=B0=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit JobDetail에 rawOutput 노출, 카드 펼침 상단에 전체 복사·영상 URL 복사 툴바 추가. capcut2가 구분선·타이틀 후보 섞인 통짜 텍스트에서 JSON 5개를 알아서 뽑고 타이틀은 자체 선택 화면에서 고르므로 원문 그대로 복사한다. Co-Authored-By: Claude Fable 5 --- .../domain/shortform/dto/ShortformDtos.java | 5 +++-- src/main/resources/templates/shortform.html | 14 +++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hlab/yanalyst/domain/shortform/dto/ShortformDtos.java b/src/main/java/com/hlab/yanalyst/domain/shortform/dto/ShortformDtos.java index c6953cf..1a0984d 100644 --- a/src/main/java/com/hlab/yanalyst/domain/shortform/dto/ShortformDtos.java +++ b/src/main/java/com/hlab/yanalyst/domain/shortform/dto/ShortformDtos.java @@ -36,11 +36,12 @@ public final class ShortformDtos { public record JobDetail(Long id, String youtubeUrl, String videoId, String title, String status, LocalDateTime createdAt, LocalDateTime completedAt, - List clips) { + String rawOutput, List clips) { public static JobDetail from(ShortformJob job) { return new JobDetail(job.getId(), job.getYoutubeUrl(), job.getVideoId(), job.getTitle(), job.getStatus().name(), job.getCreatedAt(), - job.getCompletedAt(), job.getClips().stream().map(ClipDto::from).toList()); + job.getCompletedAt(), job.getRawOutput(), + job.getClips().stream().map(ClipDto::from).toList()); } } } diff --git a/src/main/resources/templates/shortform.html b/src/main/resources/templates/shortform.html index 06777b4..2503730 100644 --- a/src/main/resources/templates/shortform.html +++ b/src/main/resources/templates/shortform.html @@ -103,16 +103,24 @@ async function toggleJob(id, el) { if (el.classList.contains('open')) { el.classList.remove('open'); return; } const detail = await api('/api/shortform/jobs/' + id); - el.querySelector('.sf-clips').innerHTML = detail.clips.length + const toolbar = `
+ + +
`; + el.querySelector('.sf-clips').innerHTML = toolbar + (detail.clips.length ? detail.clips.map(clipHtml).join('') - : '

저장된 클립이 없습니다. 결과 붙여넣기 또는 "숏폼 큐 돌려줘"로 채우세요.

'; + : '

저장된 클립이 없습니다. 결과 붙여넣기 또는 "숏폼 큐 돌려줘"로 채우세요.

'); el.classList.add('open'); el.querySelectorAll('[data-copy]').forEach(btn => { + const label = btn.dataset.label || 'capcut2 JSON 복사'; btn.onclick = (e) => { e.stopPropagation(); navigator.clipboard.writeText(decodeURIComponent(btn.dataset.copy)); btn.textContent = '복사됨!'; - setTimeout(() => btn.textContent = 'capcut2 JSON 복사', 1200); + setTimeout(() => btn.textContent = label, 1200); }; }); }