diff --git a/src/main/java/com/hlab/yanalyst/domain/shortform/ShortformClip.java b/src/main/java/com/hlab/yanalyst/domain/shortform/ShortformClip.java new file mode 100644 index 0000000..74859dd --- /dev/null +++ b/src/main/java/com/hlab/yanalyst/domain/shortform/ShortformClip.java @@ -0,0 +1,51 @@ +package com.hlab.yanalyst.domain.shortform; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** 작업 하나에서 나온 구간(ID 1~5) 하나. capcutJson이 실제 편집 프로그램에 붙여넣는 값. */ +@Entity +@Table(name = "shortform_clip") +@Getter +@NoArgsConstructor +public class ShortformClip { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "job_id") + private ShortformJob job; + + @Column(nullable = false) + private Integer clipNo; + + @Column(length = 100) + private String titleTop; + + @Column(length = 200) + private String titleMain; + + @Column(columnDefinition = "TEXT") + private String capcutJson; + + @Column(columnDefinition = "TEXT") + private String titleCandidates; + + @Column(columnDefinition = "TEXT") + private String durationTable; + + static ShortformClip of(ShortformJob job, ParsedClip p) { + ShortformClip clip = new ShortformClip(); + clip.job = job; + clip.clipNo = p.clipNo(); + clip.titleTop = p.titleTop(); + clip.titleMain = p.titleMain(); + clip.capcutJson = p.capcutJson(); + clip.titleCandidates = p.titleCandidates(); + clip.durationTable = p.durationTable(); + return clip; + } +} diff --git a/src/main/java/com/hlab/yanalyst/domain/shortform/ShortformJob.java b/src/main/java/com/hlab/yanalyst/domain/shortform/ShortformJob.java new file mode 100644 index 0000000..50f734d --- /dev/null +++ b/src/main/java/com/hlab/yanalyst/domain/shortform/ShortformJob.java @@ -0,0 +1,79 @@ +package com.hlab.yanalyst.domain.shortform; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +/** + * 숏폼 큐 작업 하나 = 유튜브 영상 하나. Opal "숏폼 생성기" 실행 결과를 담는다. + * + *
rawOutput은 파싱 성공 여부와 무관하게 항상 원문을 보존한다 — 파서가 놓친 정보는
+ * 여기서 복구할 수 있다.
+ */
+@Entity
+@Table(name = "shortform_job",
+ indexes = @Index(name = "idx_sfj_video_id", columnList = "videoId", unique = true))
+@Getter
+@NoArgsConstructor
+public class ShortformJob {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(nullable = false, length = 500)
+ private String youtubeUrl;
+
+ @Column(nullable = false, length = 20)
+ private String videoId;
+
+ /** 결과의 첫 클립 title_main. 목록 표시에 쓴다. */
+ @Column(length = 300)
+ private String title;
+
+ @Enumerated(EnumType.STRING)
+ @Column(nullable = false, length = 20)
+ private ShortformJobStatus status = ShortformJobStatus.PENDING;
+
+ @Column(columnDefinition = "TEXT")
+ private String rawOutput;
+
+ @CreationTimestamp
+ @Column(updatable = false)
+ private LocalDateTime createdAt;
+
+ private LocalDateTime completedAt;
+
+ @OneToMany(mappedBy = "job", cascade = CascadeType.ALL, orphanRemoval = true)
+ @OrderBy("clipNo ASC")
+ private List