`).map((C)=>C.trim()).filter(Boolean),F=[],E={cuda:"nvenc",qsv:"qsv",vaapi:"vaapi",videotoolbox:"videotoolbox",v4l2m2m:"v4l2",dxva2:"amf"};for(let C of u){let A=E[C];if(A)F.push({accelerator:A})}return F}async function YD(D){let u=["-v","error","-f","lavfi","-i","testsrc=size=320x240:rate=1","-frames:v","1","-an","-c:v",D,"-f","null","-"];return new Promise((F)=>{let E=f("ffmpeg",u);E.on("error",()=>F(!1)),E.on("close",(C)=>F(C===0))})}async function GD(D,u){let F=["-v","error"];if(D==="nvenc")F.push("-hwaccel","cuda","-hwaccel_output_format","cuda");else if(D==="qsv")F.push("-hwaccel","qsv");else if(D==="vaapi")F.push("-hwaccel","vaapi","-vaapi_device","/dev/dri/renderD128");else if(D==="videotoolbox")F.push("-hwaccel","videotoolbox");else if(D==="v4l2")F.push("-hwaccel","v4l2m2m");else if(D==="amf")return!1;return F.push("-i",u,"-frames:v","1","-f","null","-"),new Promise((E)=>{let C=f("ffmpeg",F);C.on("error",()=>E(!1)),C.on("close",(A)=>E(A===0))})}async function c(D,u,F){let C=`
${X}`))}})})}import{spawn as sF}from"node:child_process";async function o(D){return new Promise((u,F)=>{let E=sF("ffprobe",["-v","error","-show_entries","stream=width,height,duration,r_frame_rate,codec_name,codec_type,bit_rate","-show_entries","format=duration","-of","json",D]),C="";E.stdout.on("data",(A)=>{C+=A.toString()}),E.on("error",(A)=>{F(Error(`ffprobeerror:${A.message}`))}),E.on("close",(A)=>{if(A!==0){F(Error(`ffprobefailedwithexitcode${A}`));return}try{let B=JSON.parse(C),$=B.streams.find((Q)=>Q.codec_type==="video"),K=B.streams.find((Q)=>Q.codec_type==="audio"),X=B.format;if(!$){F(Error("No video stream found in input file"));return}let U=30;if($.r_frame_rate){let[Q,G]=$.r_frame_rate.split("/").map(Number);if(Q&&G&&G!==0)U=Q/G}let Y=parseFloat($.duration||X.duration||"0"),Z=B.streams.find((Q)=>Q.codec_type==="audio"&&Q.bit_rate),W=Z?.bit_rate?Math.round(parseInt(Z.bit_rate)/1000):void 0,J=$.bit_rate?Math.round(parseInt($.bit_rate)/1000):void 0;u({width:$.width,height:$.height,duration:Y,fps:U,codec:$.codec_name,hasAudio:Boolean(K),audioBitrate:W,videoBitrate:J})}catch(B){F(Error(`Failedtoparseffprobeoutput:${B}`))}})})}function UD(D,u=256){if(!D)return`${u}k`;let F=Math.min(D,u);if(F<=64)return"64k";if(F<=96)return"96k";if(F<=128)return"128k";if(F<=192)return"192k";return"256k"}function WD(D){let u=Math.floor(D/3600),F=Math.floor(D%3600/60),E=D%60;return`${String(u).padStart(2,"0")}:${String(F).padStart(2,"0")}:${E.toFixed(3).padStart(6,"0")}`}import{mkdir as aF,access as iF,constants as rF}from"node:fs/promises";async function l(D){try{await iF(D,rF.F_OK)}catch{await aF(D,{recursive:!0})}}function eF(D,u){let F=D*u;if(F<=230400)return 0.08;if(F<=409920)return 0.075;if(F<=921600)return 0.07;if(F<=2073600)return 0.065;if(F<=3686400)return 0.06;return 0.055}function b(D,u,F=30,E){let C=eF(D,u),A=Math.round(D*u*F*C/1000);if(E&&A>E)A=E;return`${A}k`}var TD=[{name:"360p",width:640,height:360,videoBitrate:b(640,360,30),audioBitrate:"192k"},{name:"480p",width:854,height:480,videoBitrate:b(854,480,30),audioBitrate:"192k"},{name:"720p",width:1280,height:720,videoBitrate:b(1280,720,30),audioBitrate:"192k"},{name:"1080p",width:1920,height:1080,videoBitrate:b(1920,1080,30),audioBitrate:"256k"},{name:"1440p",width:2560,height:1440,videoBitrate:b(2560,1440,30),audioBitrate:"256k"},{name:"2160p",width:3840,height:2160,videoBitrate:b(3840,2160,30),audioBitrate:"256k"}];function AD(D,u,F=30,E){let C=[],A=TD.filter((B)=>{return B.width<=D&&B.height<=u});for(let B of A)C.push({...B,videoBitrate:b(B.width,B.height,30,E),fps:30});return C}function D8(D,u,F){return{...D,name:`${D.name}-${u}`,videoBitrate:b(D.width,D.height,u,F),fps:u}}function Ku(D){let F=D.trim().match(/^(\d+)p?(?:[@-](\d+))?$/i);if(!F)return null;let E=F[1]+"p",C=F[2]?parseInt(F[2]):30;return{resolution:E,fps:C}}function Xu(D,u=30,F){let E=TD.find((C)=>C.name===D);if(!E)return null;if(u===30)return{...E,videoBitrate:b(E.width,E.height,30,F),fps:30};return D8(E,u,F)}function u8(D,u,F,E){let C=Ku(D);if(!C)return{error:`Invalidprofileformat:${D}.Useformatlike:360,720@60,1080-60`};let A=Xu(C.resolution,C.fps);if(!A)return{error:`Unknownresolution:${C.resolution}.Available:360,480,720,1080,1440,2160`};if(A.width>u||A.height>F)return{error:`Sourceresolution(${u}x${F})islowerthan${D}(${A.width}x${A.height})`};let B=120,$=C.fps,K;if(C.fps>E)$=Math.min(E,B),K=`Requested${C.fps}FPSin${D},butsourceis${E}FPS.Using${$}FPSinstead`;else if(C.fps>B)$=B,K=`Requested${C.fps}FPSin${D}exceedsmaximum${B}FPS.Using${$}FPSinstead`;return K?{warning:K,adjustedFps:$}:{}}function ND(D,u,F,E,C){let A=[],B=[],$=[];for(let K of D){let X=u8(K,u,F,E);if(X.error){B.push(X.error);continue}if(X.warning)$.push(X.warning);let U=Ku(K);if(!U)continue;let Y=X.adjustedFps!==void 0?X.adjustedFps:U.fps,Z=Xu(U.resolution,Y,C);if(Z)A.push(Z)}return{profiles:A,errors:B,warnings:$}}import{join as g}from"node:path";import{readdir as F8,unlink as Yu,rmdir as E8,writeFile as Gu}from"node:fs/promises";async function Uu(D,u,F="00:00:00"){let E=g(u,"po
`;for(let E of D){let C=u?"avc1.4D4020,mp4a.40.2":"avc1.4D4020";if(F+=`#EXT-X-STREAM-INF:BANDWIDTH=${E.bandwidth},CODECS="${C}",RESOLUTION=${E.resolution},FRAME-RATE=${E.fps}`,u)F+=',AUDIO="audio"';F+=`
`}return F}async function Z8(D,u,F,E,C,A){let B=L(u,"manifest.mpd"),$=C.length>1,K=["-dash",String(E*1000),"-frag",String(E*1000),"-rap","-segment-timeline","-segment-name","$RepresentationID$_$Number$","-out",B],X=!0;for(let[U,Y]of D.entries())for(let Z of F){let W=Y.get(Z.name);if(!W)throw Error(`MP4filenotfoundforprofile:${Z.name},codec:${U}`);let J=$?`${Z.name}-${U}`:Z.name;if(K.push(`${W}#video:id=${J}`),X&&A)K.push(`${W}#audio:id=audio`),X=!1}if(await jD(K),await $8(u,F,C,A),await _u(B),$)await zu(B);return await Qu(B),B}async function $8(D,u,F,E){let{readdir:C,rename:A,mkdir:B}=await import("node:fs/promises"),$=F.length>1,K=[];for(let Y of F)for(let Z of u){let W=$?`${Z.name}-${Y}`:Z.name;K.push(W);let J=L(D,W);await B(J,{recursive:!0})}let X=L(D,"audio");if(E)await B(X,{recursive:!0});let U=await C(D);for(let Y of U){if(Y==="manifest.mpd")continue;if(E&&(Y.startsWith("audio_")||Y==="audio_init.m4s")){let Z=L(D,Y),W=L(X,Y);await A(Z,W);continue}for(let Z of K)if(Y.startsWith(`${Z}_`)){let W=L(D,Y),J=L(D,Z,Y);await A(W,J);break}}}async function Hu(D,u,F,E,C,A,B){let $,K,X=A.length>0,U=A.includes("dash"),Y=A.includes("hls");if(X){if($=await Z8(D,u,F,E,C,B),!U)$=void 0}if(Y)K=await J8(u,F,E,C.length>1,B);return{manifestPath:$,hlsManifestPath:K}}async function J8(D,u,F,E,C){let A=L(D,"master.m3u8"),B=[];for(let U of u){let Y=E?`${U.name}-h264`:U.name,Z=L(D,Y),W=await Iu(Z),J=W.filter((x)=>x.endsWith(".m4s")).sort((x,O)=>{let M=parseInt(x.match(/_(\d+)\.m4s$/)?.[1]||"0"),S=parseInt(O.match(/_(\d+)\.m4s$/)?.[1]||"0");return M-S}),Q=W.find((x)=>x.endsWith("_.mp4"));if(!Q||J.length===0)continue;let G=SD(J,Q,F),N=L(Z,"playlist.m3u8");await bD(N,G,"utf-8");let k=parseInt(U.videoBitrate)*1000;B.push({path:`${Y}/playlist.m3u8`,bandwidth:k,resolution:`${U.width}x${U.height}`,fps:U.fps||30})}let $,K=[];if(C){let U=L(D,"audio"),Y=[];try{Y=await Iu(U)}catch{Y=[]}if(K=Y.filter((Z)=>Z.endsWith(".m4s")).sort((Z,W)=>{let J=parseInt(Z.match(/_(\d+)\.m4s$/)?.[1]||"0"),Q=parseInt(W.match(/_(\d+)\.m4s$/)?.[1]||"0");return J-Q}),$=Y.find((Z)=>Z.endsWith("_.mp4")),$&&K.length>0){let Z=SD(K,$,F);await bD(L(U,"playlist.m3u8"),Z,"utf-8")}}let X=qu(B,C&&$!==void 0&&K.length>0);return await bD(A,X,"utf-8"),A}async function vD(D){let{input:u,outputDir:F,segmentDuration:E=2,profiles:C,customProfiles:A,codec:B=["h264"],formats:$=["dash","hls"],hardwareDecoder:K,hardwareAccelerator:X,quality:U,generateThumbnails:Y=!0,thumbnailConfig:Z={},generatePoster:W=!0,posterTimecode:J="00:00:00",parallel:Q=!0,onProgress:G}=D,N=kD("/tmp",`dash-converter-${K8()}`);await l(N);let k=xu(u,Mu(u)),x=kD(F,k);await l(x);let O=kD(x,"conversion.log");RD(O);let{writeFile:M}=await import("node:fs/promises"),S=`===========================================
`,"utf-8")}catch($D){}try{await Ou(N,{recursive:!0,force:!0})}catch($D){console.warn(`Warning:Failedtocleanuptempdirectory:${N}`)}}}async function X8(D,u,F,E,C,A,B,$,K,X,U,Y,Z,W,J,Q,G){if(!await s())throw Error("FFmpeg is not installed or not in PATH");if(!await a())throw Error("MP4Box is not installed or not in PATH. Install gpac package.");let N=(z,I,MD,OD)=>{if(G)G({stage:z,percent:I,message:MD,currentProfile:OD})};N("analyzing",0,"Analyzing input video...");let k=await o(D),x=k.hasAudio,O=K&&K!=="auto"?K:"auto",M=await i(),S=await r(),ED=M.some((z)=>z.av1Encoder),$D=Array.isArray(B)?B:[B],tD=$D.includes("h264"),VD=$D.includes("av1"),{selected:JD,h264Encoder:RF,av1Encoder:jF,warnings:eD}=Y8(M,O,tD,VD);if(eD.length>0)for(let z of eD)console.warn(`⚠️${z}`);let{selected:KD}=G8(S,X||"auto");if(VD&&!ED)console.warn("⚠️ AV1 hardware encoder not detected. AV1 will use CPU encoder (slow).");let v=[];if(tD)v.push("h264");if(VD)v.push("av1");if(v.length===0)v.push("h264");let Du=$&&$.length>0?Array.from(new Set($)):["dash","hls"],R;if(A&&A.length>0){let z=ND(A,k.width,k.height,k.fps,k.videoBitrate);if(z.errors.length>0){console.warn(`
`);var zF=await s(),qF=await a(),IF=await i(),l8=await r(),p8=IF.some((D)=>D.av1Encoder),qD={nvenc:100,qsv:90,amf:80,vaapi:70,videotoolbox:65,v4l2:60,cpu:1},d8={nvenc:"h264_nvenc",qsv:"h264_qsv",amf:"h264_amf",vaapi:"h264_vaapi",videotoolbox:"h264_videotoolbox",v4l2:"h264_v4l2m2m",cpu:"libx264"},n8=Array.from(new Set([...IF.map((D)=>D.accelerator),"cpu"])),s8=Array.from(new Set([...l8.map((D)=>D.accelerator),"cpu"]));async function a8(){let D=[];for(let u of n8){if(u==="amf")continue;let F=d8[u]||"libx264";if(await YD(F))D.push(u)}return D}async function i8(){let D=[];for(let u of s8){if(u==="cpu"){D.push("cpu");continue}if(await GD(u,d))D.push(u)}return D}var HF=await a8(),VF=await i8(),uD=HF.slice().sort((D,u)=>(qD[u]||0)-(qD[D]||0))[0],FD=VF.slice().sort((D,u)=>(qD[u]||0)-(qD[D]||0))[0];console.log(`FFmpeg:${zF?"✅":"❌"}`);console.log(`MP4Box:${qF?"✅":"❌"}`);var GF=Array.from(new Set(HF.map((D)=>D.toUpperCase()))),UF=Array.from(new Set(VF.map((D)=>D.toUpperCase()))),WF=e?e.toUpperCase():uD&&uD.toUpperCase()||"CPU",xF=GF.length>0?GF:["CPU"],NF=DD?DD.toUpperCase():FD&&FD.toUpperCase()||"CPU",MF=UF.length>0?UF:["CPU"];console.log(`Encoder:${WF==="AUTO"?uD&&uD.toUpperCase()||"CPU":WF}(${xF.join(", ")})`);console.log(`Decoder:${NF==="AUTO"?FD&&FD.toUpperCase()||"CPU":NF}(${MF.join(", ")})`);console.log("");if(!zF)console.error("❌ FFmpeg not found. Please install FFmpeg first."),process.exit(1);if(!qF)console.error("❌ MP4Box not found. Please install: sudo pacman -S gpac"),process.exit(1);var oD=zD&&zD.length>0?zD:["h264"],ID=oD.includes("h264"),HD=oD.includes("av1");if(!ID)console.warn("⚠️ H.264 is mandatory for compatibility. Adding H.264."),ID=!0;if(HD&&!p8)console.error("⚠️ AV1 requested but no hardware AV1 encoder found."),console.error(" CPU-based AV1 encoding (libsvtav1) will be VERY slow."),console.error(`Considerusing--codech264forfasterencoding.