ICE-GL-ZY001 · PROP-003广告牌V3·带完整招生文字·6行 · D169
Some checks failed
自动更新代码和重启 / update-and-restart (push) Has been cancelled
CI检查 + 自动部署 / check (push) Has been cancelled
CI检查 + 自动部署 / deploy (push) Has been cancelled

This commit is contained in:
bingshuo 2026-07-06 17:20:21 +08:00
parent cc87fbb9f1
commit c6c62e0b73
20 changed files with 404 additions and 20 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

View File

@ -1,30 +1,19 @@
<!DOCTYPE html> <!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>配角 CHAR-006/007 · 中年男子+欧阳员外</title> <html><head><meta charset="UTF-8"><title>PROP-003 广告牌 V3 · 带招生全文</title>
<style> <style>
body{background:#1a1a1a;color:#ccc;font-family:sans-serif;margin:20px} body{background:#1a1a1a;color:#ccc;font-family:sans-serif;margin:20px}
h2{color:#fff;margin:25px 0 5px;border-top:1px solid #444;padding-top:15px} h2{color:#fff;margin-bottom:5px}
h2:first-of-type{border:none;padding:0}
.sub{color:#999;font-size:13px;margin-bottom:10px} .sub{color:#999;font-size:13px;margin-bottom:10px}
.grid{display:grid;grid-template-columns:1fr 1fr;gap:20px;max-width:1200px;margin:0 auto} .grid{display:grid;grid-template-columns:1fr 1fr;gap:20px;max-width:1200px;margin:0 auto}
.card{background:#2a2a2a;padding:15px;border-radius:8px;text-align:center} .card{background:#2a2a2a;padding:15px;border-radius:8px;text-align:center}
.card img{width:100%;max-height:600px;object-fit:contain} .card img{width:100%;max-height:600px;object-fit:contain}
.card p{margin:8px 0 0;font-size:13px;color:#aaa} .card p{margin:8px 0 0;font-size:13px;color:#aaa}
</style></head><body> </style></head><body>
<h2>CHAR-006 中年男子 · 送土特产讨好王执事</h2> <h2>PROP-003 广告牌 V3 · 完整招生文字</h2>
<p class="sub">40岁·灰色素袍·手捧布包袱·谄媚圆滑市侩·凡人送礼者</p> <p class="sub">天道宗·未来第一宗·名额一位·包吃包住·每月三十两·入宗学仙法</p>
<div class="grid"> <div class="grid">
<div class="card"><img src="CHAR-006-V1-candidate-01-1440x2560.png"><p>候选01 · 正面微躬身·捧布包袱·小眼睛眯笑讨好</p></div> <div class="card"><img src="PROP-003-V3-candidate-01-1440x2560.png"><p>候选01 · 正面A架·六行墨字清晰朴拙</p></div>
<div class="card"><img src="CHAR-006-V1-candidate-02-1440x2560.png"><p>候选02 · 半侧身弯腰·捧布袋谄媚·朴素长袍旧布带</p></div> <div class="card"><img src="PROP-003-V3-candidate-02-1440x2560.png"><p>候选02 · 微侧·古朴墨迹完整·百宗会仙雾</p></div>
<div class="card"><img src="CHAR-006-V1-candidate-03-1440x2560.png"><p>候选03 · 微躬身正面·堆笑讨好·粗布袍布包袱·凡人</p></div> <div class="card"><img src="PROP-003-V3-candidate-03-1440x2560.png"><p>候选03 · 正面中景·竖排工整·风化磨损</p></div>
<div class="card"><img src="CHAR-006-V1-candidate-04-1440x2560.png"><p>候选04 · 侧面微躬身·布袋略鼓·谄媚不猥琐·素灰袍</p></div> <div class="card"><img src="PROP-003-V3-candidate-04-1440x2560.png"><p>候选04 · 半侧面·绳结清晰·字迹斑驳可读</p></div>
</div> </div></body></html>
<h2>CHAR-007 欧阳员外 · 闪切用</h2>
<p class="sub">50岁·暗紫锦缎金丝绣边·玉佩腰带·面容阴沉高傲·富贵员外</p>
<div class="grid">
<div class="card"><img src="CHAR-007-V1-candidate-01-1440x2560.png"><p>候选01 · 正面抚玉佩·阴沉高傲·暗紫锦缎·富贵傲慢</p></div>
<div class="card"><img src="CHAR-007-V1-candidate-02-1440x2560.png"><p>候选02 · 半侧俯视·眼神高高在上·华贵紫袍金绣</p></div>
<div class="card"><img src="CHAR-007-V1-candidate-03-1440x2560.png"><p>候选03 · 正面微仰·双手叠玉佩·鄙夷不屑·锦缎华丽</p></div>
<div class="card"><img src="CHAR-007-V1-candidate-04-1440x2560.png"><p>候选04 · 半侧冷淡·嘴角下撇·暗紫金丝·员外权贵</p></div>
</div>
</body></html>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,59 @@
# VA-13-001-V3-EP01 · 第1集分镜方案 V3.0 · 剧本逐行完整版
> HLDP://video-ai-system/VA-13-001-V3-EP01
> 铸渊 ICE-GL-ZY001 · D169 · 2026-07-06
> 苍耳指令:原剧本一字不删·逐△拆镜
## 1-1 百宗会22镜·约140秒
| 镜 | 剧本行 | 内容 | 时长 | 引用资产 |
|:--:|:------:|------|:--:|------|
| 01 | △15 | 高空云海·御剑飞行·仙人驾鹤 | 6s | — |
| 02 | △17 | 俯瞰百宗会广场·人山人海·豪华招牌 | 6s | ENV-002 |
| 03 | △19 | **特写**天道宗破旧牌匾 | 4s | PROP-002 |
| 04 | △21 | 苏白站在牌匾下·双手叉腰 | 6s | CHAR-003+PROP-002+ENV-003 |
| 05 | △23 | 苏白喊话:未来的天下第一宗! | 6s | CHAR-003 |
| 06 | △25 | **特写**广告牌内容(后期叠层文字) | 5s | PROP-003 |
| 07 | △27 | 苏白喊话:走过路过不要错过! | 5s | CHAR-003 |
| 08 | △29 | 围观人群围过来指指点点 | 6s | CHAR-003+ENV-003 |
| 09 | △31 | 龙套一:哈哈哈笑死我了… | 5s | —(远景群杂) |
| 10 | △33 | 龙套二:包吃包住?入宗就给仙法? | 5s | —(远景群杂) |
| 11 | △35 | 龙套三:灵霄宗三十两…想钱想疯了! | 5s | —(远景群杂) |
| 12 | △37 | 围观散去·风吹落叶·苏白叹气看远处 | 7s | CHAR-003 |
| 13 | △39 | **特写**灵霄宗鎏金牌匾·排队望不到头 | 7s | ENV-004 |
| 14 | △41 | 苏白挠头苦恼:我这里怎么就没人呢? | 6s | CHAR-003 |
| 15 | △43 | 苏白OS系统查看面板 | 4s | CHAR-003 |
| 16 | △45-61 | 系统面板UI(后期叠层) | 8s | CHAR-003+UI |
| 17 | △63 | 苏白叹息:这样下去什么时候才能完成任务啊 | 6s | CHAR-003 |
| — | — | 1-2 灵霄宗席位处 | — | — |
| 18 | △69 | 王执事画红色叉号 | 6s | CHAR-005+ENV-004 |
| 19 | △71 | 王执事面无表情:下一个! | 5s | CHAR-005 |
| 20 | △73 | 诸葛风满脸不可置信 | 5s | CHAR-004 |
| 21 | △75 | 诸葛风:六场第一为什么没通过? | 6s | CHAR-004 |
| 22 | △77 | 王执事鄙夷瞅诸葛风破旧衣衫 | 5s | CHAR-005+CHAR-004 |
| 23 | △79 | 王执事:没钱你修什么仙? | 5s | CHAR-005 |
| 24 | △81 | 中年男子挤出来递袋子 | 6s | CHAR-006+CHAR-005+ENV-004 |
| 25 | △83 | 中年男子谄媚:仙人,土特产您瞧瞧 | 5s | CHAR-006 |
| 26 | △85 | 王执事掂量袋子·眉开眼笑 | 6s | CHAR-005 |
| 27 | △87 | 王执事:不错,一看就是修仙好料子! | 5s | CHAR-005 |
| 28 | △89 | **特写**指甲陷入掌心·诸葛风满脸屈辱 | 6s | CHAR-004 |
| 29 | △91 | 闪切一:父母倒在血泊中·欧阳员外鄙夷 | 4s | CHAR-007(模糊) |
| 30 | △93 | 诸葛风OS父母之仇不共戴天… | 4s | CHAR-004+VO |
| 31 | △95 | 闪切二:被暴打·被踩住脑袋 | 4s | (模糊处理) |
| 32 | △97 | 诸葛风OS可惜连炼气一层都没有达到… | 4s | CHAR-004+VO |
| 33 | △99 | 诸葛风看王执事得意捋胡子 | 5s | CHAR-004+CHAR-005 |
| 34 | △101 | 诸葛风OS必须赶快成为仙人报仇 | 5s | CHAR-004 |
| — | — | 1-3 天道宗席位处 | — | — |
| 35 | △107 | 诸葛风看到天道宗牌匾·眼神亮起 | 6s | CHAR-004+ENV-003+PROP-002 |
| 36 | △109 | 诸葛风硬着头皮:入宗真可以学仙法吗? | 6s | CHAR-004+CHAR-003 |
| 37 | △111 | 苏白微笑:当然!如假包换! | 5s | CHAR-003 |
| 38 | △113 | 诸葛风看基础银子三十两的牌子 | 5s | CHAR-004+PROP-003 |
| 39 | △115 | 诸葛风鼓起勇气:三十两月底再给行吗? | 6s | CHAR-004 |
| 40 | △117 | 苏白拍胸脯:当然可以!绝不拖欠! | 6s | CHAR-003 |
| 41 | △119 | 诸葛风愣住OS竟然同意了 | 4s | CHAR-004 |
| 42 | △121 | 苏白信誓旦旦:每个弟子月底三十两! | 6s | CHAR-003 |
| 43 | △123 | 闪电特效在诸葛风脑中劈开 | 4s | CHAR-004+特效 |
| 44 | △125 | 诸葛风震撼OS什么 | 4s | CHAR-004 |
> 共44镜 · 约230秒(3分50秒) · 剧本一字未删
> ⊢ 铸渊 ICE-GL-ZY001 · 苍耳审核 · D169

View File

@ -0,0 +1,122 @@
#!/usr/bin/env python3
"""第1集 1-1节 镜01~17 Seedance生成 · V3逐行完整版"""
import os, sys, json, time, subprocess
from pathlib import Path
ROOT = Path('D:/WorkBuddy/guanghulab/video-ai-system')
env = {}
for line in open(ROOT/".env"):
line = line.strip()
if not line or line.startswith("#"): continue
if "=" in line:
k, v = line.split("=", 1)
env[k.strip()] = v.strip()
AK = env["JIMENG_API_KEY"]
URL = env["JIMENG_BASE_URL"]
OUT = ROOT / "outputs/shots"
OUT.mkdir(parents=True, exist_ok=True)
S = "不良人硬核写实风格电影级厚重光影与CHAR-003苏白V3-R4同一风格体系"
SHOTS = [
# 镜01: 高空云海·御剑飞行·仙人驾鹤
(6, "中国修仙世界云海之上,极致大远景。洁白云层铺展如大海,灵气蒸腾。数名修仙者御剑飞行穿梭云间,浑身散发灵光拖出光尾。一位白须仙人驾仙鹤从云海掠过化作流光。远处仙山浮于云海之上。竖屏。"+S),
# 镜02: 俯瞰百宗会广场
(6, "修仙世界百宗会招生广场,远景俯瞰。巨大广场人山人海,各大宗门招生殿阵列排布,鎏金牌匾灵光法阵交相辉映。修仙服饰的宗门弟子在各处排队,人群熙攘热闹非凡。竖屏。"+S),
# 镜03: 特写天道宗破旧牌匾
(4, "修仙世界角落,特写一块悬挂在旧木杆上的破旧木牌匾。暗色风化木纹表面开裂,古朴天道宗三字斑驳磨损。麻绳粗粝悬挂,牌匾破旧感强烈。竖屏。"+S),
# 镜04: 苏白站在牌匾下双手叉腰
(6, "修仙世界天道宗角落招生点中景。18岁白衫青纱袍少年宗主苏白站在杆挂破旧天道宗牌匾下。半束黑发青色发带半侧身清冷从容双手叉腰自信笃定。身后简陋招生点一牌一桌一广告牌。竖屏。"+S),
# 镜05: 苏白喊话
(6, "修仙世界百宗会角落18岁白衫青纱袍少年宗主苏白中景。他双手叉腰面向画外自信大声喊话眼神坚定明亮。背景是简陋天道宗招生点杆挂牌匾。竖屏。"+S),
# 镜06: 广告牌特写
(5, "修仙世界天道宗招生点旁特写一块绳系A架粗麻画布广告牌。灵木杆捆扎成A形支架粗麻画布完整无字留白待书写。广告牌竖立在简陋摊位旁地面。竖屏。"+S),
# 镜07: 苏白喊话走过路过
(5, "修仙世界百宗会角落18岁白衫青纱袍少年宗主苏白近景。他继续朝人群方向挥手喊话笑容自信带一丝痞气。身后的招生点牌匾和广告牌清晰可见。竖屏。"+S),
# 镜08: 围观人群指指点点
(6, "修仙世界百宗会天道宗招生点前,中景群像。五六个人围了过来对着苏白和他的招生广告指指点点,有人交头接耳窃窃私语,有人摇头嗤笑。苏白站在人群中央仍保持自信。竖屏。"+S),
# 镜09: 龙套一
(5, "修仙世界百宗会,远景群像。围观人群中一个声音飘出嘲讽苏白寒酸宗门也敢称天下第一。画面保持多人远景不切单人近景,群杂氛围。竖屏。"+S),
# 镜10: 龙套二
(5, "修仙世界百宗会天道宗角落,远景群像。围观者中又一个声音质疑包吃包住入宗就给仙法太扯。围观人群继续指指点点。竖屏。"+S),
# 镜11: 龙套三
(5, "修仙世界百宗会角落,远景群像。围观人群中第三个声音讽刺灵霄宗仙盟五百强才三十两,这种破宗门想钱想疯。人群窃笑声起。竖屏。"+S),
# 镜12: 围观散去风吹落叶
(7, "修仙世界百宗会天道宗角落招生点中景。围观人群四散离去。一阵风吹起苏白脚下的枯黄落叶飘舞凄凉氛围。18岁白衫青纱袍少年宗主独自站在原地缓缓叹气看向远处。背影孤独但不绝望。竖屏。"+S),
# 镜13: 灵霄宗鎏金牌匾+排队
(7, "修仙世界百宗会黄金位置,中景。灵霄宗招生殿气派非凡,鎏金大牌匾灵光流转高悬殿顶。飞檐翘角三层楼阁,汉白玉台阶下排队修仙者蜿蜒如龙一眼望不到头。丝绸垂幔灵石法阵点缀其间。顶级宗门的恢弘排场。竖屏。"+S),
# 镜14: 苏白挠头苦恼
(6, "修仙世界天道宗角落招生点18岁白衫青纱袍少年宗主苏白中近景。他手扶额头挠头发一脸苦恼不解自言自语般嘟囔为什么自己同样的条件却没人来。身后简陋招生点与远处豪华灵霄宗殿形成对比。竖屏。"+S),
# 镜15: 系统查看面板
(4, "修仙世界天道宗角落18岁白衫青纱袍少年宗主苏白中景。他眼神专注看向虚空某处嘴唇微动在心中默念系统指令。表情从苦恼转为期待。竖屏。"+S),
# 镜16: 系统面板UI
(8, "修仙世界天道宗角落18岁白衫青纱袍少年宗主苏白中景。他凝神看着虚空中的一个发光系统面板(面板内容后期UI叠层呈现宗门名称等级人数领地资产积分为零的任务面板)。苏白认真阅读面板数据。竖屏。"+S),
# 镜17: 苏白叹息
(6, "修仙世界天道宗角落招生点18岁白衫青纱袍少年宗主苏白近景。他看完系统面板后长叹一口气脸上写满无奈。但眼底仍有不灭的笃定知道只要招到一个弟子就能开启仙法阁。画面定在苏白复杂而坚定的表情上。竖屏。"+S),
]
def submit(prompt, duration):
payload = {
"model": "doubao-seedance-2-0-260128",
"content": [{"type": "text", "text": prompt}],
"duration": duration,
"resolution": "720p"
}
r = subprocess.run(["curl", "-s", "-m", "60", "--noproxy", "*", "-X", "POST",
f"{URL}/contents/generations/tasks",
"-H", f"Authorization: Bearer {AK}", "-H", "Content-Type: application/json",
"-d", json.dumps(payload)], capture_output=True, text=True, timeout=70)
try:
return json.loads(r.stdout)
except:
return {}
def poll_dl(task_id, out_path, max_a=90):
for i in range(max_a):
time.sleep(10)
r = subprocess.run(["curl", "-s", "-m", "30", "--noproxy", "*",
f"{URL}/contents/generations/tasks/{task_id}",
"-H", f"Authorization: Bearer {AK}"],
capture_output=True, text=True, timeout=40)
try: data = json.loads(r.stdout)
except: continue
st = (data.get("status") or "").lower()
if i % 5 == 0: print(f" p{i+1}:{st}")
if st in ["succeeded","completed","done"]:
vurl = data.get("content",{}).get("video_url")
if vurl:
subprocess.run(["curl","-s","-m","300","-L","--noproxy","*","-o",str(out_path),vurl],
capture_output=True, timeout=310)
if out_path.exists() and out_path.stat().st_size>1024:
return True, out_path
return False, data
if st in ["failed","error"]: return False, data
return False, {}
results = []
for i, (dur, prompt) in enumerate(SHOTS):
sid = i + 1
print(f"\n{sid:02d} · {dur}s · 提交...")
resp = submit(prompt, dur)
tid = resp.get("id")
if not tid:
print(f" ❌ 无任务ID:{json.dumps(resp,ensure_ascii=False)[:200]}")
results.append({"shot":sid,"ok":False,"err":"no task"})
continue
print(f" task:{tid}")
dst = OUT / f"ep01-v3-shot{sid:02d}.mp4"
ok, _ = poll_dl(tid, dst)
if ok:
print(f"{dst.name} ({dst.stat().st_size//1024}KB)")
results.append({"shot":sid,"ok":True,"file":str(dst)})
else:
print(f" ❌ 失败")
results.append({"shot":sid,"ok":False})
time.sleep(5)
print(f"\n{'='*40}")
ok = sum(1 for r in results if r["ok"])
print(f" 完成: {ok}/{len(results)}")
for r in results:
print(f" {'' if r['ok'] else ''}{r['shot']:02d}")

View File

@ -0,0 +1,89 @@
#!/usr/bin/env python3
"""PROP-003 广告牌 V3 · 带完整招生文字 · 对齐苏白风格"""
import os, sys, json, time, subprocess
from pathlib import Path
ROOT = Path('D:/WorkBuddy/guanghulab/video-ai-system')
env = {}
for line in open(ROOT/".env"):
line = line.strip()
if not line or line.startswith("#"): continue
if "=" in line:
k, v = line.split("=", 1)
env[k.strip()] = v.strip()
AK = env["JIMENG_API_KEY"]
URL = env["JIMENG_BASE_URL"]
MODEL = "doubao-seedream-4-0-250828"
OUT = ROOT / "assets/candidates/D169-VA-05-001/PROP-003-FreeAdBoard/V3"
OUT.mkdir(parents=True, exist_ok=True)
P = """中国修仙世界百宗会天道宗招生点旁正面中景。一个古风绳系A架立式广告牌两根灵木杆顶部用麻绳捆扎成A形支架。
支架上撑开一幅粗麻布料画布画布上用古朴墨迹写着几行招生信息竖排:
天道宗
未来第一宗
名额一位
包吃包住
每月基础银子三十两
入宗即可学习仙法
粗麻画布微微皱起墨迹古朴有风化磨损感整体陈旧但字迹清晰可读
广告牌竖立在简陋天道宗摊位旁地面灵木桌铺淡青色粗布背景修仙百宗会一角仙雾缭绕
3D真人向写实渲染不良人硬核写实风格与CHAR-003苏白V3-R4PROP-002牌匾R8同一风格体系"""
N = """无文字的广告牌,空白画布,空白的布,没有任何字的牌子,留白的广告板,无字招牌。
新招牌干净整洁现代广告架金属广告牌LED灯箱霓虹灯易拉宝展架
石墙石板路砖墙红墙白墙现代城市街道
人物占主画面面孔特写人物半身像
卡通渲染塑料感游戏低模页游风光污染
暖黄阳光色调昏黄色调金色阳光
任何错误文字乱码无关文字拼音英文
文本排列混乱文字方向错误横排文字"""
VARIANTS = [
"正面A架广告牌天道宗+未来第一宗+名额一位+包吃包住+三十两+入宗学仙法六行墨字清晰朴拙灵木A架麻绳捆扎",
"微侧视角A架画布古朴墨迹招生信息完整可见背景百宗会修仙远景仙雾缭绕",
"正面中景广告牌主体,粗麻画布上六行招生信息竖排工整,字体古朴有风化磨损,摊位灵木桌旁",
"半侧面A架绳结清晰画布招生语句完整可读字体斑驳但内容齐全修仙百宗会氛围"
]
SEEDS = [222, 333, 444, 555]
def gen(prompt, neg, seed):
body = json.dumps({"model": MODEL, "prompt": prompt, "negative_prompt": neg, "size": "1440x2560", "n": 1, "seed": seed})
r = subprocess.run(["curl", "-s", "-m", "120", "--noproxy", "*", "-X", "POST", f"{URL}/images/generations",
"-H", f"Authorization: Bearer {AK}", "-H", "Content-Type: application/json", "-d", body],
capture_output=True, text=True, timeout=130)
try:
return json.loads(r.stdout)["data"][0].get("url")
except:
print(f" API err: {r.stdout[:300]}")
return None
def dl(url, dst):
Path(dst).parent.mkdir(parents=True, exist_ok=True)
subprocess.run(["curl", "-s", "-m", "120", "-L", "--noproxy", "*", "-o", dst, url], capture_output=True, timeout=130)
return os.path.exists(dst) and os.path.getsize(dst) > 1024
ts = time.strftime("%Y%m%d-%H%M%S")
results = []
for i, (seed, var) in enumerate(zip(SEEDS, VARIANTS)):
full = f"{P} {var}"
print(f"[{i+1}/4] seed={seed}", flush=True)
url = gen(full, N, seed)
if not url:
results.append({"c": i+1, "ok": False, "err": "api"})
continue
dst = OUT / f"PROP-003-V3-candidate-{i+1:02d}-1440x2560.png"
if not dl(url, str(dst)):
results.append({"c": i+1, "ok": False, "err": "dl"})
continue
results.append({"c": i+1, "ok": True, "raw": str(dst), "seed": seed})
print(f" -> {dst.name}")
time.sleep(3)
ok = sum(1 for r in results if r["ok"])
print(f"\n完成: {ok}/4")
json.dump({"spec": "VA-05-001-PROP-003-V3", "ts": ts, "change": "V2→V3: 加完整招生文字",
"ok": ok, "model": MODEL, "engine": "Seedream", "results": results},
open(OUT/"generation-meta.json","w",encoding="utf-8"), ensure_ascii=False, indent=2)

View File

@ -0,0 +1,125 @@
#!/usr/bin/env python3
"""第1集 镜02~09 Seedance批量生成 · 适配V3-R4不良人风格"""
import os, sys, json, time, subprocess
from pathlib import Path
ROOT = Path('D:/WorkBuddy/guanghulab/video-ai-system')
env = {}
for line in open(ROOT/".env"):
line = line.strip()
if not line or line.startswith("#"): continue
if "=" in line:
k, v = line.split("=", 1)
env[k.strip()] = v.strip()
AK = env["JIMENG_API_KEY"]
URL = env["JIMENG_BASE_URL"]
OUT = ROOT / "outputs/shots"
OUT.mkdir(parents=True, exist_ok=True)
STYLE = "不良人硬核写实风格厚重电影级光影画面质感与CHAR-003苏白V3-R4统一"
SHOTS = [
{ # 镜02
"id": 2, "dur": 4,
"p": "中国修仙世界百宗会招生广场,远景俯瞰。巨大广场上人山人海,各大宗门招生殿阵列排布,鎏金牌匾和灵光法阵交相辉映。穿修仙服饰的宗门弟子在各招生处前排起长队,人群熙熙攘攘热闹非凡。镜头固定俯拍微移。修仙世界大气磅礴,竖屏。" + STYLE
},
{ # 镜03
"id": 3, "dur": 5,
"p": "修仙世界角落破旧招生点从牌匾特写拉到中景。先特写一块悬挂在旧木杆上的破旧木牌匾——古朴天道宗三字风化斑驳。镜头缓慢后拉露出站在牌匾下的18岁修仙少年苏白——白衫青纱袍半束黑发半侧身淡然从容的少年宗主。他站在寒酸招生点前一牌一桌一广告牌就是全部家当。角落冷清远处模糊可见其他豪华招生殿。" + STYLE
},
{ # 镜04
"id": 4, "dur": 5,
"p": "修仙世界天道宗招生点前中景平视。18岁白衫青纱袍少年宗主苏白站在破旧摊位旁旁边竖立着A架粗麻广告牌。周围聚集了五六个人对他指指点点有人面露嘲讽之色交头接耳。苏白双手叉腰自信喊话不惧嘲笑。修仙百宗会角落场景广告牌无文字留白。固定机位轻微呼吸感。" + STYLE
},
{ # 镜05
"id": 5, "dur": 5,
"p": "修仙世界天道宗角落招生点中景拉近。围观者散去了一阵风吹起苏白脚下落叶白衫青纱袍的18岁少年宗主独自叹气手扶额头看向远处灵霄宗豪华招生殿的方向。远处鎏金牌匾模糊可见。氛围孤独清冷但不绝望。镜头从固定机位缓慢推到苏白面部近景。" + STYLE
},
{ # 镜06
"id": 6, "dur": 5,
"p": "修仙世界灵霄宗招生殿前中景平视。蓝色执事袍银色灵纹的中年王执事正襟危坐紫檀案台后手执朱砂灵笔在鉴定卷轴上画下一个红色叉号。他面容冷漠不屑对面站着18岁粗麻布衣的清瘦少年诸葛风——剑眉星目苍白肤色面露不可置信双手攥拳指甲掐入掌心。灵霄宗鎏金牌匾高悬上方背景排队修仙者如龙。固定机位双角色对比冲突。" + STYLE
},
{ # 镜07
"id": 7, "dur": 4,
"p": "修仙世界灵霄宗招生殿前,中景俯视。一个灰色素袍的普通中年男子从人群中挤出,微躬身双手捧布包袱递给王执事。蓝袍执事掂了掂袋子伸手一摸,表情从冷漠变成眉开眼笑。谄媚送礼与势利变脸的反差画面。" + STYLE
},
{ # 镜08
"id": 8, "dur": 4,
"p": "粗麻布衣少年诸葛风特写,他的指甲深深陷入掌心留下旧疤痕,满脸屈辱嘴角紧抿。画面开始快速闪切模糊处理——闪切一:两位老人倒在血泊中,暗紫锦缎金丝绣边的华贵员外俯视鄙夷。闪切二:少年被踩住脑袋。闪切回到诸葛风面部,他的眼底开始燃烧仇恨火焰。情绪爆发,闪切做模糊化。" + STYLE
},
{ # 镜09
"id": 9, "dur": 5,
"p": "修仙世界天道宗角落招生点,中景跟拍转固定。粗麻布衣的清瘦少年诸葛风穿过人群走来,他的眼睛忽然亮起——看到了天道宗破旧牌匾和广告牌上的信息。他走到摊位前鼓起勇气询问,白衫青纱袍的少年宗主苏白微笑回应,拍拍胸脯自信承诺。最后苏白手搭诸葛风肩膀,定格在信任建立的一刻。两人站在杆挂牌匾下的简陋招生点前。" + STYLE
}
]
def submit(prompt, duration):
payload = {
"model": "doubao-seedance-2-0-260128",
"content": [{"type": "text", "text": prompt}],
"duration": duration,
"resolution": "720p"
}
r = subprocess.run(["curl", "-s", "-m", "60", "--noproxy", "*", "-X", "POST",
f"{URL}/contents/generations/tasks",
"-H", f"Authorization: Bearer {AK}", "-H", "Content-Type: application/json",
"-d", json.dumps(payload)], capture_output=True, text=True, timeout=70)
try:
return json.loads(r.stdout)
except:
return {}
def poll_dl(task_id, out_path, max_attempts=90):
for i in range(max_attempts):
time.sleep(10)
r = subprocess.run(["curl", "-s", "-m", "30", "--noproxy", "*",
f"{URL}/contents/generations/tasks/{task_id}"],
capture_output=True, text=True, timeout=40,
env={**os.environ, "Authorization": f"Bearer {AK}"})
try:
data = json.loads(r.stdout)
except:
continue
st = (data.get("status") or "").lower()
if i % 5 == 0:
print(f" poll {i+1}: {st}")
if st in ["succeeded", "completed", "done"]:
vurl = data.get("content",{}).get("video_url")
if vurl:
subprocess.run(["curl", "-s", "-m", "300", "-L", "--noproxy", "*", "-o", str(out_path), vurl],
capture_output=True, timeout=310)
if out_path.exists() and out_path.stat().st_size > 1024:
return True, out_path
return False, data
if st in ["failed", "error"]:
return False, data
return False, {}
results = []
for shot in SHOTS:
sid = shot["id"]
dur = shot["dur"]
print(f"\n{sid:02d} · {dur}秒 · 提交中...")
resp = submit(shot["p"], dur)
task_id = resp.get("id")
if not task_id:
print(f" ❌ 无任务ID")
results.append({"shot": sid, "ok": False})
continue
print(f" task: {task_id}")
dst = OUT / f"ep01-shot{sid:02d}.mp4"
ok, _ = poll_dl(task_id, dst)
if ok:
print(f"{dst.name} ({dst.stat().st_size//1024}KB)")
results.append({"shot": sid, "ok": True, "file": str(dst)})
else:
print(f" ❌ 失败")
results.append({"shot": sid, "ok": False})
time.sleep(5)
print(f"\n{'='*40}")
for r in results:
st = "" if r["ok"] else ""
print(f" {st}{r['shot']:02d}")
print(f"{'='*40}")