Files
chat/backend/public/assets/ShortDramaView-NKkZzpXF.js
2026-08-05 15:56:08 +08:00

62 lines
30 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{q as I,_ as et,o as tt,B as at,p as k,c as n,d as t,b as u,i as ue,z,e as d,f as p,t as o,w as we,g as M,v as X,I as Ce,h,Q as S,R as st,F as w,y as j,C as Me,r as g,H as Ie,j as lt,A as de,m as l,M as ze,E as je}from"./index-CTF1v35B.js";import{I as $e,T as Ue}from"./ThemeToggle-BwEr7zqG.js";import{c as F,b as nt,I as ot,a as it}from"./IconMovie-Do5w9adN.js";/**
* @license @tabler/icons-vue v3.45.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/var rt=I("outline","arrow-up-right","ArrowUpRight",[["path",{d:"M17 7l-10 10",key:"svg-0"}],["path",{d:"M8 7l9 0l0 9",key:"svg-1"}]]);/**
* @license @tabler/icons-vue v3.45.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/var ut=I("outline","bolt","Bolt",[["path",{d:"M13 3l0 7l6 0l-8 11l0 -7l-6 0l8 -11",key:"svg-0"}]]);/**
* @license @tabler/icons-vue v3.45.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/var xe=I("outline","chevron-left","ChevronLeft",[["path",{d:"M15 6l-6 6l6 6",key:"svg-0"}]]);/**
* @license @tabler/icons-vue v3.45.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/var ce=I("outline","lock","Lock",[["path",{d:"M5 13a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-6",key:"svg-0"}],["path",{d:"M11 16a1 1 0 1 0 2 0a1 1 0 0 0 -2 0",key:"svg-1"}],["path",{d:"M8 11v-4a4 4 0 1 1 8 0v4",key:"svg-2"}]]);/**
* @license @tabler/icons-vue v3.45.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/var dt=I("outline","message","Message",[["path",{d:"M8 9h8",key:"svg-0"}],["path",{d:"M8 13h6",key:"svg-1"}],["path",{d:"M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12",key:"svg-2"}]]);/**
* @license @tabler/icons-vue v3.45.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/var ct=I("outline","photo-plus","PhotoPlus",[["path",{d:"M15 8h.01",key:"svg-0"}],["path",{d:"M12.5 21h-6.5a3 3 0 0 1 -3 -3v-12a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v6.5",key:"svg-1"}],["path",{d:"M3 16l5 -5c.928 -.893 2.072 -.893 3 0l4 4",key:"svg-2"}],["path",{d:"M14 14l1 -1c.67 -.644 1.45 -.824 2.182 -.54",key:"svg-3"}],["path",{d:"M16 19h6",key:"svg-4"}],["path",{d:"M19 16v6",key:"svg-5"}]]);/**
* @license @tabler/icons-vue v3.45.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/var Pe=I("outline","player-play","PlayerPlay",[["path",{d:"M7 4v16l13 -8l-13 -8",key:"svg-0"}]]);/**
* @license @tabler/icons-vue v3.45.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/var pt=I("outline","refresh","Refresh",[["path",{d:"M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4",key:"svg-0"}],["path",{d:"M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4",key:"svg-1"}]]);/**
* @license @tabler/icons-vue v3.45.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/var vt=I("outline","user-check","UserCheck",[["path",{d:"M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0",key:"svg-0"}],["path",{d:"M6 21v-2a4 4 0 0 1 4 -4h4",key:"svg-1"}],["path",{d:"M15 19l2 2l4 -4",key:"svg-2"}]]);/**
* @license @tabler/icons-vue v3.45.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/var Y=I("outline","user-plus","UserPlus",[["path",{d:"M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0",key:"svg-0"}],["path",{d:"M16 19h6",key:"svg-1"}],["path",{d:"M19 16v6",key:"svg-2"}],["path",{d:"M6 21v-2a4 4 0 0 1 4 -4h4",key:"svg-3"}]]);/**
* @license @tabler/icons-vue v3.45.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/var Se=I("outline","users","Users",[["path",{d:"M5 7a4 4 0 1 0 8 0a4 4 0 1 0 -8 0",key:"svg-0"}],["path",{d:"M3 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2",key:"svg-1"}],["path",{d:"M16 3.13a4 4 0 0 1 0 7.75",key:"svg-2"}],["path",{d:"M21 21v-2a4 4 0 0 0 -3 -3.85",key:"svg-3"}]]);/**
* @license @tabler/icons-vue v3.45.0 - MIT
*
* This source code is licensed under the MIT license.
* See the LICENSE file in the root directory of this source tree.
*/var gt=I("outline","wand","Wand",[["path",{d:"M6 21l15 -15l-3 -3l-15 15l3 3",key:"svg-0"}],["path",{d:"M15 6l3 3",key:"svg-1"}],["path",{d:"M9 3a2 2 0 0 0 2 2a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2a2 2 0 0 0 2 -2",key:"svg-2"}],["path",{d:"M19 13a2 2 0 0 0 2 2a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2a2 2 0 0 0 2 -2",key:"svg-3"}]]);const yt={class:"drama-app"},mt={class:"drama-sidebar"},ft={class:"brand-mark"},_t={class:"side-nav","aria-label":"短剧工坊导航"},ht={class:"nav-count"},bt={class:"side-tip"},kt={class:"side-bottom"},wt={class:"drama-main"},Ct={class:"mobile-header"},Mt={key:0,class:"center-state"},It={key:1,class:"create-page"},zt={key:0,class:"pending-character"},jt=["src"],$t={class:"composer-actions"},Ut={class:"attach-actions"},xt=["title"],Pt={class:"simple-settings"},St=["value"],At=["value"],Tt=["value"],Vt=["value"],Rt=["value"],Lt=["disabled"],Nt={key:0,class:"button-spinner"},Ot={class:"template-heading"},Ft={class:"template-grid"},qt=["onClick"],Dt={class:"template-icon"},Bt={key:2,class:"library-page"},Et={class:"page-title-row"},Ht={key:0,class:"empty-card"},Wt={key:1,class:"project-grid"},Gt=["onClick"],Jt={class:"project-info"},Qt={key:0,class:"mini-progress"},Xt={key:3,class:"library-page"},Yt={class:"page-title-row"},Kt={key:0,class:"empty-card"},Zt={key:1,class:"asset-grid"},ea=["onClick"],ta=["src","alt"],aa={key:1,class:"asset-placeholder"},sa={key:4,class:"project-detail"},la={class:"detail-toolbar"},na={class:"detail-toolbar-actions"},oa=["disabled"],ia={class:"project-hero"},ra={class:"project-meta"},ua={class:"episode-header"},da={class:"episode-progress"},ca=["src"],pa={class:"workflow-steps"},va={class:"done"},ga={class:"done"},ya={class:"section-row"},ma=["src"],fa={class:"character-fields"},_a=["disabled"],ha={class:"character-list"},ba=["src","alt"],ka={key:1,class:"asset-placeholder"},wa=["onClick"],Ca={class:"section-row shots-heading"},Ma=["disabled","onClick"],Ia={class:"shot-grid"},za=["src"],ja={key:1},$a={key:0,class:"shot-loader"},Ua={class:"shot-info"},xa={class:"shot-dialogue"},Pa={key:0,class:"shot-analysis"},Sa={key:1,class:"shot-analysis source"},Aa={key:2,class:"shot-analysis"},Ta={key:3,class:"shot-analysis continuity"},Va={key:4,class:"shot-analysis sound"},Ra={key:5,class:"shot-analysis screen"},La={key:6,class:"shot-error"},Na={key:7,class:"shot-actions"},Oa=["onClick"],Fa=["onClick"],qa=["onClick"],Da={__name:"ShortDramaView",setup(Ba){const K=g(!0),T=g(!1),q=g(!1),D=g(!1),V=g(!1),C=g("create"),A=g([]),Z=g([{value:"zh-CN",label:"普通话(推荐)"}]),ee=g([{value:!0,label:"显示字幕"},{value:!1,label:"关闭字幕"}]),te=g([{value:"east_asian",label:"东方面孔(东亚)"},{value:"global",label:"全球面孔(国家不限)"}]),ae=g([{value:"zh-CN",label:"简体中文"},{value:"en-US",label:"English(英文)"},{value:"none",label:"不显示画面文字"}]),se=g([{value:"auto",label:"AI 智能 · 5/10 秒(推荐)"},{value:"5",label:"每镜 5 秒 · 节奏更快"},{value:"10",label:"每镜 10 秒 · 表演更完整"}]),le=g({}),ne=g(0),$=g([]),r=g(null),B=g(""),pe=g(!1),E=g("正在准备…"),ve=g(null),ge=g(null),ye=g(null),x=g(null),H=g("主角"),R=g(!1);let W=null;const v=Ie({idea:"",aspect_ratio:"9:16",duration:"auto",voice_language:"zh-CN",show_subtitles:!0,character_origin:"east_asian",screen_text_language:"zh-CN",shot_duration_mode:"auto",quality:"fast",style:"电影写实"}),m=Ie({name:"",description:"",file:null,preview:""}),Ae=de(()=>A.value.length<=5?A.value:Array.from({length:5},(s,e)=>A.value[(ne.value+e)%A.value.length])),me=de(()=>{const s=[];for(const e of $.value)for(const c of e.characters||[])s.push({...c,projectId:e.id});return s}),Te=de(()=>{var e;const s=Number(((e=le.value.worker_pool)==null?void 0:e.effective_concurrency)||0);return s>1?`${s} 个独立节点并发`:"单节点安全队列"});tt(Ve),at(()=>{var s;P(),L((s=x.value)==null?void 0:s.preview),L(m.preview)});async function Ve(){var s,e,c,f,a,_,i,U,N;K.value=!0;try{const b=(await k.get("/short-drama/bootstrap")).data.data||{};A.value=b.templates||[],Z.value=b.voice_languages||Z.value,ee.value=b.subtitle_options||ee.value,te.value=b.character_origins||te.value,ae.value=b.screen_text_languages||ae.value,se.value=b.shot_duration_modes||se.value,le.value=b.engine||{},$.value=b.projects||[],Object.assign(v,{aspect_ratio:((s=b.defaults)==null?void 0:s.aspect_ratio)||"9:16",duration:((e=b.defaults)==null?void 0:e.duration)||"auto",voice_language:((c=b.defaults)==null?void 0:c.voice_language)||"zh-CN",show_subtitles:((f=b.defaults)==null?void 0:f.show_subtitles)??!0,character_origin:((a=b.defaults)==null?void 0:a.character_origin)||"east_asian",screen_text_language:((_=b.defaults)==null?void 0:_.screen_text_language)||"zh-CN",shot_duration_mode:((i=b.defaults)==null?void 0:i.shot_duration_mode)||"auto",quality:((U=b.defaults)==null?void 0:U.quality)||"fast",style:((N=b.defaults)==null?void 0:N.style)||"电影写实"})}catch(O){y(O.message||"短剧工坊加载失败",!0)}finally{K.value=!1}}async function Re(){var s,e,c;if(!(T.value||v.idea.length<5)){T.value=!0,E.value="AI 正在建立场景状态表并精细拆镜…";try{let a=(await k.post("/short-drama/projects",{...v,auto_generate:!1},{timeout:18e4})).data.data;if(E.value="正在锁定角色…",(s=x.value)!=null&&s.file){const i=await he(x.value.file);await k.post(`/short-drama/projects/${a.id}/characters`,{name:H.value||"主角",reference_upload_id:i.id,description:""}),a=(await k.get(`/short-drama/projects/${a.id}`)).data.data}E.value="正在提交镜头…",await k.post(`/short-drama/projects/${a.id}/generate`,{episode_id:(c=(e=a.episodes)==null?void 0:e[0])==null?void 0:c.id});const _=await k.get(`/short-drama/projects/${a.id}`);r.value=_.data.data,C.value="projects",re(),v.idea="",y("短剧已开始生成:独立节点自动并发,同一节点安全排队"),J(),await G()}catch(f){y(Q(f.message),!0)}finally{T.value=!1}}}async function fe(s){var e,c;try{const f=await k.get(`/short-drama/projects/${s}`);r.value=f.data.data,(c=(e=r.value)==null?void 0:e.episodes)!=null&&c.some(a=>a.status==="generating")&&J()}catch(f){y(f.message||"项目加载失败",!0)}}function Le(){P(),r.value=null,C.value="projects",G()}function oe(){P(),r.value=null,C.value="create"}function Ne(){r.value=null,C.value="projects",P(),G()}async function Oe(){r.value=null,C.value="assets",P(),await Fe()}async function Fe(){const s=[];for(const e of $.value){if(e.characters){s.push(e);continue}try{const c=await k.get(`/short-drama/projects/${e.id}`);s.push({...e,characters:c.data.data.characters||[]})}catch{s.push(e)}}$.value=s}async function G(){try{const s=await k.get("/short-drama/projects");$.value=s.data.data||[]}catch{}}async function _e(){var s,e,c;if((s=r.value)!=null&&s.id)try{const f=await k.get(`/short-drama/projects/${r.value.id}/status`);r.value=f.data.data,(c=(e=r.value)==null?void 0:e.episodes)!=null&&c.some(a=>a.status==="generating")||(P(),await G())}catch(f){y(f.message||"任务状态更新失败",!0)}}function J(){P(),_e(),W=window.setInterval(_e,8e3)}function P(){W&&window.clearInterval(W),W=null}async function qe(s){q.value=!0;try{await k.post(`/short-drama/projects/${r.value.id}/generate`,{episode_id:s}),y("任务已提交,系统会按可用独立节点自动调度"),J()}catch(e){y(Q(e.message),!0)}finally{q.value=!1}}async function De(){const s=r.value;if(!(!(s!=null&&s.id)||V.value)&&window.confirm(`确定删除“${s.title}”吗?项目、分镜和已生成视频都会永久删除。`)){V.value=!0;try{await k.delete(`/short-drama/projects/${s.id}`),P(),$.value=$.value.filter(e=>e.id!==s.id),r.value=null,C.value="projects",y("短剧和生成的视频已删除")}catch(e){y(e.message||"短剧删除失败",!0)}finally{V.value=!1}}}async function ie(s,e){try{await k.post(`/short-drama/projects/${r.value.id}/shots/${s.id}/retry`,{reason:e}),y(e==="identity"?"正在增强角色一致性并重做镜头":"镜头已重新提交"),J()}catch(c){y(Q(c.message),!0)}}async function Be(){if(!(!m.file||!m.name)){D.value=!0;try{const s=await he(m.file);await k.post(`/short-drama/projects/${r.value.id}/characters`,{name:m.name,description:m.description,reference_upload_id:s.id});const e=await k.get(`/short-drama/projects/${r.value.id}`);r.value=e.data.data,Je(),R.value=!1,y("角色已锁定,后续镜头会自动保持一致")}catch(s){y(s.message||"角色添加失败",!0)}finally{D.value=!1}}}async function Ee(s){try{await k.delete(`/short-drama/projects/${r.value.id}/characters/${s.id}`),r.value.characters=r.value.characters.filter(e=>e.id!==s.id),y("角色已移除")}catch(e){y(e.message||"角色移除失败",!0)}}async function he(s){const e=new FormData;return e.append("file",s),(await k.post("/upload",e,{headers:{"Content-Type":"multipart/form-data"}})).data.data}function He(s){var c;const e=(c=s.target.files)==null?void 0:c[0];s.target.value="",e&&(re(),x.value={file:e,preview:URL.createObjectURL(e)})}function We(s){var c;const e=(c=s.target.files)==null?void 0:c[0];s.target.value="",e&&(L(m.preview),m.file=e,m.preview=URL.createObjectURL(e))}async function Ge(s){var c;const e=(c=s.target.files)==null?void 0:c[0];if(s.target.value="",!!e)try{const f=await e.text();v.idea=f.slice(0,5e4),f.length>5e4&&y("文章已截取前 50000 字进行规划"),y(`已导入剧本“${e.name}”`)}catch{y("剧本读取失败,请复制文字后重试",!0)}}function re(){var s;L((s=x.value)==null?void 0:s.preview),x.value=null,H.value="主角"}function Je(){L(m.preview),Object.assign(m,{name:"",description:"",file:null,preview:""})}function L(s){s!=null&&s.startsWith("blob:")&&URL.revokeObjectURL(s)}function Qe(s){v.idea=s.prompt,window.requestAnimationFrame(()=>{var e;return(e=document.querySelector(".idea-composer textarea"))==null?void 0:e.focus()})}function Xe(){ne.value=A.value.length?(ne.value+2)%A.value.length:0}function y(s,e=!1){B.value=s,pe.value=e,window.clearTimeout(y.timer),y.timer=window.setTimeout(()=>{B.value=""},5e3)}function be(s){return{draft:"草稿",storyboard:"分镜完成",generating:"生成中",completed:"已完成",needs_attention:"需要处理"}[s]||"准备中"}function ke(s){return{generating:"running",completed:"success",needs_attention:"warning"}[s]||""}function Ye(s){return{fast:"快速草稿",standard:"标准成片",high:"高清优先"}[s]||"自动"}function Ke(s){const e=String(s||"").replace(/<Picture \d+>/g,"固定角色").replace(/\s+/g," ");return e.length>92?`${e.slice(0,92)}…`:e}function Ze(s){return String(s||"").replace(/^[^:]{1,16}[:]/,"")}function Q(s){const e=String(s||"");return/ComfyUI|H3|工作流|节点|SaveVideo/i.test(e)?"视频生成服务暂时繁忙,请稍后重试":e||"操作失败,请稍后重试"}return(s,e)=>{var f;const c=lt("router-link");return l(),n("div",yt,[t("aside",mt,[u(c,{to:"/",class:"brand-link","aria-label":"返回 AI 对话"},{default:ue(()=>[t("span",ft,[u(d($e),{size:18})]),e[18]||(e[18]=t("span",null,[t("strong",null,"短剧工坊"),t("small",null,"MiniMax H3")],-1))]),_:1}),t("nav",_t,[t("button",{class:z({active:C.value==="create"}),onClick:e[0]||(e[0]=a=>C.value="create")},[u(d(gt),{size:18}),e[19]||(e[19]=p(" 开始创作 ",-1))],2),t("button",{class:z({active:C.value==="projects"}),onClick:Ne},[u(d(F),{size:18}),e[20]||(e[20]=p(" 我的短剧 ",-1)),t("span",ht,o($.value.length),1)],2),t("button",{class:z({active:C.value==="assets"}),onClick:Oe},[u(d(Se),{size:18}),e[21]||(e[21]=p(" 角色资产 ",-1))],2)]),t("div",bt,[u(d(ce),{size:17}),e[22]||(e[22]=t("div",null,[t("strong",null,"角色自动锁定"),t("p",null,"同一项目的角色会跨镜头保持一致。")],-1))]),t("div",kt,[u(Ue),u(c,{to:"/",class:"back-chat"},{default:ue(()=>[u(d(dt),{size:17}),e[23]||(e[23]=p("返回对话",-1))]),_:1})])]),t("main",wt,[t("header",Ct,[u(c,{to:"/",class:"mobile-brand"},{default:ue(()=>[u(d(xe),{size:19}),e[24]||(e[24]=p("短剧工坊",-1))]),_:1}),u(Ue)]),K.value?(l(),n("div",Mt,[...e[25]||(e[25]=[t("span",{class:"loading-ring"},null,-1),t("p",null,"正在准备短剧工坊…",-1)])])):C.value==="create"&&!r.value?(l(),n("section",It,[e[43]||(e[43]=t("div",{class:"hero-copy"},[t("span",{class:"eyebrow"},[t("i"),p(" AI SHORT DRAMA STUDIO")]),t("h1",null,"说出故事,直接生成短剧"),t("p",null,"一句话、一个剧本或一张角色图,剩下的交给自动模式。")],-1)),t("form",{class:"idea-composer",onSubmit:we(Re,["prevent"])},[M(t("textarea",{"onUpdate:modelValue":e[1]||(e[1]=a=>v.idea=a),rows:"6",maxlength:"50000",placeholder:"粘贴一句创意、完整小说或剧本。AI 会自动识别人物对白、旁白、屏幕文字与场景声音……"},null,512),[[X,v.idea,void 0,{trim:!0}]]),x.value?(l(),n("div",zt,[t("img",{src:x.value.preview,alt:"角色参考图预览"},null,8,jt),t("div",null,[e[26]||(e[26]=t("span",null,"已添加固定角色",-1)),M(t("input",{"onUpdate:modelValue":e[2]||(e[2]=a=>H.value=a),maxlength:"80",placeholder:"角色名称,例如:林晚晚"},null,512),[[X,H.value,void 0,{trim:!0}]])]),t("button",{type:"button","aria-label":"移除参考图",onClick:re},[u(d(Ce),{size:17})])])):h("",!0),t("div",$t,[t("div",Ut,[t("input",{ref_key:"characterFileInput",ref:ve,hidden:"",type:"file",accept:"image/png,image/jpeg,image/webp",onChange:He},null,544),t("input",{ref_key:"scriptFileInput",ref:ge,hidden:"",type:"file",accept:".txt,.md,text/plain,text/markdown",onChange:Ge},null,544),t("button",{type:"button",onClick:e[3]||(e[3]=a=>{var _;return(_=ve.value)==null?void 0:_.click()})},[u(d(Y),{size:17}),e[27]||(e[27]=p("添加角色",-1))]),t("button",{type:"button",onClick:e[4]||(e[4]=a=>{var _;return(_=ge.value)==null?void 0:_.click()})},[u(d(nt),{size:17}),e[28]||(e[28]=p("导入剧本",-1))])]),t("span",{class:"auto-badge",title:(f=le.value.worker_pool)==null?void 0:f.message},[u(d(ut),{size:15}),p(o(Te.value),1)],8,xt)]),t("div",Pt,[t("label",null,[e[30]||(e[30]=t("span",null,"画幅",-1)),M(t("select",{"onUpdate:modelValue":e[5]||(e[5]=a=>v.aspect_ratio=a)},[...e[29]||(e[29]=[t("option",{value:"9:16"},"竖屏 9:16",-1),t("option",{value:"16:9"},"横屏 16:9",-1)])],512),[[S,v.aspect_ratio]])]),t("label",null,[e[32]||(e[32]=t("span",null,"时长",-1)),M(t("select",{"onUpdate:modelValue":e[6]||(e[6]=a=>v.duration=a)},[...e[31]||(e[31]=[st('<option value="auto" data-v-417f82d6>Auto · AI 自适应(时长不封顶)</option><option value="5" data-v-417f82d6>5 秒</option><option value="10" data-v-417f82d6>10 秒</option><option value="30" data-v-417f82d6>30 秒</option><option value="60" data-v-417f82d6>60 秒</option><option value="90" data-v-417f82d6>90 秒</option>',6)])],512),[[S,v.duration]])]),t("label",null,[e[33]||(e[33]=t("span",null,"单镜时长",-1)),M(t("select",{"onUpdate:modelValue":e[7]||(e[7]=a=>v.shot_duration_mode=a)},[(l(!0),n(w,null,j(se.value,a=>(l(),n("option",{key:a.value,value:a.value},o(a.label),9,St))),128))],512),[[S,v.shot_duration_mode]])]),t("label",null,[e[34]||(e[34]=t("span",null,"配音语言",-1)),M(t("select",{"onUpdate:modelValue":e[8]||(e[8]=a=>v.voice_language=a)},[(l(!0),n(w,null,j(Z.value,a=>(l(),n("option",{key:a.value,value:a.value},o(a.label),9,At))),128))],512),[[S,v.voice_language]])]),t("label",null,[e[35]||(e[35]=t("span",null,"字幕",-1)),M(t("select",{"onUpdate:modelValue":e[9]||(e[9]=a=>v.show_subtitles=a)},[(l(!0),n(w,null,j(ee.value,a=>(l(),n("option",{key:String(a.value),value:a.value},o(a.label),9,Tt))),128))],512),[[S,v.show_subtitles]])]),t("label",null,[e[36]||(e[36]=t("span",null,"画面文字",-1)),M(t("select",{"onUpdate:modelValue":e[10]||(e[10]=a=>v.screen_text_language=a)},[(l(!0),n(w,null,j(ae.value,a=>(l(),n("option",{key:a.value,value:a.value},o(a.label),9,Vt))),128))],512),[[S,v.screen_text_language]])]),t("label",null,[e[37]||(e[37]=t("span",null,"人物面孔",-1)),M(t("select",{"onUpdate:modelValue":e[11]||(e[11]=a=>v.character_origin=a)},[(l(!0),n(w,null,j(te.value,a=>(l(),n("option",{key:a.value,value:a.value},o(a.label),9,Rt))),128))],512),[[S,v.character_origin]])]),t("label",null,[e[39]||(e[39]=t("span",null,"质量",-1)),M(t("select",{"onUpdate:modelValue":e[12]||(e[12]=a=>v.quality=a)},[...e[38]||(e[38]=[t("option",{value:"fast"},"快速草稿",-1),t("option",{value:"standard"},"标准成片",-1),t("option",{value:"high"},"高清优先",-1)])],512),[[S,v.quality]])]),t("button",{class:"generate-btn",type:"submit",disabled:T.value||v.idea.length<5},[T.value?(l(),n("span",Nt)):(l(),Me(d(Pe),{key:1,size:18})),p(" "+o(T.value?E.value:"生成短剧"),1)],8,Lt)])],32),t("div",Ot,[e[41]||(e[41]=t("div",null,[t("h2",null,"灵感同款"),t("p",null,"选择一个故事结构,再换成你的角色和剧情。")],-1)),t("button",{type:"button",onClick:Xe},[u(d(pt),{size:16}),e[40]||(e[40]=p("换一批",-1))])]),t("div",Ft,[(l(!0),n(w,null,j(Ae.value,a=>(l(),n("button",{key:a.id,type:"button",class:"template-card",onClick:_=>Qe(a)},[t("span",Dt,o(a.icon),1),t("span",null,[t("strong",null,o(a.name),1),e[42]||(e[42]=t("small",null,"一键套用故事节奏",-1))]),u(d(rt),{size:17})],8,qt))),128))])])):C.value==="projects"&&!r.value?(l(),n("section",Bt,[t("div",Et,[e[45]||(e[45]=t("div",null,[t("span",{class:"eyebrow"},[t("i"),p(" MY PRODUCTIONS")]),t("h1",null,"我的短剧"),t("p",null,"有固定角色时按独立 ComfyUI 节点并发;同一地址安全排队。页面关闭后仍会继续。")],-1)),t("button",{class:"btn btn-primary",type:"button",onClick:oe},[u(d(ot),{size:17}),e[44]||(e[44]=p("新建短剧",-1))])]),$.value.length?(l(),n("div",Wt,[(l(!0),n(w,null,j($.value,a=>{var _;return l(),n("button",{key:a.id,class:"project-card",onClick:i=>fe(a.id)},[t("span",{class:z(["project-poster",a.aspect_ratio==="16:9"?"landscape":"portrait"])},[u(d(F),{size:28}),t("i",null,o(a.aspect_ratio),1)],2),t("span",Jt,[t("span",{class:z(["status-pill",ke(a.status)])},o(be(a.status)),3),t("strong",null,o(a.title),1),t("small",null,o(a.duration)+" 秒"+o(a.duration_mode==="auto"?" · AI 自适应":"")+" · "+o(a.character_count)+" 个固定角色",1),a.episode?(l(),n("span",Qt,[t("i",{style:ze({width:`${a.episode.progress||0}%`})},null,4)])):h("",!0),t("em",null,o(((_=a.episode)==null?void 0:_.progress_message)||"分镜已准备好"),1)])],8,Gt)}),128))])):(l(),n("div",Ht,[u(d(F),{size:30}),e[46]||(e[46]=t("h3",null,"还没有短剧项目",-1)),e[47]||(e[47]=t("p",null,"从一句故事开始,几分钟搭好第一集。",-1)),t("button",{class:"btn btn-primary",type:"button",onClick:oe},"开始创作")]))])):C.value==="assets"&&!r.value?(l(),n("section",Xt,[t("div",Yt,[e[49]||(e[49]=t("div",null,[t("span",{class:"eyebrow"},[t("i"),p(" CHARACTER ASSETS")]),t("h1",null,"角色资产"),t("p",null,"角色按短剧项目隔离,并自动锁定版本。")],-1)),t("button",{class:"btn btn-primary",type:"button",onClick:oe},[u(d(Y),{size:17}),e[48]||(e[48]=p("创建角色",-1))])]),me.value.length?(l(),n("div",Zt,[(l(!0),n(w,null,j(me.value,a=>(l(),n("button",{key:`${a.projectId}-${a.id}`,onClick:_=>fe(a.projectId)},[a.reference_url?(l(),n("img",{key:0,src:a.reference_url,alt:a.name},null,8,ta)):(l(),n("span",aa,o(a.name.slice(0,1)),1)),t("span",null,[t("strong",null,o(a.name),1),t("small",null,[u(d(ce),{size:13}),p("全剧锁定 · V"+o(a.asset_version),1)])])],8,ea))),128))])):(l(),n("div",Kt,[u(d(Se),{size:30}),e[50]||(e[50]=t("h3",null,"还没有固定角色",-1)),e[51]||(e[51]=t("p",null,"创作短剧时上传一张参考图,系统会自动建立角色资产。",-1))]))])):r.value?(l(),n("section",sa,[t("div",la,[t("button",{type:"button",onClick:Le},[u(d(xe),{size:18}),e[52]||(e[52]=p("返回",-1))]),t("div",na,[t("span",{class:z(["status-pill",ke(r.value.status)])},o(be(r.value.status)),3),t("button",{class:"delete-project",type:"button",disabled:V.value,onClick:De},[u(d(it),{size:16}),p(o(V.value?"删除中…":"删除短剧"),1)],8,oa)])]),t("div",ia,[t("div",null,[e[53]||(e[53]=t("span",{class:"eyebrow"},[t("i"),p(" SHORT DRAMA PROJECT")],-1)),t("h1",null,o(r.value.title),1),t("p",null,o(r.value.idea),1)]),t("div",ra,[t("span",null,o(r.value.aspect_ratio),1),t("span",null,o(r.value.duration)+" 秒"+o(r.value.duration_mode==="auto"?" · AI 自适应":""),1),t("span",null,o(r.value.shot_duration_mode_label),1),t("span",null,o(r.value.voice_language_label),1),t("span",null,o(r.value.subtitle_label),1),t("span",null,"画面文字:"+o(r.value.screen_text_language_label),1),t("span",null,o(r.value.character_origin_label),1),t("span",null,o(Ye(r.value.quality)),1)])]),(l(!0),n(w,null,j(r.value.episodes,a=>{var _;return l(),n("article",{key:a.id,class:"episode-panel"},[t("header",ua,[t("div",null,[t("strong",null,o(a.title),1),t("span",null,o(a.progress_message),1)]),t("b",null,o(a.progress)+"%",1)]),t("div",da,[t("i",{style:ze({width:`${a.progress}%`})},null,4)]),a.final_url?(l(),n("video",{key:0,class:"final-video",src:a.final_url,controls:"",playsinline:""},null,8,ca)):h("",!0),t("div",pa,[t("span",va,[u(d(je),{size:15}),e[54]||(e[54]=p("剧本",-1))]),t("span",ga,[u(d(je),{size:15}),e[55]||(e[55]=p("分镜",-1))]),t("span",{class:z({done:r.value.characters.length>0})},[u(d(vt),{size:15}),e[56]||(e[56]=p("角色",-1))],2),t("span",{class:z({done:a.status==="completed",active:a.status==="generating"})},[u(d(F),{size:15}),e[57]||(e[57]=p("视频",-1))],2),t("span",{class:z({done:a.status==="completed"})},[u(d($e),{size:15}),e[58]||(e[58]=p("成片",-1))],2)]),t("div",ya,[e[60]||(e[60]=t("div",null,[t("h2",null,"固定角色"),t("p",null,"同一项目的所有镜头会复用这些角色。")],-1)),t("button",{type:"button",onClick:e[13]||(e[13]=i=>R.value=!R.value)},[u(d(Y),{size:16}),e[59]||(e[59]=p("添加角色",-1))])]),R.value?(l(),n("form",{key:1,class:"character-form",onSubmit:we(Be,["prevent"])},[t("input",{ref_for:!0,ref_key:"detailCharacterInput",ref:ye,hidden:"",type:"file",accept:"image/png,image/jpeg,image/webp",onChange:We},null,544),t("button",{class:"character-upload",type:"button",onClick:e[14]||(e[14]=i=>{var U;return(U=ye.value)==null?void 0:U.click()})},[m.preview?(l(),n("img",{key:0,src:m.preview,alt:"新角色预览"},null,8,ma)):(l(),n(w,{key:1},[u(d(ct),{size:22}),e[61]||(e[61]=t("span",null,"上传一张角色图",-1))],64))]),t("div",fa,[M(t("input",{"onUpdate:modelValue":e[15]||(e[15]=i=>m.name=i),maxlength:"80",placeholder:"角色名称",required:""},null,512),[[X,m.name,void 0,{trim:!0}]]),M(t("input",{"onUpdate:modelValue":e[16]||(e[16]=i=>m.description=i),maxlength:"1000",placeholder:"可选:年龄、发型、服装等固定特征"},null,512),[[X,m.description,void 0,{trim:!0}]])]),t("button",{class:"btn btn-primary",type:"submit",disabled:D.value||!m.file||!m.name},o(D.value?"正在锁定…":"锁定角色"),9,_a)],32)):h("",!0),t("div",ha,[(l(!0),n(w,null,j(r.value.characters,i=>(l(),n("div",{key:i.id,class:"character-card"},[i.reference_url?(l(),n("img",{key:0,src:i.reference_url,alt:i.name},null,8,ba)):(l(),n("span",ka,o(i.name.slice(0,1)),1)),t("div",null,[t("strong",null,o(i.name),1),t("small",null,[u(d(ce),{size:13}),p("全剧锁定 · V"+o(i.asset_version),1)])]),t("button",{type:"button","aria-label":"移除角色",onClick:U=>Ee(i)},[u(d(Ce),{size:15})],8,wa)]))),128)),r.value.characters.length?h("",!0):(l(),n("button",{key:0,class:"empty-character",type:"button",onClick:e[17]||(e[17]=i=>R.value=!0)},[u(d(Y),{size:20}),e[62]||(e[62]=t("span",null,[t("strong",null,"添加固定角色"),t("small",null,"可跳过,系统将自动设计人物")],-1))]))]),t("div",Ca,[t("div",null,[e[63]||(e[63]=t("h2",null,"分镜预览",-1)),t("p",null,[p(o(a.shots.length)+" 个连续镜头,均包含起始画面、动作、运镜、结束画面、衔接与防漂移规则。 ",1),((_=a.shots[0])==null?void 0:_.analysis_source)==="ai"?(l(),n(w,{key:0},[p("AI 已区分人物对白、屏幕文字与场景声音。")],64)):h("",!0)])]),["generating","completed"].includes(a.status)?h("",!0):(l(),n("button",{key:0,class:"primary-action",type:"button",disabled:q.value,onClick:i=>qe(a.id)},[u(d(Pe),{size:17}),p(o(q.value?"正在提交…":"开始生成"),1)],8,Ma))]),t("div",Ia,[(l(!0),n(w,null,j(a.shots,i=>{var U,N;return l(),n("article",{key:i.id,class:"shot-card"},[t("div",{class:z(["shot-preview",r.value.aspect_ratio==="16:9"?"landscape":"portrait"])},[i.output_url?(l(),n("video",{key:0,src:i.output_url,controls:"",playsinline:""},null,8,za)):(l(),n("div",ja,[["queued","running","waiting"].includes(i.status)?(l(),n("span",$a)):(l(),Me(d(F),{key:1,size:24})),t("small",null,o(i.progress_text),1)])),t("b",null,o(i.shot_no),1)],2),t("div",Ua,[t("strong",null,o(i.title)+" · "+o(i.duration_seconds)+" 秒",1),t("span",xa,[p(o(i.audio_mode_label)+" ",1),i.dialogue?(l(),n(w,{key:0},[p(" · "+o(i.dialogue_speaker||"主角")+":“"+o(Ze(i.dialogue))+"”",1)],64)):h("",!0)]),i.scene?(l(),n("span",Pa,"场景 · "+o(i.scene),1)):h("",!0),i.source_excerpt?(l(),n("span",Sa,"原文锚点 · "+o(i.source_excerpt),1)):h("",!0),(U=i.action_beats)!=null&&U.length?(l(),n("span",Aa,"动作节拍 · "+o(i.action_beats.join("")),1)):h("",!0),i.continuity_from_previous?(l(),n("span",Ta,"承接 · "+o(i.continuity_from_previous),1)):h("",!0),(N=i.sound_effects)!=null&&N.length?(l(),n("span",Va," 声音 · "+o(i.sound_effects.join("、")),1)):h("",!0),i.screen_event?(l(),n("span",Ra," 画面文字(不朗读)· "+o(i.screen_text||i.screen_event),1)):h("",!0),t("p",null,o(Ke(i.prompt)),1),i.error_message?(l(),n("span",La,o(Q(i.error_message)),1)):h("",!0),i.status==="error"||i.status==="completed"?(l(),n("div",Na,[t("button",{type:"button",onClick:O=>ie(i,"identity")},"角色不像",8,Oa),t("button",{type:"button",onClick:O=>ie(i,"action")},"动作不对",8,Fa),t("button",{type:"button",onClick:O=>ie(i,"replace")},"换一个",8,qa)])):h("",!0)])])}),128))])])}),128))])):h("",!0),B.value?(l(),n("div",{key:5,class:z(["page-toast",{error:pe.value}])},o(B.value),3)):h("",!0)])])}}},Ga=et(Da,[["__scopeId","data-v-417f82d6"]]);export{Ga as default};