${G}`))}})})}import{spawn as VF}from"node:child_process";async function r(u){return new Promise((D,E)=>{let F=VF("ffprobe",["-v","error","-show_entries","stream=width,height,duration,r_frame_rate,codec_name,codec_type,bit_rate","-show_entries","format=duration","-of","json",u]),C="";F.stdout.on("data",(B)=>{C+=B.toString()}),F.on("error",(B)=>{E(Error(`ffprobeerror:${B.message}`))}),F.on("close",(B)=>{if(B!==0){E(Error(`ffprobefailedwithexitcode${B}`));return}try{let A=JSON.parse(C),$=A.streams.find((U)=>U.codec_type==="video"),J=A.streams.find((U)=>U.codec_type==="audio"),G=A.format;if(!$){E(Error("No video stream found in input file"));return}let X=30;if($.r_frame_rate){let[U,q]=$.r_frame_rate.split("/").map(Number);if(U&&q&&q!==0)X=U/q}let Y=parseFloat($.duration||G.duration||"0"),Z=A.streams.find((U)=>U.codec_type==="audio"&&U.bit_rate),K=Z?.bit_rate?Math.round(parseInt(Z.bit_rate)/1000):void 0,_=$.bit_rate?Math.round(parseInt($.bit_rate)/1000):void 0;D({width:$.width,height:$.height,duration:Y,fps:X,codec:$.codec_name,hasAudio:Boolean(J),audioBitrate:K,videoBitrate:_})}catch(A){E(Error(`Failedtoparseffprobeoutput:${A}`))}})})}function CD(u,D=256){if(!u)return`${D}k`;let E=Math.min(u,D);if(E<=64)return"64k";if(E<=96)return"96k";if(E<=128)return"128k";if(E<=192)return"192k";return"256k"}function BD(u){let D=Math.floor(u/3600),E=Math.floor(u%3600/60),F=u%60;return`${String(D).padStart(2,"0")}:${String(E).padStart(2,"0")}:${F.toFixed(3).padStart(6,"0")}`}import{mkdir as LF,access as MF,constants as OF}from"node:fs/promises";async function l(u){try{await MF(u,OF.F_OK)}catch{await LF(u,{recursive:!0})}}function wF(u,D){let E=u*D;if(E<=230400)return 0.08;if(E<=409920)return 0.075;if(E<=921600)return 0.07;if(E<=2073600)return 0.065;if(E<=3686400)return 0.06;return 0.055}function v(u,D,E=30,F){let C=wF(u,D),B=Math.round(u*D*E*C/1000);if(F&&B>F)B=F;return`${B}k`}var HD=[{name:"360p",width:640,height:360,videoBitrate:v(640,360,30),audioBitrate:"192k"},{name:"480p",width:854,height:480,videoBitrate:v(854,480,30),audioBitrate:"192k"},{name:"720p",width:1280,height:720,videoBitrate:v(1280,720,30),audioBitrate:"192k"},{name:"1080p",width:1920,height:1080,videoBitrate:v(1920,1080,30),audioBitrate:"256k"},{name:"1440p",width:2560,height:1440,videoBitrate:v(2560,1440,30),audioBitrate:"256k"},{name:"2160p",width:3840,height:2160,videoBitrate:v(3840,2160,30),audioBitrate:"256k"}];function uD(u,D,E=30,F){let C=[],B=HD.filter((A)=>{return A.width<=u&&A.height<=D});for(let A of B)C.push({...A,videoBitrate:v(A.width,A.height,30,F),fps:30});return C}function SF(u,D,E){return{...u,name:`${u.name}-${D}`,videoBitrate:v(u.width,u.height,D,E),fps:D}}function eD(u){let E=u.trim().match(/^(\d+)p?(?:[@-](\d+))?$/i);if(!E)return null;let F=E[1]+"p",C=E[2]?parseInt(E[2]):30;return{resolution:F,fps:C}}function Du(u,D=30,E){let F=HD.find((C)=>C.name===u);if(!F)return null;if(D===30)return{...F,videoBitrate:v(F.width,F.height,30,E),fps:30};return SF(F,D,E)}function TF(u,D,E,F){let C=eD(u);if(!C)return{error:`Invalidprofileformat:${u}.Useformatlike:360,720@60,1080-60`};let B=Du(C.resolution,C.fps);if(!B)return{error:`Unknownresolution:${C.resolution}.Available:360,480,720,1080,1440,2160`};if(B.width>D||B.height>E)return{error:`Sourceresolution(${D}x${E})islowerthan${u}(${B.width}x${B.height})`};let A=120,$=C.fps,J;if(C.fps>F)$=Math.min(F,A),J=`Requested${C.fps}FPSin${u},butsourceis${F}FPS.Using${$}FPSinstead`;else if(C.fps>A)$=A,J=`Requested${C.fps}FPSin${u}exceedsmaximum${A}FPS.Using${$}FPSinstead`;return J?{warning:J,adjustedFps:$}:{}}function AD(u,D,E,F,C){let B=[],A=[],$=[];for(let J of u){let G=TF(J,D,E,F);if(G.error){A.push(G.error);continue}if(G.warning)$.push(G.warning);let X=eD(J);if(!X)continue;let Y=G.adjustedFps!==void 0?G.adjustedFps:X.fps,Z=Du(X.resolution,Y,C);if(Z)B.push(Z)}return{profiles:B,errors:A,warnings:$}}import{join as f}from"node:path";import{readdir as bF,unlink as uu,rmdir as yF,writeFile as Fu}from"node:fs/promises";async function Eu(u,D,E="00:00:00"){let F=f(D,"po
`;for(let F of u){let C=D?"avc1.4D4020,mp4a.40.2":"avc1.4D4020";if(E+=`#EXT-X-STREAM-INF:BANDWIDTH=${F.bandwidth},CODECS="${C}",RESOLUTION=${F.resolution},FRAME-RATE=${F.fps}`,D)E+=',AUDIO="audio"';E+=`
`}return E}async function fF(u,D,E,F,C,B){let A=M(D,"manifest.mpd"),$=["-dash",String(F*1000),"-frag",String(F*1000),"-rap","-segment-timeline","-segment-name","$RepresentationID$_$Number$","-out",A],J=!0;for(let[G,X]of u.entries())for(let Y of E){let Z=X.get(Y.name);if(!Z)throw Error(`MP4filenotfoundforprofile:${Y.name},codec:${G}`);let K=C==="dual"?`${Y.name}-${G}`:Y.name;if($.push(`${Z}#video:id=${K}`),J&&B)$.push(`${Z}#audio:id=audio`),J=!1}if(await zD($),await gF(D,E,C,B),await $u(A,E,C),C==="dual")await Ju(A);return await Zu(A),A}async function gF(u,D,E,F){let{readdir:C,rename:B,mkdir:A}=await import("node:fs/promises"),$=[];if(E==="h264"||E==="dual")$.push("h264");if(E==="av1"||E==="dual")$.push("av1");let J=[];for(let Y of $)for(let Z of D){let K=E==="dual"?`${Z.name}-${Y}`:Z.name;J.push(K);let _=M(u,K);await A(_,{recursive:!0})}let G=M(u,"audio");if(F)await A(G,{recursive:!0});let X=await C(u);for(let Y of X){if(Y==="manifest.mpd")continue;if(F&&(Y.startsWith("audio_")||Y==="audio_init.m4s")){let Z=M(u,Y),K=M(G,Y);await B(Z,K);continue}for(let Z of J)if(Y.startsWith(`${Z}_`)){let K=M(u,Y),_=M(u,Z,Y);await B(K,_);break}}}async function Yu(u,D,E,F,C,B,A){let $,J;if(B==="dash"||B==="both")$=await fF(u,D,E,F,C,A);if(B==="hls"||B==="both")J=await mF(D,E,F,C,A);return{manifestPath:$,hlsManifestPath:J}}async function mF(u,D,E,F,C){let B=M(u,"master.m3u8"),A=[];for(let X of D){let Y=F==="dual"?`${X.name}-h264`:X.name,Z=M(u,Y),K=await Xu(Z),_=K.filter((z)=>z.endsWith(".m4s")).sort((z,V)=>{let j=parseInt(z.match(/_(\d+)\.m4s$/)?.[1]||"0"),w=parseInt(V.match(/_(\d+)\.m4s$/)?.[1]||"0");return j-w}),U=K.find((z)=>z.endsWith("_.mp4"));if(!U||_.length===0)continue;let q=xD(_,U,E),k=M(Z,"playlist.m3u8");await VD(k,q,"utf-8");let W=parseInt(X.videoBitrate)*1000;A.push({path:`${Y}/playlist.m3u8`,bandwidth:W,resolution:`${X.width}x${X.height}`,fps:X.fps||30})}let $,J=[];if(C){let X=M(u,"audio"),Y=[];try{Y=await Xu(X)}catch{Y=[]}if(J=Y.filter((Z)=>Z.endsWith(".m4s")).sort((Z,K)=>{let _=parseInt(Z.match(/_(\d+)\.m4s$/)?.[1]||"0"),U=parseInt(K.match(/_(\d+)\.m4s$/)?.[1]||"0");return _-U}),$=Y.find((Z)=>Z.endsWith("_.mp4")),$&&J.length>0){let Z=xD(J,$,E);await VD(M(X,"playlist.m3u8"),Z,"utf-8")}}let G=Ku(A,C&&$!==void 0&&J.length>0);return await VD(B,G,"utf-8"),B}async function LD(u){let{input:D,outputDir:E,segmentDuration:F=2,profiles:C,customProfiles:B,codec:A="dual",format:$="both",useNvenc:J,hardwareAccelerator:G,quality:X,generateThumbnails:Y=!0,thumbnailConfig:Z={},generatePoster:K=!0,posterTimecode:_="00:00:00",parallel:U=!0,onProgress:q}=u,k=$D("/tmp",`dash-converter-${cF()}`);await l(k);let W=Uu(D,ku(D)),z=$D(E,W);await l(z);let V=$D(z,"conversion.log");ND(V);let{writeFile:j}=await import("node:fs/promises"),w=`===========================================
`,"utf-8")}catch(UD){}try{await Wu(k,{recursive:!0,force:!0})}catch(UD){console.warn(`Warning:Failedtocleanuptempdirectory:${k}`)}}}async function lF(u,D,E,F,C,B,A,$,J,G,X,Y,Z,K,_,U,q){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 k=(N,I,WD,_D)=>{if(q)q({stage:N,percent:I,message:WD,currentProfile:_D})};k("analyzing",0,"Analyzing input video...");let W=await r(u),z=W.hasAudio,V=G&&G!=="auto"?G:J===!0?"nvenc":J===!1?"cpu":"auto",j=await a(),{selected:w,h264Encoder:GD,av1Encoder:UD,warnings:lD}=dF(j,V,A);if(lD.length>0)for(let N of lD)console.warn(`⚠️${N}`);let $F=j.some((N)=>N.av1Encoder),m=A;if(A==="dual"&&!$F)console.warn("⚠️ AV1 hardware encoder not detected. Switching to H.264 only."),m="h264";let O;if(B&&B.length>0){let N=AD(B,W.width,W.height,W.fps,W.videoBitrate);if(N.errors.length>0){console.warn(`
❌Profileerrors:`);for(let I of N.errors)console.warn(`-${I}`);console.warn("")}if(N.warnings.length>0){console.warn(`
⚠️Profilewarnings:`);for(let I of N.warnings)console.warn(`-${I}`);console.warn("")}if(O=N.profiles,O.length===0)throw Error("No valid profiles found in custom list. Check errors above.")}else if(C)O=C;else O=uD(W.width,W.height,W.fps,W.videoBitrate);if(O.length===0)throw Error("No suitable profiles found for input video resolution");let JF=Uu(u,ku(u)),t=$D(D,JF);try{await Wu(t,{recursive:!0,force:!0})}catch(N){}await l(t);let P=[];if(m==="h264"||m==="dual"){let N=GD||"libx264",I=Gu(N,"h264");P.push({type:"h264",codec:N,preset:I})}if(m==="av1"||m==="dual"){let N=UD||"libsvtav1",I=Gu(N,"av1");P.push({type:"av1",codec:N,preset:I})}let KF=P.map((N)=>N.type.toUpperCase()).join(" + "),XF=w==="cpu"?"CPU":w.toUpperCase();k("analyzing",20,`Using${KF}encoding(${XF})`,void 0);let YF=w==="cpu"?2:3,kD=new Map;for(let N=0;N<P.length;N++){let{type:I,codec:WD,preset:_D}=P[N],aD=N/P.length,kF=1/P.length;k("encoding",25+aD*40,`Stage1:Encoding${I.toUpperCase()}(${O.length}profiles)...`);let WF=I==="h264"?X?.h264:X?.av1,_F=await Au(u,E,O,WD,_D,W.duration,F,W.audioBitrate,U,YF,I,WF,void 0,(e,rD)=>{let R8=O.findIndex((QF)=>QF.name===e),iD=25+aD*40,oD=rD/100*(40*kF/O.length);if(k("encoding",iD+oD,`Encoding${I.toUpperCase()}${e}...`,`${I}-${e}`),q)q({stage:"encoding",percent:iD+oD,currentProfile:`${I}-${e}`,profilePercent:rD,message:`Encoding${I.toUpperCase()}${e}...`})});kD.set(I,_F)}k("encoding",65,"Stage 1 complete: All codecs and profiles encoded"),k("encoding",70,"Stage 2: Creating segments and manifests...");let{manifestPath:GF,hlsManifestPath:UF}=await Yu(kD,t,O,F,m,$,z),dD=[];for(let N of kD.values())dD.push(...Array.from(N.values()));k("encoding",80,"Stage 2 complete: All formats packaged");let pD,nD;if(Y){k("thumbnails",80,"Generating thumbnail sprites...");let N={width:Z.width||160,height:Z.height||90,interval:Z.interval||1,columns:Z.columns||10},I=await Cu(u,t,W.duration,N);pD=I.spritePath,nD=I.vttPath,k("thumbnails",90,"Thumbnails generated")}let sD;if(K)k("thumbnails",92,"Generating poster image..."),sD=await Eu(u,t,_),k("thumbnails",95,"Poster generated");return k("manifest",95,"Finalizing..."),k("complete",100,"Conversion complete!"),{manifestPath:GF,hlsManifestPath:UF,videoPaths:dD,thumbnailSpritePath:pD,thumbnailVttPath:nD,posterPath:sD,duration:W.duration,profiles:O,usedNvenc:P.some((N)=>N.codec.includes("nvenc")),selectedAccelerator:w,codecType:m,format:$}}var ZD={nvenc:100,qsv:90,amf:80,vaapi:70,videotoolbox:65,v4l2:60,cpu:1};function dF(u,D,E){let F=E==="h264"||E==="dual",C=E==="av1"||E==="dual",B=[],A=new Set(["nvenc","qsv","amf"]),$=u.filter((k)=>F&&k.h264Encoder||C&&k.av1Encoder),J=$.filter((k)=>A.has(k.accelerator)),G=(k)=>$.find((W)=>W.accelerator===k),X;if(D!=="auto"){if(D==="cpu")X=void 0;else if(!A.has(D))B.push(`Ускоритель"${D}"поканеподдерживается,используюCPU`);else if(X=G(D),!X)throw Error(`Аппаратныйускоритель"${D}"недоступенвсистеме`)}else if(X=(J.length>0?J:[]).sort((W,z)=>(ZD[z.accelerator]||0)-(ZD[W.accelerator]||0))[0],!X&&$.length>0)B.push("Доступен аппаратный ускоритель, но он пока не поддерживается пайплайном, использую CPU");let Z=(J.length>0?J:[]).sort((k,W)=>(ZD[W.accelerator]||0)-(ZD[k.accelerator]||0)),K=(k)=>{let W=k==="h264"?X?.h264Encoder:X?.av1Encoder;if(W)return{encoder:W,accel:X?.accelerator};let z=Z.find((V)=>k==="h264"?V.h264Encoder:V.av1Encoder);if(z){if(D!=="auto"&&X)B.push(`Выбранныйускоритель"${X.accelerator}"неподдерживает${k.toUpperCase()},использую${z.accelerator}`);return{encoder:k==="h264"?z.h264Encoder:z.av1Encoder,accel:z.accelerator}}if(D!=="auto"&&D!=="cpu")B.push(`Ускоритель"${D}"неподдерживает${k.toUpperCase()},используюCPU`);return{encoder:void 0,accel:"cpu"}},_=F?K("h264"):{encoder:void 0,accel:X?.accelerator},U=C?K("av1"):{encoder:void 0,accel:X?.accelerator};return{selected:X?.accelerator||_.accel||U.acc
`);var BF=await n(),AF=await s(),cD=await a(),ZF=cD.some((u)=>u.av1Encoder),FF={nvenc:100,qsv:90,amf:80,vaapi:70,videotoolbox:65,v4l2:60},XD=cD.slice().sort((u,D)=>(FF[D.accelerator]||0)-(FF[u.accelerator]||0))[0];console.log(`FFmpeg:${BF?"✅":"❌"}`);console.log(`MP4Box:${AF?"✅":"❌"}`);var z8=Array.from(new Set(cD.map((u)=>u.accelerator.toUpperCase()))),hD=XD?XD.accelerator.toUpperCase():void 0,YD=z8.filter((u)=>u!==hD),H8=hD?`✅${hD}${YD.length>0?` (${YD.join(", ")})`:""}`:"❌";console.log(`Hardware:${H8}`);console.log("");if(!BF)console.error("❌ FFmpeg not found. Please install FFmpeg first."),process.exit(1);if(!AF)console.error("❌ MP4Box not found. Please install: sudo pacman -S gpac"),process.exit(1);if((R==="av1"||R==="dual")&&!ZF){if(R==="av1")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.
`);else if(R==="dual")console.warn("⚠️ AV1 hardware encoder not detected. Using H.264 only (disable AV1)."),R="h264"}if((i==="hls"||i==="both")&&R==="av1")console.error("❌ Error: HLS format requires H.264 codec for Safari/iOS compatibility."),console.error(`Pleaseuse--codech264or--codecdualwith--formathls