/**
 * Minified by jsDelivr using Terser v5.39.0.
 * Original file: /npm/@front10/editly@1.0.1/index.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
const execa=require("execa"),assert=require("assert"),{join:join,dirname:dirname}=require("path"),JSON5=require("json5"),fs=require("fs-extra"),{nanoid:nanoid}=require("nanoid"),{testFf:testFf}=require("./ffmpeg"),{parseFps:parseFps,multipleOf2:multipleOf2}=require("./util"),{createFabricCanvas:createFabricCanvas,rgbaToFabricImage:rgbaToFabricImage,getNodeCanvasFromFabricCanvas:getNodeCanvasFromFabricCanvas}=require("./sources/fabric"),{createFrameSource:createFrameSource}=require("./sources/frameSource"),{parseConfig:parseConfig}=require("./parseConfig"),GlTransitions=require("./glTransitions"),Audio=require("./audio"),{assertFileValid:assertFileValid,checkTransition:checkTransition}=require("./util"),channels=4,Editly=async(e={})=>{const{enableFfmpegLog:t=!1,verbose:a=!1,logTimes:r=!1,keepTmp:o=!1,fast:i,outPath:s,clips:n,clipsAudioVolume:l=1,audioTracks:c=[],width:f,height:u,fps:m,defaults:d={},audioFilePath:p,loopAudio:g,keepSourceAudio:h,allowRemoteRequests:b,audioNorm:F,outputVolume:w,customOutputArgs:v,ffmpegPath:y="ffmpeg",ffprobePath:S="ffprobe"}=e;await testFf(y,"ffmpeg"),await testFf(S,"ffprobe");const P=s.toLowerCase().endsWith(".gif");p&&await assertFileValid(p,b),checkTransition(d.transition),a&&console.log(JSON5.stringify(e,null,2)),assert(s,"Please provide an output path"),assert(n.length>0,"Please provide at least 1 clip");const{clips:x,arbitraryAudio:q}=await parseConfig({defaults:d,clips:n,arbitraryAudio:c,backgroundAudioPath:p,loopAudio:g,allowRemoteRequests:b,ffprobePath:S});a&&console.log("Calculated",JSON5.stringify({clips:x,arbitraryAudio:q},null,2));const A=dirname(s),C=join(A,`editly-tmp-${nanoid()}`);a&&console.log({tmpDir:C}),await fs.mkdirp(C);const{editAudio:T}=Audio({ffmpegPath:y,ffprobePath:S,enableFfmpegLog:t,verbose:a,tmpDir:C}),N=P?void 0:await T({keepSourceAudio:h,arbitraryAudio:q,clipsAudioVolume:l,clips:x,audioNorm:F,outputVolume:w});let $,M,k,O,R,E;x.find((e=>e&&e.layers.find((e=>"video"===e.type&&($=e.inputWidth,M=e.inputHeight,k=e.framerateStr,!0))))),f?E=f:P&&(E=320);const V=e=>P?Math.round(e):multipleOf2(e);if($&&M)if(E){R=V(M/$*E),O=E}else O=$,R=M;else E?(O=E,R=E):(O=640,R=640);if(f&&u&&(O=f,R=u),i){const e=250,t=O/R;O=V(e*Math.sqrt(t)),R=V(e*Math.sqrt(1/t))}let j,I;assert(O,"Width not specified or detected"),assert(R,"Height not specified or detected"),P||(O=Math.max(2,O),R=Math.max(2,R)),i?(j=15,I=String(j)):m&&"number"==typeof m?(j=m,I=String(m)):P?(j=10,I=String(j)):k?(j=parseFps(k),I=k):(j=25,I=String(j)),assert(j,"FPS not specified or detected"),console.log(`${O}x${R} ${j}fps`);const L=j*x.reduce(((e,t,a)=>{let r=e+t.duration;return a!==x.length-1&&(r-=t.transition.duration),r}),0),{runTransitionOnFrame:W}=GlTransitions({width:O,height:R,channels:4});function _({fromFrame:e,toFrame:t,progress:a,transitionName:r,transitionParams:o}){return"dummy"===r?a>.5?t:e:W({fromFrame:e,toFrame:t,progress:a,transitionName:r,transitionParams:o})}function D(){if(v)return assert(Array.isArray(v),"customOutputArgs must be an array of arguments"),v;const t=P?["-vf",`format=rgb24,fps=${j},scale=${O}:${R}:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse`,"-loop",0]:["-vf","format=yuv420p","-vcodec","libx264","-profile:v","high",...i?["-preset:v","ultrafast"]:["-preset:v","medium"],"-crf","18","-movflags","faststart"];e["filter-complex"]&&!P&&(t.push("-filter_complex"),t.push(e["filter-complex"]));return[...N?["-acodec","aac","-b:a","128k"]:[],...t]}let G,J,H,z,B,X=0,K=0,Q=0,U=0;const Y=()=>U+1,Z=()=>x[U],ee=()=>x[Y()],te=async(e,o)=>createFrameSource({clip:e,clipIndex:o,width:O,height:R,channels:4,verbose:a,logTimes:r,ffmpegPath:y,ffprobePath:S,enableFfmpegLog:t,framerateStr:I}),ae=async()=>ee()&&te(ee(),Y());try{let e;for(G=function(){const e=[...t?[]:["-hide_banner","-loglevel","error"],"-f","rawvideo","-vcodec","rawvideo","-pix_fmt","rgba","-s",`${O}x${R}`,"-r",I,"-i","-",...N?["-i",N]:[],...P?[]:["-map","0:v:0"],...N?["-map","1:a:0"]:[],...D(),"-y",s];return a&&console.log("ffmpeg",e.join(" ")),execa(y,e,{encoding:null,buffer:!1,stdin:"pipe",stdout:process.stdout,stderr:process.stderr})}(),G.on("exit",(e=>{a&&console.log("Output ffmpeg exited",e),J=e})),G.catch((t=>{e=t})),H=await(async()=>te(Z(),U))(),z=await ae();;){const t=ee(),o=Z(),i=Math.round(o.duration*j),s=t&&Math.round(t.duration*j),n=K/i,l=t&&Q/s,c=o.duration*n,f=t&&t.duration*l,u=o.transition,m=Math.round(u.duration*j),d=Math.floor(Math.min(Math.min(i,null!=s?s:Number.MAX_SAFE_INTEGER)/2,m)),p=K-(i-d);if(!a){const e=Math.floor(X/L*100);X%10==0&&process.stdout.write(`${String(e).padStart(3," ")}% `)}const g=d;if(p>=g){if(U+=1,console.log(`Done with transition, switching to next transitionFromClip (${U})`),!Z()){console.log("No more transitionFromClip, done");break}await H.close(),H=z,z=await ae(),K=g,Q=0;continue}r&&console.time("Read frameSource1");const h=await H.readNextFrame({time:c});r&&console.timeEnd("Read frameSource1"),h?B=h:console.warn("No frame data returned, using last frame");const b=z&&d>0&&p>=0;let F;if(b){r&&console.time("Read frameSource2");const e=await z.readNextFrame({time:f});if(r&&console.timeEnd("Read frameSource2"),e){const t=p/d,a=u.easingFunction(t);r&&console.time("runTransitionOnFrame"),F=_({fromFrame:B,toFrame:e,progress:a,transitionName:u.name,transitionParams:u.params}),r&&console.timeEnd("runTransitionOnFrame")}else console.warn("Got no frame data from transitionToClip!"),F=B}else F=B;a&&(b?console.log("Writing frame:",X,"from clip",U,`(frame ${K})`,"to clip",Y(),`(frame ${Q} / ${d})`,u.name,`${u.duration}s`):console.log("Writing frame:",X,"from clip",U,`(frame ${K})`));const w=!1;if(r&&console.time("outProcess.write"),w||await new Promise((e=>G.stdin.write(F,e))),r&&console.timeEnd("outProcess.write"),e)break;X+=1,K+=1,b&&(Q+=1)}G.stdin.end()}catch(e){throw G.kill(),e}finally{a&&console.log("Cleanup"),H&&await H.close(),z&&await z.close(),o||await fs.remove(C)}try{a&&console.log("Waiting for output ffmpeg process to finish"),await G}catch(e){if(0!==J&&!e.killed)throw e}console.log(),console.log("Done. Output file can be found at:"),console.log(s)};async function renderSingleFrame({time:e=0,defaults:t,width:a=800,height:r=600,clips:o,verbose:i,logTimes:s,enableFfmpegLog:n,allowRemoteRequests:l,ffprobePath:c="ffprobe",ffmpegPath:f="ffmpeg",outPath:u=`${Math.floor(1e12*Math.random())}.png`}){const m=await parseConfig({defaults:t,clips:o,allowRemoteRequests:l,ffprobePath:c,arbitraryAudio:[]});let d=0;const p=m.find((t=>d<=e&&d+t.duration>e||(d+=t.duration,!1)));assert(p,"No clip found at requested time");const g=m.indexOf(p),h=await createFrameSource({clip:p,clipIndex:g,width:a,height:r,channels:4,verbose:i,logTimes:s,ffmpegPath:f,ffprobePath:c,enableFfmpegLog:n,framerateStr:"1"}),b=await h.readNextFrame({time:e-d}),F=createFabricCanvas({width:a,height:r}),w=await rgbaToFabricImage({width:a,height:r,rgba:b});F.add(w),F.renderAll();const v=getNodeCanvasFromFabricCanvas(F);await fs.writeFile(u,v.toBuffer("image/jpeg",{quality:.5,progressive:!0,chromaSubsampling:!0})),F.clear(),F.dispose(),await h.close()}Editly.renderSingleFrame=renderSingleFrame,module.exports=Editly;
//# sourceMappingURL=/sm/9508ad339ca06cf868879197b737118b898bb7bd0d9508a627ced58c3e437d5b.map