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

2 lines
15 KiB
JavaScript

import{d as nt,u as st,B as it,y as rt,z as ut,q as B,w as n,g as dt,C as g,I as we,J as pt,n as ct,k as d,A as X,o as c,a,e as l,b as u,t as y,j as m,K as vt,p as ee,L as mt,D as ke,G as be,c as w,s as $,F as te,v as xe,M as Ce,E as Te,r as k,H as ft,h as _t,f as ae,N as gt}from"./index-p1BAR2Hc.js";import{A as yt,B as Ee,e as wt,f as kt,g as bt,h as xt,P as Ct,T as Tt}from"./icons-CbZw_MCi.js";import{C as Et}from"./CreativeSelect-CikGCVMP.js";import{L as Pt}from"./LoadingMedia-q1A6xJc7.js";import{M as ht}from"./ModelConfigDialog-BZPjXRWk.js";import{P as Dt}from"./ProjectDialog-kNoqvi7U.js";import{u as Vt,p as Lt}from"./useModelPrompts-BKmMdFPq.js";import{f as jt}from"./media-Do63jPLX.js";import{_ as Mt}from"./_plugin-vue_export-helper-DlAUqK2U.js";const Ft={class:"project-context-bar"},It={class:"project-context-main"},Bt={class:"project-context-actions creative-page-actions"},$t={key:0,class:"setup-notice"},St={class:"episode-list"},zt=["onClick"],Ut={class:"episode-cover"},Ot={key:1,class:"episode-cover-placeholder"},Rt={class:"episode-copy"},Nt={class:"episode-title-row"},At=["onBlur"],qt=["onClick"],Xt=["onClick"],Ht={class:"episode-meta"},Gt={key:0,class:"episode-empty"},Jt={class:"creation-options"},Kt={class:"creation-option-icon"},Wt=["disabled"],Qt={class:"creation-option-icon"},Yt={class:"import-dialog-title"},Zt={class:"import-tab-label"},ea={class:"import-form"},ta={class:"import-tab-label"},aa={class:"import-form"},oa={key:1,class:"import-preview"},la={key:0,class:"chapter-list"},na=nt({__name:"DramaProjectView",setup(sa){const oe=dt(),Pe=_t(),f=st(),_=String(oe.params.projectId),b=d(null),H=d({styles:[],models:[]}),G=d([]),O=d(!1),x=d(!1),R=d(!1),N=d(!1),F=d(!1),I=d(!1),T=d(),E=d(""),s=d(),J=d(1),A=d(1),S=d(!1),P=d(),q=d(""),z=d(""),K=d(),D=d("file"),V=d(!1),{prompts:he,promptSelections:De,loadPrompts:Ve,selectPrompt:Le,createPrompt:je,updatePrompt:Me,deletePrompt:Fe}=Vt();let L,U=0;const le=X(()=>["text","image","video"].every(t=>{var e;return(e=b.value)==null?void 0:e.model_configs.some(i=>i.model_type===t)})),Ie=[{modelType:"text",purpose:"prompt_reverse",settings:{prompt:""}},{modelType:"image",purpose:"image_generation",settings:{resolution:"1k",prompt:""}},{modelType:"video",purpose:"video_generation",settings:{resolution:"480p",prompt:""}}],Be=X(()=>new Map(G.value.map(t=>[t.episode_id,t]))),ne=new Set(["queued","running","retry_wait","cancel_requested"]),se=X(()=>G.value.some(t=>ne.has(t.status))),$e=X(()=>({name:"drama-projects"}));function W(t){const e=Be.value.get(t);return e&&ne.has(e.status)?e:void 0}function Se(t){return t.status==="running"?"剧本解析中":t.status==="retry_wait"?"剧本解析重试等待中":t.status==="cancel_requested"?"剧本解析取消中":"剧本解析排队中"}async function ze(t,e){const i=new Set(t.model_configs.map(p=>p.model_type)),r={};for(const p of Ie){if(i.has(p.modelType))continue;const v=e.models.find(C=>C.model_type===p.modelType);v&&(r[p.purpose]={model_id:v.id,settings:{...p.settings}})}return Object.keys(r).length?(await g.saveModels(_,r),g.project(_)):t}async function j(t=!0){var e;t&&(O.value=!0);try{const[i,r,p]=await Promise.all([g.project(_),g.options(),g.dramaParseTasks(_)]);H.value=r,G.value=p,b.value=await ze(i,r);const v=Math.max(0,...(((e=b.value)==null?void 0:e.episodes)||[]).map(C=>C.episode_no));A.value=v+1}catch(i){h(i,"加载失败")}finally{O.value=!1}Ue()}function Ue(){se.value&&!L?L=setInterval(()=>j(!1),3e3):!se.value&&L&&(clearInterval(L),L=void 0)}async function Oe(t){x.value=!0;try{await g.updateProject(_,{...t,project_type:"premium_drama",localization:null}),R.value=!1,f.success("项目已保存"),await j(!1)}catch(e){h(e,"保存失败")}finally{x.value=!1}}async function Re(t){x.value=!0;try{await g.saveModels(_,t),N.value=!1,f.success("模型配置已保存"),await j(!1)}catch(e){h(e,"保存失败")}finally{x.value=!1}}async function ie(){N.value=!0,await Ve(Lt)}function Ne(){F.value=!1,I.value=!0}async function Ae(){if(!x.value){x.value=!0;try{const t=await g.createEpisode(_);F.value=!1,f.success(`第 ${t.episode_no} 集已创建`),await j(!1)}catch(t){h(t,"创建失败")}finally{x.value=!1}}}function qe(t){K.value=t instanceof HTMLInputElement?t:void 0}async function Xe(t){var e,i;q.value=t.id,z.value=t.name||`第${t.episode_no}集`,await we(),(e=K.value)==null||e.focus(),(i=K.value)==null||i.select()}function He(){q.value="",z.value=""}async function Ge(t){var p;if(q.value!==t.id)return;const e=z.value.trim();if(He(),!e){f.warning("剧集名称不能为空");return}if((p=b.value)==null?void 0:p.episodes.some(v=>v.id!==t.id&&v.name.trim().toLocaleLowerCase()===e.toLocaleLowerCase())){f.warning("同一项目下不可有同名剧集");return}if(e===t.name)return;const r=t.name;t.name=e;try{await g.updateEpisodeName(_,t.id,e),f.success("剧集名称已保存")}catch(v){t.name=r,h(v,"保存剧集名称失败")}}async function Je(t,e){try{await Te.confirm(`确定删除第 ${e} 集吗?`,"删除剧集",{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消"}),await g.deleteEpisode(_,t),f.success("剧集已删除"),await j(!1)}catch(i){i!=="cancel"&&i!=="close"&&h(i,"删除失败")}}async function Ke(){if(!T.value&&!E.value.trim()){f.warning("请选择文件或粘贴小说正文");return}S.value=!0;try{s.value=await g.previewDramaImport(_,{file:T.value,rawText:E.value.trim()}),s.value.has_chapters||f.info("未识别到章节标题,请确认是否将全部内容作为一集导入。")}catch(t){h(t,"读取小说失败")}finally{S.value=!1}}async function We(){if(s.value){if(!s.value.has_chapters)try{await Te.confirm("未识别到章节标题,是否将全部内容作为一集导入?","确认单集导入",{type:"warning",confirmButtonText:"作为一集导入",cancelButtonText:"返回"})}catch{return}S.value=!0;try{await g.confirmDramaImport(_,{import_token:s.value.import_token,chapters_per_episode:J.value,start_episode_no:A.value,treat_as_single_episode:!s.value.has_chapters}),f.success("小说已导入"),Q(),await j(!1)}catch(t){h(t,"导入失败")}finally{S.value=!1}}}function re(t){var i,r;const e=t.name.trim().toLowerCase();return[".txt",".doc",".docx"].some(p=>e.endsWith(p))?t.size>3*1024*1024?(T.value=void 0,s.value=void 0,(r=P.value)==null||r.clearFiles(),f.warning("小说文件不能超过3MB"),!1):!0:(T.value=void 0,s.value=void 0,(i=P.value)==null||i.clearFiles(),f.warning("仅支持TXT、DOC、DOCX文件"),!1)}function Qe(t){!t.raw||!re(t.raw)||(D.value="file",T.value=t.raw,E.value="",s.value=void 0)}function Ye(){var t;E.value&&(T.value=void 0,(t=P.value)==null||t.clearFiles(),s.value=void 0)}function Q(){var t;I.value=!1,D.value="file",T.value=void 0,E.value="",s.value=void 0,Z(),(t=P.value)==null||t.clearFiles()}function Y(t){var e;return Array.from(((e=t.dataTransfer)==null?void 0:e.types)||[]).includes("Files")}function ue(t){!I.value||s.value||!Y(t)||(t.preventDefault(),U+=1,D.value="file",V.value=!0)}function de(t){!I.value||s.value||!Y(t)||(t.preventDefault(),t.dataTransfer&&(t.dataTransfer.dropEffect="copy"),V.value=!0)}function pe(t){if(V.value){if(!t.relatedTarget){Z();return}U=Math.max(0,U-1),U===0&&(V.value=!1)}}async function ce(t){var r,p,v,C;if(!I.value||s.value||!Y(t))return;t.preventDefault(),t.stopPropagation();const e=(p=(r=t.dataTransfer)==null?void 0:r.files)==null?void 0:p[0];if(Z(),!e||!re(e))return;D.value="file",await we();const i=e;i.uid=pt(),(v=P.value)==null||v.clearFiles(),(C=P.value)==null||C.handleStart(i)}function Z(){U=0,V.value=!1}async function Ze(t){await Pe.push({path:`/drama-projects/${_}/episodes/${t}`,query:{from:String(oe.query.from||"drama-projects")}})}function h(t,e){const i=ct(t);f.error(i.message,i.copyText,e)}return it(D,t=>{var e;s.value=void 0,t==="file"?E.value="":(T.value=void 0,(e=P.value)==null||e.clearFiles())}),rt(()=>{j(),document.addEventListener("dragenter",ue,!0),document.addEventListener("dragover",de,!0),document.addEventListener("dragleave",pe,!0),document.addEventListener("drop",ce,!0)}),ut(()=>{L&&clearInterval(L),document.removeEventListener("dragenter",ue,!0),document.removeEventListener("dragover",de,!0),document.removeEventListener("dragleave",pe,!0),document.removeEventListener("drop",ce,!0)}),(t,e)=>{const i=k("RouterLink"),r=k("el-button"),p=k("el-dialog"),v=k("el-tooltip"),C=k("el-icon"),et=k("el-upload"),ve=k("el-tab-pane"),tt=k("el-input"),at=k("el-tabs"),me=k("el-input-number"),fe=k("el-form-item"),ot=k("el-form"),lt=ft("loading");return c(),B(Et,{"page-title":"短剧创作"},{default:n(()=>{var _e,ge,ye;return[a("section",Ft,[a("div",It,[l(i,{class:"back-button",to:$e.value,title:"返回"},{default:n(()=>[l(u(yt),{size:18})]),_:1},8,["to"]),a("strong",null,y(((_e=b.value)==null?void 0:_e.name)||"短剧创作项目"),1)]),a("div",Bt,[l(r,{icon:u(vt),onClick:e[0]||(e[0]=o=>R.value=!0)},{default:n(()=>[...e[14]||(e[14]=[m("项目设置",-1)])]),_:1},8,["icon"]),l(r,{icon:u(mt),class:ee({"model-warning":!le.value}),onClick:ie},{default:n(()=>[...e[15]||(e[15]=[m("模型配置",-1)])]),_:1},8,["icon","class"]),l(r,{type:"primary",icon:u(ke),onClick:e[1]||(e[1]=o=>F.value=!0)},{default:n(()=>[...e[16]||(e[16]=[m("新建剧集",-1)])]),_:1},8,["icon"])])]),be((c(),w("div",null,[!le.value&&b.value?(c(),w("section",$t,[e[18]||(e[18]=a("div",null,[a("strong",null,"解析和生成前需要完成模型配置"),a("span",null,"分别选择文本、图像和视频模型,短剧创作与剧本反推配置相互独立。")],-1)),l(r,{type:"primary",onClick:ie},{default:n(()=>[...e[17]||(e[17]=[m("立即配置",-1)])]),_:1})])):$("",!0),a("section",St,[(c(!0),w(te,null,xe(((ge=b.value)==null?void 0:ge.episodes)||[],o=>(c(),w("article",{key:o.id,class:"episode-card",onClick:M=>Ze(o.id)},[a("div",Ut,[o.cover_video_url?(c(),B(Pt,{key:0,type:"video",src:u(jt)(o.cover_video_url),muted:"",playsinline:"",preload:"metadata",disablepictureinpicture:"",disableremoteplayback:"",controlslist:"nodownload noplaybackrate noremoteplayback"},null,8,["src"])):(c(),w("span",Ot,[l(u(Ee),{size:30})])),a("span",{class:ee(["episode-status",{active:W(o.id)}])},y(W(o.id)?Se(W(o.id)):`第 ${o.episode_no} 集`),3)]),a("div",Rt,[a("div",Nt,[q.value===o.id?be((c(),w("input",{key:0,ref_for:!0,ref:qe,"onUpdate:modelValue":e[2]||(e[2]=M=>z.value=M),maxlength:"160",onClick:e[3]||(e[3]=ae(()=>{},["stop"])),onBlur:M=>Ge(o)},null,40,At)),[[gt,z.value]]):(c(),w(te,{key:1},[a("h2",null,y(o.name||`第 ${o.episode_no} 集`),1),a("button",{type:"button",title:"编辑剧集名称",onClick:ae(M=>Xe(o),["stop"])},[l(u(Ct),{size:14})],8,qt)],64))]),a("button",{class:"episode-delete",type:"button",title:"删除",onClick:ae(M=>Je(o.id,o.episode_no),["stop"])},[l(u(Tt),{size:15})],8,Xt)]),a("div",Ht,[a("span",null,y(o.storyboard_count||0)+" 个分镜",1),a("span",null,y(o.analysis_message||(o.has_text_source?"原文已就绪":"待添加原文")),1)])],8,zt))),128)),!((ye=b.value)!=null&&ye.episodes.length)&&!O.value?(c(),w("div",Gt,[l(u(Ee),{size:36}),e[20]||(e[20]=a("strong",null,"暂无剧集",-1)),l(r,{type:"primary",icon:u(ke),onClick:e[4]||(e[4]=o=>F.value=!0)},{default:n(()=>[...e[19]||(e[19]=[m("新建剧集",-1)])]),_:1},8,["icon"])])):$("",!0)])])),[[lt,O.value]]),l(Dt,{modelValue:R.value,"onUpdate:modelValue":e[5]||(e[5]=o=>R.value=o),options:H.value,project:b.value,saving:x.value,"project-type":"premium_drama",onSave:Oe},null,8,["modelValue","options","project","saving"]),b.value?(c(),B(ht,{key:0,modelValue:N.value,"onUpdate:modelValue":e[6]||(e[6]=o=>N.value=o),options:H.value,configs:b.value.model_configs,prompts:u(he),"prompt-selections":u(De),saving:x.value,"project-type":"premium_drama",onSave:Re,onPromptSelect:u(Le),onPromptCreate:u(je),onPromptUpdate:u(Me),onPromptDelete:u(Fe)},null,8,["modelValue","options","configs","prompts","prompt-selections","saving","onPromptSelect","onPromptCreate","onPromptUpdate","onPromptDelete"])):$("",!0),l(p,{modelValue:F.value,"onUpdate:modelValue":e[7]||(e[7]=o=>F.value=o),title:"新建剧集",width:"min(560px,calc(100vw - 28px))",class:"creative-dialog"},{default:n(()=>[a("div",Jt,[a("button",{type:"button",onClick:Ne},[a("span",Kt,[l(u(wt),{size:22})]),e[21]||(e[21]=a("span",null,[a("strong",null,"导入剧本"),a("small",null,"上传文件或粘贴正文,按章节批量创建剧集")],-1))]),a("button",{type:"button",disabled:x.value,onClick:Ae},[a("span",Qt,[l(u(kt),{size:22})]),a("span",null,[a("strong",null,y(x.value?"正在创建":"创建空白剧集"),1),e[22]||(e[22]=a("small",null,"自动创建下一集,稍后填写剧集原文",-1))])],8,Wt)])]),_:1},8,["modelValue"]),l(p,{"model-value":I.value,title:"导入剧本",width:"min(700px,calc(100vw - 28px))",class:ee(["creative-dialog","import-dialog",{"page-drag-active":V.value}]),onClose:Q},{header:n(()=>[a("span",Yt,[e[24]||(e[24]=m("导入剧本 ",-1)),l(v,{placement:"top"},{content:n(()=>[...e[23]||(e[23]=[m("系统会按章节标题识别并切分内容,可设置每集包含的章节数。",-1),a("br",null,null,-1),m("未识别到有效章节标题时,可将全文作为一集导入。",-1)])]),default:n(()=>[l(u(xt),{class:"import-help",size:16,title:"查看章节切分说明"})]),_:1})])]),footer:n(()=>[s.value?(c(),B(r,{key:0,onClick:e[12]||(e[12]=o=>s.value=void 0)},{default:n(()=>[...e[28]||(e[28]=[m("返回",-1)])]),_:1})):$("",!0),l(r,{onClick:Q},{default:n(()=>[...e[29]||(e[29]=[m("取消",-1)])]),_:1}),l(r,{type:"primary",loading:S.value,onClick:e[13]||(e[13]=o=>s.value?We():Ke())},{default:n(()=>[m(y(s.value?"确认导入":"读取并预览"),1)]),_:1},8,["loading"])]),default:n(()=>[s.value?(c(),w("div",oa,[a("strong",null,y(s.value.has_chapters?`识别到 ${s.value.chapters.length} 个章节`:"未识别到章节标题"),1),a("p",null,"共 "+y(s.value.total_characters.toLocaleString())+" 字",1),s.value.has_chapters?(c(),w("div",la,[(c(!0),w(te,null,xe(s.value.chapters,(o,M)=>(c(),w("span",{key:M},[m(y(o.title),1),a("small",null,y(o.char_count)+" 字",1)]))),128))])):$("",!0),l(ot,{"label-position":"top"},{default:n(()=>[s.value.has_chapters?(c(),B(fe,{key:0,label:"每集包含章节数"},{default:n(()=>[l(me,{modelValue:J.value,"onUpdate:modelValue":e[10]||(e[10]=o=>J.value=o),min:1,max:20},null,8,["modelValue"])]),_:1})):$("",!0),l(fe,{label:"起始集数"},{default:n(()=>[l(me,{modelValue:A.value,"onUpdate:modelValue":e[11]||(e[11]=o=>A.value=o),min:1,max:9999},null,8,["modelValue"])]),_:1})]),_:1})])):(c(),B(at,{key:0,modelValue:D.value,"onUpdate:modelValue":e[9]||(e[9]=o=>D.value=o),class:"import-tabs",stretch:""},{default:n(()=>[l(ve,{name:"file"},{label:n(()=>[a("span",Zt,[l(C,null,{default:n(()=>[l(u(Ce))]),_:1}),e[25]||(e[25]=m("上传文件",-1))])]),default:n(()=>[a("div",ea,[l(et,{ref_key:"uploadRef",ref:P,class:"import-upload",drag:"","auto-upload":!1,limit:1,accept:".txt,.doc,.docx","on-change":Qe},{default:n(()=>[l(C,{class:"el-icon--upload"},{default:n(()=>[l(u(Ce))]),_:1}),a("div",null,y(V.value?"松开添加文件":"拖入或选择TXT、DOC、DOCX文件"),1),e[26]||(e[26]=a("small",null,"单个文件最大3MB",-1))]),_:1},512)])]),_:1}),l(ve,{name:"text"},{label:n(()=>[a("span",ta,[l(u(bt),{size:15}),e[27]||(e[27]=m("粘贴文本 ",-1))])]),default:n(()=>[a("div",aa,[l(tt,{modelValue:E.value,"onUpdate:modelValue":e[8]||(e[8]=o=>E.value=o),type:"textarea",rows:12,resize:"none",maxlength:"3145728",placeholder:"粘贴小说正文",onInput:Ye},null,8,["modelValue"])])]),_:1})]),_:1},8,["modelValue"]))]),_:1},8,["model-value","class"])]}),_:1})}}}),_a=Mt(na,[["__scopeId","data-v-8744c8a9"]]);export{_a as default};