1
This commit is contained in:
@@ -50,34 +50,3 @@ func DeleteByPk(ctx context.Context, table string, pk int64) error {
|
||||
_, err := g.DB().Model(table).Ctx(ctx).Unscoped().Where("id", pk).Delete()
|
||||
return err
|
||||
}
|
||||
|
||||
func DeleteByDrama(ctx context.Context, table string, dramaId int64) error {
|
||||
_, err := g.DB().Model(table).Ctx(ctx).Unscoped().Where("drama_id", dramaId).Delete()
|
||||
return err
|
||||
}
|
||||
|
||||
func ListPageByDrama[T any](ctx context.Context, table string, dramaId int64, page, pageSize int) (res []*T, total int, err error) {
|
||||
m := g.DB().Model(table).Ctx(ctx).Where("drama_id", dramaId)
|
||||
if pageSize == -1 {
|
||||
r, err := m.OrderAsc("id").All()
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
res = make([]*T, 0)
|
||||
err = r.Structs(&res)
|
||||
return res, len(res), err
|
||||
}
|
||||
if page < 1 {
|
||||
page = 1
|
||||
}
|
||||
if pageSize < 1 {
|
||||
pageSize = 20
|
||||
}
|
||||
r, total, err := m.OrderAsc("id").Limit(pageSize).Offset((page - 1) * pageSize).AllAndCount(false)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
res = make([]*T, 0)
|
||||
err = r.Structs(&res)
|
||||
return
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -1,4 +1,4 @@
|
||||
package config
|
||||
package agent
|
||||
|
||||
import (
|
||||
"context"
|
||||
@@ -48,11 +48,34 @@ func (d *backgroundMusicDao) Delete(ctx context.Context, id int64) error {
|
||||
}
|
||||
|
||||
func (d *backgroundMusicDao) DeleteByDrama(ctx context.Context, dramaId int64) error {
|
||||
return common.DeleteByDrama(ctx, public.TableNameBackgroundMusic, dramaId)
|
||||
_, err := g.DB().Model(public.TableNameBackgroundMusic).Ctx(ctx).Unscoped().Where("drama_id", dramaId).Delete()
|
||||
return err
|
||||
}
|
||||
|
||||
func (d *backgroundMusicDao) ListPageByDrama(ctx context.Context, dramaId int64, page, pageSize int) (res []*entity.BackgroundMusic, total int, err error) {
|
||||
return common.ListPageByDrama[entity.BackgroundMusic](ctx, public.TableNameBackgroundMusic, dramaId, page, pageSize)
|
||||
m := g.DB().Model(public.TableNameBackgroundMusic).Ctx(ctx).Where("drama_id", dramaId)
|
||||
if pageSize == -1 {
|
||||
r, err := m.OrderAsc("id").All()
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
res = make([]*entity.BackgroundMusic, 0)
|
||||
err = r.Structs(&res)
|
||||
return res, len(res), err
|
||||
}
|
||||
if page < 1 {
|
||||
page = 1
|
||||
}
|
||||
if pageSize < 1 {
|
||||
pageSize = 20
|
||||
}
|
||||
r, total, err := m.OrderAsc("id").Limit(pageSize).Offset((page - 1) * pageSize).AllAndCount(false)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
res = make([]*entity.BackgroundMusic, 0)
|
||||
err = r.Structs(&res)
|
||||
return
|
||||
}
|
||||
func (d *backgroundMusicDao) ListByDrama(ctx context.Context, dramaId int64) (res []*entity.BackgroundMusic, err error) {
|
||||
r, err := g.DB().Model(public.TableNameBackgroundMusic).Ctx(ctx).Where("drama_id", dramaId).OrderAsc("id").Limit(200).All()
|
||||
|
||||
@@ -56,9 +56,32 @@ func (d *characterDao) Delete(ctx context.Context, id int64) error {
|
||||
}
|
||||
|
||||
func (d *characterDao) DeleteByDrama(ctx context.Context, dramaId int64) error {
|
||||
return common.DeleteByDrama(ctx, public.TableNameCharacter, dramaId)
|
||||
_, err := g.DB().Model(public.TableNameCharacter).Ctx(ctx).Unscoped().Where("drama_id", dramaId).Delete()
|
||||
return err
|
||||
}
|
||||
|
||||
func (d *characterDao) ListPageByDrama(ctx context.Context, dramaId int64, page, pageSize int) (res []*entity.Character, total int, err error) {
|
||||
return common.ListPageByDrama[entity.Character](ctx, public.TableNameCharacter, dramaId, page, pageSize)
|
||||
m := g.DB().Model(public.TableNameCharacter).Ctx(ctx).Where("drama_id", dramaId)
|
||||
if pageSize == -1 {
|
||||
r, err := m.OrderAsc("id").All()
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
res = make([]*entity.Character, 0)
|
||||
err = r.Structs(&res)
|
||||
return res, len(res), err
|
||||
}
|
||||
if page < 1 {
|
||||
page = 1
|
||||
}
|
||||
if pageSize < 1 {
|
||||
pageSize = 20
|
||||
}
|
||||
r, total, err := m.OrderAsc("id").Limit(pageSize).Offset((page - 1) * pageSize).AllAndCount(false)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
res = make([]*entity.Character, 0)
|
||||
err = r.Structs(&res)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -66,7 +66,8 @@ func (d *episodeDao) Delete(ctx context.Context, id int64) error {
|
||||
}
|
||||
|
||||
func (d *episodeDao) DeleteByDrama(ctx context.Context, dramaId int64) error {
|
||||
return common.DeleteByDrama(ctx, public.TableNameEpisode, dramaId)
|
||||
_, err := g.DB().Model(public.TableNameEpisode).Ctx(ctx).Unscoped().Where("drama_id", dramaId).Delete()
|
||||
return err
|
||||
}
|
||||
|
||||
func (d *episodeDao) UpdateStatus(ctx context.Context, id int64, status string, videoUrl string) error {
|
||||
|
||||
@@ -49,11 +49,34 @@ func (d *propDao) Delete(ctx context.Context, id int64) error {
|
||||
}
|
||||
|
||||
func (d *propDao) DeleteByDrama(ctx context.Context, dramaId int64) error {
|
||||
return common.DeleteByDrama(ctx, public.TableNameProp, dramaId)
|
||||
_, err := g.DB().Model(public.TableNameProp).Ctx(ctx).Unscoped().Where("drama_id", dramaId).Delete()
|
||||
return err
|
||||
}
|
||||
|
||||
func (d *propDao) ListPageByDrama(ctx context.Context, dramaId int64, page, pageSize int) (res []*entity.Prop, total int, err error) {
|
||||
return common.ListPageByDrama[entity.Prop](ctx, public.TableNameProp, dramaId, page, pageSize)
|
||||
m := g.DB().Model(public.TableNameProp).Ctx(ctx).Where("drama_id", dramaId)
|
||||
if pageSize == -1 {
|
||||
r, err := m.OrderAsc("id").All()
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
res = make([]*entity.Prop, 0)
|
||||
err = r.Structs(&res)
|
||||
return res, len(res), err
|
||||
}
|
||||
if page < 1 {
|
||||
page = 1
|
||||
}
|
||||
if pageSize < 1 {
|
||||
pageSize = 20
|
||||
}
|
||||
r, total, err := m.OrderAsc("id").Limit(pageSize).Offset((page - 1) * pageSize).AllAndCount(false)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
res = make([]*entity.Prop, 0)
|
||||
err = r.Structs(&res)
|
||||
return
|
||||
}
|
||||
func (d *propDao) ListByDrama(ctx context.Context, dramaId int64) (res []*entity.Prop, err error) {
|
||||
r, err := g.DB().Model(public.TableNameProp).Ctx(ctx).Where("drama_id", dramaId).OrderAsc("id").Limit(200).All()
|
||||
|
||||
@@ -49,11 +49,34 @@ func (d *sceneDao) Delete(ctx context.Context, id int64) error {
|
||||
}
|
||||
|
||||
func (d *sceneDao) DeleteByDrama(ctx context.Context, dramaId int64) error {
|
||||
return common.DeleteByDrama(ctx, public.TableNameScene, dramaId)
|
||||
_, err := g.DB().Model(public.TableNameScene).Ctx(ctx).Unscoped().Where("drama_id", dramaId).Delete()
|
||||
return err
|
||||
}
|
||||
|
||||
func (d *sceneDao) ListPageByDrama(ctx context.Context, dramaId int64, page, pageSize int) (res []*entity.Scene, total int, err error) {
|
||||
return common.ListPageByDrama[entity.Scene](ctx, public.TableNameScene, dramaId, page, pageSize)
|
||||
m := g.DB().Model(public.TableNameScene).Ctx(ctx).Where("drama_id", dramaId)
|
||||
if pageSize == -1 {
|
||||
r, err := m.OrderAsc("id").All()
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
res = make([]*entity.Scene, 0)
|
||||
err = r.Structs(&res)
|
||||
return res, len(res), err
|
||||
}
|
||||
if page < 1 {
|
||||
page = 1
|
||||
}
|
||||
if pageSize < 1 {
|
||||
pageSize = 20
|
||||
}
|
||||
r, total, err := m.OrderAsc("id").Limit(pageSize).Offset((page - 1) * pageSize).AllAndCount(false)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
res = make([]*entity.Scene, 0)
|
||||
err = r.Structs(&res)
|
||||
return
|
||||
}
|
||||
func (d *sceneDao) ListByDrama(ctx context.Context, dramaId int64) (res []*entity.Scene, err error) {
|
||||
r, err := g.DB().Model(public.TableNameScene).Ctx(ctx).Where("drama_id", dramaId).OrderAsc("id").Limit(200).All()
|
||||
|
||||
@@ -6,13 +6,11 @@ import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"video-factory/shortdrama/agent"
|
||||
"video-factory/shortdrama/config"
|
||||
consts "video-factory/shortdrama/consts"
|
||||
"video-factory/shortdrama/consts/public"
|
||||
"video-factory/shortdrama/dao"
|
||||
@@ -355,8 +353,8 @@ func (s *episodeService) buildScriptGenUserInput(ctx context.Context, d *entity.
|
||||
b.WriteString("【输出格式】\nJSON数组,每个元素是一个镜头对象(shot),包含以下字段:\n- index: 镜头序号(从1开始)\n- startTime: 开始时间(格式MM:SS)\n- endTime: 结束时间(格式MM:SS)\n- event: 画面描述——观众在屏幕上直接看到的一切。场景环境、角色动作、表情变化、物体位置等。**这是视频模型生成画面的唯一依据,所有画面内容必须写在这里**,严禁把画面描述放入 narration 字段。不包含旁白和台词。\n- dialogue: 主台词——角色在画面中亲口说出的对白。多人对话用「角色名:台词」格式。旁白和内心独白不属于这里。如果本镜头无人说话,留空即可。\n- narration: 旁白配音——需要配音演员念出来的解说文字。必须是**通过画面无法直接传达**的信息(如角色内心独白、故事背景交代、时间跳跃说明等)。**如果一段文字描述的是观众能直接看到的画面内容,它就不属于旁白,必须放进 event 字段。** 本镜头无旁白时留空即可。\n- cameraMovement: 运镜方式,从以下标准类型中选择一种:固定镜头、推、拉、摇、移、跟、升、降、旋转、晃动、航拍\n- shotSize: 景别,从以下标准类型中选择一种:远景、全景、中景、近景、特写\n- characters: 出演人物数组,填写演员名称,如[\"张三\", \"李四\"],从「可用演员」中选择\n- scene: 场景名称,从「可用场景」中选择\n- props: 道具名称数组,如[\"剑\", \"酒杯\"],从「可用道具」中选择\n\n直接输出JSON数组,不要markdown代码块标记,不要其他任何内容。\n\n")
|
||||
|
||||
b.WriteString("【创作规范】\n\n1. 剧情完整性【核心规则】—— 剧情描述是唯一创作依据,严格按每一句话、每一个细节逐拍还原。\n - 剧情描述中出现的每一句角色说的话,必须一字不差地写入对应镜头的dialogue字段。严禁把台词\"翻译\"成事件描述。\n - 剧情描述中的每一个具体细节(人物的动作、表情反应、对话、环境互动等)都必须忠实地保留在对应镜头的event、narration或dialogue字段中,不能省略、概括或改写为泛化描述。\n - 所有镜头时长之和应等于 %d 秒(50秒至少20个镜头,20-25个镜头为最佳密度)。\n\n2. 场景一致性 —— 每个镜头的 scene 字段值必须与 event 中画面描述的地点一致。\n - 如果 event 描述角色在\"实验室内\",scene 必须是该实验室的名称,不能写成其他地点。\n - 如果角色从一个场景移动到另一个场景,必须先切换 scene(如从「街道」切到「室内」),再描述新地点中的动作。\n\n3. 景别与动作匹配规则 —— 按镜头内容选择正确的 shotSize:\n - shotSize=特写:面部表情、微表情、眼神变化、细节反应(手部小动作、物品细节)。不能用于动作展示。\n - shotSize=近景:对话、上半身互动、情绪交流。能看清面部表情和手势。\n - shotSize=中景:日常动作、手持物体、多人交互。膝盖以上,既有动作又有空间感。\n - shotSize=全景:连贯动作、奔跑、打斗、空间关系。展示全身动作和环境关系。\n - shotSize=远景:环境交代、空镜过渡、场景建立。没有人或人很小,用于转场。\n\n4. 运镜搭配规则 —— 按场景类型选择 cameraMovement:\n - 对话/情绪交流 → 固定镜头或缓推\n - 动作/打斗 → 跟、摇、移\n - 人物进入/离开画面 → 跟、移\n - 情绪揭示 → 推\n - 环境展示 → 摇、升降、航拍\n - 紧张/混乱 → 晃动\n - 固定镜头是默认选项,无特殊需要不使用复杂运镜。\n\n5. 口型适配规则 —— 有台词的镜头(dialogue 不为空)必须遵守:\n - shotSize 必须为中景或近景(不能是远景、全景或特写)。\n - 说话角色必须面向或侧向镜头,不能背对镜头说话。\n - 不说话只做反应的角色可用其他景别。\n")
|
||||
b.WriteString(config.GetShotDurationPrompt(ctx, d.Type))
|
||||
b.WriteString(config.GetStylePrompt(ctx, d.Type))
|
||||
b.WriteString(agent.GetShotDurationPrompt(ctx, d.Type))
|
||||
b.WriteString(agent.GetStylePrompt(ctx, d.Type))
|
||||
b.WriteString("\n\n6. JSON格式要求:输出必须是合法的 JSON 数组,字符串值中若需使用引号请用「」代替 ASCII 双引号,确保 json.Unmarshal 能正确解析。\n7. 风控规避:视频模型对某些画面有安全审查机制,生成镜头描述时必须规避。政治敏感内容(真实政治人物/标志/当代军警标识)零容忍。暴力血腥画面(刀刺入身体、血溅、断肢)改为反应镜头或切镜回避,不展示伤害过程。当代背景中的军警抓捕动作将「警察/武警」改为「保安/黑衣人」,动作从「按倒铐住」改为「围住请离」。武器描写聚焦持武器的人物(「他握紧长刀,目光凌厉」),不写武器接触身体的画面。暴力结果用间接描写:写周围人反应而非伤口血迹。\n")
|
||||
|
||||
return b.String()
|
||||
|
||||
Reference in New Issue
Block a user