{title}
{aid}
{identity_html}{kind} · {status}
{note_html}查看完整提示词"""生成本地双版本导航与真人素材审看页,不依赖网络。"""
import csv
import html
import io
import json
from pathlib import Path
ROOT=Path(__file__).resolve().parent.parent
LIVE=ROOT/'08_真人AI短剧'
assets=json.loads((LIVE/'02_资产/全部资产任务.json').read_text(encoding='utf8'))
receipts={}
notes_path=LIVE/'05_检查与交付/图像审看提示.json'
notes=json.loads(notes_path.read_text(encoding='utf8')) if notes_path.exists() else {}
for p in (LIVE/'02_资产/生成回执').glob('*.json'):
r=json.loads(p.read_text(encoding='utf8'));receipts[r['id']]=r
cards=[];rows=[]
for a in assets:
r=receipts.get(a['id']);exists=bool(r and (LIVE/r['path']).is_file())
status='REVIEW' if exists else '待生成'
kind='角色' if a['kind']=='character' else '场景'
picpath=r['path'] if exists else ''
note=notes.get(a['id'],'')
row={'资产ID':a['id'],'名称':a['name'],'类别':kind,'状态':status,'图片':picpath, '提示词':'04_生成与后期/逐项出图提示词/'+a['id']+'.txt','原生尺寸':'×'.join(map(str,r['size'])) if exists and r.get('size') else '', '身份':a.get('identity',''),'审看提示':note,'角色批准':'未批准','动作验证':'未测试'}
rows.append(row)
title=html.escape(a['name']);aid=html.escape(a['id'])
picture=f'' if exists else '
{html.escape(note)}
' if note else '' identity_html=f'{html.escape(a.get("identity",""))}
' if a.get('identity') else '' cards.append(f'{aid}
{identity_html}{kind} · {status}
{note_html}查看完整提示词COUNT · 每项可查看原图与实际出图提示词。REVIEW表示已出候选,尚未作者批准或动作验证。