Files
dvc-cli/bin/cli.js

24 lines
38 KiB
JavaScript
Raw Normal View History

2025-11-09 01:28:42 +03:00
#!/usr/bin/env node
2025-11-09 13:24:10 +03:00
import{createRequire as Mu}from"node:module";var Vu=Object.create;var{getPrototypeOf:yu,defineProperty:RD,getOwnPropertyNames:xu}=Object;var zu=Object.prototype.hasOwnProperty;var s=(u,D,F)=>{F=u!=null?Vu(yu(u)):{};let C=D||!u||!u.__esModule?RD(F,"default",{value:u,enumerable:!0}):F;for(let E of xu(u))if(!zu.call(C,E))RD(C,E,{get:()=>u[E],enumerable:!0});return C};var I=(u,D)=>()=>(D||u((D={exports:{}}).exports,D),D.exports);var v=Mu(import.meta.url);var OD=I((EC,jD)=>{class wD{constructor(u,D,F){this.etaBufferLength=u||100,this.valueBuffer=[F],this.timeBuffer=[D],this.eta="0"}update(u,D,F){this.valueBuffer.push(D),this.timeBuffer.push(u),this.calculate(F-D)}getTime(){return this.eta}calculate(u){let D=this.valueBuffer.length,F=Math.min(this.etaBufferLength,D),C=this.valueBuffer[D-1]-this.valueBuffer[D-F],E=this.timeBuffer[D-1]-this.timeBuffer[D-F],A=C/E;this.valueBuffer=this.valueBuffer.slice(-this.etaBufferLength),this.timeBuffer=this.timeBuffer.slice(-this.etaBufferLength);let B=Math.ceil(u/A/1000);if(isNaN(B))this.eta="NULL";else if(!isFinite(B))this.eta="INF";else if(B>1e7)this.eta="INF";else if(B<0)this.eta=0;else this.eta=B}}jD.exports=wD});var e=I((BC,SD)=>{var w=v("readline");class TD{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;w.cursorTo(this.stream,u,D)}cursorRelative(u=null,D=null){if(!this.stream.isTTY)return;this.dy=this.dy+D,w.moveCursor(this.stream,u,D)}cursorRelativeReset(){if(!this.stream.isTTY)return;w.moveCursor(this.stream,0,-this.dy),w.cursorTo(this.stream,0,null),this.dy=0}clearRight(){if(!this.stream.isTTY)return;w.clearLine(this.stream,1)}clearLine(){if(!this.stream.isTTY)return;w.clearLine(this.stream,0)}clearBottom(){if(!this.stream.isTTY)return;w.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("\x1B[?7h");else this.stream.write("\x1B[?7l")}isTTY(){return this.stream.isTTY===!0}getWidth(){return this.stream.columns||(this.stream.isTTY?80:200)}}SD.exports=TD});var vD=I((AC,bD)=>{bD.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 PD=I((qC,hD)=>{var nu=vD();hD.exports=(u)=>typeof u==="string"?u.replace(nu(),""):u});var gD=I((ZC,DD)=>{var fD=(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};DD.exports=fD;DD.exports.default=fD});var mD=I((QC,cD)=>{cD.exports=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD
${B}`))})})}async function r(u){return new Promise((D,F)=>{let C=h("MP4Box",u),E="",A="";C.stdout.on("data",(B)=>{E+=B.toString()}),C.stderr.on("data",(B)=>{A+=B.toString()}),C.on("error",(B)=>{F(Error(`MP4Box error: ${B.message}`))}),C.on("close",(B)=>{if(B===0)D();else F(Error(`MP4Box failed with exit code ${B}
${A||E}`))})})}import{spawn as Nu}from"node:child_process";async function S(u){return new Promise((D,F)=>{let C=Nu("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]),E="";C.stdout.on("data",(A)=>{E+=A.toString()}),C.on("error",(A)=>{F(Error(`ffprobe error: ${A.message}`))}),C.on("close",(A)=>{if(A!==0){F(Error(`ffprobe failed with exit code ${A}`));return}try{let B=JSON.parse(E),q=B.streams.find((Z)=>Z.codec_type==="video"),Q=B.streams.find((Z)=>Z.codec_type==="audio"&&Z.bit_rate),J=B.format;if(!q){F(Error("No video stream found in input file"));return}let L=30;if(q.r_frame_rate){let[Z,R]=q.r_frame_rate.split("/").map(Number);if(Z&&R&&R!==0)L=Z/R}let G=parseFloat(q.duration||J.duration||"0"),X=Q?.bit_rate?Math.round(parseInt(Q.bit_rate)/1000):void 0,Y=q.bit_rate?Math.round(parseInt(q.bit_rate)/1000):void 0;D({width:q.width,height:q.height,duration:G,fps:L,codec:q.codec_name,audioBitrate:X,videoBitrate:Y})}catch(B){F(Error(`Failed to parse ffprobe output: ${B}`))}})})}function g(u,D=256){if(!u)return`${D}k`;let F=Math.min(u,D);if(F<=64)return"64k";if(F<=96)return"96k";if(F<=128)return"128k";if(F<=192)return"192k";return"256k"}function c(u){let D=Math.floor(u/3600),F=Math.floor(u%3600/60),C=u%60;return`${String(D).padStart(2,"0")}:${String(F).padStart(2,"0")}:${C.toFixed(3).padStart(6,"0")}`}import{mkdir as wu,access as ju,constants as Ou}from"node:fs/promises";async function b(u){try{await ju(u,Ou.F_OK)}catch{await wu(u,{recursive:!0})}}function Tu(u,D){let F=u*D;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 x(u,D,F=30,C){let E=Tu(u,D),A=Math.round(u*D*F*E/1000);if(C&&A>C)A=C;return`${A}k`}var i=[{name:"360p",width:640,height:360,videoBitrate:x(640,360,30),audioBitrate:"192k"},{name:"480p",width:854,height:480,videoBitrate:x(854,480,30),audioBitrate:"192k"},{name:"720p",width:1280,height:720,videoBitrate:x(1280,720,30),audioBitrate:"192k"},{name:"1080p",width:1920,height:1080,videoBitrate:x(1920,1080,30),audioBitrate:"256k"},{name:"1440p",width:2560,height:1440,videoBitrate:x(2560,1440,30),audioBitrate:"256k"},{name:"2160p",width:3840,height:2160,videoBitrate:x(3840,2160,30),audioBitrate:"256k"}];function o(u,D,F=30,C){let E=[],A=i.filter((B)=>{return B.width<=u&&B.height<=D});for(let B of A)E.push({...B,videoBitrate:x(B.width,B.height,30,C)});if(F>=45)for(let B of A)E.push(m(B,60,C));if(F>=75)for(let B of A)E.push(m(B,90,C));if(F>=95)for(let B of A)E.push(m(B,120,C));return E}function m(u,D,F){return{...u,name:`${u.name}-${D}`,videoBitrate:x(u.width,u.height,D,F)}}function $D(u){let F=u.trim().match(/^(\d+)p?(?:[@-](\d+))?$/i);if(!F)return null;let C=F[1]+"p",E=F[2]?parseInt(F[2]):30;return{resolution:C,fps:E}}function UD(u,D=30,F){let C=i.find((E)=>E.name===u);if(!C)return null;if(D===30)return{...C,videoBitrate:x(C.width,C.height,30,F)};return m(C,D,F)}function Su(u,D,F,C){let E=$D(u);if(!E)return`Invalid profile format: ${u}. Use format like: 360, 720@60, 1080-60`;let A=UD(E.resolution,E.fps);if(!A)return`Unknown resolution: ${E.resolution}. Available: 360, 480, 720, 1080, 1440, 2160`;if(A.width>D||A.height>F)return`Source resolution (${D}x${F}) is lower than ${u} (${A.width}x${A.height})`;if(E.fps>C)return`Source FPS (${C}) is lower than requested ${E.fps} FPS in ${u}`;return null}function kD(u,D,F,C,E){let A=[],B=[];for(let q of u){let Q=Su(q,D,F,C);if(Q){B.push(Q);continue}let J=$D(q);if(!J)continue;let L=UD(J.resolution,J.fps,E);if(L)A.push(L)}return{profiles:A,errors:B}}import{join as z}from"node:path";import{readdir as bu,unlink as _D,rmdir as vu,writeFile as HD}from"node:fs/promises";async function WD(u,D,F="00:00:01"){let C=z(D,"poster.jpg"),E=/^\d+(\.\d+)?$/.test(F)?F:F;return await M(["-ss",E,"-i",u,"-vframes","1","-q:v","2","-y",C]),C}async function VD(u,D,F,C){let{width:E,height:A,interval:B,columns:q}=C,Q=z(D,".thumbnails_temp");await b(Q),await HD(z(Q,".keep"),"");let J=z(Q,"thumb_%04d.j
2025-11-09 01:28:42 +03:00
2025-11-09 13:24:10 +03:00
`;for(let q=0;q<u;q++){let Q=q*D,J=(q+1)*D,L=Math.floor(q/E),X=q%E*F,Y=L*C;B+=`${c(Q)} --> ${c(J)}
`,B+=`${A}#xywh=${X},${Y},${F},${C}
2025-11-09 01:28:42 +03:00
2025-11-09 13:24:10 +03:00
`}return B}import{join as Pu}from"node:path";async function yD(u,D,F,C,E,A,B,q,Q,J,L){let G=Pu(D,`video_${F.name}.mp4`),X=["-y","-i",u,"-c:v",C];if(C==="h264_nvenc")X.push("-rc:v","vbr"),X.push("-preset",E),X.push("-2pass","0");else X.push("-preset",E);X.push("-b:v",F.videoBitrate,"-maxrate",F.videoBitrate,"-bufsize",`${parseInt(F.videoBitrate)*2}k`);let Y=Math.round(q*B);X.push("-g",String(Y),"-keyint_min",String(Y),"-sc_threshold","0");let Z=[`scale=${F.width}:${F.height}`];if(J){if(J.deinterlace)Z.push("yadif");if(J.denoise)Z.push("hqdn3d");if(J.customFilters)Z.push(...J.customFilters)}X.push("-vf",Z.join(","));let R=parseInt(F.audioBitrate)||256,U=g(Q,R);if(X.push("-c:a","aac","-b:a",U),J?.audioNormalize)X.push("-af","loudnorm");return X.push("-f","mp4",G),await M(X,L,A),G}async function xD(u,D,F,C,E,A,B,q,Q,J,L,G,X){let Y=new Map;if(J&&F.length>1)for(let Z=0;Z<F.length;Z+=L){let R=F.slice(Z,Z+L),U=R.map((_)=>yD(u,D,_,C,E,A,B,q,Q,G,(V)=>{if(X)X(_.name,V)}));(await Promise.all(U)).forEach((_,V)=>{let a=R[V];Y.set(a.name,_)})}else for(let Z of F){let R=await yD(u,D,Z,C,E,A,B,q,Q,G,(U)=>{if(X)X(Z.name,U)});Y.set(Z.name,R)}return Y}import{join as N}from"node:path";async function zD(u,D,F,C){let E=N(D,"manifest.mpd"),A=["-dash",String(C*1000),"-frag",String(C*1000),"-rap","-segment-name","$RepresentationID$_$Number$","-out",E];for(let B of F){let q=u.get(B.name);if(!q)throw Error(`MP4 file not found for profile: ${B.name}`);if(A.push(`${q}#video:id=${B.name}`),B===F[0])A.push(`${q}#audio:id=audio`)}return await r(A),await fu(D,F),await gu(E,F),E}async function fu(u,D){let{readdir:F,rename:C,mkdir:E}=await import("node:fs/promises");for(let q of D){let Q=N(u,q.name);await E(Q,{recursive:!0})}let A=N(u,"audio");await E(A,{recursive:!0});let B=await F(u);for(let q of B){if(q==="manifest.mpd")continue;if(q.startsWith("audio_")||q==="audio_init.m4s"){let Q=N(u,q),J=N(A,q);await C(Q,J);continue}for(let Q of D)if(q.startsWith(`${Q.name}_`)){let J=N(u,q),L=N(u,Q.name,q);await C(J,L);break}}}async function gu(u,D){let{readFile:F,writeFile:C}=await import("node:fs/promises"),E=await F(u,"utf-8");E=E.replace(/media="\$RepresentationID\$_\$Number\$\.m4s"/g,'media="$RepresentationID$/$RepresentationID$_$Number$.m4s"'),E=E.replace(/initialization="\$RepresentationID\$_\.mp4"/g,'initialization="$RepresentationID$/$RepresentationID$_.mp4"'),await C(u,E,"utf-8")}async function t(u){let{input:D,outputDir:F,segmentDuration:C=2,profiles:E,customProfiles:A,useNvenc:B,generateThumbnails:q=!0,thumbnailConfig:Q={},generatePoster:J=!0,posterTimecode:L="00:00:01",parallel:G=!0,onProgress:X}=u,Y=MD("/tmp",`dash-converter-${du()}`);await b(Y);try{return await lu(D,F,Y,C,E,A,B,q,Q,J,L,G,X)}finally{try{await ND(Y,{recursive:!0,force:!0})}catch(Z){console.warn(`Warning: Failed to cleanup temp directory: ${Y}`)}}}async function lu(u,D,F,C,E,A,B,q,Q,J,L,G,X){if(!await j())throw Error("FFmpeg is not installed or not in PATH");if(!await O())throw Error("MP4Box is not installed or not in PATH. Install gpac package.");let Y=(k,y,GD,f)=>{if(X)X({stage:k,percent:y,message:GD,currentProfile:f})};Y("analyzing",0,"Analyzing input video...");let Z=await S(u),R=B!==!1?await T():!1,U=B===!0?!0:B===!1?!1:R;if(B===!0&&!R)throw Error("NVENC requested but not available. Check NVIDIA drivers and GPU support.");let $;if(A&&A.length>0){let k=kD(A,Z.width,Z.height,Z.fps,Z.videoBitrate);if(k.errors.length>0){console.warn(`
Profile warnings:`);for(let y of k.errors)console.warn(` - ${y}`);console.warn("")}if($=k.profiles,$.length===0)throw Error("No valid profiles found in custom list. Check warnings above.")}else if(E)$=E;else $=o(Z.width,Z.height,Z.fps,Z.videoBitrate);if($.length===0)throw Error("No suitable profiles found for input video resolution");let _=cu(u,mu(u)),V=MD(D,_);try{await ND(V,{recursive:!0,force:!0})}catch(k){}await b(V),Y("analyzing",20,`Using ${U?"NVENC":"CPU"} encoding`,void 0);let a=U?"h264_nvenc":"libx264",Uu=U?"p4":"medium",ku=U?3:2;Y("encoding",25,`Stage 1: Encoding ${$.length} profiles to MP4...`);let YD=await xD(u,F,$,a,Uu,Z.duration,C,Z.fps||25,Z.audioBitrate,G,ku,void 0,(k,y)=>{let f=25+$.findIndex((Wu)=>Wu.name===k)/$.length*40,ID=y/100*(40/$.length);if(Y("encoding",f+ID,`Encoding ${k}...`,k),X)X({stage:"encoding",percent:f+ID,currentProfile:k,profilePercent:y,message:`Encoding ${k}...`})});Y("encoding",65,"Stage 1 complete: All profiles encoded"),Y("encoding",70,"Stage 2: Creating DASH with MP4Box...");let _u=await zD(YD,V,$,C),Hu=Array.from(YD.values());Y("encoding",80,"Stage 2 complete: DASH created");let JD,KD;if(q){Y("thumbnails",80,"Generating thumbnail sprites...");let k={width:Q.width||160,height:Q.height||90,interval:Q.interval||1,columns:Q.columns||10},y=await VD(u,V,Z.duration,k);JD=y.spritePath,KD=y.vttPath,Y("thumbnails",90,"Thumbnails generated")}let LD;if(J)Y("thumbnails",92,"Generating poster image..."),LD=await WD(u,V,L),Y("thumbnails",95,"Poster generated");return Y("manifest",95,"Finalizing manifest..."),Y("complete",100,"Conversion complete!"),{manifestPath:_u,videoPaths:Hu,thumbnailSpritePath:JD,thumbnailVttPath:KD,posterPath:LD,duration:Z.duration,profiles:$,usedNvenc:U}}var QD=s(Lu(),1);import{statSync as UF}from"node:fs";var H=process.argv.slice(2),n,p,XD=[];for(let u=0;u<H.length;u++)if(H[u]==="-r"||H[u]==="--resolutions"){let D=[];for(let C=u+1;C<H.length;C++){if(H[C].startsWith("-"))break;D.push(H[C]),u=C}n=D.join(",").split(/[,\s]+/).map((C)=>C.trim()).filter((C)=>C.length>0)}else if(H[u]==="-p"||H[u]==="--poster")p=H[u+1],u++;else if(!H[u].startsWith("-"))XD.push(H[u]);var P=XD[0],Gu=XD[1]||".";if(!P)console.error("❌ Usage: dvc-cli <input-video> [output-dir] [-r resolutions] [-p poster-timecode]"),console.error(`
Examples:`),console.error(" dvc-cli video.mp4"),console.error(" dvc-cli video.mp4 ./output"),console.error(" dvc-cli video.mp4 -r 360,480,720"),console.error(" dvc-cli video.mp4 -r 720@60,1080@60,2160@60"),console.error(" dvc-cli video.mp4 -p 00:00:05"),console.error(" dvc-cli video.mp4 ./output -r 720,1080 -p 10"),process.exit(1);console.log(`\uD83D\uDD0D Checking system...
`);var Iu=await j(),Ru=await T(),$u=await O();console.log(`FFmpeg: ${Iu?"✅":"❌"}`);console.log(`NVENC: ${Ru?"✅ (GPU acceleration)":"⚠️ (CPU only)"}`);console.log(`MP4Box: ${$u?"✅":"❌"}
`);if(!Iu)console.error("❌ FFmpeg not found. Please install FFmpeg first."),process.exit(1);if(!$u)console.error("❌ MP4Box not found. Please install: sudo pacman -S gpac"),process.exit(1);console.log(`\uD83D\uDCCA Analyzing video...
`);var W=await S(P),kF=UF(P),_F=(kF.size/1048576).toFixed(2);console.log("\uD83D\uDCF9 Video Information:");console.log(` File: ${P}`);console.log(` Size: ${_F} MB`);console.log(` Resolution: ${W.width}x${W.height}`);console.log(` FPS: ${W.fps.toFixed(2)}`);console.log(` Duration: ${Math.floor(W.duration/60)}m ${Math.floor(W.duration%60)}s`);console.log(` Codec: ${W.codec}`);if(W.videoBitrate)console.log(` Video Bitrate: ${(W.videoBitrate/1000).toFixed(2)} Mbps`);if(W.audioBitrate)console.log(` Audio Bitrate: ${W.audioBitrate} kbps`);console.log(`
\uD83D\uDCC1 Output: ${Gu}`);if(n)console.log(`\uD83C\uDFAF Custom profiles: ${n.join(", ")}`);if(p)console.log(`\uD83D\uDDBC Poster timecode: ${p}`);console.log(`
\uD83D\uDE80 Starting conversion...
`);var l=new QD.default.MultiBar({format:"{stage} | {bar} | {percentage}% | {name}",barCompleteChar:"█",barIncompleteChar:"░",hideCursor:!0,clearOnComplete:!1,stopOnComplete:!0},QD.default.Presets.shades_classic),qD={},ZD=null;try{let u=await t({input:P,outputDir:Gu,customProfiles:n,posterTimecode:p,segmentDuration:2,useNvenc:Ru,generateThumbnails:!0,generatePoster:!0,parallel:!0,onProgress:(D)=>{let F=D.stage==="encoding"?"Encoding":D.stage==="thumbnails"?"Thumbnails":D.stage==="manifest"?"Manifest":D.stage==="analyzing"?"Analyzing":"Complete";if(D.stage==="encoding"&&D.currentProfile){if(!qD[D.currentProfile])qD[D.currentProfile]=l.create(100,0,{stage:"Encode",name:D.currentProfile});let C=D.profilePercent??D.percent;qD[D.currentProfile].update(C,{stage:"Encode",name:D.currentProfile})}if(!ZD)ZD=l.create(100,0,{stage:F,name:"Overall"});ZD.update(D.percent,{stage:F,name:D.message||"Overall"})}});if(l.stop(),console.log(`
2025-11-09 01:28:42 +03:00
Conversion completed successfully!
2025-11-09 13:24:10 +03:00
`),console.log("\uD83D\uDCCA Results:"),console.log(` Manifest: ${u.manifestPath}`),console.log(` Duration: ${u.duration.toFixed(2)}s`),console.log(` Profiles: ${u.profiles.map((D)=>D.name).join(", ")}`),console.log(` Encoder: ${u.usedNvenc?"⚡ NVENC (GPU)":"\uD83D\uDD27 libx264 (CPU)"}`),u.posterPath)console.log(` Poster: ${u.posterPath}`);if(u.thumbnailSpritePath)console.log(` Thumbnails: ${u.thumbnailSpritePath}`),console.log(` VTT file: ${u.thumbnailVttPath}`);console.log(`
\uD83C\uDF89 Done! You can now use the manifest file in your video player.`)}catch(u){l.stop(),console.error(`
2025-11-09 01:28:42 +03:00
Error during conversion:`),console.error(u),process.exit(1)}