import{d as mt,k as b,B as ne,o as l,q as j,w as _,a as s,t as A,e as n,c as u,F as ve,v as he,f as ce,p as re,b as d,A as V,r as be,O as Bt,y as Zt,z as Jt,u as Kt,Q as ma,D as Ut,s as h,S as Ye,T as Ct,j as te,U as ct,V as Gt,M as St,W as xt,X as Ze,Y as Je,Z as ya,_ as Et,$ as Wt,G as Tt,m as pa,a0 as fa,a1 as _a,a2 as ga,a3 as ba,E as we,C as I,H as Qt,x as ka,a4 as ha,I as Vt,g as wa,n as $a,K as Ca,L as Sa}from"./index-p1BAR2Hc.js";import{i as xa,V as Pt,A as Ia,g as Aa,D as Ba,j as vt,k as Ht,c as It,d as Nt,S as Ta,l as Va,m as Pa,T as ja,X as Da,I as Ma,F as za}from"./icons-CbZw_MCi.js";import{A as jt}from"./AssetPromptEditor-bfTzC_cs.js";import{L as ie}from"./LoadingMedia-q1A6xJc7.js";import{V as Xt,t as Ra}from"./taskTimeout-D92AUM04.js";import{_ as yt}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{d as Ke,a as La}from"./download-BrY2jnvm.js";import{a as Yt,r as qa}from"./media-Do63jPLX.js";import{C as Oa}from"./CreativeSelect-CikGCVMP.js";import{M as Fa}from"./ModelConfigDialog-BZPjXRWk.js";import{P as Ua}from"./ProjectDialog-kNoqvi7U.js";import{u as Ga,p as Ea}from"./useModelPrompts-BKmMdFPq.js";const Wa={class:"duration-popover-content"},Ha={class:"duration-range-head"},Na={class:"duration-slider-wrap"},Xa={class:"duration-nodes"},Ya=["title","onClick"],Za=mt({__name:"DurationSelector",props:{modelValue:{},min:{default:5},max:{default:15},compact:{type:Boolean,default:!1},placement:{default:"top-start"}},emits:["update:modelValue","change"],setup(B,{emit:ke}){const r=B,k=ke,w=b(r.modelValue),g=V(()=>Array.from({length:r.max-r.min+1},(C,O)=>r.min+O));ne(()=>r.modelValue,C=>{w.value=C});function E(C){w.value=C,k("update:modelValue",C)}function F(C){w.value=C,k("change",C)}function M(C){E(C),F(C)}function S(C){return`${(C-r.min)/Math.max(1,r.max-r.min)*100}%`}return(C,O)=>{const H=be("el-slider"),G=be("el-popover");return l(),j(G,{placement:B.placement,trigger:"click",width:260,"show-arrow":!1,"popper-class":"duration-popper"},{reference:_(()=>[s("button",{class:re(["duration-trigger",{compact:B.compact}]),type:"button",onClick:O[0]||(O[0]=ce(()=>{},["stop"]))},[s("span",null,A(w.value)+A(B.compact?"s":" 秒"),1),n(d(xa),{size:15})],2)]),default:_(()=>[s("div",Wa,[s("div",Ha,[s("span",null,A(B.min)+" 秒",1),s("strong",null,A(w.value)+" 秒",1),s("span",null,A(B.max)+" 秒",1)]),s("div",Na,[n(H,{"model-value":w.value,min:B.min,max:B.max,step:1,"format-tooltip":D=>`${D} 秒`,"onUpdate:modelValue":E,onChange:F},null,8,["model-value","min","max","format-tooltip"]),s("div",Xa,[(l(!0),u(ve,null,he(g.value,D=>(l(),u("button",{key:D,type:"button",class:re({active:w.value===D}),style:Bt({left:S(D)}),title:`选择 ${D} 秒`,onClick:ye=>M(D)},[s("span",null,A(D)+" 秒",1)],14,Ya))),128))])])])]),_:1},8,["placement"])}}}),Ja=yt(Za,[["__scopeId","data-v-a46c2445"]]),Fe=1,Ka=5,Qa=.2,es=mt({__name:"ZoomableImage",props:{src:{},alt:{}},setup(B){const ke=B,r=b(),k=b(Fe),w=b(0),g=b(0),E=b(0),F=b(0),M=b("16 / 9"),S=b(!1);let C=0,O=0,H,G,D=0,ye=0,N=0,Y=0;function J(){k.value=Fe,w.value=0,g.value=0,S.value=!1,G=void 0}function W(){const P=r.value;if(!P||C<=0||O<=0)return;const m=Math.min(P.clientWidth/C,P.clientHeight/O,1);E.value=C*m,F.value=O*m}function ae(P){const m=P.target;C=m.naturalWidth,O=m.naturalHeight,C>0&&O>0&&(M.value=`${C} / ${O}`),W(),J()}function ue(P,m,$=k.value){const c=r.value;if(!c||E.value<=0||F.value<=0)return{x:0,y:0};const se=Math.max(0,(E.value*$-c.clientWidth)/2),oe=Math.max(0,(F.value*$-c.clientHeight)/2);return{x:Math.min(se,Math.max(-se,P)),y:Math.min(oe,Math.max(-oe,m))}}function pe(P){const m=r.value;if(!m)return;const $=k.value,c=P.deltaY<0?1:-1,se=Math.min(Ka,Math.max(Fe,Number(($+c*Qa).toFixed(2))));if(se===$)return;if(se===Fe){J();return}const oe=m.getBoundingClientRect(),je=P.clientX-oe.left-oe.width/2,De=P.clientY-oe.top-oe.height/2,Ce=se/$,Me=ue(je-(je-w.value)*Ce,De-(De-g.value)*Ce,se);k.value=se,w.value=Me.x,g.value=Me.y}function de(P){if(P.pointerType==="mouse"&&P.button!==0||k.value<=Fe)return;P.currentTarget.setPointerCapture(P.pointerId),G=P.pointerId,D=P.clientX,ye=P.clientY,N=w.value,Y=g.value,S.value=!0}function Pe(P){if(!S.value||P.pointerId!==G)return;const m=ue(N+P.clientX-D,Y+P.clientY-ye);w.value=m.x,g.value=m.y}function $e(P){if(P.pointerId!==G)return;const m=P.currentTarget;m.hasPointerCapture(P.pointerId)&&m.releasePointerCapture(P.pointerId),S.value=!1,G=void 0}return ne(()=>ke.src,()=>{C=0,O=0,E.value=0,F.value=0,M.value="16 / 9",J()}),Zt(()=>{H=new ResizeObserver(()=>{W(),J()}),r.value&&H.observe(r.value)}),Jt(()=>H==null?void 0:H.disconnect()),(P,m)=>(l(),u("div",{ref_key:"viewport",ref:r,class:re(["zoomable-image",{"is-zoomed":k.value>Fe,"is-dragging":S.value}]),style:Bt({"--zoomable-aspect-ratio":M.value}),onWheel:ce(pe,["prevent"]),onPointerdown:de,onPointermove:Pe,onPointerup:$e,onPointercancel:$e},[n(ie,{type:"image",class:"zoomable-image__media",src:B.src,alt:B.alt,style:Bt({width:E.value>0?`${E.value}px`:void 0,height:F.value>0?`${F.value}px`:void 0,transform:`translate(${w.value}px, ${g.value}px) scale(${k.value})`}),onLoad:ae},null,8,["src","alt","style"])],38))}}),At=yt(es,[["__scopeId","data-v-d5383cff"]]),ts={class:"asset-panel"},as={key:0,class:"asset-detail-header"},ss={key:1},os=["disabled","title"],ls=["title","onClick"],ns={key:0},is={key:0,class:"asset-section-header"},rs={class:"asset-card-grid"},us={key:0,class:"current-asset-indicator",title:"当前分镜使用"},ds=["onClick"],cs={class:"asset-thumb"},vs={key:1},ms={key:2,class:"asset-audio-badge",title:"已上传参考音频"},ys={class:"asset-copy"},ps={class:"asset-card-actions"},fs=["title","onClick"],_s=["title","disabled","onClick"],gs={key:1,class:"asset-section-empty"},bs={key:1,class:"storyboard-video-assets"},ks={class:"storyboard-video-actions"},hs={key:0,class:"storyboard-video-limit"},ws={class:"storyboard-video-grid"},$s=["title","onClick"],Cs=["title","onClick"],Ss=["title","onClick"],xs={key:0,class:"storyboard-video-card is-loading"},Is={class:"storyboard-video-loading"},As={key:1,class:"storyboard-video-empty"},Bs={key:2,class:"asset-empty"},Ts={key:0,class:"asset-editor"},Vs={class:"asset-preview"},Ps={key:1},js={key:2,class:"asset-preview-audio-badge",title:"已上传参考音频"},Ds={key:3,class:"asset-image-loading"},Ms={class:"asset-preview-actions"},zs=["disabled"],Rs=["disabled"],Ls={class:"asset-reference-upload"},qs={class:"asset-reference-box"},Os={key:0,class:"audio-field"},Fs={class:"audio-upload"},Us={class:"prompt-field"},Gs={class:"asset-actions"},Es={key:0,class:"asset-editor storyboard-media-editor"},Ws={class:"asset-preview storyboard-media-preview"},Hs={key:2,class:"storyboard-media-empty"},Ns={key:3,class:"asset-image-loading"},Xs={key:4,class:"asset-preview-actions"},Ys={key:0,class:"storyboard-reference-upload"},Zs={class:"asset-reference-box"},Js={key:1,class:"storyboard-prompt-field"},Ks={class:"storyboard-media-summary"},Qs={class:"storyboard-media-actions"},eo={key:4,class:"asset-history",title:"历史记录"},to={class:"asset-history-list"},ao={class:"asset-history-actions"},so=["onClick"],oo=["title","disabled","onClick"],lo=["disabled","onClick"],no=["onClick"],io={key:0,class:"asset-history-empty"},ro={key:0,class:"asset-history-limit"},uo=mt({__name:"AssetPanel",props:{projectId:{},projectName:{},episodeName:{},assets:{},tasks:{},busy:{type:Boolean},canGenerate:{type:Boolean},now:{},pendingGenerationIds:{},storyboards:{},currentStoryboard:{},videoGenerationBlockedReason:{},videoDurationRange:{},mediaFocus:{},assetFocus:{}},emits:["create","save","delete","addToStoryboard","uploadImage","removeImage","uploadAudio","generateImage","cancel","generateStoryboardMedia","updateStoryboardDuration","historyStoryboard","historyChanged"],setup(B,{emit:ke}){const r=B,k=Kt(),w=ke,g=[{type:"character",label:"角色",icon:fa},{type:"scene",label:"场景",icon:_a},{type:"prop",label:"道具",icon:ga},{type:"custom",label:"自定义",icon:ba}],E=[{type:"storyboard_image",label:"分镜图",icon:Et},{type:"storyboard_video",label:"视频",icon:Wt}],F=V(()=>r.storyboards?[...g.filter(a=>a.type!=="custom"),...E,g.find(a=>a.type==="custom")]:g),M=b("character"),S=b(""),C=b(!1),O=b([]),H=b(!1),G=b(),D=b(),ye=b(""),N=b(""),Y=b(""),J=b(""),W=pa({name:"",image_prompt:""}),ae=b(!1);function ue(a,o){return(a||o).replace(/[\\/:*?"<>|]/g,"-").trim()||o}function pe(a){var z;const o=ue(r.projectName,"项目"),v=ue(r.episodeName,"剧集");return`${o}-${v}-分镜${((z=c.value)==null?void 0:z.sequence_no)||""}-${a}.mp4`}const de=V(()=>r.assets.filter(a=>a.asset_type===M.value)),Pe=V(()=>new Set((r.storyboards||[]).flatMap(a=>(a.asset_refs||[]).map(o=>o.id)))),$e=V(()=>{var a;return new Set((((a=r.currentStoryboard)==null?void 0:a.asset_refs)||[]).map(o=>o.id))}),P=V(()=>r.storyboards===void 0?[{key:"all",label:"",assets:de.value}]:[{key:"used",label:"本剧集已使用",assets:de.value.filter(a=>Pe.value.has(a.id))},{key:"unused",label:"本剧集未使用",assets:de.value.filter(a=>!Pe.value.has(a.id))}]),m=V(()=>r.assets.find(a=>a.id===S.value)),$=V(()=>E.some(a=>a.type===M.value)?M.value:void 0),c=V(()=>{var a;return $.value?(a=r.storyboards)==null?void 0:a.find(o=>o.id===S.value):void 0}),se=V(()=>{var o;const a=new Set((((o=c.value)==null?void 0:o.asset_refs)||[]).map(v=>v.id));return r.assets.filter(v=>a.has(v.id))});ne(c,a=>{J.value=(a==null?void 0:a.image_prompt)||""},{immediate:!0});const oe=V(()=>C.value||$.value==="storyboard_video"&&!!c.value),je=V(()=>r.assets.length),De=V(()=>{var a;return((a=m.value)==null?void 0:a.name)||(c.value?`分镜 ${c.value.sequence_no}`:"资产详情")}),Ce=new Set(["pending_submission","submitting","submitted","processing","result_ready","downloading","cancel_requested"]);function Me(a,o){return r.tasks.find(v=>v.storyboard_id===a.id&&v.task_type===o&&(o!=="image_generation"||!v.asset_id)&&Ce.has(v.status))}const K=V(()=>r.tasks.find(a=>a.task_type==="image_generation"&&a.asset_id===S.value&&Ce.has(a.status))),Ue=V(()=>{var a;return((a=r.pendingGenerationIds)==null?void 0:a.includes(S.value))||!1}),fe=V(()=>Ue.value||!!K.value),Ie=V(()=>{var a;return((a=K.value)==null?void 0:a.status)==="cancel_requested"}),Ae=V(()=>O.value.filter(a=>$.value==="storyboard_image"?!a.active&&a.mime_type.startsWith("image/"):$.value==="storyboard_video"?!(a.candidate??a.active)&&a.mime_type.startsWith("video/"):!a.active)),Z=V(()=>Ae.value.length>=5),Se=V(()=>O.value.filter(a=>a.mime_type.startsWith("video/")&&!!(a.candidate??a.active))),Qe=V(()=>K.value?Ra(K.value,r.now||Date.now()):""),et=V(()=>Ue.value?"正在启动":Ie.value?"取消中":K.value?`生成中 ${Qe.value}`:"生成参考图"),Q=V(()=>K.value&&!Ie.value?`取消生成 ${Qe.value}`:et.value),U=V(()=>{if(!c.value||!$.value)return;const a=$.value==="storyboard_image"?"image_generation":"video_generation";return Me(c.value,a)}),Ge=V(()=>Se.value.length+(U.value?1:0)>=3);function pt(a){var o;return!!((o=r.pendingGenerationIds)!=null&&o.includes(a)||r.tasks.some(v=>v.task_type==="image_generation"&&v.asset_id===a&&v.status!=="cancel_requested"&&Ce.has(v.status)))}function Ee(a){return r.assets.filter(o=>o.asset_type===a).length}function ze(a){return E.some(o=>o.type===a)}ne(()=>r.assets,a=>{var o;ze(M.value)||a.some(v=>v.id===S.value)||(S.value=((o=de.value[0])==null?void 0:o.id)||"")},{immediate:!0,deep:!0}),ne(M,a=>{var o,v,z,_e,ge,Le;if(ze(a)){const Be=(o=r.storyboards)!=null&&o.some(qe=>qe.id===S.value)?S.value:"";S.value=((v=r.currentStoryboard)==null?void 0:v.id)||Be||((z=r.mediaFocus)==null?void 0:z.storyboardId)||((ge=(_e=r.storyboards)==null?void 0:_e[0])==null?void 0:ge.id)||"",C.value=a==="storyboard_image"&&!!S.value}else S.value=((Le=de.value[0])==null?void 0:Le.id)||"",C.value=!1}),ne(()=>r.mediaFocus,a=>{a&&(M.value=a.type,S.value=a.storyboardId,C.value=a.type==="storyboard_image")},{deep:!0}),ne(()=>r.assetFocus,async a=>{if(!a)return;const o=r.assets.find(v=>v.id===a.assetId);o&&(M.value=o.asset_type,await Vt(),S.value=o.id,C.value=!0)}),ne(()=>{var a;return(a=r.currentStoryboard)==null?void 0:a.id},a=>{a&&$.value&&(S.value=a)}),ne(m,a=>Object.assign(W,{name:(a==null?void 0:a.name)||"",image_prompt:(a==null?void 0:a.image_prompt)||""}),{immediate:!0});async function xe(){if(!oe.value||!m.value&&!c.value){O.value=[];return}H.value=!0;try{O.value=c.value?await I.outputs(r.projectId,c.value.id):await I.assetOutputs(r.projectId,m.value.id)}finally{H.value=!1}}async function L(a){a.active||(c.value&&$.value==="storyboard_video"?await I.addStoryboardCandidate(r.projectId,c.value.id,a.id):c.value?await I.activateOutput(r.projectId,c.value.id,a.id):await I.activateAssetOutput(r.projectId,m.value.id,a.id),await xe(),w("historyChanged"))}async function tt(a){if(c.value){try{await we.confirm("删除后该视频会移入历史记录,是否继续?","删除备选视频",{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消"})}catch(o){if(o==="cancel"||o==="close")return;throw o}await I.removeStoryboardCandidate(r.projectId,c.value.id,a.id),await xe(),w("historyChanged")}}async function ft(a){if(!a.active){try{await we.confirm("删除后不可恢复,确定删除该历史记录吗?","删除历史记录",{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消"})}catch(o){if(o==="cancel"||o==="close")return;throw o}c.value?await I.deleteOutput(r.projectId,c.value.id,a.id):await I.deleteAssetOutput(r.projectId,m.value.id,a.id),await xe(),w("historyChanged")}}function at(a){G.value=a,ae.value=!0}ne([M,S,C],()=>{xe()}),ne([()=>{var a;return(a=m.value)==null?void 0:a.image_asset_id},()=>{var a;return(a=c.value)==null?void 0:a.thumbnail_asset_id},()=>{var a;return(a=c.value)==null?void 0:a.active_output_id}],()=>{oe.value&&xe()}),ne(S,()=>{N.value="",Y.value=""});function _t(){if(ze(M.value)||r.busy)return;const a=g.find(z=>z.type===M.value);if(!a)return;const o=new Set(r.assets.map(z=>z.name.trim()).filter(Boolean));let v=1;for(;o.has(`${a.label}${v}`);)v+=1;w("create",{asset_type:a.type,name:`${a.label}${v}`})}function gt(a){S.value=a.id,C.value=!0}function bt(a){w("delete",a)}function st(a){if(!(!m.value||W[a]===(m.value[a]||""))){if(a==="name"&&r.assets.some(o=>{var v,z;return o.id!==((v=m.value)==null?void 0:v.id)&&o.asset_type===((z=m.value)==null?void 0:z.asset_type)&&o.name.trim().toLocaleLowerCase()===W.name.trim().toLocaleLowerCase()})){k.error("同类型资产名称已存在"),W.name=m.value.name;return}w("save",m.value.id,{[a]:W[a]})}}function We(a,o){var _e;const v=a.target,z=(_e=v.files)==null?void 0:_e[0];if(z&&(m.value||c.value))if(o==="image"){const ge=new FileReader;ge.onload=()=>{Y.value=String(ge.result||""),N.value=Y.value},ge.readAsDataURL(z)}else m.value&&w("uploadAudio",m.value.id,z);v.value=""}function He(a){var z;const o=a.target,v=(z=o.files)==null?void 0:z[0];v&&m.value&&w("uploadImage",m.value.id,v),o.value=""}function ot(){N.value="",Y.value=""}async function lt(){var a;if((a=m.value)!=null&&a.image_url)try{await Ke(m.value.image_asset_id,m.value.image_url,m.value.name||"asset")}catch(o){k.error(o instanceof Error?o.message:"图片下载失败")}}async function Ne(){var a;(a=c.value)!=null&&a.thumbnail_url&&await Ke(c.value.thumbnail_asset_id,c.value.thumbnail_url,`分镜${c.value.sequence_no}`)}async function kt(){var a;(a=c.value)!=null&&a.result_url&&await Ke(c.value.result_media_id,c.value.result_url,pe("主视频"))}async function ht(){var a;if((a=c.value)!=null&&a.thumbnail_url){try{await we.confirm("删除后分镜图会移入历史记录,可从历史记录恢复。是否继续?","删除分镜图",{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消"})}catch(o){if(o==="cancel"||o==="close")return;throw o}await I.removeStoryboardImage(r.projectId,c.value.id),await xe(),w("historyChanged")}}async function wt(){var a;if((a=m.value)!=null&&a.image_url){try{await we.confirm("移除后资产图会进入历史记录,可从历史记录恢复。是否继续?","移除资产图",{type:"warning",confirmButtonText:"移除",cancelButtonText:"取消"})}catch(o){if(o==="cancel"||o==="close")return;throw o}w("removeImage",m.value.id)}}function nt(){m.value&&(K.value?w("cancel",K.value):w("generateImage",m.value.id,Y.value||void 0))}async function Re(){if(!(!c.value||!$.value))if(U.value)w("cancel",U.value);else if($.value==="storyboard_image"){const a=J.value.trim();try{await I.updateStoryboard(r.projectId,c.value.id,{image_prompt:a})}catch{k.error("分镜图提示词保存失败");return}w("generateStoryboardMedia",c.value.id,"image_generation",{prompt:a,image_urls:Y.value?[Y.value]:void 0})}else w("generateStoryboardMedia",c.value.id,"video_generation")}function it(){C.value=!1,M.value="character"}async function rt(a){var o;ye.value=a.public_url,await Vt(),(o=D.value)==null||o.openFullscreen()}return(a,o)=>{var Be,qe,ut,dt;const v=be("el-icon"),z=be("el-button"),_e=be("el-input"),ge=be("el-dialog"),Le=Qt("loading");return l(),u("aside",ts,[C.value?(l(),u("header",as,[s("button",{type:"button",title:"返回资产列表",onClick:o[0]||(o[0]=y=>$.value?it():C.value=!1)},[n(v,null,{default:_(()=>[n(d(ma))]),_:1})]),s("strong",null,A(De.value),1)])):(l(),u("header",ss,[s("div",null,[o[15]||(o[15]=s("strong",null,"资产",-1)),s("span",null,A(je.value),1)]),s("button",{type:"button",disabled:!!$.value||B.busy,title:$.value?"分镜媒体不能手动新建":B.busy?"正在创建资产":`新建${((Be=F.value.find(y=>y.type===M.value))==null?void 0:Be.label)||"资产"}`,onClick:_t},[n(v,null,{default:_(()=>[n(d(Ut))]),_:1})],8,os)])),C.value?h("",!0):(l(),u("nav",{key:2,class:re(["asset-tabs",{"has-media":B.storyboards}])},[(l(!0),u(ve,null,he(F.value,y=>(l(),u("button",{key:y.type,type:"button",class:re({active:M.value===y.type}),title:y.label,onClick:T=>M.value=y.type},[n(v,null,{default:_(()=>[(l(),j(ka(y.icon)))]),_:2},1024),ze(y.type)?h("",!0):(l(),u("small",ns,A(Ee(y.type)),1))],10,ls))),128))],2)),C.value?h("",!0):(l(),u("div",{key:3,class:re(["asset-list",{"episode-assets":B.storyboards!==void 0}])},[$.value?$.value==="storyboard_video"&&c.value?(l(),u("section",bs,[s("div",ks,[n(Ja,{"model-value":c.value.duration_seconds,min:((qe=B.videoDurationRange)==null?void 0:qe.min)||5,max:((ut=B.videoDurationRange)==null?void 0:ut.max)||15,placement:"bottom-start",onChange:o[1]||(o[1]=y=>w("updateStoryboardDuration",c.value.id,y))},null,8,["model-value","min","max"]),n(z,{class:"storyboard-video-generate",type:U.value?"danger":"primary",icon:U.value?d(Ye):d(Ct),disabled:((dt=U.value)==null?void 0:dt.status)==="cancel_requested"||B.busy||!U.value&&(Ge.value||!!B.videoGenerationBlockedReason),onClick:Re},{default:_(()=>[te(A(U.value?"取消生成":Ge.value?"备选视频已满":B.videoGenerationBlockedReason||"生成视频"),1)]),_:1},8,["type","icon","disabled"])]),!U.value&&B.videoGenerationBlockedReason?(l(),u("small",hs,A(B.videoGenerationBlockedReason)+",请调整 @ 资产后再生成",1)):h("",!0),s("div",ws,[(l(!0),u(ve,null,he(Se.value,(y,T)=>(l(),u("article",{key:y.id,class:re(["storyboard-video-card",{active:y.active}])},[s("button",{class:"storyboard-video-preview",type:"button",title:`全屏播放备选视频 ${T+1}`,onClick:Te=>rt(y)},[n(ie,{type:"video",src:y.public_url,muted:"",preload:"metadata",playsinline:"",disablepictureinpicture:"",disableremoteplayback:"",controlslist:"nodownload noplaybackrate noremoteplayback"},null,8,["src"]),s("strong",null,"备选 "+A(T+1),1)],8,$s),s("button",{class:"storyboard-video-delete",type:"button",title:`删除备选视频 ${T+1}`,onClick:Te=>tt(y)},[n(v,null,{default:_(()=>[n(d(Ze))]),_:1})],8,Cs),s("button",{class:"storyboard-video-download",type:"button",title:`下载备选视频 ${T+1}`,onClick:Te=>d(Ke)(y.media_asset_id,y.public_url,pe(`备选${T+1}`))},[n(v,null,{default:_(()=>[n(d(Je))]),_:1})],8,Ss)],2))),128)),U.value?(l(),u("article",xs,[s("span",Is,[n(v,null,{default:_(()=>[n(d(ct))]),_:1}),o[16]||(o[16]=s("small",null,"生成中",-1))]),o[17]||(o[17]=s("strong",null,"新备选视频",-1))])):h("",!0),!Se.value.length&&!U.value?(l(),u("span",As,"暂无备选视频")):h("",!0)])])):h("",!0):(l(!0),u(ve,{key:0},he(P.value,y=>(l(),u("section",{key:y.key,class:"asset-section"},[y.label?(l(),u("header",is,[s("strong",null,A(y.label),1),s("span",null,A(y.assets.length),1)])):h("",!0),s("div",rs,[(l(!0),u(ve,null,he(y.assets,T=>(l(),u("article",{key:T.id,class:"asset-card"},[$e.value.has(T.id)?(l(),u("span",us)):h("",!0),s("button",{class:"asset-card-main",type:"button",onClick:Te=>gt(T)},[s("span",cs,[T.image_url?(l(),j(ie,{key:0,type:"image",src:T.image_url,alt:T.name},null,8,["src","alt"])):(l(),u("i",vs,A(T.name.slice(0,1)),1)),T.audio_url?(l(),u("span",ms,[n(d(Pt),{size:13}),s("small",null,A(d(Yt)(T.audio_duration_ms)),1)])):h("",!0),pt(T.id)?(l(),j(v,{key:3,class:"asset-thumb-loading"},{default:_(()=>[n(d(ct))]),_:1})):h("",!0)]),s("span",ys,[s("b",null,A(T.name),1)])],8,ds),s("div",ps,[s("button",{class:"asset-delete",type:"button",title:"删除资产",onClick:Te=>bt(T)},[n(v,null,{default:_(()=>[n(d(Ze))]),_:1})],8,fs),$e.value.has(T.id)?h("",!0):(l(),u("button",{key:0,class:"asset-add",type:"button",title:"添加到当前分镜",disabled:B.busy||!B.currentStoryboard||B.currentStoryboard.locked,onClick:Te=>w("addToStoryboard",T)},[n(v,null,{default:_(()=>[n(d(Ut))]),_:1})],8,_s))])]))),128))]),y.assets.length?h("",!0):(l(),u("div",gs,A(y.key==="used"?"暂无已使用资产":y.key==="unused"?"暂无未使用资产":"暂无资产"),1))]))),128)),$.value&&!c.value?(l(),u("div",Bs," 请先选择一个分镜 ")):h("",!0)],2)),n(Gt,{name:"asset-detail"},{default:_(()=>[m.value&&C.value?(l(),u("div",Ts,[s("div",Vs,[m.value.image_url?(l(),j(ie,{key:0,type:"image",src:m.value.image_url,alt:`${m.value.name} 主图`,onClick:o[2]||(o[2]=y=>ae.value=!0)},null,8,["src","alt"])):(l(),u("i",Ps,A(m.value.name.slice(0,1)),1)),m.value.audio_url?(l(),u("span",js,[n(d(Pt),{size:15}),s("small",null,A(d(Yt)(m.value.audio_duration_ms)),1)])):h("",!0),fe.value?(l(),u("div",Ds,[n(v,null,{default:_(()=>[n(d(ct))]),_:1}),s("b",null,A(et.value),1)])):h("",!0),s("div",Ms,[s("label",{class:re({disabled:B.busy}),title:"上传本地图"},[n(v,null,{default:_(()=>[n(d(St))]),_:1}),s("input",{type:"file",accept:"image/jpeg,image/png,image/webp",disabled:B.busy,onChange:He},null,40,zs)],2),m.value.image_url?(l(),u("button",{key:0,type:"button",title:"查看大图",onClick:o[3]||(o[3]=y=>ae.value=!0)},[n(v,null,{default:_(()=>[n(d(xt))]),_:1})])):h("",!0),m.value.image_url?(l(),u("button",{key:1,type:"button",title:"移除图片",disabled:B.busy,onClick:wt},[n(v,null,{default:_(()=>[n(d(Ze))]),_:1})],8,Rs)):h("",!0),m.value.image_url?(l(),u("button",{key:2,type:"button",title:"下载原图",onClick:lt},[n(v,null,{default:_(()=>[n(d(Je))]),_:1})])):h("",!0)])]),s("div",Ls,[o[19]||(o[19]=s("span",null,"临时参考图",-1)),s("span",qs,[N.value?(l(),j(ie,{key:0,type:"image",compact:"",src:N.value,alt:"临时参考图"},null,8,["src"])):(l(),u(ve,{key:1},[n(v,null,{default:_(()=>[n(d(St))]),_:1}),o[18]||(o[18]=s("small",null,"上传参考图",-1))],64)),s("input",{type:"file",accept:"image/jpeg,image/png,image/webp",onChange:o[4]||(o[4]=y=>We(y,"image"))},null,32),N.value?(l(),u("button",{key:2,class:"asset-reference-remove",type:"button",title:"移除临时参考图",onClick:ce(ot,["prevent","stop"])},[n(v,null,{default:_(()=>[n(d(Ye))]),_:1})])):h("",!0)])]),s("div",{class:re(["asset-name-row",{single:m.value.asset_type!=="character"}])},[s("label",null,[o[20]||(o[20]=s("span",null,"名称",-1)),n(_e,{modelValue:W.name,"onUpdate:modelValue":o[5]||(o[5]=y=>W.name=y),modelModifiers:{trim:!0},maxlength:"200",onBlur:o[6]||(o[6]=y=>st("name"))},null,8,["modelValue"])]),m.value.asset_type==="character"?(l(),u("label",Os,[o[21]||(o[21]=s("span",null,"参考音频",-1)),s("span",Fs,[s("input",{type:"file",accept:"audio/*",onChange:o[7]||(o[7]=y=>We(y,"audio"))},null,32),n(v,null,{default:_(()=>[n(d(ya))]),_:1}),te(A(m.value.audio_url?"重新上传":"上传"),1)])])):h("",!0)],2),s("label",Us,[o[22]||(o[22]=s("span",null,"生图提示词",-1)),n(_e,{modelValue:W.image_prompt,"onUpdate:modelValue":o[8]||(o[8]=y=>W.image_prompt=y),type:"textarea",resize:"none",onBlur:o[9]||(o[9]=y=>st("image_prompt"))},null,8,["modelValue"])]),s("div",Gs,[n(z,{type:K.value?"danger":"primary",icon:K.value?d(Ye):d(Ct),disabled:B.busy||Ie.value||Z.value||!K.value&&(!B.canGenerate||!W.image_prompt.trim()||fe.value),loading:!K.value&&Ue.value,onClick:nt},{default:_(()=>[te(A(Q.value),1)]),_:1},8,["type","icon","disabled","loading"])])])):h("",!0)]),_:1}),n(Gt,{name:"asset-detail"},{default:_(()=>{var y;return[c.value&&$.value&&C.value?(l(),u("div",Es,[s("div",Ws,[$.value==="storyboard_image"&&c.value.thumbnail_url?(l(),j(ie,{key:0,type:"image",src:c.value.thumbnail_url,alt:`分镜 ${c.value.sequence_no}`},null,8,["src","alt"])):$.value==="storyboard_video"&&c.value.result_url?(l(),j(ie,{key:1,type:"video",src:c.value.result_url,controls:"",preload:"metadata",playsinline:"",disablepictureinpicture:"",disableremoteplayback:"",controlslist:"nodownload noplaybackrate noremoteplayback"},null,8,["src"])):U.value?h("",!0):(l(),u("div",Hs,[n(v,null,{default:_(()=>[$.value==="storyboard_image"?(l(),j(d(Et),{key:0})):(l(),j(d(Wt),{key:1}))]),_:1}),s("span",null,A($.value==="storyboard_image"?"暂无分镜图":"暂无视频"),1)])),U.value?(l(),u("div",Ns,[n(v,null,{default:_(()=>[n(d(ct))]),_:1}),s("b",null,A(U.value.status==="cancel_requested"?"取消中":"生成中"),1)])):h("",!0),$.value==="storyboard_image"&&c.value.thumbnail_url||$.value==="storyboard_video"&&c.value.result_url?(l(),u("div",Xs,[$.value==="storyboard_image"?(l(),u("button",{key:0,type:"button",title:"查看大图",onClick:o[10]||(o[10]=T=>ae.value=!0)},[n(v,null,{default:_(()=>[n(d(xt))]),_:1})])):h("",!0),$.value==="storyboard_image"?(l(),u("button",{key:1,type:"button",title:"下载分镜图",onClick:Ne},[n(v,null,{default:_(()=>[n(d(Je))]),_:1})])):h("",!0),$.value==="storyboard_image"?(l(),u("button",{key:2,type:"button",title:"删除分镜图",onClick:ht},[n(v,null,{default:_(()=>[n(d(Ze))]),_:1})])):h("",!0),$.value==="storyboard_video"?(l(),u("button",{key:3,type:"button",title:"下载分镜视频",onClick:kt},[n(v,null,{default:_(()=>[n(d(Je))]),_:1})])):h("",!0)])):h("",!0)]),$.value==="storyboard_image"?(l(),u("div",Ys,[o[24]||(o[24]=s("span",null,"参考图(可选)",-1)),s("span",Zs,[N.value?(l(),j(ie,{key:0,type:"image",compact:"",src:N.value,alt:"分镜图参考图"},null,8,["src"])):(l(),u(ve,{key:1},[n(v,null,{default:_(()=>[n(d(St))]),_:1}),o[23]||(o[23]=s("small",null,"上传参考图",-1))],64)),s("input",{type:"file",accept:"image/jpeg,image/png,image/webp",onChange:o[11]||(o[11]=T=>We(T,"image"))},null,32),N.value?(l(),u("button",{key:2,class:"asset-reference-remove",type:"button",title:"移除临时参考图",onClick:ce(ot,["prevent","stop"])},[n(v,null,{default:_(()=>[n(d(Ye))]),_:1})])):h("",!0)])])):h("",!0),$.value==="storyboard_image"?(l(),u("div",Js,[o[25]||(o[25]=s("span",null,"分镜图提示词",-1)),n(jt,{modelValue:J.value,"onUpdate:modelValue":o[12]||(o[12]=T=>J.value=T),assets:se.value,variant:"drama-storyboard",placeholder:"请输入分镜图提示词,输入 @ 引用当前分镜素材"},null,8,["modelValue","assets"])])):h("",!0),s("div",Ks,[s("strong",null,"分镜 "+A(c.value.sequence_no),1),s("span",null,A($.value==="storyboard_image"?"分镜图处理":"视频处理"),1)]),s("div",Qs,[n(z,{type:U.value?"danger":"primary",icon:U.value?d(Ye):d(Ct),disabled:((y=U.value)==null?void 0:y.status)==="cancel_requested"||B.busy||Z.value,onClick:Re},{default:_(()=>[te(A(U.value?"取消生成":$.value==="storyboard_image"?c.value.thumbnail_url?"重新生成分镜图":"生成分镜图":c.value.result_url?"重新生成视频":"生成视频"),1)]),_:1},8,["type","icon","disabled"])])])):h("",!0)]}),_:1}),oe.value?(l(),u("section",eo,[s("header",null,[o[26]||(o[26]=s("strong",null,"历史记录",-1)),s("small",null,A(Ae.value.length)+" / 5",1)]),Tt((l(),u("div",to,[(l(!0),u(ve,null,he(Ae.value,y=>(l(),u("article",{key:y.id,class:"asset-history-item"},[y.mime_type.startsWith("image/")?(l(),j(ie,{key:0,type:"image",src:y.public_url,alt:"历史图片"},null,8,["src"])):(l(),j(ie,{key:1,type:"video",src:y.public_url,muted:"",playsinline:"",preload:"metadata",disablepictureinpicture:"",disableremoteplayback:"",controlslist:"nodownload noplaybackrate noremoteplayback"},null,8,["src"])),s("span",ao,[s("button",{type:"button",title:"查看",onClick:T=>at(y)},[n(v,null,{default:_(()=>[n(d(xt))]),_:1})],8,so),s("button",{type:"button",title:$.value==="storyboard_video"?"设为备选":"设为主图",disabled:y.active||$.value==="storyboard_video"&&Ge.value,onClick:T=>L(y)},[n(v,null,{default:_(()=>[n(d(ha))]),_:1})],8,oo),s("button",{type:"button",title:"删除",disabled:y.active,onClick:T=>ft(y)},[n(v,null,{default:_(()=>[n(d(Ze))]),_:1})],8,lo),s("button",{type:"button",title:"下载",onClick:T=>d(Ke)(y.media_asset_id,y.public_url,`history-${y.id}`)},[n(v,null,{default:_(()=>[n(d(Je))]),_:1})],8,no)])]))),128)),!Ae.value.length&&!H.value?(l(),u("span",io,"暂无历史记录")):h("",!0)])),[[Le,H.value]]),Z.value?(l(),u("small",ro,"历史记录已满,请删除后再生成")):h("",!0)])):h("",!0),n(ge,{modelValue:ae.value,"onUpdate:modelValue":o[13]||(o[13]=y=>ae.value=y),title:"资产预览",width:(G.value&&!G.value.mime_type.startsWith("image/"),"min(980px, calc(100vw - 28px))"),class:"asset-preview-dialog","append-to-body":"","destroy-on-close":"",onClosed:o[14]||(o[14]=y=>G.value=void 0)},{default:_(()=>{var y,T;return[G.value&&!G.value.mime_type.startsWith("image/")?(l(),j(Xt,{key:0,class:"asset-history-player",src:G.value.public_url},null,8,["src"])):G.value?(l(),j(At,{key:1,class:"asset-original",src:G.value.public_url,alt:"历史记录预览"},null,8,["src"])):(y=m.value)!=null&&y.image_url?(l(),j(At,{key:2,class:"asset-original",src:m.value.image_url,alt:m.value.name},null,8,["src","alt"])):(T=c.value)!=null&&T.thumbnail_url?(l(),j(At,{key:3,class:"asset-original",src:c.value.thumbnail_url,alt:`分镜 ${c.value.sequence_no}`},null,8,["src","alt"])):h("",!0)]}),_:1},8,["modelValue","width"]),ye.value?(l(),j(Xt,{key:5,ref_key:"storyboardVideoPlayer",ref:D,class:"storyboard-video-player-launcher",src:ye.value},null,8,["src"])):h("",!0)])}}}),co=yt(uo,[["__scopeId","data-v-fdcdab9c"]]),vo={class:"workbench-context-bar"},mo={class:"workbench-context-main"},yo={class:"workbench-context-actions creative-page-actions"},po={class:"editor-layout"},fo={class:"storyboard-workspace"},_o={class:"table-scroll"},go={class:"storyboard-table"},bo={class:"insert-row"},ko={colspan:"7"},ho=["onClick"],wo=["onClick"],$o={class:"sequence-cell"},Co={class:"row-actions"},So=["title","onClick"],xo=["disabled","title","onClick"],Io={class:"script-cell"},Ao=["title","onClick"],Bo={key:1},To=["disabled","title","onClick"],Vo={key:0,class:"cell-empty"},Po={class:"media-cell"},jo=["onClick"],Do={key:1,class:"media-empty media-loading"},Mo={key:2,class:"media-empty"},zo=["title","onClick"],Ro={class:"media-cell"},Lo=["onClick"],qo={key:1,class:"media-empty media-loading"},Oo={key:2,class:"media-empty"},Fo={key:0,class:"insert-row"},Uo={colspan:"7"},Go={key:0,class:"empty-storyboards parse-loading"},Eo={key:1,class:"empty-storyboards parse-failed"},Wo={class:"asset-rail"},Ho={class:"source-dialog-content"},No={class:"source-meta"},Xo=mt({__name:"DramaWorkbenchView",setup(B){const ke=wa(),r=Kt(),k=String(ke.params.projectId),w=String(ke.params.episodeId),g=b(),E=b({styles:[],models:[]}),F=b(),M=b(""),S=b(""),C=b([]),O=b([]),H=b(!1),G=b(!1),D=b(!1),ye=b(!1),N=b(!1),Y=b(!1),J=b(!1),W=b(!1),ae=b(!1),ue=b(!1),pe=b(!1),de=b(!1),Pe=b(!1),$e=b(!1),P=b([]),m=b(),$=b(),c=b(""),se=b(Date.now()),{prompts:oe,promptSelections:je,loadPrompts:De,selectPrompt:Ce,createPrompt:Me,updatePrompt:K,deletePrompt:Ue}=Ga();let fe,Ie;const Ae=["pending_submission","submitting","submitted","processing","result_ready","downloading","cancel_requested"],Z=V(()=>{var t;return(t=g.value)==null?void 0:t.storyboards.find(e=>e.id===S.value)}),Se=V(()=>{var t,e;return(e=(t=g.value)==null?void 0:t.project.model_configs.find(i=>i.purpose==="video_generation"))==null?void 0:e.capabilities}),Qe=V(()=>Se.value?{min:Se.value.duration_min_seconds,max:Se.value.duration_max_seconds}:void 0),et=V(()=>Z.value?wt(Z.value):""),Q=V(()=>O.value.find(t=>["queued","running","retry_wait","cancel_requested"].includes(t.status))),U=V(()=>{const t=O.value[0];return(t==null?void 0:t.status)==="failed"?t:void 0}),Ge=V(()=>{var t,e;return((t=Q.value)==null?void 0:t.status)==="cancel_requested"?"剧本解析取消中":((e=Q.value)==null?void 0:e.status)==="queued"?"剧本解析排队中":"剧本解析中"}),pt=V(()=>g.value?`第${g.value.episode.episode_no}集`:"剧集工作台"),Ee=V(()=>{var t;return!!((t=g.value)!=null&&t.storyboards.some(e=>e.result_url))}),ze=V(()=>({path:`/drama-projects/${k}`,query:{from:String(ke.query.from||"drama-projects")}}));async function xe(){if(!(!g.value||de.value||!Ee.value)){de.value=!0;try{const t=await I.episodeVideosArchive(k,w);La(t,`${g.value.project.name}${g.value.episode.name}.zip`)}catch(t){R(t,"下载全部视频失败")}finally{de.value=!1}}}async function L(t=!0){var e,i,f;t&&(H.value=!0);try{const[x,q,le]=await Promise.all([I.workbench(k,w),I.tasks(k,w),I.dramaParseTasks(k,w)]),Ve=c.value?(i=(e=g.value)==null?void 0:e.storyboards.find(X=>X.id===c.value))==null?void 0:i.script_content:void 0;g.value={...x,storyboards:x.storyboards.map(X=>({...X,script_content:X.id===c.value&&Ve!==void 0?Ve:X.script_content,asset_refs:ot(X.asset_refs)}))};const Xe=new Map(O.value.map(X=>[X.id,X.status]));C.value=q,O.value=le;for(const X of le.filter(Oe=>Oe.status==="failed"&&Xe.has(Oe.id)&&Xe.get(Oe.id)!=="failed"))ca(X);(!S.value||!x.storyboards.some(X=>X.id===S.value))&&(S.value=((f=x.storyboards[0])==null?void 0:f.id)||"")}catch(x){R(x,"加载工作台失败")}finally{H.value=!1}We()}async function tt(){if(!(Y.value||F.value)){Y.value=!0;try{F.value=await I.dramaEpisodeSource(k,w),M.value=F.value.raw_content}catch{F.value=void 0}finally{Y.value=!1}}}function ft(){J.value=!0,tt()}async function at(){if(!(E.value.styles.length||E.value.models.length))try{E.value=await I.options()}catch(t){R(t,"加载配置选项失败")}}async function _t(){W.value=!0,await at()}async function gt(){ae.value=!0,await Promise.all([at(),De(Ea)])}async function bt(t){ue.value=!0;try{await I.updateProject(k,{...t,project_type:"premium_drama",localization:null}),W.value=!1,r.success("项目信息已保存"),await L(!1)}catch(e){R(e,"保存项目信息失败")}finally{ue.value=!1}}async function st(t){ue.value=!0;try{await I.saveModels(k,t),ae.value=!1,r.success("模型配置已保存"),await L(!1)}catch(e){R(e,"保存模型配置失败")}finally{ue.value=!1}}function We(){const t=!!(Q.value||C.value.some(e=>Ae.includes(e.status)));t&&!fe?fe=setInterval(()=>L(!1),3e3):!t&&fe&&(clearInterval(fe),fe=void 0)}function He(t){S.value=t}function ot(t){if(Array.isArray(t))return t.filter(i=>i&&typeof i=="object"&&typeof i.id=="string");if(typeof t!="string"||!t.trim())return[];const e=[t];try{const i=Uint8Array.from(atob(t),f=>f.charCodeAt(0));e.push(new TextDecoder().decode(i))}catch{}for(const i of e)try{const f=JSON.parse(i);if(Array.isArray(f))return f.filter(x=>x&&typeof x=="object"&&typeof x.id=="string")}catch{}return[]}function lt(t,e){var f;const i=new Set((t.asset_refs||[]).map(x=>x.id));return(((f=g.value)==null?void 0:f.assets)||[]).filter(x=>x.asset_type===e&&i.has(x.id))}function Ne(t){var f;const e=new Set((t.asset_refs||[]).map(x=>x.id)),i=(((f=g.value)==null?void 0:f.assets)||[]).filter(x=>x.asset_type==="custom"||e.has(x.id));return t.thumbnail_url?[{id:`storyboard-image-${t.id}`,project_id:k,source_episode_id:w,asset_type:"custom",name:`分镜 ${t.sequence_no} 分镜图`,image_asset_id:t.thumbnail_asset_id,image_url:t.thumbnail_url,user_edited:!1},...i]:i}function kt(t,e){const i=`@${e.trim()}`;if(i==="@")return-1;let f=0;for(;f({asset:q,index:kt(e,q.name)})).filter(q=>q.index>=0).sort((q,le)=>q.index-le.index).map(q=>q.asset);if(i.length)return i;const f=new Set((t.asset_refs||[]).map(q=>q.id));return(((x=g.value)==null?void 0:x.assets)||[]).filter(q=>f.has(q.id))}function wt(t){const e=Se.value;if(!e)return"视频模型缺少参考素材能力配置";const i=ht(t),f=i.filter(le=>!!le.image_url).length,x=i.filter(le=>!!le.audio_url),q=x.reduce((le,Ve)=>le+Number(Ve.audio_duration_ms||0),0);return f>e.reference_images.max_count?`参考图数量超过 ${e.reference_images.max_count} 张`:x.length>e.reference_audios.max_count?`参考音频数量超过 ${e.reference_audios.max_count} 个`:e.reference_audios.max_total_duration_ms&&q>e.reference_audios.max_total_duration_ms?`参考音频总时长超过 ${e.reference_audios.max_total_duration_ms/1e3} 秒`:x.length>0&&f===0?"不能只使用参考音频":""}function nt(t,e){return C.value.some(i=>i.storyboard_id===t.id&&i.task_type===e&&(e!=="image_generation"||!i.asset_id)&&Ae.includes(i.status))}function Re(t){const e=C.value.filter(i=>i.storyboard_id===t.id&&i.task_type==="image_generation"&&!i.asset_id&&i.status==="failed"&&i.error_message).sort((i,f)=>String(f.created_at).localeCompare(String(i.created_at)))[0];return(e==null?void 0:e.error_message)||""}async function it(){var t;if(!M.value.trim())return r.warning("剧集原文不能为空"),!1;N.value=!0;try{return F.value=await I.saveDramaEpisodeSource(k,w,{title:(t=g.value)==null?void 0:t.episode.name,raw_content:M.value}),r.success("原文已保存"),!0}catch(e){return R(e,"保存原文失败"),!1}finally{N.value=!1}}async function rt(){var t;if(Q.value){await a();return}if(!pe.value){pe.value=!0;try{if(F.value||await tt(),(!F.value||M.value!==F.value.raw_content)&&!await it())return;const e=!!((t=g.value)!=null&&t.storyboards.length);if(e)try{await we.confirm("重新解析将永久删除当前剧集的所有分镜、分镜图和生成视频,此操作无法恢复。","确认重新解析剧本",{type:"warning",confirmButtonText:"删除并重新解析",cancelButtonText:"取消"})}catch(i){if(i==="cancel"||i==="close")return;throw i}e?await I.reparseDramaEpisode(k,w):await I.parseDramaEpisode(k,w),r.success("解析任务已提交"),await L(!1)}catch(e){R(e,"提交解析失败")}finally{pe.value=!1}}}async function a(){if(Q.value)try{await we.confirm("主动取消解析不会退费,是否继续?","取消解析",{type:"warning",confirmButtonText:"确认取消",cancelButtonText:"返回"}),await I.cancelDramaParse(k,Q.value.id),await L(!1)}catch(t){t!=="cancel"&&t!=="close"&&R(t,"取消失败")}}function o(t,e){t.script_content=e}async function v(t,e=!1){if(t.locked)return r.warning("分镜已锁定,无法编辑"),!1;G.value=!0;try{return await I.updateStoryboard(k,t.id,{script_content:t.script_content}),e&&r.success("分镜内容已保存"),!0}catch(i){return R(i,"保存分镜内容失败"),!1}finally{G.value=!1}}async function z(t){var e,i;if(t.locked){r.warning("分镜已锁定,无法编辑");return}c.value=t.id,S.value=t.id,await Vt(),(i=(e=document.getElementById(`storyboard-editor-${t.id}`))==null?void 0:e.querySelector("[contenteditable='true']"))==null||i.focus()}async function _e(t){c.value===t.id&&(c.value="",await v(t))}function ge(t){window.setTimeout(()=>{const e=document.getElementById(`storyboard-editor-${t.id}`);e!=null&&e.contains(document.activeElement)||_e(t)},150)}async function Le(){try{const t=await I.createDramaStoryboard(k,w);await L(!1),S.value=t.id}catch(t){R(t,"创建分镜失败")}}async function Be(t){if(Z.value)try{const e=await I.insertStoryboard(k,Z.value.id,t);await L(!1),S.value=e.id}catch(e){R(e,"插入分镜失败")}}async function qe(t){const e=!t.locked;if(!(e&&c.value===t.id&&(c.value="",!await v(t))))try{await I.updateStoryboard(k,t.id,{locked:e}),t.locked=e,r.success(e?"分镜已锁定":"分镜已解锁")}catch(i){R(i,e?"锁定分镜失败":"解锁分镜失败")}}async function ut(t){if(t.locked){r.warning("分镜已锁定,无法删除");return}try{await we.confirm(`确定删除分镜 ${t.sequence_no} 吗?对应的分镜图、视频和历史结果也将永久删除。`,"删除分镜",{type:"warning",confirmButtonText:"永久删除",cancelButtonText:"取消"}),await I.deleteStoryboard(k,t.id),await L(!1)}catch(e){e!=="cancel"&&e!=="close"&&R(e,"删除分镜失败")}}async function dt(t,e={},i=Z.value){if(i){if(i.locked){r.warning("分镜已锁定,无法生成");return}ye.value=!0;try{if(!await v(i))return;S.value=i.id,await I.generate(k,w,i.id,t,e),r.success(t==="image_generation"?"分镜图任务已提交":"视频任务已提交"),await L(!1)}catch(f){R(f,"生成失败")}finally{ye.value=!1}}}async function y(t){if(!D.value){D.value=!0;try{await I.createAsset(k,t),await L(!1)}catch(e){R(e,"创建资产失败")}finally{D.value=!1}}}async function T(t,e){try{await I.updateAsset(k,t,e),await L(!1)}catch(i){R(i,"保存资产失败"),await L(!1)}}async function Te(t){try{await we.confirm(`确定删除资产“${t.name}”吗?`,"删除资产",{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消"}),await I.deleteAsset(k,t.id),await L(!1)}catch(e){e!=="cancel"&&e!=="close"&&R(e,"删除资产失败")}}async function ea(t){const e=Z.value;if(!e){r.warning("请先选择一个分镜");return}if(e.locked){r.warning("当前分镜已锁定,无法添加资产");return}const i=e.asset_refs||[];i.some(f=>f.id===t.id)||await Dt(e,[...i,{id:t.id,name:t.name}],"添加资产失败")}async function ta(t,e){if(t.locked){r.warning("当前分镜已锁定,无法移除资产");return}const i=(t.asset_refs||[]).filter(f=>f.id!==e.id);await Dt(t,i,"移除资产失败")}async function Dt(t,e,i){if(!D.value){D.value=!0;try{await I.updateStoryboard(k,t.id,{asset_refs:e}),await L(!1)}catch(f){R(f,i)}finally{D.value=!1}}}async function aa(t,e){D.value=!0;try{await I.uploadAssetImage(k,t,e),await L(!1)}catch(i){R(i,"上传失败")}finally{D.value=!1}}async function sa(t){D.value=!0;try{await I.removeAssetImage(k,t),r.success("资产图已移入历史记录"),await L(!1)}catch(e){R(e,"移除失败")}finally{D.value=!1}}async function oa(t,e){D.value=!0;try{await I.uploadAssetAudio(k,t,e,await qa(e)),await L(!1)}catch(i){R(i,"上传失败")}finally{D.value=!1}}async function la(t,e){if(!Z.value){r.warning("请先选择一个分镜");return}try{await I.generate(k,w,Z.value.id,"image_generation",{asset_id:t,image_urls:e?[e]:void 0}),await L(!1)}catch(i){R(i,"生成资产图失败")}}async function na(t){try{await we.confirm("确定取消当前生成任务吗?取消后已扣积分不退。","取消生成",{type:"warning",confirmButtonText:"确认取消",cancelButtonText:"继续生成"}),await I.cancelTask(k,t.id),await L(!1)}catch(e){if(e==="cancel"||e==="close")return;R(e,"取消失败")}}function $t(t,e){S.value=t.id,$.value=void 0,m.value={type:e,storyboardId:t.id}}function ia(t,e){S.value=t.id,m.value=void 0,$.value={assetId:e.id}}async function ra(t,e,i={}){var x;const f=(x=g.value)==null?void 0:x.storyboards.find(q=>q.id===t);f&&await dt(e,e==="image_generation"?{...i,target_type:"storyboard"}:i,f)}async function ua(t,e){var i;try{await I.updateStoryboard(k,t,{duration_seconds:e});const f=(i=g.value)==null?void 0:i.storyboards.find(x=>x.id===t);f&&(f.duration_seconds=e)}catch(f){R(f,"时长保存失败")}}async function da(t=(e=>(e=Z.value)==null?void 0:e.id)()){if(t){S.value=t,Pe.value=!0,$e.value=!0;try{P.value=await I.outputs(k,t)}catch(i){R(i,"加载历史失败")}finally{$e.value=!1}}}function R(t,e){const i=$a(t);r.error(i.message,i.copyText,e)}function ca(t){var f;const e=((f=t.error_message)==null?void 0:f.trim())||"剧本解析失败",i=[`错误码:${t.error_code||"parse_failed"}`,`错误描述:${e}`,`任务 ID:${t.id}`].join(` `);r.error(e,i,"剧本解析失败")}return ne(S,()=>{P.value=[]}),Zt(()=>{L(),Ie=setInterval(()=>{se.value=Date.now()},1e3)}),Jt(()=>{fe&&clearInterval(fe),Ie&&clearInterval(Ie)}),(t,e)=>{const i=be("RouterLink"),f=be("el-button"),x=be("el-input"),q=be("el-dialog"),le=Qt("loading");return l(),j(Oa,{class:"drama-workbench-shell"},{default:_(()=>{var Ve,Xe,X,Oe,Mt,zt,Rt,Lt,qt,Ot,Ft;return[s("section",vo,[s("div",mo,[n(i,{class:"back-button",to:ze.value,title:"返回项目"},{default:_(()=>[n(d(Ia),{size:18})]),_:1},8,["to"]),s("strong",null,A(pt.value),1)]),s("div",yo,[n(f,{icon:d(Ca),onClick:_t},{default:_(()=>[...e[7]||(e[7]=[te("项目信息",-1)])]),_:1},8,["icon"]),n(f,{icon:d(Sa),onClick:gt},{default:_(()=>[...e[8]||(e[8]=[te("模型配置",-1)])]),_:1},8,["icon"]),n(f,{icon:d(Aa),onClick:ft},{default:_(()=>[...e[9]||(e[9]=[te("剧集原文",-1)])]),_:1},8,["icon"]),n(f,{icon:d(Ba),loading:de.value,disabled:!Ee.value,title:Ee.value?"下载当前剧集全部视频":"当前剧集暂无可下载视频",onClick:xe},{default:_(()=>[...e[10]||(e[10]=[te("下载全部视频",-1)])]),_:1},8,["icon","loading","disabled","title"]),n(f,{class:re(["parse-action",{"is-cancel":Q.value}]),type:Q.value?void 0:"primary",icon:Q.value?void 0:d(Ht),loading:pe.value,onClick:rt},{default:_(()=>{var p;return[Q.value?(l(),j(d(vt),{key:0,class:"spin",size:15})):h("",!0),te(A(Q.value?"取消解析":pe.value?"准备解析":(p=g.value)!=null&&p.storyboards.length?"重新解析剧本":"解析剧本"),1)]}),_:1},8,["class","type","icon","loading"])])]),Tt((l(),u("div",po,[s("section",fo,[s("div",_o,[s("table",go,[e[21]||(e[21]=s("thead",null,[s("tr",null,[s("th",{class:"sequence-column"},"序号"),s("th",{class:"script-column"},"分镜内容(双击编辑)"),s("th",{class:"entity-column"},"角色"),s("th",{class:"entity-column"},"场景"),s("th",{class:"entity-column"},"道具"),s("th",{class:"media-column"},"分镜图"),s("th",{class:"media-column"},"视频")])],-1)),s("tbody",null,[(l(!0),u(ve,null,he(((Ve=g.value)==null?void 0:Ve.storyboards)||[],p=>(l(),u(ve,{key:p.id},[s("tr",bo,[s("td",ko,[s("button",{type:"button",onClick:ee=>{He(p.id),Be("before")}},[e[12]||(e[12]=s("span",null,null,-1)),s("em",null,[n(d(It),{size:13}),e[11]||(e[11]=te("插入分镜",-1))]),e[13]||(e[13]=s("span",null,null,-1))],8,ho)])]),s("tr",{class:re(["storyboard-row",{active:p.id===S.value,locked:p.locked}]),onClick:ee=>He(p.id)},[s("td",$o,[s("b",null,A(p.sequence_no),1),s("div",Co,[s("button",{class:re(["lock-action",{active:p.locked}]),type:"button",title:p.locked?"解锁分镜":"锁定分镜",onClick:ce(ee=>qe(p),["stop"])},[p.locked?(l(),j(d(Va),{key:0,size:14})):(l(),j(d(Pa),{key:1,size:14}))],10,So),s("button",{class:"danger",type:"button",disabled:p.locked,title:p.locked?"分镜已锁定,无法删除":"删除分镜",onClick:ce(ee=>ut(p),["stop"])},[n(d(ja),{size:14})],8,xo)])]),s("td",Io,[c.value===p.id&&!p.locked?(l(),j(jt,{key:0,id:`storyboard-editor-${p.id}`,"model-value":p.script_content||"",class:"storyboard-content-editor",assets:Ne(p),variant:"drama-storyboard",placeholder:"输入分镜内容,输入 @ 插入当前分镜资产","onUpdate:modelValue":ee=>o(p,ee),onBlur:ee=>ge(p)},null,8,["id","model-value","assets","onUpdate:modelValue","onBlur"])):(l(),j(jt,{key:1,class:re(["script-content-display",{empty:!p.script_content,locked:p.locked}]),"model-value":p.script_content||"",assets:Ne(p),placeholder:p.locked?"暂无分镜内容":"双击编辑分镜内容",title:p.locked?"分镜已锁定":"双击编辑分镜内容",variant:"drama-storyboard",readonly:"",onDblclick:ce(ee=>z(p),["stop"])},null,8,["class","model-value","assets","placeholder","title","onDblclick"]))]),(l(),u(ve,null,he(["character","scene","prop"],ee=>s("td",{key:ee,class:"entity-cell"},[(l(!0),u(ve,null,he(lt(p,ee),me=>(l(),u("div",{key:me.id,class:"entity-chip"},[s("button",{class:"entity-chip-main",type:"button",title:`打开资产详情:${me.name}`,onClick:ce(va=>ia(p,me),["stop"])},[me.image_url?(l(),j(ie,{key:0,type:"image",compact:"",src:me.image_url,alt:me.name},null,8,["src","alt"])):(l(),u("span",Bo,A(me.name.slice(0,1)),1)),s("small",null,A(me.name),1),me.audio_url?(l(),j(d(Pt),{key:2,class:"entity-audio-icon",size:13,title:"已上传参考音频"})):h("",!0)],8,Ao),s("button",{class:"entity-remove",type:"button",disabled:p.locked||D.value,title:p.locked?"分镜已锁定,无法移除资产":`从当前分镜移除:${me.name}`,onClick:ce(va=>ta(p,me),["stop"])},[n(d(Da),{size:13})],8,To)]))),128)),lt(p,ee).length?h("",!0):(l(),u("span",Vo,"未关联"))])),64)),s("td",Po,[s("div",{class:"media-focus-target",title:"打开分镜图处理",onClick:ce(ee=>$t(p,"storyboard_image"),["stop"])},[p.thumbnail_url?(l(),j(ie,{key:0,type:"image",compact:"",src:p.thumbnail_url,alt:`分镜 ${p.sequence_no}`,"data-no-visual-search":""},null,8,["src","alt"])):nt(p,"image_generation")?(l(),u("span",Do,[n(d(vt),{class:"spin",size:24}),e[14]||(e[14]=s("small",null,"生成中",-1))])):(l(),u("span",Mo,[n(d(Ma),{size:24}),e[15]||(e[15]=s("small",null,"暂无图片",-1))]))],8,jo),!p.thumbnail_url&&Re(p)?(l(),u("div",{key:0,class:"storyboard-image-error",title:Re(p),onClick:ce(ee=>$t(p,"storyboard_image"),["stop"])},[n(d(Nt),{size:12}),s("span",null,"生成失败:"+A(Re(p)),1)],8,zo)):h("",!0)]),s("td",Ro,[s("div",{class:"media-focus-target",title:"打开视频处理",onClick:ce(ee=>$t(p,"storyboard_video"),["stop"])},[p.result_url?(l(),j(ie,{key:0,type:"video",compact:"",src:p.result_url,muted:"",preload:"metadata",playsinline:"",disablepictureinpicture:"",disableremoteplayback:"",controlslist:"nodownload noplaybackrate noremoteplayback"},null,8,["src"])):nt(p,"video_generation")?(l(),u("span",qo,[n(d(vt),{class:"spin",size:24}),e[16]||(e[16]=s("small",null,"生成中",-1))])):(l(),u("span",Oo,[n(d(za),{size:24}),e[17]||(e[17]=s("small",null,"暂无视频",-1))]))],8,Lo)])],10,wo)],64))),128)),(Xe=g.value)!=null&&Xe.storyboards.length?(l(),u("tr",Fo,[s("td",Uo,[s("button",{type:"button",onClick:e[0]||(e[0]=p=>{He(g.value.storyboards[g.value.storyboards.length-1].id),Be("after")})},[e[19]||(e[19]=s("span",null,null,-1)),s("em",null,[n(d(It),{size:13}),e[18]||(e[18]=te("插入分镜",-1))]),e[20]||(e[20]=s("span",null,null,-1))])])])):h("",!0)])]),!((X=g.value)!=null&&X.storyboards.length)&&Q.value?(l(),u("div",Go,[n(d(vt),{class:"spin",size:26}),s("strong",null,A(Ge.value),1),e[22]||(e[22]=s("span",null,"模型正在解析剧本并生成资产与分镜,请稍候。",-1))])):!((Oe=g.value)!=null&&Oe.storyboards.length)&&U.value?(l(),u("div",Eo,[n(d(Nt),{size:26}),e[24]||(e[24]=s("strong",null,"剧本解析失败",-1)),s("span",null,A(U.value.error_message||"模型返回结果无法解析,请重新解析。"),1),n(f,{type:"primary",icon:d(Ht),onClick:rt},{default:_(()=>[...e[23]||(e[23]=[te("重新解析",-1)])]),_:1},8,["icon"])])):(Mt=g.value)!=null&&Mt.storyboards.length?h("",!0):(l(),u("button",{key:2,class:"empty-storyboards",type:"button",onClick:Le},[n(d(It),{size:22}),e[25]||(e[25]=s("strong",null,"创建第一个分镜",-1)),e[26]||(e[26]=s("span",null,"也可以先解析剧本,由模型自动生成分镜。",-1))]))])]),s("aside",Wo,[n(co,{"project-id":d(k),"project-name":(zt=g.value)==null?void 0:zt.project.name,"episode-name":(Rt=g.value)==null?void 0:Rt.episode.name,assets:((Lt=g.value)==null?void 0:Lt.assets)||[],storyboards:((qt=g.value)==null?void 0:qt.storyboards)||[],"current-storyboard":Z.value,"video-generation-blocked-reason":et.value,"video-duration-range":Qe.value,"media-focus":m.value,"asset-focus":$.value,tasks:C.value,now:se.value,busy:D.value,"can-generate":!!Z.value,onCreate:y,onSave:T,onDelete:Te,onUploadImage:aa,onRemoveImage:sa,onUploadAudio:oa,onGenerateImage:la,onCancel:na,onAddToStoryboard:ea,onGenerateStoryboardMedia:ra,onUpdateStoryboardDuration:ua,onHistoryStoryboard:da,onHistoryChanged:e[1]||(e[1]=p=>L(!1))},null,8,["project-id","project-name","episode-name","assets","storyboards","current-storyboard","video-generation-blocked-reason","video-duration-range","media-focus","asset-focus","tasks","now","busy","can-generate"])])])),[[le,H.value]]),n(q,{modelValue:J.value,"onUpdate:modelValue":e[4]||(e[4]=p=>J.value=p),title:"剧集原文",width:"min(820px, calc(100vw - 28px))",class:"creative-dialog source-dialog"},{footer:_(()=>[n(f,{onClick:e[3]||(e[3]=p=>J.value=!1)},{default:_(()=>[...e[28]||(e[28]=[te("关闭",-1)])]),_:1}),n(f,{type:"primary",icon:d(Ta),loading:N.value,onClick:it},{default:_(()=>[...e[29]||(e[29]=[te("保存原文",-1)])]),_:1},8,["icon","loading"])]),default:_(()=>[Tt((l(),u("div",Ho,[s("div",No,[s("span",null,A(M.value.length.toLocaleString())+" 字",1),e[27]||(e[27]=s("small",null,"修改后保存,再解析剧本。",-1))]),n(x,{modelValue:M.value,"onUpdate:modelValue":e[2]||(e[2]=p=>M.value=p),type:"textarea",rows:22,resize:"none",placeholder:"输入或粘贴剧集原文"},null,8,["modelValue"])])),[[le,Y.value]])]),_:1},8,["modelValue"]),(Ot=g.value)!=null&&Ot.project?(l(),j(Ua,{key:0,modelValue:W.value,"onUpdate:modelValue":e[5]||(e[5]=p=>W.value=p),options:E.value,project:g.value.project,saving:ue.value,"project-type":"premium_drama",onSave:bt},null,8,["modelValue","options","project","saving"])):h("",!0),(Ft=g.value)!=null&&Ft.project?(l(),j(Fa,{key:1,modelValue:ae.value,"onUpdate:modelValue":e[6]||(e[6]=p=>ae.value=p),options:E.value,configs:g.value.project.model_configs,prompts:d(oe),"prompt-selections":d(je),saving:ue.value,"project-type":"premium_drama",onSave:st,onPromptSelect:d(Ce),onPromptCreate:d(Me),onPromptUpdate:d(K),onPromptDelete:d(Ue)},null,8,["modelValue","options","configs","prompts","prompt-selections","saving","onPromptSelect","onPromptCreate","onPromptUpdate","onPromptDelete"])):h("",!0)]}),_:1})}}}),il=yt(Xo,[["__scopeId","data-v-cfcfd377"]]);export{il as default};