@bylqwjc/media-editor-server 1.0.15 → 1.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/dist/browser.cjs +1 -1
- package/core/dist/browser.js +2 -2
- package/core/dist/chunk-MGKYVYOH.js +1 -1
- package/core/dist/chunk-USY6UDGL.js +1 -1
- package/core/dist/chunk-XCBM7P7N.js +1 -1
- package/core/dist/engine.cjs +1 -1
- package/core/dist/engine.js +1 -1
- package/core/dist/filerobot.cjs +1 -1
- package/core/dist/filerobot.js +1 -1
- package/core/dist/index.cjs +1 -1
- package/core/dist/index.js +1 -1
- package/core/package.json +1 -1
- package/core/zod/index.cjs +1 -1
- package/core/zod/index.js +1 -1
- package/core/zod/v3/ZodError.cjs +1 -1
- package/core/zod/v3/ZodError.js +1 -1
- package/core/zod/v3/errors.cjs +1 -1
- package/core/zod/v3/errors.js +1 -1
- package/core/zod/v3/external.cjs +1 -1
- package/core/zod/v3/helpers/errorUtil.cjs +1 -1
- package/core/zod/v3/helpers/errorUtil.js +1 -1
- package/core/zod/v3/helpers/parseUtil.cjs +1 -1
- package/core/zod/v3/helpers/parseUtil.js +1 -1
- package/core/zod/v3/helpers/util.cjs +1 -1
- package/core/zod/v3/helpers/util.js +1 -1
- package/core/zod/v3/index.cjs +1 -1
- package/core/zod/v3/index.js +1 -1
- package/core/zod/v3/locales/en.cjs +1 -1
- package/core/zod/v3/locales/en.js +1 -1
- package/core/zod/v3/types.cjs +1 -1
- package/core/zod/v3/types.js +1 -1
- package/dist/adapters/express.cjs +1 -1
- package/dist/adapters/express.d.ts +2 -2
- package/dist/adapters/express.js +1 -1
- package/dist/adapters/web.cjs +1 -1
- package/dist/adapters/web.d.ts +2 -2
- package/dist/adapters/web.js +1 -1
- package/dist/index.cjs +4 -4
- package/dist/index.js +3 -3
- package/package.json +1 -1
package/dist/adapters/web.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var c=Object.defineProperty,w=Object.getOwnPropertyDescriptor,B=Object.getOwnPropertyNames,h=Object.prototype.hasOwnProperty,v=(e,r)=>{for(var t in r)c(e,t,{get:r[t],enumerable:!0})},D=(e,r,t,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of B(r))!h.call(e,a)&&a!==t&&c(e,a,{get:()=>r[a],enumerable:!(o=w(r,a))||o.enumerable});return e},C=e=>D(c({},"__esModule",{value:!0}),e),g={};v(g,{toWebPosterHandler:()=>O,toWebVideoHandler:()=>E}),module.exports=C(g);var m=16;function f(e){return typeof e=="object"&&e!==null&&typeof e.type=="string"&&typeof e.arrayBuffer=="function"}async function y(e){return{type:e.type,bytes:Buffer.from(await e.arrayBuffer())}}function s(e){return e.ok?new Response(new Uint8Array(e.bytes),{status:200,headers:{"Content-Type":e.contentType,"Content-Disposition":`attachment; filename="${e.filename}"`,"Cache-Control":"no-store"}}):new Response(JSON.stringify({error:e.error,message:e.message}),{status:e.status,headers:{"Content-Type":"application/json"}})}function E(e){return async r=>{let t;try{t=await r.formData()}catch{return s({ok:!1,status:400,error:"BAD_REQUEST",message:"\u8BF7\u6C42\u4F53\u89E3\u6790\u5931\u8D25"})}const o=[];for(let n=0;n<m;n++){const u=t.get(`video_${n}`);if(!f(u))break;o.push(await y(u))}const a=[];for(let n=0;n<m;n++){const u=t.get(`audio_${n}`);if(!f(u))break;a.push(await y(u))}const p=t.get("editState"),l=t.get("overlay"),i=f(l)?l:void 0,d=i?Buffer.from(await i.arrayBuffer()):void 0;if(i&&i.type!=="image/png")return s({ok:!1,status:415,error:"BAD_OVERLAY",message:"overlay \u5FC5\u987B\u662F PNG"});const b={videos:o,audios:a,overlay:d,editStateRaw:typeof p=="string"?p:""};return s(await e.handle(b))}}function O(e){return async r=>{let t;try{t=await r.formData()}catch{return s({ok:!1,status:400,error:"BAD_REQUEST",message:"\u8BF7\u6C42\u4F53\u89E3\u6790\u5931\u8D25"})}const o=t.get("file"),a=t.get("time");return!f(o)||typeof a!="string"?s({ok:!1,status:400,error:"BAD_REQUEST",message:"\u7F3A\u5C11 file \u6216 time"}):s(await e.handle(await y(o),Number(a)))}}
|
package/dist/adapters/web.d.ts
CHANGED
|
@@ -3,8 +3,8 @@ import { P as PosterHandler, V as VideoExportHandler } from '../handler-DL4Inp7o
|
|
|
3
3
|
/**
|
|
4
4
|
* Web 标准适配器(Next.js App Router 路由 / 任何接收 Request 返回 Response 的运行时)。
|
|
5
5
|
* 用法(Next):
|
|
6
|
-
* import { createVideoExportHandler } from '@media-editor
|
|
7
|
-
* import { toWebVideoHandler } from '@media-editor
|
|
6
|
+
* import { createVideoExportHandler } from '@bylqwjc/media-editor-server';
|
|
7
|
+
* import { toWebVideoHandler } from '@bylqwjc/media-editor-server/web';
|
|
8
8
|
* export const runtime = 'nodejs'; export const maxDuration = 300;
|
|
9
9
|
* export const POST = toWebVideoHandler(createVideoExportHandler());
|
|
10
10
|
*/
|
package/dist/adapters/web.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var g=16;function s(e){return typeof e=="object"&&e!==null&&typeof e.type=="string"&&typeof e.arrayBuffer=="function"}async function p(e){return{type:e.type,bytes:Buffer.from(await e.arrayBuffer())}}function o(e){return e.ok?new Response(new Uint8Array(e.bytes),{status:200,headers:{"Content-Type":e.contentType,"Content-Disposition":`attachment; filename="${e.filename}"`,"Cache-Control":"no-store"}}):new Response(JSON.stringify({error:e.error,message:e.message}),{status:e.status,headers:{"Content-Type":"application/json"}})}function C(e){return async y=>{let t;try{t=await y.formData()}catch{return o({ok:!1,status:400,error:"BAD_REQUEST",message:"\u8BF7\u6C42\u4F53\u89E3\u6790\u5931\u8D25"})}const u=[];for(let r=0;r<g;r++){const a=t.get(`video_${r}`);if(!s(a))break;u.push(await p(a))}const n=[];for(let r=0;r<g;r++){const a=t.get(`audio_${r}`);if(!s(a))break;n.push(await p(a))}const c=t.get("editState"),l=t.get("overlay"),m=t.get("videoCover"),i=s(l)?l:void 0,f=s(m)?m:void 0,B=i?Buffer.from(await i.arrayBuffer()):void 0,v=f?Buffer.from(await f.arrayBuffer()):void 0,d=[];for(let r=0;r<g;r++){const a=t.get(`textOverlay_${r}`);if(!s(a))break;if(a.type!=="image/png")return o({ok:!1,status:415,error:"BAD_OVERLAY",message:"textOverlay \u5FC5\u987B\u662F PNG"});d.push(Buffer.from(await a.arrayBuffer()))}if(i&&i.type!=="image/png")return o({ok:!1,status:415,error:"BAD_OVERLAY",message:"overlay \u5FC5\u987B\u662F PNG"});if(f&&!/^image\/(?:png|jpe?g)$/.test(f.type))return o({ok:!1,status:415,error:"BAD_COVER",message:"videoCover \u5FC5\u987B\u662F PNG \u6216 JPG"});const w={videos:u,audios:n,overlay:B,videoCover:v,textOverlays:d,editStateRaw:typeof c=="string"?c:""};return o(await e.handle(w))}}function F(e){return async y=>{let t;try{t=await y.formData()}catch{return o({ok:!1,status:400,error:"BAD_REQUEST",message:"\u8BF7\u6C42\u4F53\u89E3\u6790\u5931\u8D25"})}const u=t.get("file"),n=t.get("time");return!s(u)||typeof n!="string"?o({ok:!1,status:400,error:"BAD_REQUEST",message:"\u7F3A\u5C11 file \u6216 time"}):o(await e.handle(await p(u),Number(n)))}}export{F as toWebPosterHandler,C as toWebVideoHandler};
|
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
${
|
|
3
|
-
---end---`),
|
|
4
|
-
`,g.slice(-2e3)),new Error("\u5408\u6210\u5931\u8D25: \u8F93\u51FA mp4 \u7F3A\u5C11\u97F3\u8F68 (\u68C0\u67E5 filter_complex \u8BED\u6CD5)");console.log("[ffmpeg-runner] composeVideo \u5B8C\u6210,\u5DF2\u542B\u97F3\u89C6\u9891\u53CC\u6D41")}catch(g){if(g instanceof Error&&g.message.includes("\u5408\u6210\u5931\u8D25"))throw g}return(0,
|
|
1
|
+
"use strict";var K=Object.create;var M=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var Q=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty;var X=(e,t,u,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of J(t))!W.call(e,r)&&r!==u&&M(e,r,{get:()=>t[r],enumerable:!(o=U(t,r))||o.enumerable});return e};var Z=(e,t,u)=>(u=e!=null?K(Q(e)):{},X(t||!e||!e.__esModule?M(u,"default",{value:e,enumerable:!0}):u,e));var ee=Object.create,V=Object.defineProperty,te=Object.getOwnPropertyDescriptor,ue=Object.getOwnPropertyNames,re=Object.getPrototypeOf,oe=Object.prototype.hasOwnProperty,ne=(e,t,u,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ue(t))!oe.call(e,r)&&r!==u&&V(e,r,{get:()=>t[r],enumerable:!(o=te(t,r))||o.enumerable});return e},Ke=(e,t,u)=>(u=e!=null?ee(re(e)):{},ne(t||!e||!e.__esModule?V(u,"default",{value:e,enumerable:!0}):u,e)),ie=Object.create,R=Object.defineProperty,ae=Object.getOwnPropertyDescriptor,se=Object.getOwnPropertyNames,ce=Object.getPrototypeOf,le=Object.prototype.hasOwnProperty,pe=(e,t,u,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of se(t))!le.call(e,r)&&r!==u&&R(e,r,{get:()=>t[r],enumerable:!(o=ae(t,r))||o.enumerable});return e},Ue=(e,t,u)=>(u=e!=null?ie(ce(e)):{},pe(t||!e||!e.__esModule?R(u,"default",{value:e,enumerable:!0}):u,e)),fe=Object.create,I=Object.defineProperty,me=Object.getOwnPropertyDescriptor,de=Object.getOwnPropertyNames,ge=Object.getPrototypeOf,Fe=Object.prototype.hasOwnProperty,ye=(e,t,u,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of de(t))!Fe.call(e,r)&&r!==u&&I(e,r,{get:()=>t[r],enumerable:!(o=me(t,r))||o.enumerable});return e},Je=(e,t,u)=>(u=e!=null?fe(ge(e)):{},ye(t||!e||!e.__esModule?I(u,"default",{value:e,enumerable:!0}):u,e)),we=Object.create,L=Object.defineProperty,ve=Object.getOwnPropertyDescriptor,be=Object.getOwnPropertyNames,Ae=Object.getPrototypeOf,he=Object.prototype.hasOwnProperty,Ee=(e,t,u,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of be(t))!he.call(e,r)&&r!==u&&L(e,r,{get:()=>t[r],enumerable:!(o=ve(t,r))||o.enumerable});return e},Qe=(e,t,u)=>(u=e!=null?we(Ae(e)):{},Ee(t||!e||!e.__esModule?L(u,"default",{value:e,enumerable:!0}):u,e)),Oe=Object.create,D=Object.defineProperty,Ce=Object.getOwnPropertyDescriptor,Be=Object.getOwnPropertyNames,De=Object.getPrototypeOf,_e=Object.prototype.hasOwnProperty,je=(e,t)=>{for(var u in t)D(e,u,{get:t[u],enumerable:!0})},k=(e,t,u,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Be(t))!_e.call(e,r)&&r!==u&&D(e,r,{get:()=>t[r],enumerable:!(o=Ce(t,r))||o.enumerable});return e},xe=(e,t,u)=>(u=e!=null?Oe(De(e)):{},k(t||!e||!e.__esModule?D(u,"default",{value:e,enumerable:!0}):u,e)),Pe=e=>k(D({},"__esModule",{value:!0}),e),N={};je(N,{DEFAULT_LIMITS:()=>G,composeVideo:()=>Le,createPosterHandler:()=>He,createVideoExportHandler:()=>Ge,extractAudio:()=>Re,probeHasAudio:()=>T,probeVideoDuration:()=>Y,runVideoEdit:()=>$}),module.exports=Pe(N);var Te=require("../core/dist/index.cjs"),q=require("../core/dist/index.cjs"),P=xe(require("ffmpeg-static"),1),_=require("child_process"),d=require("fs/promises"),$e=require("fs"),Se=require("os"),f=require("path"),Me={};async function Ve(){const e=[];P.default&&typeof P.default=="string"&&e.push(P.default);try{const{createRequire:t}=await import("module"),u=t(Me.url).resolve("ffmpeg-static/package.json"),o=u.substring(0,u.lastIndexOf("/"));e.push((0,f.join)(o,"ffmpeg"))}catch{}e.push((0,f.join)(process.cwd(),"node_modules","ffmpeg-static","ffmpeg"),(0,f.join)(process.cwd(),"node_modules",".pnpm","ffmpeg-static@5.3.0","node_modules","ffmpeg-static","ffmpeg"));for(const t of e)if(t&&!t.startsWith("/ROOT/"))try{return await(0,d.access)(t,$e.constants.X_OK),t}catch{}return null}var j;async function x(){return j!==void 0||(j=await Ve(),j||console.warn("[ffmpeg-runner] ffmpeg-static \u4E8C\u8FDB\u5236\u672A\u627E\u5230 (\u5C1D\u8BD5\u4E86\u591A\u4E2A fallback \u8DEF\u5F84)")),j}async function B({args:e,timeoutMs:t=18e4}){const u=await x();if(!u)throw new Error("ffmpeg-static \u4E8C\u8FDB\u5236\u7F3A\u5931 \u2014 \u8BF7\u68C0\u67E5 node_modules/ffmpeg-static/ffmpeg \u662F\u5426\u5B58\u5728");return console.log("[ffmpeg-runner] args:",JSON.stringify(e)),new Promise((o,r)=>{const i=(0,_.spawn)(u,e,{stdio:["ignore","pipe","pipe"]});let a="",p=!1;const s=setTimeout(()=>{p=!0,i.kill("SIGKILL"),r(new Error(`ffmpeg \u8D85\u65F6 (${t}ms)`))},t);i.stderr.on("data",n=>{a+=n.toString(),a.length>8192&&(a=a.slice(-8192))}),i.on("close",n=>{if(clearTimeout(s),p)return;const m=a.slice(-2500);console.log(`[ffmpeg-runner] exit=${n}, stderr tail:
|
|
2
|
+
${m}
|
|
3
|
+
---end---`),n===0?o():r(new Error(`ffmpeg \u9000\u51FA\u7801 ${n}: ${m.slice(-800)}`))}),i.on("error",n=>{clearTimeout(s),r(n)})})}async function C(e){const t=await(0,d.mkdtemp)((0,f.join)((0,Se.tmpdir)(),"vtrans-"));try{return await e(t)}finally{(0,d.rm)(t,{recursive:!0,force:!0}).catch(()=>{})}}async function T(e){const t=await x();return t?C(async u=>{const o=(0,f.join)(u,"probe.mp4");return await(0,d.writeFile)(o,e),new Promise(r=>{const i=(0,_.spawn)(t,["-hide_banner","-i",o],{stdio:["ignore","ignore","pipe"]});let a="";const p=setTimeout(()=>{i.kill("SIGKILL"),r(!1)},15e3);i.stderr.on("data",s=>{a+=s.toString(),a.length>16384&&(a=a.slice(-16384))}),i.on("close",()=>{clearTimeout(p),r(/Stream #[^\n]*Audio:/.test(a))}),i.on("error",()=>{clearTimeout(p),r(!1)})})}):!1}async function Re(e){return C(async t=>{const u=(0,f.join)(t,"in.mp4"),o=(0,f.join)(t,"audio.mp3");return await(0,d.writeFile)(u,e),await B({args:["-y","-i",u,"-vn","-acodec","libmp3lame","-ar","16000","-ac","1","-b:a","64k",o],timeoutMs:6e4}),(0,d.readFile)(o)})}var Ie=["Fontsize=14","PrimaryColour=&H00FFFFFF","OutlineColour=&H00000000","BackColour=&H80000000","BorderStyle=1","Outline=2","Shadow=0","Alignment=2","MarginV=80","Bold=1"].join(",");async function Le(e){const t=(await Y(e.videoBytes)).durationSeconds;return C(async u=>{const o=(0,f.join)(u,"in.mp4"),r=(0,f.join)(u,"out.mp4");await(0,d.writeFile)(o,e.videoBytes);const i=["-i",o];let a=-1,p=-1;if(e.newAudioBytes){const g=(0,f.join)(u,"new.mp3");await(0,d.writeFile)(g,e.newAudioBytes),a=(i.length-0)/2,i.push("-i",g)}if(e.bgmAudioBytes){const g=(0,f.join)(u,"bgm.mp3");await(0,d.writeFile)(g,e.bgmAudioBytes),p=i.length/2,i.push("-i",g)}const s=e.srtContent&&e.srtContent.trim().length>0;let n=null;s&&(n=(0,f.join)(u,"subs.srt"),await(0,d.writeFile)(n,e.srtContent));const m=e.bgmVolume??.18;console.log(`[ffmpeg-runner] composeVideo: video=${e.videoBytes.length}B (${t.toFixed(2)}s), newAudio=${e.newAudioBytes?.length??0}B, bgm=${e.bgmAudioBytes?.length??0}B@${m}, srt=${e.srtContent?.length??0}chars`);const y=Ie.replace(/,/g,"\\,"),w=[];let v,A=!1;s&&n?(w.push(`[0:v]subtitles=${n}:force_style=${y}[v]`),v="[v]",A=!0):v="0:v:0";const b=[];a>=0&&b.push({idx:a,isBgm:!1}),p>=0&&b.push({idx:p,isBgm:!0});let c=null;if(b.length===1)c=`${b[0].idx}:a:0`;else if(b.length>=2){const g=[];for(const h of b)h.isBgm?(w.push(`[${h.idx}:a]volume=${m}[bgm]`),g.push("[bgm]")):g.push(`[${h.idx}:a]`);w.push(`${g.join("")}amix=inputs=${g.length}:duration=first:dropout_transition=0[a]`),c="[a]"}const F=["-y",...i];w.length>0&&F.push("-filter_complex",w.join(";")),F.push("-map",v),c&&F.push("-map",c),A?F.push("-c:v","libx264","-preset","fast","-crf","22","-pix_fmt","yuv420p"):F.push("-c:v","copy"),F.push("-c:a","aac","-b:a","128k","-ar","44100","-ac","2","-movflags","+faststart","-t",t.toFixed(3)),F.push(r),await B({args:F,timeoutMs:18e4});const O=c?await x():null;if(O)try{const g=await new Promise(h=>{const E=(0,_.spawn)(O,["-i",r],{stdio:["ignore","pipe","pipe"]});let S="";E.stderr.on("data",z=>S+=z.toString()),E.on("close",()=>h(S))});if(!/Audio:/.test(g))throw console.error(`[ffmpeg-runner] \u4EA7\u7269\u7F3A\u5C11\u97F3\u8F68,ffmpeg \u6D41\u6982\u89C8:
|
|
4
|
+
`,g.slice(-2e3)),new Error("\u5408\u6210\u5931\u8D25: \u8F93\u51FA mp4 \u7F3A\u5C11\u97F3\u8F68 (\u68C0\u67E5 filter_complex \u8BED\u6CD5)");console.log("[ffmpeg-runner] composeVideo \u5B8C\u6210,\u5DF2\u542B\u97F3\u89C6\u9891\u53CC\u6D41")}catch(g){if(g instanceof Error&&g.message.includes("\u5408\u6210\u5931\u8D25"))throw g}return(0,d.readFile)(r)})}async function Y(e){return C(async t=>{const u=(0,f.join)(t,"in.mp4");await(0,d.writeFile)(u,e);const o=await x();if(!o)throw new Error("ffmpeg-static \u4E8C\u8FDB\u5236\u7F3A\u5931");return new Promise((r,i)=>{const a=(0,_.spawn)(o,["-i",u],{stdio:["ignore","pipe","pipe"]});let p="";a.stderr.on("data",s=>p+=s.toString()),a.on("close",()=>{const s=p.match(/Duration:\s*(\d+):(\d+):(\d+(?:\.\d+)?)/);if(!s)return i(new Error("\u65E0\u6CD5\u89E3\u6790\u89C6\u9891\u65F6\u957F"));const n=parseInt(s[1]),m=parseInt(s[2]),y=parseFloat(s[3]);r({durationSeconds:n*3600+m*60+y})}),a.on("error",i)})})}async function $(e,t,u="mp4",o=[],r=24e4){return C(async i=>{const a=(0,f.join)(i,"input.mp4"),p=(0,f.join)(i,`output.${u}`);await(0,d.writeFile)(a,e);const s={};for(const n of o){const m=n.name.replace(/[^a-zA-Z0-9._-]/g,"_"),y=(0,f.join)(i,m);await(0,d.writeFile)(y,n.bytes),s[n.name]=y}return await B({args:t(a,p,s),timeoutMs:r}),(0,d.readFile)(p)})}function ke(e){const t=String(e??"").toLowerCase();return t==="mp4"||t==="mov"}function Ne(e,t,u){return["-y","-loop","1","-t","0.04","-i",t,"-i",e,"-filter_complex","[0:v][1:v]scale2ref=w=main_w:h=main_h[vcover][vmainref];[vcover]setsar=1,fps=30,format=yuv420p[vcoverf];[vmainref]setpts=PTS-STARTPTS,fps=30,format=yuv420p[vmain];[vcoverf][vmain]concat=n=2:v=1:a=0[v]","-map","[v]","-map","1:a?","-c:v","libx264","-preset","fast","-crf","18","-pix_fmt","yuv420p","-c:a","copy","-movflags","+faststart",u]}async function qe(e,t,u="mp4",o=[],r,i=24e4){return C(async a=>{const p=(0,f.join)(a,"input.mp4"),s=(0,f.join)(a,`output.${u}`),n=(0,f.join)(a,"video-cover.png"),m=(0,f.join)(a,`output-with-cover.${u}`);await(0,d.writeFile)(p,e);const y={};for(const w of o){const v=w.name.replace(/[^a-zA-Z0-9._-]/g,"_"),A=(0,f.join)(a,v);await(0,d.writeFile)(A,w.bytes),y[w.name]=A}return await B({args:t(p,s,y),timeoutMs:i}),!ke(u)||!r?.length?(0,d.readFile)(s):(await(0,d.writeFile)(n,r),await B({args:Ne(s,n,m),timeoutMs:i}),(0,d.readFile)(m))})}var G={maxVideos:6,maxAudios:3,maxVideoBytes:100*1024*1024,maxTotalVideoBytes:300*1024*1024,maxAudioBytes:30*1024*1024,maxOverlayBytes:20*1024*1024},l=(e,t,u)=>({ok:!1,status:e,error:t,message:u});function H(e){return e.startsWith("video/")?"mp4":e.includes("mpeg")||e.includes("mp3")?"mp3":e.includes("wav")?"wav":e.includes("aac")?"aac":e.includes("ogg")?"ogg":e.includes("mp4")||e.includes("m4a")?"m4a":e.includes("flac")?"flac":"bin"}function Ye(e){if(!e?.poster?.useAsVideoCover)return;const t=(typeof e.poster.preview=="string"?e.poster.preview:"").match(/^data:image\/(?:png|jpe?g);base64,([a-z0-9+/=]+)$/i);if(t)return Buffer.from(t[1],"base64")}function Ge(e){const t={...G,...e?.limits};return{async handle(u){const{videos:o,audios:r,overlay:i,videoCover:a,editStateRaw:p}=u;if(o.length>t.maxVideos)return l(413,"TOO_MANY",`\u89C6\u9891\u6570\u8D85\u8FC7 ${t.maxVideos}`);for(let n=0;n<o.length;n++){if(!/^video\//.test(o[n].type))return l(415,"BAD_TYPE",`video_${n} \u4E0D\u662F\u89C6\u9891\u6587\u4EF6`);if(o[n].bytes.length>t.maxVideoBytes)return l(413,"TOO_LARGE",`\u89C6\u9891 ${n+1} \u8D85\u8FC7 100MB`)}if(!o.length)return l(400,"BAD_REQUEST","\u7F3A\u5C11\u89C6\u9891\u6587\u4EF6(video_0)");if(o.reduce((n,m)=>n+m.bytes.length,0)>t.maxTotalVideoBytes)return l(413,"TOO_LARGE","\u89C6\u9891\u603B\u5927\u5C0F\u8D85\u8FC7 300MB,\u8BF7\u51CF\u5C11\u7D20\u6750\u6216\u538B\u7F29");if(r.length>t.maxAudios)return l(413,"TOO_MANY",`\u97F3\u9891\u6570\u8D85\u8FC7 ${t.maxAudios}`);for(let n=0;n<r.length;n++){const m=/^audio\//.test(r[n].type),y=/^video\//.test(r[n].type);if(!m&&!y)return l(415,"BAD_TYPE",`audio_${n} \u4E0D\u662F\u97F3\u9891\u6216\u89C6\u9891\u6587\u4EF6`);if(r[n].bytes.length>(y?t.maxVideoBytes:t.maxAudioBytes))return l(413,"TOO_LARGE",`\u97F3\u9891 ${n+1} \u8D85\u8FC7 ${y?"100MB":"30MB"}`)}if(typeof p!="string")return l(400,"BAD_REQUEST","\u7F3A\u5C11 editState");if(i&&i.length>t.maxOverlayBytes)return l(413,"OVERLAY_TOO_LARGE","overlay \u8FC7\u5927");if(a&&a.length>t.maxOverlayBytes)return l(413,"COVER_TOO_LARGE","videoCover \u8FC7\u5927");let s;try{s=Te.VideoEditState.parse(JSON.parse(p))}catch{return l(400,"BAD_STATE","\u7F16\u8F91\u53C2\u6570\u4E0D\u5408\u6CD5")}if(s.clips.some(n=>n.srcIdx>=o.length))return l(400,"BAD_STATE","clips.srcIdx \u8D85\u51FA\u4E0A\u4F20\u89C6\u9891\u6570");if((s.audioClips??[]).some(n=>n.srcIdx>=r.length))return l(400,"BAD_STATE","audioClips.srcIdx \u8D85\u51FA\u4E0A\u4F20\u97F3\u9891\u6570");try{const n=o.map(c=>c.bytes),m=r.map(c=>c.bytes),y=[...new Set((s.audioClips??[]).map(c=>c.srcIdx))];for(const c of y)if(/^video\//.test(r[c].type)&&!await T(m[c]))return l(400,"BAD_TYPE",`\u97F3\u9891 ${c+1} \u662F\u89C6\u9891\u6587\u4EF6\u4F46\u6CA1\u6709\u97F3\u8F68,\u65E0\u6CD5\u63D0\u53D6\u58F0\u97F3`);const w=o.map(()=>!1);if(s.keepAudio){const c=[...new Set(s.clips.map(F=>F.srcIdx))];await Promise.all(c.map(async F=>{w[F]=await T(n[F])})),!w.some(Boolean)&&!(s.audioClips??[]).length&&(s={...s,keepAudio:!1})}const v=[];for(let c=1;c<n.length;c++)v.push({name:`video_${c}.mp4`,bytes:n[c]});m.forEach((c,F)=>v.push({name:`audio_${F}.${H(r[F].type)}`,bytes:c})),i&&v.push({name:"overlay.png",bytes:i});const A=a?.length?a:Ye(s),b=(c,F,O)=>{const g={videoPaths:[c,...n.slice(1).map((h,E)=>O[`video_${E+1}.mp4`])],videoHasAudio:w,audioPaths:m.map((h,E)=>O[`audio_${E}.${H(r[E].type)}`]),overlayPath:i?O["overlay.png"]:void 0};return(0,q.buildFfmpegArgs)(s,g,F)};return{ok:!0,bytes:A==null?await $(n[0],b,"mp4",v,28e4):await qe(n[0],b,"mp4",v,A,28e4),contentType:"video/mp4",filename:"edited.mp4"}}catch(n){return(n.message??"").includes("\u4E8C\u8FDB\u5236\u7F3A\u5931")?l(503,"SERVER_NOT_READY","\u670D\u52A1\u7AEF\u7F16\u7801\u7EC4\u4EF6\u672A\u5C31\u7EEA\uFF08ffmpeg \u7F3A\u5931\uFF09\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458"):l(502,"ENCODE_FAILED","\u89C6\u9891\u5904\u7406\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\u6216\u6362\u66F4\u77ED\u7684\u89C6\u9891")}}}}function He(e){const t=e?.maxBytes??104857600;return{async handle(u,o){if(!/^video\//.test(u.type))return l(415,"BAD_TYPE","\u53EA\u652F\u6301\u89C6\u9891\u6587\u4EF6");if(u.bytes.length>t)return l(413,"TOO_LARGE","\u6587\u4EF6\u8D85\u8FC7 100MB");if(!isFinite(o)||o<0)return l(400,"BAD_TIME","time \u53C2\u6570\u4E0D\u5408\u6CD5");try{return{ok:!0,bytes:await $(u.bytes,(r,i)=>(0,q.buildPosterArgs)(r,o,i),"jpg"),contentType:"image/jpeg",filename:"poster.jpg"}}catch(r){return(r.message??"").includes("\u4E8C\u8FDB\u5236\u7F3A\u5931")?l(503,"SERVER_NOT_READY","\u670D\u52A1\u7AEF\u7F16\u7801\u7EC4\u4EF6\u672A\u5C31\u7EEA\uFF08ffmpeg \u7F3A\u5931\uFF09\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458"):l(502,"EXTRACT_FAILED","\u5C01\u9762\u62BD\u53D6\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5")}}}}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{VideoEditState as
|
|
1
|
+
import{VideoEditState as k}from"../core/dist/index.js";import{buildFfmpegArgs as Y,buildPosterArgs as j}from"../core/dist/index.js";import R from"ffmpeg-static";import{spawn as b}from"child_process";import{writeFile as A,readFile as x,mkdtemp as G,rm as H,access as N}from"fs/promises";import{constants as z}from"fs";import{tmpdir as K}from"os";import{join as d}from"path";async function U(){const e=[];R&&typeof R=="string"&&e.push(R);try{const{createRequire:t}=await import("module"),o=t(import.meta.url).resolve("ffmpeg-static/package.json"),r=o.substring(0,o.lastIndexOf("/"));e.push(d(r,"ffmpeg"))}catch{}e.push(d(process.cwd(),"node_modules","ffmpeg-static","ffmpeg"),d(process.cwd(),"node_modules",".pnpm","ffmpeg-static@5.3.0","node_modules","ffmpeg-static","ffmpeg"));for(const t of e)if(t&&!t.startsWith("/ROOT/"))try{return await N(t,z.X_OK),t}catch{}return null}var $;async function S(){return $!==void 0||($=await U(),$||console.warn("[ffmpeg-runner] ffmpeg-static \u4E8C\u8FDB\u5236\u672A\u627E\u5230 (\u5C1D\u8BD5\u4E86\u591A\u4E2A fallback \u8DEF\u5F84)")),$}async function T({args:e,timeoutMs:t=18e4}){const o=await S();if(!o)throw new Error("ffmpeg-static \u4E8C\u8FDB\u5236\u7F3A\u5931 \u2014 \u8BF7\u68C0\u67E5 node_modules/ffmpeg-static/ffmpeg \u662F\u5426\u5B58\u5728");return console.log("[ffmpeg-runner] args:",JSON.stringify(e)),new Promise((r,s)=>{const i=b(o,e,{stdio:["ignore","pipe","pipe"]});let a="",f=!1;const p=setTimeout(()=>{f=!0,i.kill("SIGKILL"),s(new Error(`ffmpeg \u8D85\u65F6 (${t}ms)`))},t);i.stderr.on("data",n=>{a+=n.toString(),a.length>8192&&(a=a.slice(-8192))}),i.on("close",n=>{if(clearTimeout(p),f)return;const u=a.slice(-2500);console.log(`[ffmpeg-runner] exit=${n}, stderr tail:
|
|
2
2
|
${u}
|
|
3
|
-
---end---`),
|
|
4
|
-
`,c.slice(-2e3)),new Error("\u5408\u6210\u5931\u8D25: \u8F93\u51FA mp4 \u7F3A\u5C11\u97F3\u8F68 (\u68C0\u67E5 filter_complex \u8BED\u6CD5)");console.log("[ffmpeg-runner] composeVideo \u5B8C\u6210,\u5DF2\u542B\u97F3\u89C6\u9891\u53CC\u6D41")}catch(c){if(c instanceof Error&&c.message.includes("\u5408\u6210\u5931\u8D25"))throw c}return
|
|
3
|
+
---end---`),n===0?r():s(new Error(`ffmpeg \u9000\u51FA\u7801 ${n}: ${u.slice(-800)}`))}),i.on("error",n=>{clearTimeout(p),s(n)})})}async function D(e){const t=await G(d(K(),"vtrans-"));try{return await e(t)}finally{H(t,{recursive:!0,force:!0}).catch(()=>{})}}async function V(e){const t=await S();return t?D(async o=>{const r=d(o,"probe.mp4");return await A(r,e),new Promise(s=>{const i=b(t,["-hide_banner","-i",r],{stdio:["ignore","ignore","pipe"]});let a="";const f=setTimeout(()=>{i.kill("SIGKILL"),s(!1)},15e3);i.stderr.on("data",p=>{a+=p.toString(),a.length>16384&&(a=a.slice(-16384))}),i.on("close",()=>{clearTimeout(f),s(/Stream #[^\n]*Audio:/.test(a))}),i.on("error",()=>{clearTimeout(f),s(!1)})})}):!1}async function q(e){return D(async t=>{const o=d(t,"in.mp4"),r=d(t,"audio.mp3");return await A(o,e),await T({args:["-y","-i",o,"-vn","-acodec","libmp3lame","-ar","16000","-ac","1","-b:a","64k",r],timeoutMs:6e4}),x(r)})}var J=["Fontsize=14","PrimaryColour=&H00FFFFFF","OutlineColour=&H00000000","BackColour=&H80000000","BorderStyle=1","Outline=2","Shadow=0","Alignment=2","MarginV=80","Bold=1"].join(",");async function Q(e){const t=(await I(e.videoBytes)).durationSeconds;return D(async o=>{const r=d(o,"in.mp4"),s=d(o,"out.mp4");await A(r,e.videoBytes);const i=["-i",r];let a=-1,f=-1;if(e.newAudioBytes){const c=d(o,"new.mp3");await A(c,e.newAudioBytes),a=(i.length-0)/2,i.push("-i",c)}if(e.bgmAudioBytes){const c=d(o,"bgm.mp3");await A(c,e.bgmAudioBytes),f=i.length/2,i.push("-i",c)}const p=e.srtContent&&e.srtContent.trim().length>0;let n=null;p&&(n=d(o,"subs.srt"),await A(n,e.srtContent));const u=e.bgmVolume??.18;console.log(`[ffmpeg-runner] composeVideo: video=${e.videoBytes.length}B (${t.toFixed(2)}s), newAudio=${e.newAudioBytes?.length??0}B, bgm=${e.bgmAudioBytes?.length??0}B@${u}, srt=${e.srtContent?.length??0}chars`);const g=J.replace(/,/g,"\\,"),F=[];let h,y=!1;p&&n?(F.push(`[0:v]subtitles=${n}:force_style=${g}[v]`),h="[v]",y=!0):h="0:v:0";const v=[];a>=0&&v.push({idx:a,isBgm:!1}),f>=0&&v.push({idx:f,isBgm:!0});let w=null;if(v.length===1)w=`${v[0].idx}:a:0`;else if(v.length>=2){const c=[];for(const C of v)C.isBgm?(F.push(`[${C.idx}:a]volume=${u}[bgm]`),c.push("[bgm]")):c.push(`[${C.idx}:a]`);F.push(`${c.join("")}amix=inputs=${c.length}:duration=first:dropout_transition=0[a]`),w="[a]"}const E=["-y",...i];F.length>0&&E.push("-filter_complex",F.join(";")),E.push("-map",h),w&&E.push("-map",w),y?E.push("-c:v","libx264","-preset","fast","-crf","22","-pix_fmt","yuv420p"):E.push("-c:v","copy"),E.push("-c:a","aac","-b:a","128k","-ar","44100","-ac","2","-movflags","+faststart","-t",t.toFixed(3)),E.push(s),await T({args:E,timeoutMs:18e4});const m=w?await S():null;if(m)try{const c=await new Promise(C=>{const O=b(m,["-i",s],{stdio:["ignore","pipe","pipe"]});let _="";O.stderr.on("data",B=>_+=B.toString()),O.on("close",()=>C(_))});if(!/Audio:/.test(c))throw console.error(`[ffmpeg-runner] \u4EA7\u7269\u7F3A\u5C11\u97F3\u8F68,ffmpeg \u6D41\u6982\u89C8:
|
|
4
|
+
`,c.slice(-2e3)),new Error("\u5408\u6210\u5931\u8D25: \u8F93\u51FA mp4 \u7F3A\u5C11\u97F3\u8F68 (\u68C0\u67E5 filter_complex \u8BED\u6CD5)");console.log("[ffmpeg-runner] composeVideo \u5B8C\u6210,\u5DF2\u542B\u97F3\u89C6\u9891\u53CC\u6D41")}catch(c){if(c instanceof Error&&c.message.includes("\u5408\u6210\u5931\u8D25"))throw c}return x(s)})}async function I(e){return D(async t=>{const o=d(t,"in.mp4");await A(o,e);const r=await S();if(!r)throw new Error("ffmpeg-static \u4E8C\u8FDB\u5236\u7F3A\u5931");return new Promise((s,i)=>{const a=b(r,["-i",o],{stdio:["ignore","pipe","pipe"]});let f="";a.stderr.on("data",p=>f+=p.toString()),a.on("close",()=>{const p=f.match(/Duration:\s*(\d+):(\d+):(\d+(?:\.\d+)?)/);if(!p)return i(new Error("\u65E0\u6CD5\u89E3\u6790\u89C6\u9891\u65F6\u957F"));const n=parseInt(p[1]),u=parseInt(p[2]),g=parseFloat(p[3]);s({durationSeconds:n*3600+u*60+g})}),a.on("error",i)})})}async function L(e,t,o="mp4",r=[],s=24e4){return D(async i=>{const a=d(i,"input.mp4"),f=d(i,`output.${o}`);await A(a,e);const p={};for(const n of r){const u=n.name.replace(/[^a-zA-Z0-9._-]/g,"_"),g=d(i,u);await A(g,n.bytes),p[n.name]=g}return await T({args:t(a,f,p),timeoutMs:s}),x(f)})}function W(e){const t=String(e??"").toLowerCase();return t==="mp4"||t==="mov"}function X(e,t,o){return["-y","-loop","1","-t","0.04","-i",t,"-i",e,"-filter_complex","[0:v][1:v]scale2ref=w=main_w:h=main_h[vcover][vmainref];[vcover]setsar=1,fps=30,format=yuv420p[vcoverf];[vmainref]setpts=PTS-STARTPTS,fps=30,format=yuv420p[vmain];[vcoverf][vmain]concat=n=2:v=1:a=0[v]","-map","[v]","-map","1:a?","-c:v","libx264","-preset","fast","-crf","18","-pix_fmt","yuv420p","-c:a","copy","-movflags","+faststart",o]}async function Z(e,t,o="mp4",r=[],s,i=24e4){return D(async a=>{const f=d(a,"input.mp4"),p=d(a,`output.${o}`),n=d(a,"video-cover.png"),u=d(a,`output-with-cover.${o}`);await A(f,e);const g={};for(const F of r){const h=F.name.replace(/[^a-zA-Z0-9._-]/g,"_"),y=d(a,h);await A(y,F.bytes),g[F.name]=y}return await T({args:t(f,p,g),timeoutMs:i}),!W(o)||!s?.length?x(p):(await A(n,s),await T({args:X(p,n,u),timeoutMs:i}),x(u))})}var P={maxVideos:6,maxAudios:3,maxVideoBytes:100*1024*1024,maxTotalVideoBytes:300*1024*1024,maxAudioBytes:30*1024*1024,maxOverlayBytes:20*1024*1024},l=(e,t,o)=>({ok:!1,status:e,error:t,message:o});function M(e){return e.startsWith("video/")?"mp4":e.includes("mpeg")||e.includes("mp3")?"mp3":e.includes("wav")?"wav":e.includes("aac")?"aac":e.includes("ogg")?"ogg":e.includes("mp4")||e.includes("m4a")?"m4a":e.includes("flac")?"flac":"bin"}function ee(e){const t=String(e??"mp4").toLowerCase();return t==="mov"||t==="mxf"?t:"mp4"}function te(e){return e==="mov"?"video/quicktime":e==="mxf"?"application/mxf":"video/mp4"}function ue(e){if(!e?.poster?.useAsVideoCover)return;const t=(typeof e.poster.preview=="string"?e.poster.preview:"").match(/^data:image\/(?:png|jpe?g);base64,([a-z0-9+/=]+)$/i);if(t)return Buffer.from(t[1],"base64")}function oe(e){const t={...P,...e?.limits};return{async handle(o){const{videos:r,audios:s,overlay:i,videoCover:a,textOverlays:f=[],editStateRaw:p}=o;if(r.length>t.maxVideos)return l(413,"TOO_MANY",`\u89C6\u9891\u6570\u8D85\u8FC7 ${t.maxVideos}`);for(let u=0;u<r.length;u++){if(!/^video\//.test(r[u].type))return l(415,"BAD_TYPE",`video_${u} \u4E0D\u662F\u89C6\u9891\u6587\u4EF6`);if(r[u].bytes.length>t.maxVideoBytes)return l(413,"TOO_LARGE",`\u89C6\u9891 ${u+1} \u8D85\u8FC7 100MB`)}if(!r.length)return l(400,"BAD_REQUEST","\u7F3A\u5C11\u89C6\u9891\u6587\u4EF6(video_0)");if(r.reduce((u,g)=>u+g.bytes.length,0)>t.maxTotalVideoBytes)return l(413,"TOO_LARGE","\u89C6\u9891\u603B\u5927\u5C0F\u8D85\u8FC7 300MB,\u8BF7\u51CF\u5C11\u7D20\u6750\u6216\u538B\u7F29");if(s.length>t.maxAudios)return l(413,"TOO_MANY",`\u97F3\u9891\u6570\u8D85\u8FC7 ${t.maxAudios}`);for(let u=0;u<s.length;u++){const g=/^audio\//.test(s[u].type),F=/^video\//.test(s[u].type);if(!g&&!F)return l(415,"BAD_TYPE",`audio_${u} \u4E0D\u662F\u97F3\u9891\u6216\u89C6\u9891\u6587\u4EF6`);if(s[u].bytes.length>(F?t.maxVideoBytes:t.maxAudioBytes))return l(413,"TOO_LARGE",`\u97F3\u9891 ${u+1} \u8D85\u8FC7 ${F?"100MB":"30MB"}`)}if(typeof p!="string")return l(400,"BAD_REQUEST","\u7F3A\u5C11 editState");if(i&&i.length>t.maxOverlayBytes)return l(413,"OVERLAY_TOO_LARGE","overlay \u8FC7\u5927");if(a&&a.length>t.maxOverlayBytes)return l(413,"COVER_TOO_LARGE","videoCover \u8FC7\u5927");if(f.some(u=>u.length>t.maxOverlayBytes))return l(413,"OVERLAY_TOO_LARGE","textOverlay \u8FC7\u5927");let n;try{n=k.parse(JSON.parse(p))}catch{return l(400,"BAD_STATE","\u7F16\u8F91\u53C2\u6570\u4E0D\u5408\u6CD5")}if(n.clips.some(u=>u.srcIdx>=r.length))return l(400,"BAD_STATE","clips.srcIdx \u8D85\u51FA\u4E0A\u4F20\u89C6\u9891\u6570");if((n.audioClips??[]).some(u=>u.srcIdx>=s.length))return l(400,"BAD_STATE","audioClips.srcIdx \u8D85\u51FA\u4E0A\u4F20\u97F3\u9891\u6570");try{const u=r.map(m=>m.bytes),g=s.map(m=>m.bytes),F=[...new Set((n.audioClips??[]).map(m=>m.srcIdx))];for(const m of F)if(/^video\//.test(s[m].type)&&!await V(g[m]))return l(400,"BAD_TYPE",`\u97F3\u9891 ${m+1} \u662F\u89C6\u9891\u6587\u4EF6\u4F46\u6CA1\u6709\u97F3\u8F68,\u65E0\u6CD5\u63D0\u53D6\u58F0\u97F3`);const h=r.map(()=>!1);if(n.keepAudio){const m=[...new Set(n.clips.map(c=>c.srcIdx))];await Promise.all(m.map(async c=>{h[c]=await V(u[c])})),!h.some(Boolean)&&!(n.audioClips??[]).length&&(n={...n,keepAudio:!1})}const y=[];for(let m=1;m<u.length;m++)y.push({name:`video_${m}.mp4`,bytes:u[m]});g.forEach((m,c)=>y.push({name:`audio_${c}.${M(s[c].type)}`,bytes:m})),i&&y.push({name:"overlay.png",bytes:i}),f.forEach((m,c)=>y.push({name:`textOverlay_${c}.png`,bytes:m}));const v=ee(n.exportSettings?.format),w=a?.length?a:ue(n),E=(m,c,C)=>{const O={videoPaths:[m,...u.slice(1).map((_,B)=>C[`video_${B+1}.mp4`])],videoHasAudio:h,audioPaths:g.map((_,B)=>C[`audio_${B}.${M(s[B].type)}`]),overlayPath:i?C["overlay.png"]:void 0,textOverlayPaths:f.map((_,B)=>C[`textOverlay_${B}.png`]).filter(Boolean)};return Y(n,O,c)};return{ok:!0,bytes:w==null?await L(u[0],E,v,y,28e4):await Z(u[0],E,v,y,w,28e4),contentType:te(v),filename:`edited.${v}`}}catch(u){return(u.message??"").includes("\u4E8C\u8FDB\u5236\u7F3A\u5931")?l(503,"SERVER_NOT_READY","\u670D\u52A1\u7AEF\u7F16\u7801\u7EC4\u4EF6\u672A\u5C31\u7EEA\uFF08ffmpeg \u7F3A\u5931\uFF09\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458"):l(502,"ENCODE_FAILED","\u89C6\u9891\u5904\u7406\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\u6216\u6362\u66F4\u77ED\u7684\u89C6\u9891")}}}}function ne(e){const t=e?.maxBytes??104857600;return{async handle(o,r){if(!/^video\//.test(o.type))return l(415,"BAD_TYPE","\u53EA\u652F\u6301\u89C6\u9891\u6587\u4EF6");if(o.bytes.length>t)return l(413,"TOO_LARGE","\u6587\u4EF6\u8D85\u8FC7 100MB");if(!isFinite(r)||r<0)return l(400,"BAD_TIME","time \u53C2\u6570\u4E0D\u5408\u6CD5");try{return{ok:!0,bytes:await L(o.bytes,(s,i)=>j(s,r,i),"jpg"),contentType:"image/jpeg",filename:"poster.jpg"}}catch(s){return(s.message??"").includes("\u4E8C\u8FDB\u5236\u7F3A\u5931")?l(503,"SERVER_NOT_READY","\u670D\u52A1\u7AEF\u7F16\u7801\u7EC4\u4EF6\u672A\u5C31\u7EEA\uFF08ffmpeg \u7F3A\u5931\uFF09\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458"):l(502,"EXTRACT_FAILED","\u5C01\u9762\u62BD\u53D6\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5")}}}}export{P as DEFAULT_LIMITS,Q as composeVideo,ne as createPosterHandler,oe as createVideoExportHandler,q as extractAudio,V as probeHasAudio,I as probeVideoDuration,L as runVideoEdit};
|