62 lines
30 KiB
JavaScript
62 lines
30 KiB
JavaScript
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};
|