#!/usr/bin/env python3 """CHAR-004 R5 · 剧本锚定版 · 18岁淳朴粗麻白衣 · 纯文生图""" import sys,os,json,time,subprocess from pathlib import Path sys.path.insert(0,os.path.dirname(__file__)) from secrets_loader import secret,endpoint AK=secret("SC-001");URL=endpoint("EPT-001");M="doubao-seedream-4-0-250828" ROOT=Path(__file__).resolve().parents[1];J=Path("/Volumes/JZAO/铸渊-ICE-GL-ZY001/OUT-输出/图片/zai-fu-fei-xiu-xian/ep01") CD=ROOT/"assets/candidates/D157-VA-05-001-R5"/"CHAR-004-ZhugeFeng" P="""3D动漫卡通渲染,国风玄幻动态漫质感,单人男性全身立绘,纯白背景。 角色为18岁少年,身形挺拔偏瘦,小麦色肤色,面部轮廓利落,剑眉星目,眼神澄澈有韧劲,气质淳朴端正。 黑色短发,半束高马尾,用普通深棕色木簪固定,额前有少量碎发,发型整洁。 身穿素色粗麻交领上衣,袖口收窄,内搭浅色中衣,布料平整干净,无破损、无补丁、无污渍。腰间系深棕色粗麻绳腰带,系法简洁。 下装为同色系粗麻长裤,裤脚收进黑色短靴里,靴面整洁。 腰间挂一个深灰色布囊,形制简单,完整无破损。 人物比例协调,线条清晰,光影柔和,整体为干净整洁的修仙少年形象。""" N="""乞丐,流民,流浪汉,破旧衣服,破洞,补丁,污渍,泥点,脏鞋,破烂袖口,毛边,褪色,磨损,衣衫褴褛,寒酸感,佝偻,颓废,萎靡,肮脏凌乱。 与苏白长相相似,同款五官,同款脸型,真人写实,照片,畸形肢体,五官崩坏,模糊,水印,多余装饰,玉佩,首饰,华丽服饰。""" V=["正面直视镜头,表情端正沉稳","微微侧身站姿,目光澄澈看向前方","略微仰视,下颌抬起,眼神向上有期待","3/4侧脸,侧视左前方,少年英气淳朴"] S=[42,137,256,399] def g(prompt,neg,seed): url=f"{URL}/images/generations" r=subprocess.run(["curl","-s","-m","120","--noproxy","*","-X","POST",url, "-H",f"Authorization: Bearer {AK}","-H","Content-Type: application/json", "-d",json.dumps({"model":M,"prompt":prompt,"negative_prompt":neg,"size":"1440x2560","n":1,"seed":seed})], capture_output=True,text=True,timeout=130) try:d=json.loads(r.stdout);return d["data"][0].get("url") except:return None def d(url,dst): Path(dst).parent.mkdir(parents=True,exist_ok=True) subprocess.run(["curl","-s","-m","60","-L","--noproxy","*","-o",dst,url],capture_output=True,timeout=65) return os.path.exists(dst) and os.path.getsize(dst)>1024 def main(): print("CHAR-004 R5 · 剧本锚定 · 18岁淳朴粗麻白衣") if not AK: sys.exit("✗ no key") ts=time.strftime("%Y%m%d-%H%M%S");rd=J/"D157-R5"/ts;rd.mkdir(parents=True,exist_ok=True) CD.mkdir(parents=True,exist_ok=True);rs=[] for i,(seed,var) in enumerate(zip(S,V)): full=f"{P} {var}";print(f"[{i+1}/4] seed={seed}",flush=True) url=g(full,N,seed) if not url:rs.append({"c":i+1,"ok":False,"err":"api"});continue raw=rd/f"CHAR-004-R5-{i+1:02d}-1440x2560.jpg" if not d(url,raw):rs.append({"c":i+1,"ok":False,"err":"dl"});continue sc=CD/f"CHAR-004-R5-candidate-{i+1:02d}-1080x1920.jpg" subprocess.run(["sips","-z","1920","1080",str(raw),"--out",str(sc)],capture_output=True) rs.append({"c":i+1,"ok":True,"raw":str(raw),"scaled":str(sc),"seed":seed});time.sleep(2) ok=sum(1 for r in rs if r["ok"]);print(f"完成:{ok}/4") with open(CD/"generation-meta.json","w") as f:json.dump({"spec":"VA-05-001-R5","ts":ts,"ok":ok,"results":rs},f,ensure_ascii=False,indent=2) return 0 if ok>=4 else 1 if __name__=="__main__":sys.exit(main())