Files
JuYou/API/static/web/assets/RedrawWorkbenchView-DHIAS1em.js
2026-08-25 17:59:42 +08:00

3 lines
26 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{d as ee,B as Z,o as p,c as k,a as n,t as x,G as ze,F as de,v as we,s as L,A as B,r as q,H as We,e as f,w as R,q as G,x as gt,b as C,X as Oe,m as bt,a0 as wt,a1 as kt,a2 as ht,u as Fe,k as y,p as K,a5 as ke,S as he,j as Q,$ as St,M as $t,W as Tt,a6 as Bt,a7 as Le,f as Y,U as xt,y as Ct,z as Vt,g as Pt,C as w,n as Rt,L as Dt,E as F}from"./index-p1BAR2Hc.js";import{n as qt,A as It}from"./icons-CbZw_MCi.js";import{C as Mt,a as je}from"./CreativeSelect-CikGCVMP.js";import{M as At}from"./ModelConfigDialog-BZPjXRWk.js";import{_ as te}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{t as Se,V as Ut}from"./taskTimeout-D92AUM04.js";import{A as Ee}from"./AssetPromptEditor-bfTzC_cs.js";import"./LoadingMedia-q1A6xJc7.js";const Lt={class:"redraw-column asset-column"},jt={class:"asset-list"},Et={key:0,class:"asset-group"},zt={class:"asset-group-title"},Wt={class:"asset-edit-row"},Ot={key:0,class:"column-empty"},Ft=ee({__name:"RedrawAssetPanel",props:{assets:{},busy:{type:Boolean}},emits:["save","delete"],setup(i,{emit:I}){const a=i,u=I,c=bt({}),s=[{type:"character",label:"角色",icon:wt},{type:"scene",label:"场景",icon:kt},{type:"prop",label:"道具",icon:ht}],d=B(()=>s.map(_=>({..._,items:a.assets.filter(S=>S.asset_type===_.type)})));Z(()=>a.assets,_=>_.forEach(S=>c[S.id]=S.name),{immediate:!0,deep:!0}),Z(()=>a.busy,(_,S)=>{S&&!_&&a.assets.forEach(o=>c[o.id]=o.name)});function h(_){const S=(c[_.id]||"").trim();if(!S){c[_.id]=_.name;return}S!==_.name&&u("save",_.id,{name:S})}function D(_){u("delete",_)}return(_,S)=>{const o=q("el-icon"),l=q("el-input"),v=q("el-button"),m=We("loading");return p(),k("section",Lt,[n("header",null,[S[0]||(S[0]=n("strong",null,"资产",-1)),n("small",null,x(i.assets.length),1)]),ze((p(),k("div",jt,[(p(!0),k(de,null,we(d.value,g=>(p(),k(de,{key:g.type},[g.items.length?(p(),k("div",Et,[n("div",zt,[f(o,null,{default:R(()=>[(p(),G(gt(g.icon)))]),_:2},1024),n("span",null,x(g.label),1),n("small",null,x(g.items.length),1)]),(p(!0),k(de,null,we(g.items,V=>(p(),k("label",{key:V.id,class:"asset-name"},[n("span",null,x(g.label),1),n("div",Wt,[f(l,{modelValue:c[V.id],"onUpdate:modelValue":P=>c[V.id]=P,maxlength:"80",onBlur:P=>h(V)},null,8,["modelValue","onUpdate:modelValue","onBlur"]),f(v,{class:"asset-delete-button",text:"",icon:C(Oe),disabled:i.busy,title:"删除资产",onClick:P=>D(V)},null,8,["icon","disabled","onClick"])])]))),128))])):L("",!0)],64))),128)),i.assets.length?L("",!0):(p(),k("div",Ot," 反推完成后将在这里显示资产。 "))])),[[m,i.busy]])])}}}),Nt=te(Ft,[["__scopeId","data-v-396012c3"]]),Xt={class:"redraw-column script-column"},Yt={key:0},Gt={class:"script-body"},Ht={key:1,class:"script-empty"},Jt=ee({__name:"RedrawScriptPanel",props:{content:{},ready:{type:Boolean},task:{},starting:{type:Boolean},saving:{type:Boolean},saveState:{},now:{}},emits:["reverse","stop","update:content","save"],setup(i,{emit:I}){const a=i,u=I,c=Fe(),s=y(!!a.content),d=B(()=>!!(a.task&&["pending_submission","submitting","submitted","processing","result_ready","downloading","cancel_requested"].includes(a.task.status))),h=B(()=>{var v;return((v=a.task)==null?void 0:v.status)==="cancel_requested"}),D=B(()=>a.saving?"保存中":a.saveState==="error"?"保存失败":a.saveState==="saved"?"已保存":""),_=B(()=>a.starting?"正在启动":h.value?"停止中":d.value?`停止反推 ${Se(a.task,a.now||Date.now())}`:a.ready?a.content.trim()?"重新反推为剧本":"反推为剧本":"请先完成所有分镜反推");function S(){d.value&&a.task?u("stop",a.task):u("reverse")}function o(v){u("update:content",v)}Z(()=>a.content,v=>{v&&(s.value=!0)});async function l(){if(a.content.trim())try{await navigator.clipboard.writeText(a.content),c.success("剧本已复制")}catch{c.error("复制失败,请检查浏览器剪贴板权限")}}return(v,m)=>{const g=q("el-input"),V=q("el-icon"),P=q("el-button");return p(),k("section",Xt,[n("header",null,[m[2]||(m[2]=n("strong",null,"剧本",-1)),s.value?(p(),k("small",Yt,x(i.content.length)+" 字",1)):L("",!0),D.value?(p(),k("small",{key:1,class:K(["script-save-state",{"is-error":i.saveState==="error"}])},x(D.value),3)):L("",!0),i.content?(p(),k("button",{key:2,type:"button",class:"script-copy-button",title:"复制剧本",onClick:l},[f(C(qt),{size:15}),m[1]||(m[1]=n("span",null,"复制",-1))])):L("",!0)]),n("div",Gt,[s.value?(p(),G(g,{key:0,"model-value":i.content,type:"textarea",resize:"none",disabled:d.value,"onUpdate:modelValue":o,onBlur:m[0]||(m[0]=ae=>v.$emit("save"))},null,8,["model-value","disabled"])):(p(),k("div",Ht,[f(V,null,{default:R(()=>[f(C(ke))]),_:1}),n("strong",null,x(d.value?"正在反推完整剧本":"尚未反推剧本"),1),n("span",null,x(i.ready?"全部分镜提示词已就绪,可以开始反推。":"请先完成所有分镜反推。"),1)])),f(P,{class:K(["script-action-button",{"is-unready":!d.value&&!i.ready}]),type:d.value?"danger":"primary",icon:d.value?C(he):C(ke),loading:i.starting,disabled:i.starting||h.value||!d.value&&!i.ready,onClick:S},{default:R(()=>[Q(x(_.value),1)]),_:1},8,["class","type","icon","loading","disabled"])])])}}}),Kt=te(Jt,[["__scopeId","data-v-63475711"]]),Qt={class:"source-body"},Zt={key:1,class:"source-empty"},ea=["disabled"],ta={key:2,class:"replace-video"},aa=["disabled"],sa=ee({__name:"RedrawSourcePanel",props:{source:{},uploading:{type:Boolean},dragging:{type:Boolean}},emits:["upload"],setup(i,{emit:I}){const a=I;function u(c){var h;const s=c.target,d=(h=s.files)==null?void 0:h[0];s.value="",d&&a("upload",d)}return(c,s)=>{var D,_;const d=q("el-icon"),h=q("el-button");return p(),k("section",{class:K(["redraw-column source-column",{dragging:i.dragging}])},[s[3]||(s[3]=n("header",null,[n("strong",null,"原视频上传")],-1)),n("div",Qt,[(D=i.source)!=null&&D.source_video_url?(p(),G(Ut,{key:0,src:i.source.source_video_url,"media-id":i.source.source_video_asset_id,"aspect-ratio":"9:16","transparent-controls":""},null,8,["src","media-id"])):(p(),k("label",Zt,[n("input",{type:"file",accept:"video/mp4,video/webm,video/quicktime,video/x-m4v,.mp4,.webm,.mov,.m4v",disabled:i.uploading,onChange:u},null,40,ea),f(d,null,{default:R(()=>[f(C(St))]),_:1}),n("strong",null,x(i.uploading?"正在上传":"上传原视频"),1),s[0]||(s[0]=n("span",null,"支持 MP4、WebM、MOV、M4V",-1)),s[1]||(s[1]=n("span",null,"最大 50MB,时长不超过 3 分钟",-1))])),(_=i.source)!=null&&_.source_video_url?(p(),k("label",ta,[n("input",{type:"file",accept:"video/mp4,video/webm,video/quicktime,video/x-m4v,.mp4,.webm,.mov,.m4v",disabled:i.uploading,onChange:u},null,40,aa),f(h,{icon:C($t),loading:i.uploading},{default:R(()=>[...s[2]||(s[2]=[Q("重新上传",-1)])]),_:1},8,["icon","loading"])])):L("",!0)])],2)}}}),na=te(sa,[["__scopeId","data-v-cfe498c0"]]),oa={class:"redraw-column text-column"},la={key:0,class:"text-editor"},ra={class:"selected-heading"},ia={class:"prompt-editor-wrap"},ua={key:1,class:"column-empty"},ca=ee({__name:"RedrawTextPanel",props:{storyboards:{},assets:{},selectedId:{},reinferTask:{},now:{},reinferring:{type:Boolean}},emits:["save","reinfer","stopReinfer"],setup(i,{emit:I}){const a=i,u=I,c=y(""),s=y(!1),d=B(()=>a.storyboards.find(o=>o.id===a.selectedId)),h=B(()=>!!(a.reinferTask&&["pending_submission","submitting","submitted","processing","result_ready","downloading","cancel_requested"].includes(a.reinferTask.status))),D=B(()=>{var o;return a.reinferring?"正在启动":((o=a.reinferTask)==null?void 0:o.status)==="cancel_requested"?"停止中":h.value?`停止反推 ${Se(a.reinferTask,a.now||Date.now())}`:"重新反推"});Z(d,o=>c.value=(o==null?void 0:o.prompt_content)||"",{immediate:!0});function _(){if(d.value&&c.value!==(d.value.prompt_content||"")){const o=a.assets.filter(l=>l.name.trim()&&c.value.includes(`@${l.name.trim()}`)).map(l=>({id:l.id,name:l.name}));u("save",{prompt_content:c.value,asset_refs:o})}}function S(){a.reinferTask?u("stopReinfer",a.reinferTask):u("reinfer")}return(o,l)=>{var V;const v=q("el-icon"),m=q("el-button"),g=q("el-dialog");return p(),k("section",oa,[n("header",null,[l[4]||(l[4]=n("strong",null,"分镜提示词",-1)),n("small",null,x(i.storyboards.length)+" 个分镜",1)]),d.value?(p(),k("div",la,[n("div",ra,[n("strong",null,"分镜 "+x(d.value.sequence_no),1),n("span",null,x(d.value.title||"未命名分镜"),1)]),n("div",ia,[f(Ee,{modelValue:c.value,"onUpdate:modelValue":l[0]||(l[0]=P=>c.value=P),assets:i.assets,variant:"redraw",placeholder:"输入提示词,输入 @ 插入资产",onBlur:_},null,8,["modelValue","assets"]),n("button",{class:"expand-button",type:"button",title:"放大编辑提示词",onClick:l[1]||(l[1]=P=>s.value=!0)},[f(v,null,{default:R(()=>[f(C(Tt))]),_:1})])]),f(m,{type:h.value?"danger":"default",icon:h.value?C(he):C(Bt),loading:i.reinferring,disabled:((V=i.reinferTask)==null?void 0:V.status)==="cancel_requested",onClick:S},{default:R(()=>[Q(x(D.value),1)]),_:1},8,["type","icon","loading","disabled"])])):(p(),k("div",ua," 完成视频抽帧后,将在这里显示分镜提示词。 ")),f(g,{modelValue:s.value,"onUpdate:modelValue":l[3]||(l[3]=P=>s.value=P),title:"分镜提示词",width:"min(900px, calc(100vw - 28px))",class:"web-dialog creative-dialog prompt-dialog","append-to-body":"",onClosed:_},{default:R(()=>[f(Ee,{modelValue:c.value,"onUpdate:modelValue":l[2]||(l[2]=P=>c.value=P),assets:i.assets,variant:"redraw",placeholder:"输入提示词,输入 @ 插入资产",expanded:"",onBlur:_},null,8,["modelValue","assets"])]),_:1},8,["modelValue"])])}}}),da=te(ca,[["__scopeId","data-v-35c7850c"]]),va={class:"timeline-panel"},fa=["onClick"],pa=["onClick"],ma=["onClick"],ya={class:"timeline-header"},_a=["onClick"],ga={key:1,class:"timeline-empty"},ba=ee({__name:"StoryboardTimeline",props:{storyboards:{},selectedId:{},tasks:{}},emits:["select","insert","delete"],setup(i,{emit:I}){const a=i,u=I,c=y(),s=new Set(["pending_submission","submitting","submitted","processing","result_ready","downloading","cancel_requested"]);function d(o,l){return a.tasks.filter(v=>v.task_type===l&&(v.storyboard_id===o.id||!v.storyboard_id&&v.sequence_no===o.sequence_no)).sort((v,m)=>Date.parse(m.created_at)-Date.parse(v.created_at))[0]}function h(o){const v=[d(o,"prompt_reverse")].filter(m=>!!m).sort((m,g)=>Date.parse(g.created_at)-Date.parse(m.created_at))[0];return v&&s.has(v.status)?v.status==="cancel_requested"?"停止中":v.storyboard_id?"重新反推中":"反推中":(v==null?void 0:v.status)==="failed"?"反推失败":(v==null?void 0:v.status)==="cancelled"?"反推已取消":o.prompt_content||o.script_content?"反推完成":o.status==="failed"?"反推失败":o.status==="generating"?"反推中":o.status==="queued"?"等待反推":""}function D(o){const l=h(o);return l.includes("失败")?"failed":l.includes("中")?"running":l.includes("完成")?"completed":"cancelled"}function _(o){const l=d(o,"prompt_reverse");return!!(l&&s.has(l.status))}function S(o){!c.value||Math.abs(o.deltaY)<=Math.abs(o.deltaX)||(o.preventDefault(),c.value.scrollLeft+=o.deltaY)}return(o,l)=>{const v=q("el-icon");return p(),k("section",va,[n("header",null,[n("div",null,[l[0]||(l[0]=n("strong",null,"分镜时间线",-1)),n("span",null,x(i.storyboards.length)+" 个镜头",1)])]),i.storyboards.length?(p(),k("div",{key:0,ref_key:"track",ref:c,class:"timeline-track",onWheel:S},[(p(!0),k(de,null,we(i.storyboards,m=>(p(),k("div",{key:m.id,class:"timeline-card-shell"},[n("button",{class:"timeline-insert timeline-insert-before",type:"button",title:"在前面插入分镜",onClick:Y(g=>u("insert",m,"before"),["stop"])},[f(v,null,{default:R(()=>[f(C(Le))]),_:1})],8,fa),n("button",{class:"timeline-insert timeline-insert-after",type:"button",title:"在后面插入分镜",onClick:Y(g=>u("insert",m,"after"),["stop"])},[f(v,null,{default:R(()=>[f(C(Le))]),_:1})],8,pa),n("article",{class:K(["timeline-card",{active:m.id===i.selectedId}]),onClick:g=>u("select",m)},[n("div",ya,[n("strong",{class:K({completed:m.prompt_content||m.script_content})},"分镜 "+x(m.sequence_no),3)]),n("div",{class:K(["timeline-status-center",D(m)])},[_(m)?(p(),G(v,{key:0,class:"is-loading"},{default:R(()=>[f(C(xt))]),_:1})):L("",!0),n("span",null,x(h(m)||"未反推"),1)],2),n("button",{class:"timeline-delete",type:"button",title:"删除分镜",onClick:Y(g=>u("delete",m),["stop"])},[f(v,null,{default:R(()=>[f(C(Oe))]),_:1})],8,_a)],10,ma)]))),128))],544)):(p(),k("div",ga,[...l[1]||(l[1]=[n("strong",null,"尚未生成分镜",-1),n("span",null,"开始反推后,分镜会按原片顺序出现在这里。",-1)])]))])}}}),wa=te(ba,[["__scopeId","data-v-c0c81a03"]]),ka={class:"analysis-bar"},ha={class:"analysis-controls"},Sa={key:0},$a=["disabled"],Ta={class:"analysis-actions creative-page-actions"},Ba={class:"workbench-grid"},xa=ee({__name:"RedrawWorkbenchView",setup(i){const I=Pt(),a=Fe(),u=String(I.params.projectId),c=String(I.params.episodeId),s=y(),d=y([]),h=y(""),D=y(!1),_=y(!1),S=y(!1),o=y(""),l=y(!1),v=y(!1),m=y(!1),g=y(""),V=y(""),P=y(!1),ae=y("idle"),se=y(!1),ve=y(!1),ne=y(!1),$e=y(),re=y(Date.now()),fe=y(!1),pe=y(!1),Te=y({styles:[],models:[]}),z=y([]),H=y({}),ie=y(!1),me=y(!1),M=y("video_audio"),N=y(""),Be=["剧本反推"],Ne=[{label:"识别视频音轨",value:"video_audio"},{label:"使用字幕文件",value:"subtitle_file"}],Xe=[{label:"自动识别",value:""},{label:"中文",value:"zh"},{label:"英语",value:"en"},{label:"日语",value:"ja"},{label:"韩语",value:"ko"}],oe=new Set(["pending_submission","submitting","submitted","processing","result_ready","downloading","cancel_requested"]),X=B(()=>{var t;return(t=s.value)==null?void 0:t.storyboards.find(e=>e.id===h.value)}),E=B(()=>d.value.find(t=>t.task_type==="prompt_reverse"&&t.mode!=="script"&&!t.storyboard_id&&oe.has(t.status))),ye=B(()=>d.value.filter(t=>t.task_type==="prompt_reverse"&&t.mode==="script").sort((t,e)=>Date.parse(e.created_at)-Date.parse(t.created_at))[0]),_e=B(()=>{if(X.value)return d.value.filter(t=>{var e,r;return t.task_type==="prompt_reverse"&&t.mode!=="script"&&(t.storyboard_id===((e=X.value)==null?void 0:e.id)||!t.storyboard_id&&t.sequence_no===((r=X.value)==null?void 0:r.sequence_no))}).sort((t,e)=>Date.parse(e.created_at)-Date.parse(t.created_at))[0]}),Ye=B(()=>_e.value&&oe.has(_e.value.status)?_e.value:void 0),Ge=B(()=>d.value.some(t=>t.task_type==="prompt_reverse"&&t.mode!=="script"&&(!!t.storyboard_id||t.sequence_no!==void 0)&&oe.has(t.status))),ue=B(()=>{var t,e;return!!((t=s.value)!=null&&t.source.source_video_url&&((e=s.value)!=null&&e.storyboards.length))}),xe=B(()=>{var t;return((t=s.value)==null?void 0:t.source.status)==="review"&&!!s.value.storyboards.length&&s.value.storyboards.every(e=>{var r;return!!((r=e.prompt_content)!=null&&r.trim())})&&!E.value&&!Ge.value}),Ce=B(()=>{var t;return d.value.some(e=>oe.has(e.status))||((t=s.value)==null?void 0:t.source.status)==="analyzing"}),He=B(()=>{var t,e;return l.value?"正在启动":((t=E.value)==null?void 0:t.status)==="cancel_requested"?"停止中":E.value?`停止:${((e=s.value)==null?void 0:e.source.analysis_message)||"正在反推"} ${Se(E.value,re.value)}`:ue.value?"全部重新反推":"开始反推"}),Je=B(()=>{var t,e;return l.value||!!(ye.value&&oe.has(ye.value.status))||((t=E.value)==null?void 0:t.status)==="cancel_requested"||M.value==="subtitle_file"&&!((e=s.value)!=null&&e.source.subtitle_asset_id)});Z(s,t=>{var e;t&&(fe.value=!0,M.value=t.source.audio_source||"video_audio",N.value=t.source.source_language||"",o.value=t.source.subtitle_original_name||"",!P.value&&g.value===V.value&&(g.value=t.script_content||"",V.value=g.value),t.storyboards.some(r=>r.id===h.value)||(h.value=((e=t.storyboards[0])==null?void 0:e.id)||""),queueMicrotask(()=>fe.value=!1))},{deep:!0});let W,le;function Ke(){ae.value="idle",W&&clearTimeout(W),W=setTimeout(()=>void J(),400)}function J(){if(W&&clearTimeout(W),W=void 0,le)return le.then(e=>e&&g.value!==V.value?J():e);if(g.value===V.value)return Promise.resolve(!0);const t=g.value;return P.value=!0,le=(async()=>{try{return await w.saveRedrawScript(u,c,t),V.value=t,s.value&&(s.value.script_content=t),ae.value="saved",!0}catch(e){return ae.value="error",T(e,"自动保存剧本失败"),!1}finally{P.value=!1,le=void 0}})(),le.then(e=>e&&g.value!==V.value?J():e)}async function Ve(){if(!(!s.value||pe.value||fe.value)&&!((s.value.source.audio_source||"video_audio")===M.value&&(s.value.source.source_language||"")===N.value)){pe.value=!0;try{await w.saveAnalysisSettings(u,c,{audio_source:M.value,source_language:N.value})}catch(t){T(t,"保存台词设置失败")}finally{pe.value=!1}}}Z([M,N],()=>void Ve());async function A(t=!0){t&&(D.value=!0);try{[s.value,d.value]=await Promise.all([w.redrawWorkbench(u,c),w.tasks(u,c)])}catch(e){T(e,"加载失败")}finally{t&&(D.value=!1)}}async function Qe(){try{Te.value=await w.options()}catch(t){T(t,"加载模型选项失败")}}async function Ze(){ie.value=!0;try{const t=await Promise.all(Be.map($=>w.promptPresets($))),e=new Map,r={};t.forEach(($,b)=>{($.prompts||[]).forEach(U=>e.set(U.id,U)),$.selected_id&&(r[Be[b]]=$.selected_id)}),z.value=[...e.values()],H.value=r}catch(t){T(t,"加载提示词失败")}}async function et(t){const e=t.prompt_reverse;if(!(e!=null&&e.model_id))return a.warning("请选择反推模型");me.value=!0;try{await w.saveModels(u,{prompt_reverse:e}),ie.value=!1,a.success("模型配置已保存"),await A(!1)}catch(r){T(r,"保存失败")}finally{me.value=!1}}async function tt(t){try{await w.selectPrompt(t.type,t.promptId),H.value={...H.value,[t.type]:t.promptId}}catch(e){T(e,"启用提示词失败")}}async function at(t){try{const e=await w.createCustomPrompt(t);z.value=[...z.value,e],await w.selectPrompt(t.type,e.id),H.value={...H.value,[t.type]:e.id}}catch(e){T(e,"保存自定义提示词失败")}}async function st(t){try{const e=await w.updateCustomPrompt(t.id,t);z.value=z.value.map(r=>r.id===e.id?e:r)}catch(e){T(e,"保存提示词失败")}}async function nt(t){try{await F.confirm("删除后不可恢复,确定删除该提示词吗?","删除提示词",{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消"}),await w.deleteCustomPrompt(t.id),z.value=z.value.filter(e=>e.id!==t.id)}catch(e){e!=="cancel"&&e!=="close"&&T(e,"删除提示词失败")}}async function ot(t){const e=t.name.toLowerCase().split(".").pop()||"";if(!["mp4","webm","mov","m4v"].includes(e))return a.error("不支持该视频格式"),!1;if(t.size>50*1024*1024)return a.error("视频不能超过 50MB"),!1;const r=URL.createObjectURL(t);try{const $=await new Promise((b,U)=>{const O=document.createElement("video");O.preload="metadata",O.onloadedmetadata=()=>b(O.duration),O.onerror=()=>U(new Error),O.src=r});return!Number.isFinite($)||$<=0||$>180?(a.error("视频时长不能超过 3 分钟"),!1):!0}catch{return a.error("视频读取失败"),!1}finally{URL.revokeObjectURL(r)}}async function Pe(t){if(!(_.value||!await ot(t))){if(ue.value)try{await F.confirm("重新上传视频将删除当前剧本的分镜和提示词,资产会保留。是否继续?","重新上传视频",{type:"warning",confirmButtonText:"继续上传",cancelButtonText:"取消"})}catch{return}_.value=!0;try{await w.uploadSource(u,c,t),a.success("原视频已上传"),await A(!1)}catch(e){T(e,"上传失败")}finally{_.value=!1}}}function lt(t){var r,$;ne.value=!1;const e=($=(r=t.dataTransfer)==null?void 0:r.files)==null?void 0:$[0];e&&Pe(e)}async function rt(t){var $;const e=t.target,r=($=e.files)==null?void 0:$[0];if(e.value="",!!r){S.value=!0;try{await w.uploadSubtitle(u,c,r),o.value=r.name,M.value="subtitle_file",await A(!1),await Ve()}catch(b){T(b,"上传失败")}finally{S.value=!1}}}async function it(){var t;if(E.value)return ge(E.value);if(!((t=s.value)!=null&&t.source.source_video_url))return a.warning("请先上传原视频");if(ue.value)try{await F.confirm("全部重新反推将替换当前分镜提示词和剧本,资产名称会保留。是否继续?","全部重新反推",{type:"warning",confirmButtonText:"继续",cancelButtonText:"取消"})}catch{return}l.value=!0;try{await w.saveAnalysisSettings(u,c,{audio_source:M.value,source_language:N.value});const e=ue.value?await w.reanalyze(u,c):await w.analyze(u,c);d.value.unshift(e),await A(!1)}catch(e){T(e,"反推失败")}finally{l.value=!1}}async function ut(t,e){se.value=!0;try{await w.updateAsset(u,t,{name:e.name}),await A(!1)}catch(r){T(r,"保存失败")}finally{se.value=!1}}async function ct(t){try{await F.confirm(`确定删除资产“${t.name}”吗?删除后,分镜提示词中的角色文字会保留,但 @ 标签会移除。`,"删除资产",{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消"}),se.value=!0,await w.deleteAsset(u,t.id),await A(!1),a.success("资产已删除")}catch(e){e!=="cancel"&&e!=="close"&&T(e,"删除资产失败")}finally{se.value=!1}}async function dt(t){if(X.value)try{await w.updateStoryboard(u,X.value.id,t),await A(!1)}catch(e){T(e,"保存失败")}}async function vt(t,e){try{const r=await w.insertStoryboard(u,t.id,e);h.value=r.id,await A(!1)}catch(r){T(r,"插入分镜失败")}}async function ft(t){try{await F.confirm(`确定删除分镜 ${t.sequence_no} 吗?`,"删除分镜",{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消"}),await w.deleteStoryboard(u,t.id),await A(!1)}catch(e){e!=="cancel"&&e!=="close"&&T(e,"删除分镜失败")}}async function pt(){if(X.value){try{await F.confirm("重新反推将仅替换当前分镜的反推结果,是否继续?","重新反推当前分镜",{type:"warning",confirmButtonText:"继续反推",cancelButtonText:"取消"})}catch{return}v.value=!0;try{d.value.unshift(await w.reinferStoryboard(u,c,X.value.id))}catch(t){T(t,"反推失败")}finally{v.value=!1}}}async function mt(){if(xe.value){if(g.value.trim())try{await F.confirm("重新反推将替换当前完整剧本,是否继续?","重新反推为剧本",{type:"warning",confirmButtonText:"继续反推",cancelButtonText:"取消"})}catch{return}if(await J()){m.value=!0;try{const t=await w.reverseRedrawScript(u,c);d.value.unshift(t),a.success("完整剧本反推任务已开始"),await A(!1)}catch(t){T(t,"剧本反推失败")}finally{m.value=!1}}}}async function ge(t){try{await F.confirm("确定停止当前反推任务吗?迟到结果将被丢弃,已扣积分不退。","停止反推",{type:"warning",confirmButtonText:"确认停止",cancelButtonText:"继续反推"})}catch(e){if(e==="cancel"||e==="close")return;throw e}try{t.status="cancel_requested",await w.cancelTask(u,t.id),await A(!1)}catch(e){T(e,"停止反推失败")}}async function yt(){if(!ve.value){ve.value=!0;try{const t=new Map(d.value.map(b=>[b.id,b.status])),e=await w.tasks(u,c),r=e.map(b=>`${b.id}:${b.status}`).join("|")!==d.value.map(b=>`${b.id}:${b.status}`).join("|");d.value=e;const $=e.filter(b=>b.task_type==="prompt_reverse"&&b.status==="failed"&&t.get(b.id)!=="failed");for(const b of $){const U=b.mode==="script"?"剧本反推失败":b.storyboard_id?"分镜反推失败":"视频反推失败";_t(b,U)}(r||Ce.value)&&(s.value=await w.redrawWorkbench(u,c))}finally{ve.value=!1}}}function _t(t,e){var b;const r=((b=t.error_message)==null?void 0:b.trim())||e,$=[`错误码:${t.error_code||"task_failed"}`,`错误描述:${r}`,`任务 ID${t.id}`].join(`
`);a.error(r,$,e)}function T(t,e){const r=Rt(t);a.error(r.message,r.copyText,e)}let ce,be,Re=!1;async function De(){await yt(),Re||(ce=setTimeout(De,Ce.value?1e3:5e3))}return Ct(async()=>{await Promise.all([A(),Qe()]),ce=setTimeout(De,1e3),be=setInterval(()=>re.value=Date.now(),1e3)}),Vt(()=>{Re=!0,ce&&clearTimeout(ce),be&&clearInterval(be),W&&clearTimeout(W),g.value!==V.value&&J()}),(t,e)=>{const r=q("RouterLink"),$=q("el-button"),b=We("loading");return p(),G(Mt,{class:"workbench-shell",onDragenter:e[6]||(e[6]=Y(U=>ne.value=!0,["prevent"])),onDragover:e[7]||(e[7]=Y(U=>ne.value=!0,["prevent"])),onDragleave:e[8]||(e[8]=Y(U=>ne.value=!1,["prevent"])),onDrop:Y(lt,["prevent"])},{default:R(()=>{var U,O,qe,Ie,Me,Ae;return[n("section",ka,[n("div",ha,[f(r,{class:"analysis-back",to:{name:"redraw-project",params:{projectId:C(u)}}},{default:R(()=>[f(C(It),{size:18})]),_:1},8,["to"]),n("label",null,[e[9]||(e[9]=n("span",null,"台词来源",-1)),f(je,{modelValue:M.value,"onUpdate:modelValue":e[0]||(e[0]=j=>M.value=j),options:Ne},null,8,["modelValue"])]),M.value==="video_audio"?(p(),k("label",Sa,[e[10]||(e[10]=n("span",null,"源语言",-1)),f(je,{modelValue:N.value,"onUpdate:modelValue":e[1]||(e[1]=j=>N.value=j),options:Xe,clearable:"",placeholder:"自动识别"},null,8,["modelValue"])])):L("",!0),M.value==="subtitle_file"?(p(),k("input",{key:1,ref_key:"subtitleInput",ref:$e,class:"source-file-input",type:"file",accept:".srt,.vtt,.txt",disabled:S.value,onChange:rt},null,40,$a)):L("",!0),M.value==="subtitle_file"?(p(),G($,{key:2,icon:C(ke),loading:S.value,onClick:e[2]||(e[2]=j=>{var Ue;return(Ue=$e.value)==null?void 0:Ue.click()})},{default:R(()=>[Q(x(o.value||"上传字幕"),1)]),_:1},8,["icon","loading"])):L("",!0)]),n("div",Ta,[f($,{icon:C(Dt),onClick:Ze},{default:R(()=>[...e[11]||(e[11]=[Q("模型配置",-1)])]),_:1},8,["icon"]),f($,{type:E.value?"danger":"primary",icon:E.value?C(he):void 0,disabled:Je.value,loading:l.value,onClick:it},{default:R(()=>[Q(x(He.value),1)]),_:1},8,["type","icon","disabled","loading"])])]),ze((p(),k("div",Ba,[f(na,{source:(U=s.value)==null?void 0:U.source,uploading:_.value,dragging:ne.value,onUpload:Pe},null,8,["source","uploading","dragging"]),f(Nt,{assets:((O=s.value)==null?void 0:O.assets)||[],busy:se.value,onSave:ut,onDelete:ct},null,8,["assets","busy"]),f(da,{storyboards:((qe=s.value)==null?void 0:qe.storyboards)||[],assets:((Ie=s.value)==null?void 0:Ie.assets)||[],"selected-id":h.value,"reinfer-task":Ye.value,now:re.value,reinferring:v.value,onSave:dt,onReinfer:pt,onStopReinfer:ge},null,8,["storyboards","assets","selected-id","reinfer-task","now","reinferring"]),f(Kt,{content:g.value,ready:xe.value,task:ye.value,starting:m.value,saving:P.value,"save-state":ae.value,now:re.value,"onUpdate:content":e[3]||(e[3]=j=>{g.value=j,Ke()}),onSave:J,onReverse:mt,onStop:ge},null,8,["content","ready","task","starting","saving","save-state","now"])])),[[b,D.value]]),f(wa,{storyboards:((Me=s.value)==null?void 0:Me.storyboards)||[],"selected-id":h.value,tasks:d.value,onSelect:e[4]||(e[4]=j=>h.value=j.id),onInsert:vt,onDelete:ft},null,8,["storyboards","selected-id","tasks"]),(Ae=s.value)!=null&&Ae.project?(p(),G(At,{key:0,modelValue:ie.value,"onUpdate:modelValue":e[5]||(e[5]=j=>ie.value=j),"analysis-only":"",options:Te.value,configs:s.value.project.model_configs,prompts:z.value,"prompt-selections":H.value,saving:me.value,onSave:et,onPromptSelect:tt,onPromptCreate:at,onPromptUpdate:st,onPromptDelete:nt},null,8,["modelValue","options","configs","prompts","prompt-selections","saving"])):L("",!0)]}),_:1})}}}),Aa=te(xa,[["__scopeId","data-v-ed325fc0"]]);export{Aa as default};