2026-01-20 00:25:55 +03:00
#!/usr/bin/env node
2026-01-20 10:46:22 +03:00
import { createRequire as yF } from "node:module" ; var wF = Object . create ; var { getPrototypeOf : SF , defineProperty : Eu , getOwnPropertyNames : TF } = Object ; var bF = Object . prototype . hasOwnProperty ; var KD = ( u , D , E ) => { E = u != null ? wF ( SF ( u ) ) : { } ; let F = D || ! u || ! u . _ _esModule ? Eu ( E , "default" , { value : u , enumerable : ! 0 } ) : E ; for ( let C of TF ( u ) ) if ( ! bF . call ( F , C ) ) Eu ( F , C , { get : ( ) => u [ C ] , enumerable : ! 0 } ) ; return F } ; var I = ( u , D ) => ( ) => ( D || u ( ( D = { exports : { } } ) . exports , D ) , D . exports ) ; var n = yF ( import . meta . url ) ; var Iu = I ( ( y3 , xu ) => { class qu { constructor ( u , D , E ) { this . etaBufferLength = u || 100 , this . valueBuffer = [ E ] , this . timeBuffer = [ D ] , this . eta = "0" } update ( u , D , E ) { this . valueBuffer . push ( D ) , this . timeBuffer . push ( u ) , this . calculate ( E - D ) } getTime ( ) { return this . eta } calculate ( u ) { let D = this . valueBuffer . length , E = Math . min ( this . etaBufferLength , D ) , F = this . valueBuffer [ D - 1 ] - this . valueBuffer [ D - E ] , C = this . timeBuffer [ D - 1 ] - this . timeBuffer [ D - E ] , B = F / C ; this . valueBuffer = this . valueBuffer . slice ( - this . etaBufferLength ) , this . timeBuffer = this . timeBuffer . slice ( - this . etaBufferLength ) ; let A = Math . ceil ( u / B / 1000 ) ; if ( isNaN ( A ) ) this . eta = "NULL" ; else if ( ! isFinite ( A ) ) this . eta = "INF" ; else if ( A > 1e7 ) this . eta = "INF" ; else if ( A < 0 ) this . eta = 0 ; else this . eta = A } } xu . exports = qu } ) ; var wD = I ( ( v3 , Mu ) => { var p = n ( "readline" ) ; class Vu { constructor ( u ) { this . stream = u , this . linewrap = ! 0 , this . dy = 0 } cursorSave ( ) { if ( ! this . stream . isTTY ) return ; this . stream . write ( "\x1B7" ) } cursorRestore ( ) { if ( ! this . stream . isTTY ) return ; this . stream . write ( "\x1B8" ) } cursor ( u ) { if ( ! this . stream . isTTY ) return ; if ( u ) this . stream . write ( "\x1B[?25h" ) ; else this . stream . write ( "\x1B[?25l" ) } cursorTo ( u = null , D = null ) { if ( ! this . stream . isTTY ) return ; p . cursorTo ( this . stream , u , D ) } cursorRelative ( u = null , D = null ) { if ( ! this . stream . isTTY ) return ; this . dy = this . dy + D , p . moveCursor ( this . stream , u , D ) } cursorRelativeReset ( ) { if ( ! this . stream . isTTY ) return ; p . moveCursor ( this . stream , 0 , - this . dy ) , p . cursorTo ( this . stream , 0 , null ) , this . dy = 0 } clearRight ( ) { if ( ! this . stream . isTTY ) return ; p . clearLine ( this . stream , 1 ) } clearLine ( ) { if ( ! this . stream . isTTY ) return ; p . clearLine ( this . stream , 0 ) } clearBottom ( ) { if ( ! this . stream . isTTY ) return ; p . clearScreenDown ( this . stream ) } newline ( ) { this . stream . write ( `
` ),this.dy++}write(u,D=!1){if(this.linewrap===!0&&D===!1)this.stream.write(u.substr(0,this.getWidth()));else this.stream.write(u)}lineWrapping(u){if(!this.stream.isTTY)return;if(this.linewrap=u,u)this.stream.write(" \x 1B[?7h");else this.stream.write(" \x 1B[?7l")}isTTY(){return this.stream.isTTY===!0}getWidth(){return this.stream.columns||(this.stream.isTTY?80:200)}}Mu.exports=Vu});var Ru=I((P3,Ou)=>{Ou.exports=({onlyFirst:u=!1}={})=>{let D=["[ \\ u001B \\ u009B][[ \\ ]()#;?]*(?:(?:(?:(?:;[-a-zA-Z \\ d \\ /#&.:=?%@~_]+)*|[a-zA-Z \\ d]+(?:;[-a-zA-Z \\ d \\ /#&.:=?%@~_]*)*)? \\ u0007)","(?:(?: \\ d{1,4}(?:; \\ d{0,4})*)?[ \\ dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(D,u?void 0:"g")}});var ju=I((h3,Lu)=>{var C8=Ru();Lu.exports=(u)=>typeof u==="string"?u.replace(C8(),""):u});var Su=I((f3,SD)=>{var wu=(u)=>{if(Number.isNaN(u))return!1;if(u>=4352&&(u<=4447||u===9001||u===9002||11904<=u&&u<=12871&&u!==12351||12880<=u&&u<=19903||19968<=u&&u<=42182||43360<=u&&u<=43388||44032<=u&&u<=55203||63744<=u&&u<=64255||65040<=u&&u<=65049||65072<=u&&u<=65131||65281<=u&&u<=65376||65504<=u&&u<=65510||110592<=u&&u<=110593||127488<=u&&u<=127569||131072<=u&&u<=262141))return!0;return!1};SD.exports=wu;SD.exports.default=wu});var bu=I((g3,Tu)=>{Tu.exports=function(){return/ \u D83C \u DFF4 \u DB40 \u DC67 \u DB40 \u DC62(?: \u DB40 \u DC65 \u DB40 \u DC6E \u DB40 \u DC67| \u DB40 \u DC73 \u DB40 \u DC63 \u DB40 \u DC74| \u DB40 \u DC77 \u DB40 \u DC6C \u DB40 \u DC73) \u DB40 \u DC7F| \u D83D \u DC68(?: \u D83C \u DFFC \u 200D(?: \u D83E \u DD1D \u 200D \u D83D \u DC68 \u D83C \u DFFB| \u D83C[ \u DF3E \u DF73 \u DF93 \u DFA4 \u DFA8 \u DFEB \u DFED]| \u D83D[ \u DCBB \u DCBC \u DD27 \u DD2C \u DE80 \u DE92]| \u D83E[ \u DDAF- \u DDB3 \u DDBC \u DDBD])| \u D83C \u DFFF \u 200D(?: \u D83E \u DD1D \u 200D \u D83D \u DC68(?: \u D83C[ \u DFFB- \u DFFE])| \u D83C[ \u DF3E \u DF73 \u DF93 \u DFA4 \u DFA8 \u DFEB \u DFED]| \u D83D[ \u DCBB \u DCBC \u DD27 \u DD2C \u DE80 \u DE92]| \u D83E[ \u DDAF- \u DDB3 \u DDBC \u DDBD])| \u D83C \u DFFE \u 200D(?: \u D83E \u DD1D \u 200D \u D83D \u DC68(?: \u D83C[ \u DFFB- \u DFFD])| \u D83C[ \u DF3E \u DF73 \u DF93 \u DFA4 \u DFA8 \u DFEB \u DFED]| \u D83D[ \u DCBB \u DCBC \u DD27 \u DD2C \u DE80 \u DE92]| \u D83E[ \u DDAF- \u DDB3 \u DDBC \u DDBD])| \u D83C \u DFFD \u 200D(?: \u D83E \u DD1D \u 200D \u D83D \u DC68(?: \u D83C[ \u DFFB \u DFFC])| \u D83C[ \u DF3E \u DF73 \u DF93 \u DFA4 \u DFA8 \u DFEB \u DFED]| \u D83D[ \u DCBB \u DCBC \u DD27 \u DD2C \u DE80 \u DE92]| \u D83E[ \u DDAF- \u DDB3 \u DDBC \u DDBD])| \u 200D(?: \u 2764 \u FE0F \u 200D(?: \u D83D \u DC8B \u 200D)? \u D83D \u DC68|(?: \u D83D[ \u DC68 \u DC69]) \u 200D(?: \u D83D \u DC66 \u 200D \u D83D \u DC66| \u D83D \u DC67 \u 200D(?: \u D83D[ \u DC66 \u DC67]))| \u D83D \u DC66 \u 200D \u D83D \u DC66| \u D83D \u DC67 \u 200D(?: \u D83D[ \u DC66 \u DC67])|(?: \u D83D[ \u DC68 \u DC69]) \u 200D(?: \u D83D[ \u DC66 \u DC67])|[ \u 2695 \u 2696 \u 2708] \u FE0F| \u D83D[ \u DC66 \u DC67]| \u D83C[ \u DF3E \u DF73 \u DF93 \u DFA4 \u DFA8 \u DFEB \u DFED]| \u D83D[ \u DCBB \u DCBC \u DD27 \u DD2C \u DE80 \u DE92]| \u D83E[ \u DDAF- \u DDB3 \u DDBC \u DDBD])|(?: \u D83C \u DFFB \u 200D[ \u 2695 \u 2696 \u 2708]| \u D83C \u DFFF \u 200D[ \u 2695 \u 2696 \u 2708]| \u D83C \u DFFE \u 200D[ \u 2695 \u 2696 \u 2708]| \u D83C \u DFFD \u 200D[ \u 2695 \u 2696 \u 2708]| \u D83C \u DFFC \u 200D[ \u 2695 \u 2696 \u 2708]) \u FE0F| \u D83C \u DFFB \u 200D(?: \u D83C[ \u DF3E \u DF73 \u DF93 \u DFA4 \u DFA8 \u DFEB \u DFED]| \u D83D[ \u DCBB \u DCBC \u DD27 \u DD2C \u DE80 \u DE92]| \u D83E[ \u DDAF- \u DDB3 \u DDBC \u DDBD])| \u D83C[ \u DFFB- \u DFFF])|(?: \u D83E \u DDD1 \u D83C \u DFFB \u 200D \u D83E \u DD1D \u 200D \u D83E \u DDD1| \u D83D \u DC69 \u D83C \u DFFC \u 200D \u D83E \u DD1D \u 200D \u D83D \u DC69) \u D83C \u DFFB| \u D83E \u DDD1(?: \u D83C \u DFFF \u 200D \u D83E \u DD1D \u 200D \u D83E \u DDD1(?: \u D83C[ \u DFFB- \u DFFF])| \u 200D \u D83E \u DD1D \u 200D \u D83E \u DDD1)|(?: \u D83E \u DDD1 \u D83C \u DFFE \u 200D \u D83E \u DD1D \u 200D \u D83E \u DDD1| \u D83D \u DC69 \u D83C \u DFFF \u 200D \u D83E \u DD1D \u 200D(?: \u D83D[ \u DC68 \u DC69]))(?: \u D83C[ \u DFFB- \u DFFE])|(?: \u D83E \u DDD1 \u D83C \u DFFC \u 200D \u D83E \u DD1D \u 200D \u D83E \u DDD1| \u D83D \u DC69 \u D83C \u DFFD \u 200D \u D83E \u DD1D \u 200D \u D83D \u DC69)(?: \u D83C[ \u DFFB \u DFFC])| \u D83D \u DC69(?: \u D83C \u DFFE \u 200D(?: \u D83E \u DD1D \u 200D \u D83D \u DC68(?: \u D83C[ \u DFFB- \u DFFD \u DFFF])| \u D83C[ \u DF3E \u DF73 \u DF93 \u DFA4 \u DFA8 \u DFEB \u DFED]| \u D83D[ \u DCBB \u DCBC \u DD27 \u DD2C \u DE80 \u DE92]| \u D83E[ \u DDAF- \u DDB3 \u DDBC \u DDBD])| \u D83C \u DFFC \u 200D(?: \u D83E \u DD1D \u 200D \u D83D \u DC68(?: \u D83C[ \u DFFB \u DFFD- \u DFFF])| \u D83C[ \u DF3E \u DF73 \u DF93 \u DFA4 \u DFA8 \u DFEB \u DFED]| \u D83D[ \u DCBB \u DCBC \u DD27 \u DD2C \u DE80 \u DE92]| \u D
2026-01-20 10:38:25 +03:00
` ).map((C)=>C.trim()).filter(Boolean),E=[],F={cuda:"nvenc",qsv:"qsv",vaapi:"vaapi",videotoolbox:"videotoolbox",v4l2m2m:"v4l2",dxva2:"amf"};for(let C of D){let B=F[C];if(B)E.push({accelerator:B})}return E}async function l(u,D,E){let C= `
2026-01-20 00:25:55 +03:00
=== FFmpeg Command [ $ { new Date ( ) . toISOString ( ) } ] ===
ffmpeg $ { u . join ( " " ) }
2026-01-20 10:38:25 +03:00
` ;return await f(C),new Promise((B,A)=>{let Z=s("ffmpeg",u),J="";Z.stderr.on("data",(G)=>{let X=G.toString();if(J+=X,D&&E){let Y=X.match(/time=( \d {2}):( \d {2}):( \d {2} \. \d {2})/);if(Y){let $ =parseInt(Y[1]),N=parseInt(Y[2]),K=parseFloat(Y[3]),_= $ *3600+N*60+K,W=Math.min(100,_/E*100);D(W)}}}),Z.on("error",(G)=>{f( ` ERROR : $ { G . message }
` ),A(Error( ` FFmpeg error : $ { G . message } ` ))}),Z.on("close",(G)=>{if(G===0){let Y=J.split( `
` ).filter(( $ )=> $ .trim()).slice(-10).join( `
` );f( ` SUCCESS : Exit code $ { G }
2026-01-20 00:25:55 +03:00
-- - Last 10 lines of output -- -
$ { Y }
2026-01-20 10:38:25 +03:00
` ),B()}else f( ` FAILED : Exit code $ { G }
2026-01-20 00:25:55 +03:00
-- - Full error output -- -
$ { J }
` ),A(Error( ` FFmpeg failed with exit code $ { G }
2026-01-20 10:38:25 +03:00
$ { J } ` ))})})}async function ID(u){let E= `
2026-01-20 00:25:55 +03:00
=== MP4Box Command [ $ { new Date ( ) . toISOString ( ) } ] ===
MP4Box $ { u . join ( " " ) }
2026-01-20 10:38:25 +03:00
` ;return await f(E),new Promise((F,C)=>{let B=s("MP4Box",u),A="",Z="";B.stdout.on("data",(J)=>{A+=J.toString()}),B.stderr.on("data",(J)=>{Z+=J.toString()}),B.on("error",(J)=>{f( ` ERROR : $ { J . message }
` ),C(Error( ` MP4Box error : $ { J . message } ` ))}),B.on("close",(J)=>{if(J===0){let Y=(A||Z).split( `
` ).filter(( $ )=> $ .trim()).slice(-10).join( `
` );f( ` SUCCESS : Exit code $ { J }
2026-01-20 00:25:55 +03:00
-- - Last 10 lines of output -- -
$ { Y }
2026-01-20 10:38:25 +03:00
` ),F()}else{let G=Z||A;f( ` FAILED : Exit code $ { J }
2026-01-20 00:25:55 +03:00
-- - Full error output -- -
$ { G }
2026-01-20 01:31:47 +03:00
` ),C(Error( ` MP4Box failed with exit code $ { J }
2026-01-20 10:46:22 +03:00
$ { G } ` ))}})})}import{spawn as PF}from"node:child_process";async function t(u){return new Promise((D,E)=>{let F=PF("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( ` ffprobe error : $ { B . message } ` ))}),F.on("close",(B)=>{if(B!==0){E(Error( ` ffprobe failed with exit code $ { B } ` ));return}try{let A=JSON.parse(C),Z=A.streams.find((_)=>_.codec_type==="video"),J=A.streams.find((_)=>_.codec_type==="audio"),G=A.format;if(!Z){E(Error("No video stream found in input file"));return}let X=30;if(Z.r_frame_rate){let[_,W]=Z.r_frame_rate.split("/").map(Number);if(_&&W&&W!==0)X=_/W}let Y=parseFloat(Z.duration||G.duration||"0"), $ =A.streams.find((_)=>_.codec_type==="audio"&&_.bit_rate),N= $ ?.bit_rate?Math.round(parseInt( $ .bit_rate)/1000):void 0,K=Z.bit_rate?Math.round(parseInt(Z.bit_rate)/1000):void 0;D({width:Z.width,height:Z.height,duration:Y,fps:X,codec:Z.codec_name,hasAudio:Boolean(J),audioBitrate:N,videoBitrate:K})}catch(A){E(Error( ` Failed to parse ffprobe output : $ { A } ` ))}})})}function XD(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 YD(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 hF,access as fF,constants as gF}from"node:fs/promises";async function d(u){try{await fF(u,gF.F_OK)}catch{await hF(u,{recursive:!0})}}function lF(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=lF(u,D),B=Math.round(u*D*E*C/1000);if(F&&B>F)B=F;return ` $ { B } k ` }var VD=[{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 AD(u,D,E=30,F){let C=[],B=VD.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 dF(u,D,E){return{...u,name: ` $ { u . name } - $ { D } ` ,videoBitrate:v(u.width,u.height,D,E),fps:D}}function Cu(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 Bu(u,D=30,E){let F=VD.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 dF(F,D,E)}function pF(u,D,E,F){let C=Cu(u);if(!C)return{error: ` Invalid profile format : $ { u } . Use format like : 360 , 720 @ 60 , 1080 - 60 ` };let B=Bu(C.resolution,C.fps);if(!B)return{error: ` Unknown resolution : $ { C . resolution } . Available : 360 , 480 , 720 , 1080 , 1440 , 2160 ` };if(B.width>D||B.height>E)return{error: ` Source resolution ( $ { D } x$ { E } ) is lower than $ { u } ( $ { B . width } x$ { B . height } ) ` };let A=120,Z=C.fps,J;if(C.fps>F)Z=Math.min(F,A),J= ` Requested $ { C . fps } FPS in $ { u } , but source is $ { F } FPS . Using $ { Z } FPS instead ` ;else if(C.fps>A)Z=A,J= ` Requested $ { C . fps } FPS in $ { u } exceeds maximum $ { A } FPS . Using $ { Z } FPS instead ` ;return J?{warning:J,adjustedFps:Z}:{}}function GD(u,D,E,F,C){let B=[],A=[],Z=[];for(let J of u){let G=pF(J,D,E,F);if(G.error){A.push(G.error);continue}if(G.warning)Z.push(G.warning);let X=Cu(J);if(!X)continue;let Y=G.adjustedFps!==void 0?G.adjustedFps:X.fps, $ =Bu(X.resolution,Y,C);if( $ )B.push( $ )}return{profiles:B,errors:A,warnings:Z}}import{join as g}from"node:path";import{readdir as nF,unlink as Au,rmdir as sF,writeFile as Zu}from"node:fs/promises";async function $ u(u,D,E="00:00:00"){let F=g(D,"po
2026-01-20 00:25:55 +03:00
2026-01-20 10:46:22 +03:00
` ;for(let Z=0;Z<u;Z++){let J=Z*D,G=(Z+1)*D,X=Math.floor(Z/C), $ =Z%C*E,N=X*F;A+= ` $ { YD ( J ) } -- > $ { YD ( G ) }
2026-01-20 10:38:25 +03:00
` ,A+= ` $ { B } # xywh = $ { $ } , $ { N } , $ { E } , $ { F }
2026-01-20 00:25:55 +03:00
2026-01-20 10:46:22 +03:00
` }return A}import{join as iF}from"node:path";function rF(u,D,E){if(E)if(D==="h264")return 32;else return 42;else if(D==="h264"){if(u<=360)return 25;if(u<=480)return 24;if(u<=720)return 23;if(u<=1080)return 22;if(u<=1440)return 21;return 20}else{if(u<=360)return 40;if(u<=480)return 38;if(u<=720)return 35;if(u<=1080)return 32;if(u<=1440)return 30;return 28}}async function Ku(u,D,E,F,C,B,A,Z,J,G,X,Y, $ ){let N=iF(D, ` video _$ { J } _$ { E . name } . mp4 ` ),K=["-y"];if(Y){if(Y==="nvenc")K.push("-hwaccel","cuda","-hwaccel_output_format","cuda");else if(Y==="qsv")K.push("-hwaccel","qsv");else if(Y==="vaapi")K.push("-hwaccel","vaapi");else if(Y==="videotoolbox")K.push("-hwaccel","videotoolbox");else if(Y==="v4l2")K.push("-hwaccel","v4l2")}K.push("-i",u,"-c:v",F);let _=F.includes("nvenc")||F.includes("qsv")||F.includes("amf")||F.includes("vaapi")||F.includes("videotoolbox")||F.includes("v4l2"),W;if(_&&G?.cq!==void 0)W=G.cq;else if(!_&&G?.crf!==void 0)W=G.crf;else W=rF(E.height,J,_);if(F==="h264_nvenc")K.push("-rc:v","vbr"),K.push("-cq",String(W)),K.push("-preset",C),K.push("-2pass","0");else if(F==="av1_nvenc")K.push("-rc:v","vbr"),K.push("-cq",String(W)),K.push("-preset",C),K.push("-2pass","0");else if(F==="av1_qsv")K.push("-preset",C),K.push("-global_quality",String(W));else if(F==="h264_qsv")K.push("-preset",C),K.push("-global_quality",String(W));else if(F==="av1_amf")K.push("-quality","balanced"),K.push("-rc","cqp"),K.push("-qp_i",String(W)),K.push("-qp_p",String(W));else if(F==="h264_amf")K.push("-quality","balanced"),K.push("-rc","cqp"),K.push("-qp_i",String(W)),K.push("-qp_p",String(W));else if(F==="libsvtav1")K.push("-crf",String(W)),K.push("-preset",C),K.push("-svtav1-params","tune=0:enable-overlays=1");else if(F==="libx264")K.push("-crf",String(W)),K.push("-preset",C);else K.push("-preset",C);let U=J==="av1"?0.6:1,k=Math.round(parseInt(E.videoBitrate)*U*1.5);K.push("-maxrate", ` $ { k } k ` ),K.push("-bufsize", ` $ { k * 2 } k ` );let q=E.fps||30,V=Math.round(q*A);K.push("-g",String(V),"-keyint_min",String(V),"-sc_threshold","0");let O=[ ` scale = $ { E . width } : $ { E . height } ` ];if(X){if(X.deinterlace)O.push("yadif");if(X.denoise)O.push("hqdn3d");if(X.customFilters)O.push(...X.customFilters)}K.push("-vf",O.join(","));let y=parseInt(E.audioBitrate)||256,P=XD(Z,y);if(K.push("-c:a","aac","-b:a",P),X?.audioNormalize)K.push("-af","loudnorm");return K.push("-f","mp4",N),await l(K, $ ,B),N}async function Xu(u,D,E,F,C,B,A,Z,J,G,X,Y, $ ,N,K){let _=new Map;if(J&&E.length>1)for(let W=0;W<E.length;W+=G){let U=E.slice(W,W+G),k=U.map((V)=>Ku(u,D,V,F,C,B,A,Z,X,Y, $ ,N,(O)=>{if(K)K(V.name,O)}));(await Promise.all(k)).forEach((V,O)=>{let y=U[O];_.set(y.name,V)})}else for(let W of E){let U=await Ku(u,D,W,F,C,B,A,Z,X,Y, $ ,N,(k)=>{if(K)K(W.name,k)});_.set(W.name,U)}return _}import{join as R}from"node:path";import{readdir as ku,rename as Q3,mkdir as _3,writeFile as LD}from"node:fs/promises";import{readFile as MD,writeFile as OD}from"node:fs/promises";async function Yu(u){let D=await MD(u,"utf-8");D=D.replace(/ \/ \/ >/g,"/>"),D=D.replace(/ \/ \s + \/ >/g,"/>"),D=D.replace(/(<Representation[^>]+) \s + \/ >/g," $ 1/>"),D=D.replace(/<Representation \s +([^>]+) \/ > \s *< \/ Representation>/g,"<Representation $ 1/>"),D=D.replace(/<Representation \s +([^>]+) \/ > \s *(<AudioChannelConfiguration[^>]* \/ >)/g, ` < Representation $1 >
2026-01-20 00:25:55 +03:00
$2
< /Representation>`),D=D.replace(/ < Representation \ s + ( [ ^ > ] + ) > \ s * ( ? = < ( ? : Representation | \ / AdaptationSet ) ) / g , ` <Representation $ 1/>
2026-01-20 10:46:22 +03:00
` ),await OD(u,D,"utf-8")}async function Gu(u,D,E){let F=await MD(u,"utf-8");F=F.replace(/media=" \$ RepresentationID \$ _ \$ Number \$ \. m4s"/g,'media=" $ RepresentationID $ / $ RepresentationID $ _ $ Number $ .m4s"'),F=F.replace(/initialization=" \$ RepresentationID \$ _ \. mp4"/g,'initialization=" $ RepresentationID $ / $ RepresentationID $ _.mp4"'),await OD(u,F,"utf-8")}async function Uu(u){let E=(await MD(u,"utf-8")).split( `
` ),F=[],C=0;while(C<E.length){let B=E[C];if(B.includes("<AdaptationSet")&&B.includes("maxWidth")){let A=C,Z=[B],J=[],G=[],X=[],Y=!1;C++;while(C<E.length&&!E[C].includes("</AdaptationSet>")){let $ =E[C];if( $ .includes("<SegmentTemplate"))Y=!0;if(Y){if(J.push( $ ), $ .includes("</SegmentTemplate>"))Y=!1}else if( $ .includes("<Representation")&& $ .includes("-h264"))G.push( $ );else if( $ .includes("<Representation")&& $ .includes("-av1"))X.push( $ );C++}if(G.length>0&&X.length>0)F.push(B),J.forEach(( $ )=>F.push( $ )),G.forEach(( $ )=>F.push( $ )),F.push(" </AdaptationSet>"),F.push(B),J.forEach(( $ )=>F.push( $ )),X.forEach(( $ )=>F.push( $ )),F.push(" </AdaptationSet>");else{F.push(B);for(let $ =A+1; $ <C; $ ++)F.push(E[ $ ]);F.push(E[C])}C++}else F.push(B),C++}await OD(u,F.join( `
` ),"utf-8")}function RD(u,D,E){let F= ` # EXTM3U
2026-01-20 00:25:55 +03:00
` ;F+= ` # EXT - X - VERSION : 6
2026-01-20 01:31:47 +03:00
` ,F+= ` # EXT - X - TARGETDURATION : $ { Math . ceil ( E ) }
2026-01-20 00:25:55 +03:00
` ,F+= ` # EXT - X - MEDIA - SEQUENCE : 1
` ,F+= ` # EXT - X - INDEPENDENT - SEGMENTS
` ,F+= ` # EXT - X - MAP : URI = "${D}"
2026-01-20 01:31:47 +03:00
` ;for(let C of u)F+= ` # EXTINF : $ { E } ,
` ,F+= ` $ { C }
2026-01-20 00:25:55 +03:00
` ;return F+= ` # EXT - X - ENDLIST
2026-01-20 10:46:22 +03:00
` ,F}function Wu(u,D){let E= ` # EXTM3U
2026-01-20 01:31:47 +03:00
` ;if(E+= ` # EXT - X - VERSION : 6
` ,E+= ` # EXT - X - INDEPENDENT - SEGMENTS
2026-01-20 00:25:55 +03:00
2026-01-20 01:31:47 +03:00
` ,D)E+= ` # EXT - X - MEDIA : TYPE = AUDIO , GROUP - ID = "audio" , NAME = "audio" , AUTOSELECT = YES , URI = "audio/playlist.m3u8" , CHANNELS = "2"
2026-01-20 00:25:55 +03:00
2026-01-20 01:31:47 +03:00
` ;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+= `
` ,E+= ` $ { F . path }
2026-01-20 00:25:55 +03:00
2026-01-20 10:46:22 +03:00
` }return E}async function oF(u,D,E,F,C,B){let A=R(D,"manifest.mpd"),Z=["-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 $ =X.get(Y.name);if(! $ )throw Error( ` MP4 file not found for profile : $ { Y . name } , codec : $ { G } ` );let N=C==="dual"? ` $ { Y . name } - $ { G } ` :Y.name;if(Z.push( ` $ { $ } # video : id = $ { N } ` ),J&&B)Z.push( ` $ { $ } # audio : id = audio ` ),J=!1}if(await ID(Z),await tF(D,E,C,B),await Gu(A,E,C),C==="dual")await Uu(A);return await Yu(A),A}async function tF(u,D,E,F){let{readdir:C,rename:B,mkdir:A}=await import("node:fs/promises"),Z=[];if(E==="h264"||E==="dual")Z.push("h264");if(E==="av1"||E==="dual")Z.push("av1");let J=[];for(let Y of Z)for(let $ of D){let N=E==="dual"? ` $ { $ . name } - $ { Y } ` : $ .name;J.push(N);let K=R(u,N);await A(K,{recursive:!0})}let G=R(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 $ =R(u,Y),N=R(G,Y);await B( $ ,N);continue}for(let $ of J)if(Y.startsWith( ` $ { $ } _ ` )){let N=R(u,Y),K=R(u, $ ,Y);await B(N,K);break}}}async function Nu(u,D,E,F,C,B,A){let Z,J;if(B==="dash"||B==="both")Z=await oF(u,D,E,F,C,A);if(B==="hls"||B==="both")J=await eF(D,E,F,C,A);return{manifestPath:Z,hlsManifestPath:J}}async function eF(u,D,E,F,C){let B=R(u,"master.m3u8"),A=[];for(let X of D){let Y=F==="dual"? ` $ { X . name } - h264 ` :X.name, $ =R(u,Y),N=await ku( $ ),K=N.filter((q)=>q.endsWith(".m4s")).sort((q,V)=>{let O=parseInt(q.match(/_( \d +) \. m4s $ /)?.[1]||"0"),y=parseInt(V.match(/_( \d +) \. m4s $ /)?.[1]||"0");return O-y}),_=N.find((q)=>q.endsWith("_.mp4"));if(!_||K.length===0)continue;let W=RD(K,_,E),U=R( $ ,"playlist.m3u8");await LD(U,W,"utf-8");let k=parseInt(X.videoBitrate)*1000;A.push({path: ` $ { Y } / playlist . m3u8 ` ,bandwidth:k,resolution: ` $ { X . width } x$ { X . height } ` ,fps:X.fps||30})}let Z,J=[];if(C){let X=R(u,"audio"),Y=[];try{Y=await ku(X)}catch{Y=[]}if(J=Y.filter(( $ )=> $ .endsWith(".m4s")).sort(( $ ,N)=>{let K=parseInt( $ .match(/_( \d +) \. m4s $ /)?.[1]||"0"),_=parseInt(N.match(/_( \d +) \. m4s $ /)?.[1]||"0");return K-_}),Z=Y.find(( $ )=> $ .endsWith("_.mp4")),Z&&J.length>0){let $ =RD(J,Z,E);await LD(R(X,"playlist.m3u8"), $ ,"utf-8")}}let G=Wu(A,C&&Z!==void 0&&J.length>0);return await LD(B,G,"utf-8"),B}async function jD(u){let{input:D,outputDir:E,segmentDuration:F=2,profiles:C,customProfiles:B,codec:A="dual",format:Z="both",hardwareDecoder:J,hardwareAccelerator:G,quality:X,generateThumbnails:Y=!0,thumbnailConfig: $ ={},generatePoster:N=!0,posterTimecode:K="00:00:00",parallel:_=!0,onProgress:W}=u,U=UD("/tmp", ` dash - converter - $ { D8 ( ) } ` );await d(U);let k=_u(D,zu(D)),q=UD(E,k);await d(q);let V=UD(q,"conversion.log");xD(V);let{writeFile:O}=await import("node:fs/promises"),y= ` === === === === === === === === === === === === === === =
2026-01-20 00:25:55 +03:00
DASH Conversion Log
Started : $ { new Date ( ) . toISOString ( ) }
Input : $ { D }
2026-01-20 10:38:25 +03:00
Output : $ { q }
2026-01-20 00:25:55 +03:00
Codec : $ { A }
2026-01-20 10:38:25 +03:00
Format : $ { Z }
2026-01-20 00:25:55 +03:00
=== === === === === === === === === === === === === === =
2026-01-20 10:46:22 +03:00
` ;await O(V,y,"utf-8");try{return await u8(D,E,U,F,C,B,A,Z,G,J,X,Y, $ ,N,K,_,W)}finally{let{appendFile:P}=await import("node:fs/promises");try{await P(V, `
2026-01-20 00:25:55 +03:00
Completed : $ { new Date ( ) . toISOString ( ) }
2026-01-20 10:46:22 +03:00
` ,"utf-8")}catch(QD){}try{await Hu(U,{recursive:!0,force:!0})}catch(QD){console.warn( ` Warning : Failed to cleanup temp directory : $ { U } ` )}}}async function u8(u,D,E,F,C,B,A,Z,J,G,X,Y, $ ,N,K,_,W){if(!await a())throw Error("FFmpeg is not installed or not in PATH");if(!await i())throw Error("MP4Box is not installed or not in PATH. Install gpac package.");let U=(z,x,zD,HD)=>{if(W)W({stage:z,percent:x,message:zD,currentProfile:HD})};U("analyzing",0,"Analyzing input video...");let k=await t(u),q=k.hasAudio,V=J&&J!=="auto"?J:"auto",O=await r(),y=await o(),{selected:P,h264Encoder:QD,av1Encoder:_F,warnings:aD}=F8(O,V,A);if(aD.length>0)for(let z of aD)console.warn( ` ⚠ ️ $ { z } ` );let{selected:JD}=E8(y,G||"auto"),zF=O.some((z)=>z.av1Encoder),c=A;if(A==="dual"&&!zF)console.warn("⚠️ AV1 hardware encoder not detected. Switching to H.264 only."),c="h264";let L;if(B&&B.length>0){let z=GD(B,k.width,k.height,k.fps,k.videoBitrate);if(z.errors.length>0){console.warn( `
2026-01-20 10:38:25 +03:00
❌ Profile errors : ` );for(let x of z.errors)console.warn( ` - $ { x } ` );console.warn("")}if(z.warnings.length>0){console.warn( `
2026-01-20 10:46:22 +03:00
⚠ ️ Profile warnings : ` );for(let x of z.warnings)console.warn( ` - $ { x } ` );console.warn("")}if(L=z.profiles,L.length===0)throw Error("No valid profiles found in custom list. Check errors above.")}else if(C)L=C;else L=AD(k.width,k.height,k.fps,k.videoBitrate);if(L.length===0)throw Error("No suitable profiles found for input video resolution");let HF=_u(u,zu(u)),CD=UD(D,HF);try{await Hu(CD,{recursive:!0,force:!0})}catch(z){}await d(CD);let h=[];if(c==="h264"||c==="dual"){let z=QD||"libx264",x=Qu(z,"h264");h.push({type:"h264",codec:z,preset:x})}if(c==="av1"||c==="dual"){let z=_F||"libsvtav1",x=Qu(z,"av1");h.push({type:"av1",codec:z,preset:x})}let qF=h.map((z)=>z.type.toUpperCase()).join(" + "),xF=P==="cpu"?"CPU":P.toUpperCase();U("analyzing",20, ` Using $ { qF } encoding ( $ { xF } , decoder $ { JD . toUpperCase ( ) } ) ` ,void 0);let IF=P==="cpu"?2:3,_D=new Map;for(let z=0;z<h.length;z++){let{type:x,codec:zD,preset:HD}=h[z],eD=z/h.length,OF=1/h.length;U("encoding",25+eD*40, ` Stage 1 : Encoding $ { x . toUpperCase ( ) } ( $ { L . length } profiles ) ... ` );let RF=x==="h264"?X?.h264:X?.av1,LF=await Xu(u,E,L,zD,HD,k.duration,F,k.audioBitrate,_,IF,x,RF,void 0,JD==="cpu"?void 0:JD,(BD,Du)=>{let d8=L.findIndex((jF)=>jF.name===BD),uu=25+eD*40,Fu=Du/100*(40*OF/L.length);if(U("encoding",uu+Fu, ` Encoding $ { x . toUpperCase ( ) } $ { BD } ... ` , ` $ { x } - $ { BD } ` ),W)W({stage:"encoding",percent:uu+Fu,currentProfile: ` $ { x } - $ { BD } ` ,profilePercent:Du,message: ` Encoding $ { x . toUpperCase ( ) } $ { BD } ... ` })});_D.set(x,LF)}U("encoding",65,"Stage 1 complete: All codecs and profiles encoded"),U("encoding",70,"Stage 2: Creating segments and manifests...");let{manifestPath:VF,hlsManifestPath:MF}=await Nu(_D,CD,L,F,c,Z,q),iD=[];for(let z of _D.values())iD.push(...Array.from(z.values()));U("encoding",80,"Stage 2 complete: All formats packaged");let rD,oD;if(Y){U("thumbnails",80,"Generating thumbnail sprites...");let z={width: $ .width||160,height: $ .height||90,interval: $ .interval||1,columns: $ .columns||10},x=await Ju(u,CD,k.duration,z);rD=x.spritePath,oD=x.vttPath,U("thumbnails",90,"Thumbnails generated")}let tD;if(N)U("thumbnails",92,"Generating poster image..."),tD=await $ u(u,CD,K),U("thumbnails",95,"Poster generated");return U("manifest",95,"Finalizing..."),U("complete",100,"Conversion complete!"),{manifestPath:VF,hlsManifestPath:MF,videoPaths:iD,thumbnailSpritePath:rD,thumbnailVttPath:oD,posterPath:tD,duration:k.duration,profiles:L,usedNvenc:h.some((z)=>z.codec.includes("nvenc")),selectedAccelerator:P,selectedDecoder:JD,codecType:c,format:Z}}var e={nvenc:100,qsv:90,amf:80,vaapi:70,videotoolbox:65,v4l2:60,cpu:1};function F8(u,D,E){let F=E==="h264"||E==="dual",C=E==="av1"||E==="dual",B=[],A=new Set(["nvenc","qsv","amf"]),Z=u.filter((U)=>F&&U.h264Encoder||C&&U.av1Encoder),J=Z.filter((U)=>A.has(U.accelerator)),G=(U)=>Z.find((k)=>k.accelerator===U),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((k,q)=>(e[q.accelerator]||0)-(e[k.accelerator]||0))[0],!X&&Z.length>0)B.push("Доступен аппаратный ускоритель, но он пока не поддерживается пайплайном, использую CPU");let $ =(J.length>0?J:[]).sort((U,k)=>(e[k.accelerator]||0)-(e[U.accelerator]||0)),N=(U)=>{let k=U==="h264"?X?.h264Encoder:X?.av1Encoder;if(k)return{encoder:k,accel:X?.accelerator};let q= $ .find((V)=>U==="h264"?V.h264Encoder:V.av1Encoder);if(q){if(D!=="auto"&&X)B.push( ` Выбранный ускоритель "${X.accelerator}" не поддерживает $ { U . toUpperCase ( ) } , использую $ { q . accelerator } ` );return{encoder:U==="h264"?q.h264Encoder:q.av1Encoder,accel:q.accelerator}}if(D!=="auto"&&D!=="cpu")B.push( ` Ускоритель "${D}" не поддерживает $ { U . toUpperCase ( ) } , использую CPU ` );return{encoder:void 0,accel:"cpu"}},K=F?N("h264"):{encoder:void 0,accel:X?.accelerator},_=C?N("av1"):{encoder
2026-01-20 10:38:25 +03:00
Options : ` ),console.error(" -r, --resolutions Video resolutions (e.g., 360,480,720 or 720@60,1080@60)"),console.error(" -c, --codec Video codec: av1, h264, or dual (default: dual)"),console.error(" -f, --format Streaming format: dash, hls, or both (default: both)"),console.error(" -p, --poster Poster timecode (e.g., 00:00:05 or 10)"),console.error(" -e, --encoder <type> Hardware encoder: auto|nvenc|qsv|amf|vaapi|videotoolbox|v4l2|cpu (default: auto)"),console.error(" -d, --decoder <type> Hardware decoder: auto|nvenc|qsv|amf|vaapi|videotoolbox|v4l2|cpu (default: auto)"),console.error( `
2026-01-20 00:25:55 +03:00
Quality Options ( override defaults ) : ` ),console.error(" --h264-cq <value> H.264 GPU CQ value (0-51, lower = better, default: auto)"),console.error(" --h264-crf <value> H.264 CPU CRF value (0-51, lower = better, default: auto)"),console.error(" --av1-cq <value> AV1 GPU CQ value (0-51, lower = better, default: auto)"),console.error(" --av1-crf <value> AV1 CPU CRF value (0-63, lower = better, default: auto)"),console.error( `
Examples : ` ),console.error(" create-vod video.mp4"),console.error(" create-vod video.mp4 ./output"),console.error(" create-vod video.mp4 -r 360,480,720"),console.error(" create-vod video.mp4 -c av1 --av1-cq 40"),console.error(" create-vod video.mp4 -c dual --h264-cq 30 --av1-cq 39"),console.error(" create-vod video.mp4 -f hls"),console.error(" create-vod video.mp4 -c dual -f both"),console.error(" create-vod video.mp4 -r 720@60,1080@60,2160@60 -c av1 -f dash"),console.error(" create-vod video.mp4 -p 00:00:05"),console.error(" create-vod video.mp4 ./output -r 720,1080 -c dual -f both -p 10 --h264-cq 28 --av1-cq 37"),process.exit(1);console.log( ` \uD83D\uDD0D Checking system ...
2026-01-20 10:46:22 +03:00
` );var UF=await a(),WF=await i(),nD=await r(),kF=nD.some((u)=>u.av1Encoder),sD=await o(),ZF={nvenc:100,qsv:90,amf:80,vaapi:70,videotoolbox:65,v4l2:60}, $ F=nD.slice().sort((u,D)=>(ZF[D.accelerator]||0)-(ZF[u.accelerator]||0))[0];console.log( ` FFmpeg : $ { UF ? "✅" : "❌" } ` );console.log( ` MP4Box : $ { WF ? "✅" : "❌" } ` );var cD=Array.from(new Set(nD.map((u)=>u.accelerator.toUpperCase()))), $ D= $ F? $ F.accelerator.toUpperCase():void 0,B2=cD.filter((u)=>u!== $ D),JF=uD?uD.toUpperCase(): $ D||"CPU",NF=cD.length>0?cD:["CPU"],ND=Array.from(new Set(sD.map((u)=>u.accelerator.toUpperCase()))),KF=FD?FD.toUpperCase():ND[0]||"CPU",QF=ND.length>0?ND:["CPU"];console.log( ` Encoder : $ { JF === "AUTO" ? $D || "CPU" : JF } ( $ { NF . join ( ", " ) } ) ` );console.log( ` Decoder : $ { KF === "AUTO" ? ND [ 0 ] || "CPU" : KF } ( $ { QF . join ( ", " ) } ) ` );console.log("");if(!UF)console.error("❌ FFmpeg not found. Please install FFmpeg first."),process.exit(1);if(!WF)console.error("❌ MP4Box not found. Please install: sudo pacman -S gpac"),process.exit(1);if((j==="av1"||j==="dual")&&!kF){if(j==="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( ` Consider using -- codec h264 for faster encoding .
2026-01-20 10:38:25 +03:00
` );else if(j==="dual")console.warn("⚠️ AV1 hardware encoder not detected. Using H.264 only (disable AV1)."),j="h264"}if((DD==="hls"||DD==="both")&&j==="av1")console.error("❌ Error: HLS format requires H.264 codec for Safari/iOS compatibility."),console.error( ` Please use -- codec h264 or -- codec dual with -- format hls
2026-01-20 00:25:55 +03:00
` ),process.exit(1);console.log( ` \uD83D\uDCCA Analyzing video ...
2026-01-20 10:46:22 +03:00
` );var M=await t(ED),T8=S8(ED),b8=(T8.size/1048576).toFixed(2);console.log(" \u D83D \u DCF9 Video Information:");console.log( ` File : $ { ED } ` );console.log( ` Size : $ { b8 } MB ` );console.log( ` Resolution : $ { M . width } x$ { M . height } ` );console.log( ` FPS : $ { M . fps . toFixed ( 2 ) } ` );console.log( ` Duration : $ { Math . floor ( M . duration / 60 ) } m $ { Math . floor ( M . duration % 60 ) } s ` );console.log( ` Codec : $ { M . codec } ` );if(M.videoBitrate)console.log( ` Video Bitrate : $ { ( M . videoBitrate / 1000 ) . toFixed ( 2 ) } Mbps ` );if(M.audioBitrate)console.log( ` Audio Bitrate : $ { M . audioBitrate } kbps ` );var lD=[];if(ZD&&ZD.length>0){let u=GD(ZD,M.width,M.height,M.fps,M.videoBitrate);if(u.errors.length>0)console.error( `
2026-01-20 00:25:55 +03:00
❌ Profile errors : ` ),u.errors.forEach((D)=>console.error( ` - $ { D } ` )),process.exit(1);if(u.warnings.length>0)console.warn( `
2026-01-20 10:46:22 +03:00
⚠ ️ Profile warnings : ` ),u.warnings.forEach((D)=>console.warn( ` - $ { D } ` ));lD=u.profiles.map((D)=>D.name)}else lD=AD(M.width,M.height,M.fps,M.videoBitrate).map((D)=>D.name);var y8=DD==="both"?"DASH (manifest.mpd), HLS (master.m3u8)":DD==="dash"?"DASH (manifest.mpd)":"HLS (master.m3u8)",v8=!0,P8=dD||"00:00:00",h8=j==="dual"?"dual (AV1 + H.264)":j,f8=j==="h264"&&!kF?" (AV1 disabled: no HW)":"",XF=uD?uD.toUpperCase(): $ D||"CPU",YF=FD?FD.toUpperCase():sD[0]?.accelerator.toUpperCase()||"CPU",g8=XF==="AUTO"? $ D||"CPU":XF,m8=YF==="AUTO"?sD[0]?.accelerator.toUpperCase()||"CPU":YF,c8=NF.join(", "),l8=QF.join(", ");console.log( `
\uD83D\uDCE6 Parameters : ` );console.log( ` Input : $ { ED } ` );console.log( ` Output : $ { GF } ` );console.log( ` Codec : $ { h8 } $ { f8 } ` );console.log( ` Profiles : $ { lD . join ( ", " ) } ` );console.log( ` Manifests : $ { y8 } ` );console.log( ` Poster : $ { P8 } ( will be generated ) ` );console.log( ` Thumbnails : $ { v8 ? "yes (with VTT)" : "no" } ` );console.log( ` Encoder : $ { g8 } ( available : $ { c8 } ) ` );console.log( ` Decoder : $ { m8 } ( available : $ { l8 } ) ` );var m;if(w!==void 0||S!==void 0||T!==void 0||b!==void 0){if(m={},w!==void 0||S!==void 0){if(m.h264={},w!==void 0)m.h264.cq=w;if(S!==void 0)m.h264.crf=S;console.log( ` \uD83C\uDF9A ️ H . 264 Quality : $ { w !== void 0 ? ` CQ ${ w } ` : "" } $ { S !== void 0 ? ` CRF ${ S } ` : "" } ` )}if(T!==void 0||b!==void 0){if(m.av1={},T!==void 0)m.av1.cq=T;if(b!==void 0)m.av1.crf=b;console.log( ` \uD83C\uDF9A ️ AV1 Quality : $ { T !== void 0 ? ` CQ ${ T } ` : "" } $ { b !== void 0 ? ` CRF ${ b } ` : "" } ` )}}console.log( `
2026-01-20 00:25:55 +03:00
\uD83D\uDE80 Starting conversion ...
2026-01-20 10:46:22 +03:00
` );var kD=new mD.default.MultiBar({format:"{stage} | {bar} | {percentage}% | {name}",barCompleteChar:"█",barIncompleteChar:"░",hideCursor:!0,clearOnComplete:!1,stopOnComplete:!0},mD.default.Presets.shades_classic),fD={},gD=null;try{let u=Date.now(),D=await jD({input:ED,outputDir:GF,customProfiles:ZD,posterTimecode:dD,codec:j,format:DD,segmentDuration:2,hardwareAccelerator:uD,hardwareDecoder:FD,quality:m,generateThumbnails:!0,generatePoster:!0,parallel:!0,onProgress:(C)=>{let B=C.stage==="encoding"?"Encoding":C.stage==="thumbnails"?"Thumbnails":C.stage==="manifest"?"Manifest":C.stage==="analyzing"?"Analyzing":"Complete";if(C.stage==="encoding"&&C.currentProfile){if(!fD[C.currentProfile])fD[C.currentProfile]=kD.create(100,0,{stage:"Encode",name:C.currentProfile});let A=C.profilePercent??C.percent;fD[C.currentProfile].update(A,{stage:"Encode",name:C.currentProfile})}if(!gD)gD=kD.create(100,0,{stage:B,name:"Overall"});gD.update(C.percent,{stage:B,name:C.message||"Overall"})}});kD.stop();let F=((Date.now()-u)/1000).toFixed(2);console.log( `
2026-01-20 10:38:25 +03:00
✅ Conversion completed successfully ! ( $ { F } s )
2026-01-20 10:46:22 +03:00
` )}catch(u){kD.stop(),console.error( `
2026-01-20 00:25:55 +03:00
❌ Error during conversion : ` ),console.error(u),process.exit(1)}