${X}`))}})})}import{spawn as $F}from"node:child_process";async function i(D){return new Promise((u,C)=>{let F=$F("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]),E="";F.stdout.on("data",(B)=>{E+=B.toString()}),F.on("error",(B)=>{C(Error(`ffprobeerror:${B.message}`))}),F.on("close",(B)=>{if(B!==0){C(Error(`ffprobefailedwithexitcode${B}`));return}try{let A=JSON.parse(E),$=A.streams.find((_)=>_.codec_type==="video"),Z=A.streams.find((_)=>_.codec_type==="audio"&&_.bit_rate),X=A.format;if(!$){C(Error("No video stream found in input file"));return}let G=30;if($.r_frame_rate){let[_,k]=$.r_frame_rate.split("/").map(Number);if(_&&k&&k!==0)G=_/k}let J=parseFloat($.duration||X.duration||"0"),Y=Z?.bit_rate?Math.round(parseInt(Z.bit_rate)/1000):void 0,K=$.bit_rate?Math.round(parseInt($.bit_rate)/1000):void 0;u({width:$.width,height:$.height,duration:J,fps:G,codec:$.codec_name,audioBitrate:Y,videoBitrate:K})}catch(A){C(Error(`Failedtoparseffprobeoutput:${A}`))}})})}function uD(D,u=256){if(!D)return`${u}k`;let C=Math.min(D,u);if(C<=64)return"64k";if(C<=96)return"96k";if(C<=128)return"128k";if(C<=192)return"192k";return"256k"}function FD(D){let u=Math.floor(D/3600),C=Math.floor(D%3600/60),F=D%60;return`${String(u).padStart(2,"0")}:${String(C).padStart(2,"0")}:${F.toFixed(3).padStart(6,"0")}`}import{mkdir as JF,access as KF,constants as XF}from"node:fs/promises";async function g(D){try{await KF(D,XF.F_OK)}catch{await JF(D,{recursive:!0})}}function GF(D,u){let C=D*u;if(C<=230400)return 0.08;if(C<=409920)return 0.075;if(C<=921600)return 0.07;if(C<=2073600)return 0.065;if(C<=3686400)return 0.06;return 0.055}function y(D,u,C=30,F){let E=GF(D,u),B=Math.round(D*u*C*E/1000);if(F&&B>F)B=F;return`${B}k`}var GD=[{name:"360p",width:640,height:360,videoBitrate:y(640,360,30),audioBitrate:"192k"},{name:"480p",width:854,height:480,videoBitrate:y(854,480,30),audioBitrate:"192k"},{name:"720p",width:1280,height:720,videoBitrate:y(1280,720,30),audioBitrate:"192k"},{name:"1080p",width:1920,height:1080,videoBitrate:y(1920,1080,30),audioBitrate:"256k"},{name:"1440p",width:2560,height:1440,videoBitrate:y(2560,1440,30),audioBitrate:"256k"},{name:"2160p",width:3840,height:2160,videoBitrate:y(3840,2160,30),audioBitrate:"256k"}];function kD(D,u,C=30,F){let E=[],B=GD.filter((A)=>{return A.width<=D&&A.height<=u});for(let A of B)E.push({...A,videoBitrate:y(A.width,A.height,30,F),fps:30});return E}function kF(D,u,C){return{...D,name:`${D.name}-${u}`,videoBitrate:y(D.width,D.height,u,C),fps:u}}function cD(D){let C=D.trim().match(/^(\d+)p?(?:[@-](\d+))?$/i);if(!C)return null;let F=C[1]+"p",E=C[2]?parseInt(C[2]):30;return{resolution:F,fps:E}}function dD(D,u=30,C){let F=GD.find((E)=>E.name===D);if(!F)return null;if(u===30)return{...F,videoBitrate:y(F.width,F.height,30,C),fps:30};return kF(F,u,C)}function UF(D,u,C,F){let E=cD(D);if(!E)return{error:`Invalidprofileformat:${D}.Useformatlike:360,720@60,1080-60`};let B=dD(E.resolution,E.fps);if(!B)return{error:`Unknownresolution:${E.resolution}.Available:360,480,720,1080,1440,2160`};if(B.width>u||B.height>C)return{error:`Sourceresolution(${u}x${C})islowerthan${D}(${B.width}x${B.height})`};let A=120,$=E.fps,Z;if(E.fps>F)$=Math.min(F,A),Z=`Requested${E.fps}FPSin${D},butsourceis${F}FPS.Using${$}FPSinstead`;else if(E.fps>A)$=A,Z=`Requested${E.fps}FPSin${D}exceedsmaximum${A}FPS.Using${$}FPSinstead`;return Z?{warning:Z,adjustedFps:$}:{}}function lD(D,u,C,F,E){let B=[],A=[],$=[];for(let Z of D){let X=UF(Z,u,C,F);if(X.error){A.push(X.error);continue}if(X.warning)$.push(X.warning);let G=cD(Z);if(!G)continue;let J=X.adjustedFps!==void 0?X.adjustedFps:G.fps,Y=dD(G.resolution,J,E);if(Y)B.push(Y)}return{profiles:B,errors:A,warnings:$}}import{join as h}from"node:path";import{readdir as _F,unlink as pD,rmdir as WF,writeFile as nD}from"node:fs/promises";async function sD(D,u,C="00:00:01"){let F=h(u,"poster.jpg"),E=/^\d+(\.\d+)?$/.test(C)?C:C;return await f(["-ss",E,"
`;for(let F of D){if(C+=`#EXT-X-STREAM-INF:BANDWIDTH=${F.bandwidth},CODECS="avc1.4D4020,mp4a.40.2",RESOLUTION=${F.resolution},FRAME-RATE=${F.fps}`,u)C+=',AUDIO="audio"';C+=`
`,"utf-8")}catch(M){}try{await Bu(U,{recursive:!0,force:!0})}catch(M){console.warn(`Warning:Failedtocleanuptempdirectory:${U}`)}}}async function xF(D,u,C,F,E,B,A,$,Z,X,G,J,Y,K,_,k){if(!await n())throw Error("FFmpeg is not installed or not in PATH");if(!await s())throw Error("MP4Box is not installed or not in PATH. Install gpac package.");let U=(q,z,o,$D)=>{if(k)k({stage:q,percent:z,message:o,currentProfile:$D})};U("analyzing",0,"Analyzing input video...");let Q=await i(D),x=Z!==!1?await a():!1,V=Z===!0?!0:Z===!1?!1:x;if(Z===!0&&!x)throw Error("NVENC requested but not available. Check NVIDIA drivers and GPU support.");let H;if(B&&B.length>0){let q=lD(B,Q.width,Q.height,Q.fps,Q.videoBitrate);if(q.errors.length>0){console.warn(`
❌Profileerrors:`);for(let z of q.errors)console.warn(`-${z}`);console.warn("")}if(q.warnings.length>0){console.warn(`
⚠️Profilewarnings:`);for(let z of q.warnings)console.warn(`-${z}`);console.warn("")}if(H=q.profiles,H.length===0)throw Error("No valid profiles found in custom list. Check errors above.")}else if(E)H=E;else H=kD(Q.width,Q.height,Q.fps,Q.videoBitrate);if(H.length===0)throw Error("No suitable profiles found for input video resolution");let S=Cu(D,Eu(D)),L=CD(u,S);try{await Bu(L,{recursive:!0,force:!0})}catch(q){}await g(L);let M=[];if(A==="h264"||A==="dual"){let q=V?"h264_nvenc":"libx264",z=V?"p4":"medium";M.push({type:"h264",codec:q,preset:z})}if(A==="av1"||A==="dual"){let q=await r(),z=q.available?q.encoder:"libsvtav1",o=q.available?z==="av1_nvenc"?"p4":"medium":"8";M.push({type:"av1",codec:z,preset:o})}let ru=M.map((q)=>q.type.toUpperCase()).join(" + ");U("analyzing",20,`Using${ru}encoding(${V?"GPU":"CPU"})`,void 0);let iu=V?3:2,YD=new Map;for(let q=0;q<M.length;q++){let{type:z,codec:o,preset:$D}=M[q],hD=q/M.length,eu=1/M.length;U("encoding",25+hD*40,`Stage1:Encoding${z.toUpperCase()}(${H.length}profiles)...`);let DF=z==="h264"?X?.h264:X?.av1,uF=await iD(D,C,H,o,$D,Q.duration,F,Q.audioBitrate,_,iu,z,DF,void 0,(t,PD)=>{let C3=H.findIndex((FF)=>FF.name===t),fD=25+hD*40,gD=PD/100*(40*eu/H.length);if(U("encoding",fD+gD,`Encoding${z.toUpperCase()}${t}...`,`${z}-${t}`),k)k({stage:"encoding",percent:fD+gD,currentProfile:`${z}-${t}`,profilePercent:PD,message:`Encoding${z.toUpperCase()}${t}...`})});YD.set(z,uF)}U("encoding",65,"Stage 1 complete: All codecs and profiles encoded"),U("encoding",70,"Stage 2: Creating segments and manifests...");let{manifestPath:ou,hlsManifestPath:tu}=await Fu(YD,L,H,F,A,$),TD=[];for(let q of YD.values())TD.push(...Array.from(q.values()));U("encoding",80,"Stage 2 complete: All formats packaged");let SD,yD;if(G){U("thumbnails",80,"Generating thumbnail sprites...");let q={width:J.width||160,height:J.height||90,interval:J.interval||1,columns:J.columns||10},z=await aD(D,L,Q.duration,q);SD=z.spritePath,yD=z.vttPath,U("thumbnails",90,"Thumbnails generated")}let vD;if(Y)U("thumbnails",92,"Generating poster image..."),vD=await sD(D,L,K),U("thumbnails",95,"Poster generated");return U("manifest",95,"Finalizing..."),U("complete",100,"Conversion complete!"),{manifestPath:ou,hlsManifestPath:tu,videoPaths:TD,thumbnailSpritePath:SD,thumbnailVttPath:yD,posterPath:vD,duration:Q.duration,profiles:H,usedNvenc:V,codecType:A,format:$}}var wD=DD(lu(),1);import{statSync as D3}from"node:fs";var W=process.argv.slice(2),AD,ZD,d="dual",c="both",bD=[],O,w,j,b;for(let D=0;D<W.length;D++)if(W[D]==="-r"||W[D]==="--resolutions"){let u=[];for(let F=D+1;F<W.length;F++){if(W[F].startsWith("-"))break;u.push(W[F]),D=F}AD=u.join(",").split(/[,\s]+/).map((F)=>F.trim()).filter((F)=>F.length>0)}else if(W[D]==="-p"||W[D]==="--poster")ZD=W[D+1],D++;else if(W[D]==="-c"||W[D]==="--codec"){let u=W[D+1];if(u==="av1"||u==="h264"||u==="dual")d=u;else console.error(`❌Invalidcodec:${u}.Validoptions:av1,h264,dual`),process.exit(1);D++}else if(W[D]==="-f"||W[D]==="--format"){let u=W[D+1];if(u==="dash"||u==="hls"||u==="both")c=u;else console.error(`❌Invalidformat:${u}.Validoptions:dash,hls,both`),process.exit(1);D++}else if(W[D]==="--h264-cq"){if(O=parseInt(W[D+1]),isNaN(O)||O<0||O>51)console.error(`❌InvalidH.264CQvalue:${W[D+1]}.Mustbe0-51`),process.exit(1);D++}else if(W[D]==="--h264-crf"){if(w=parseInt(W[D+1]),isNaN(w)||w<0||w>51)console.error(`❌InvalidH.264CRFvalue:${W[D+1]}.Mustbe0-51`),process.exit(1);D++}else if(W[D]==="--av1-cq"){if(j=parseInt(W[D+1]),isNaN(j)||j<0||j>51)console.error(`❌InvalidAV1CQvalue:${W[D+1]}.Mustbe0-51`),process.exit(1);D++}else if(W[D]==="--av1-crf"){if(b=parseInt(W[D+1]),isNaN(b)||b<0||b>63)console.error(`❌InvalidAV1CRFvalue:${W[D+1]}.Mustbe0-63`),process.exit(1);D++}else if(!W[D].startsWith("-"))bD.push(W[D]);var e=bD[0],pu=bD[1]||".";if(!e)console.error("❌ Usage: avc <input-video> [output-dir] [options]"),console.error(`
`);var nu=await n(),su=await a(),jD=await r(),au=await s();console.log(`FFmpeg:${nu?"✅":"❌"}`);console.log(`NVENC(H.264):${su?"✅ (GPU acceleration)":"⚠️ (CPU only)"}`);if(jD.available)console.log(`AV1Encoder:✅${jD.encoder}(GPUacceleration)`);else console.log("AV1 Encoder: ⚠️ (not available, will use CPU fallback)");console.log(`MP4Box:${au?"✅":"❌"}
`);if(!nu)console.error("❌ FFmpeg not found. Please install FFmpeg first."),process.exit(1);if(!au)console.error("❌ MP4Box not found. Please install: sudo pacman -S gpac"),process.exit(1);if((d==="av1"||d==="dual")&&!jD.available)console.error("⚠️ Warning: AV1 encoding requested but no hardware AV1 encoder found."),console.error(" CPU-based AV1 encoding (libsvtav1) will be VERY slow."),console.error(`Considerusing--codech264forfasterencoding.
`);if((c==="hls"||c==="both")&&d==="av1")console.error("❌ Error: HLS format requires H.264 codec for Safari/iOS compatibility."),console.error(`Pleaseuse--codech264or--codecdualwith--formathls
`);var T=await i(e),u3=D3(e),F3=(u3.size/1048576).toFixed(2);console.log("\uD83D\uDCF9 Video Information:");console.log(`File:${e}`);console.log(`Size:${F3}MB`);console.log(`Resolution:${T.width}x${T.height}`);console.log(`FPS:${T.fps.toFixed(2)}`);console.log(`Duration:${Math.floor(T.duration/60)}m${Math.floor(T.duration%60)}s`);console.log(`Codec:${T.codec}`);if(T.videoBitrate)console.log(`VideoBitrate:${(T.videoBitrate/1000).toFixed(2)}Mbps`);if(T.audioBitrate)console.log(`AudioBitrate:${T.audioBitrate}kbps`);console.log(`
\uD83D\uDCC1Output:${pu}`);console.log(`\uD83C\uDFACCodec:${d}${d==="dual"?" (AV1 + H.264 for maximum compatibility)":""}`);console.log(`\uD83D\uDCFAFormat:${c}${c==="both"?" (DASH + HLS for maximum compatibility)":c==="hls"?" (H.264 only for Safari/iOS)":""}`);if(AD)console.log(`\uD83C\uDFAFCustomprofiles:${AD.join(", ")}`);if(ZD)console.log(`\uD83D\uDDBC️Postertimecode:${ZD}`);var P;if(O!==void 0||w!==void 0||j!==void 0||b!==void 0){if(P={},O!==void 0||w!==void 0){if(P.h264={},O!==void 0)P.h264.cq=O;if(w!==void 0)P.h264.crf=w;console.log(`\uD83C\uDF9A️H.264Quality:${O!==void0?`CQ ${O}`:""}${w!==void0?` CRF ${w}`:""}`)}if(j!==void 0||b!==void 0){if(P.av1={},j!==void 0)P.av1.cq=j;if(b!==void 0)P.av1.crf=b;console.log(`\uD83C\uDF9A️AV1Quality:${j!==void0?`CQ ${j}`:""}${b!==void0?` CRF ${b}`:""}`)}}console.log(`