Files
create-vod/bin/cli.js
S.Gromov b8f9f0e046 fix: Исправить баг с масштабированием через VIDEOTOOLBOX ускоритель.
feat: добавлена возможность генерировать видео без звука -m --muted
2026-01-22 09:51:32 +03:00

86 lines
56 KiB
JavaScript
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env node
import{createRequire as rF}from"node:module";var nF=Object.create;var{getPrototypeOf:sF,defineProperty:Gu,getOwnPropertyNames:aF}=Object;var iF=Object.prototype.hasOwnProperty;var YD=(D,u,C)=>{C=D!=null?nF(sF(D)):{};let F=u||!D||!D.__esModule?Gu(C,"default",{value:D,enumerable:!0}):C;for(let E of aF(D))if(!iF.call(F,E))Gu(F,E,{get:()=>D[E],enumerable:!0});return F};var H=(D,u)=>()=>(u||D((u={exports:{}}).exports,u),u.exports);var i=rF(import.meta.url);var Su=H((B2,yu)=>{class wu{constructor(D,u,C){this.etaBufferLength=D||100,this.valueBuffer=[C],this.timeBuffer=[u],this.eta="0"}update(D,u,C){this.valueBuffer.push(u),this.timeBuffer.push(D),this.calculate(C-u)}getTime(){return this.eta}calculate(D){let u=this.valueBuffer.length,C=Math.min(this.etaBufferLength,u),F=this.valueBuffer[u-1]-this.valueBuffer[u-C],E=this.timeBuffer[u-1]-this.timeBuffer[u-C],A=F/E;this.valueBuffer=this.valueBuffer.slice(-this.etaBufferLength),this.timeBuffer=this.timeBuffer.slice(-this.etaBufferLength);let B=Math.ceil(D/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}}yu.exports=wu});var fD=H((A2,vu)=>{var n=i("readline");class bu{constructor(D){this.stream=D,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(D){if(!this.stream.isTTY)return;if(D)this.stream.write("\x1B[?25h");else this.stream.write("\x1B[?25l")}cursorTo(D=null,u=null){if(!this.stream.isTTY)return;n.cursorTo(this.stream,D,u)}cursorRelative(D=null,u=null){if(!this.stream.isTTY)return;this.dy=this.dy+u,n.moveCursor(this.stream,D,u)}cursorRelativeReset(){if(!this.stream.isTTY)return;n.moveCursor(this.stream,0,-this.dy),n.cursorTo(this.stream,0,null),this.dy=0}clearRight(){if(!this.stream.isTTY)return;n.clearLine(this.stream,1)}clearLine(){if(!this.stream.isTTY)return;n.clearLine(this.stream,0)}clearBottom(){if(!this.stream.isTTY)return;n.clearScreenDown(this.stream)}newline(){this.stream.write(`
`),this.dy++}write(D,u=!1){if(this.linewrap===!0&&u===!1)this.stream.write(D.substr(0,this.getWidth()));else this.stream.write(D)}lineWrapping(D){if(!this.stream.isTTY)return;if(this.linewrap=D,D)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)}}vu.exports=bu});var hu=H((Z2,Pu)=>{Pu.exports=({onlyFirst:D=!1}={})=>{let u=["[\\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(u,D?void 0:"g")}});var gu=H(($2,fu)=>{var _8=hu();fu.exports=(D)=>typeof D==="string"?D.replace(_8(),""):D});var cu=H((J2,gD)=>{var mu=(D)=>{if(Number.isNaN(D))return!1;if(D>=4352&&(D<=4447||D===9001||D===9002||11904<=D&&D<=12871&&D!==12351||12880<=D&&D<=19903||19968<=D&&D<=42182||43360<=D&&D<=43388||44032<=D&&D<=55203||63744<=D&&D<=64255||65040<=D&&D<=65049||65072<=D&&D<=65131||65281<=D&&D<=65376||65504<=D&&D<=65510||110592<=D&&D<=110593||127488<=D&&D<=127569||131072<=D&&D<=262141))return!0;return!1};gD.exports=mu;gD.exports.default=mu});var lu=H((K2,pu)=>{pu.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]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\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\uDFFE\uDFFF])|\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\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g}});var nu=H((X2,mD)=>{var z8=gu(),q8=cu(),I8=lu(),du=(D)=>{if(typeof D!=="string"||D.length===0)return 0;if(D=z8(D),D.length===0)return 0;D=D.replace(I8()," ");let u=0;for(let C=0;C<D.length;C++){let F=D.codePointAt(C);if(F<=31||F>=127&&F<=159)continue;if(F>=768&&F<=879)continue;if(F>65535)C++;u+=q8(F)?2:1}return u};mD.exports=du;mD.exports.default=du});var cD=H((Y2,su)=>{su.exports=function(u,C,F){if(C.autopadding!==!0)return u;function E(A,B){return(C.autopaddingChar+A).slice(-B)}switch(F){case"percentage":return E(u,3);default:return u}}});var pD=H((G2,au)=>{au.exports=function(u,C){let F=Math.round(u*C.barsize),E=C.barsize-F;return C.barCompleteString.substr(0,F)+C.barGlue+C.barIncompleteString.substr(0,E)}});var lD=H((U2,iu)=>{iu.exports=function(u,C,F){function E(B){if(F)return F*Math.round(B/F);else return B}function A(B){return(C.autopaddingChar+B).slice(-2)}if(u>3600)return A(Math.floor(u/3600))+"h"+A(E(u%3600/60))+"m";else if(u>60)return A(Math.floor(u/60))+"m"+A(E(u%60))+"s";else if(u>10)return A(E(u))+"s";else return A(u)+"s"}});var dD=H((W2,ru)=>{var V8=nu(),H8=cD(),x8=pD(),M8=lD();ru.exports=function(u,C,F){let E=u.format,A=u.formatTime||M8,B=u.formatValue||H8,$=u.formatBar||x8,K=Math.floor(C.progress*100)+"",X=C.stopTime||Date.now(),G=Math.round((X-C.startTime)/1000),Y=Object.assign({},F,{bar:$(C.progress,u),percentage:B(K,u,"percentage"),total:B(C.total,u,"total"),value:B(C.value,u,"value"),eta:B(C.eta,u,"eta"),eta_formatted:A(C.eta,u,5),duration:B(G,u,"duration"),duration_formatted:A(G,u,1)});E=E.replace(/\{(\w+)\}/g,function(_,J){if(typeof Y[J]<"u")return Y[J];return _});let Z=Math.max(0,C.maxWidth-V8(E)-2),k=Math.floor(Z/2);switch(u.align){case"right":E=Z>0?" ".repeat(Z)+E:E;break;case"center":E=k>0?" ".repeat(k)+E:E;break;case"left":default:break}return E}});var _D=H((N2,ou)=>{function I(D,u){if(typeof D>"u"||D===null)return u;else return D}ou.exports={parse:function(u,C){let F={},E=Object.assign({},C,u);return F.throttleTime=1000/I(E.fps,10),F.stream=I(E.stream,process.stderr),F.terminal=I(E.terminal,null),F.clearOnComplete=I(E.clearOnComplete,!1),F.stopOnComplete=I(E.stopOnComplete,!1),F.barsize=I(E.barsize,40),F.align=I(E.align,"left"),F.hideCursor=I(E.hideCursor,!1),F.linewrap=I(E.linewrap,!1),F.barGlue=I(E.barGlue,""),F.barCompleteChar=I(E.barCompleteChar,"="),F.barIncompleteChar=I(E.barIncompleteChar,"-"),F.format=I(E.format,"progress [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}"),F.formatTime=I(E.formatTime,null),F.formatValue=I(E.formatValue,null),F.formatBar=I(E.formatBar,null),F.etaBufferLength=I(E.etaBuffer,10),F.etaAsynchronousUpdate=I(E.etaAsynchronousUpdate,!1),F.progressCalculationRelative=I(E.progressCalculationRelative,!1),F.synchronousUpdate=I(E.synchronousUpdate,!0),F.noTTYOutput=I(E.noTTYOutput,!1),F.notTTYSchedule=I(E.notTTYSchedule,2000),F.emptyOnZero=I(E.emptyOnZero,!1),F.forceRedraw=I(E.forceRedraw,!1),F.autopadding=I(E.autopadding,!1),F.gracefulExit=I(E.gracefulExit,!1),F},assignDerivedOptions:function(u){return u.barCompleteString=u.barCompleteChar.repeat(u.barsize+1),u.barIncompleteString=u.barIncompleteChar.repeat(u.barsize+1),u.autopaddingChar=u.autopadding?I(u.autopaddingChar," "):"",u}}});var nD=H((k2,eu)=>{var tu=Su(),O8=fD(),L8=dD(),R8=_D(),j8=i("events");eu.exports=class extends j8{constructor(u){super();this.options=R8.assignDerivedOptions(u),this.terminal=this.options.terminal?this.options.terminal:new O8(this.options.stream),this.value=0,this.startValue=0,this.total=100,this.lastDrawnString=null,this.startTime=null,this.stopTime=null,this.lastRedraw=Date.now(),this.eta=new tu(this.options.etaBufferLength,0,0),this.payload={},this.isActive=!1,this.formatter=typeof this.options.format==="function"?this.options.format:L8}render(u=!1){let C={progress:this.getProgress(),eta:this.eta.getTime(),startTime:this.startTime,stopTime:this.stopTime,total:this.total,value:this.value,maxWidth:this.terminal.getWidth()};if(this.options.etaAsynchronousUpdate)this.updateETA();let F=this.formatter(this.options,C,this.payload);if(u||this.options.forceRedraw||this.options.noTTYOutput&&!this.terminal.isTTY()||this.lastDrawnString!=F)this.emit("redraw-pre"),this.terminal.cursorTo(0,null),this.terminal.write(F),this.terminal.clearRight(),this.lastDrawnString=F,this.lastRedraw=Date.now(),this.emit("redraw-post")}start(u,C,F){this.value=C||0,this.total=typeof u<"u"&&u>=0?u:100,this.startValue=C||0,this.payload=F||{},this.startTime=Date.now(),this.stopTime=null,this.lastDrawnString="",this.eta=new tu(this.options.etaBufferLength,this.startTime,this.value),this.isActive=!0,this.emit("start",u,C)}stop(){this.isActive=!1,this.stopTime=Date.now(),this.emit("stop",this.total,this.value)}update(u,C={}){if(typeof u==="number")this.value=u,this.eta.update(Date.now(),u,this.total);let F=(typeof u==="object"?u:C)||{};this.emit("update",this.total,this.value);for(let E in F)this.payload[E]=F[E];if(this.value>=this.getTotal()&&this.options.stopOnComplete)this.stop()}getProgress(){let u=this.value/this.total;if(this.options.progressCalculationRelative)u=(this.value-this.startValue)/(this.total-this.startValue);if(isNaN(u))u=this.options&&this.options.emptyOnZero?0:1;return u=Math.min(Math.max(u,0),1),u}increment(u=1,C={}){if(typeof u==="object")this.update(this.value+1,u);else this.update(this.value+u,C)}getTotal(){return this.total}setTotal(u){if(typeof u<"u"&&u>=0)this.total=u}updateETA(){this.eta.update(Date.now(),this.value,this.total)}}});var uF=H((Q2,DF)=>{var T8=nD(),w8=_D();DF.exports=class extends T8{constructor(u,C){super(w8.parse(u,C));if(this.timer=null,this.options.noTTYOutput&&this.terminal.isTTY()===!1)this.options.synchronousUpdate=!1;this.schedulingRate=this.terminal.isTTY()?this.options.throttleTime:this.options.notTTYSchedule,this.sigintCallback=null}render(){if(this.timer)clearTimeout(this.timer),this.timer=null;if(super.render(),this.options.noTTYOutput&&this.terminal.isTTY()===!1)this.terminal.newline();this.timer=setTimeout(this.render.bind(this),this.schedulingRate)}update(u,C){if(!this.timer)return;if(super.update(u,C),this.options.synchronousUpdate&&this.lastRedraw+this.options.throttleTime*2<Date.now())this.render()}start(u,C,F){if(this.options.noTTYOutput===!1&&this.terminal.isTTY()===!1)return;if(this.sigintCallback===null&&this.options.gracefulExit)this.sigintCallback=this.stop.bind(this),process.once("SIGINT",this.sigintCallback),process.once("SIGTERM",this.sigintCallback);if(this.terminal.cursorSave(),this.options.hideCursor===!0)this.terminal.cursor(!1);if(this.options.linewrap===!1)this.terminal.lineWrapping(!1);super.start(u,C,F),this.render()}stop(){if(!this.timer)return;if(this.sigintCallback)process.removeListener("SIGINT",this.sigintCallback),process.removeListener("SIGTERM",this.sigintCallback),this.sigintCallback=null;if(this.render(),super.stop(),clearTimeout(this.timer),this.timer=null,this.options.hideCursor===!0)this.terminal.cursor(!0);if(this.options.linewrap===!1)this.terminal.lineWrapping(!0);if(this.terminal.cursorRestore(),this.options.clearOnComplete)this.terminal.cursorTo(0,null),this.terminal.clearLine();else this.terminal.newline()}}});var EF=H((_2,FF)=>{var y8=fD(),S8=nD(),b8=_D(),v8=i("events");FF.exports=class extends v8{constructor(u,C){super();this.bars=[],this.options=b8.parse(u,C),this.options.synchronousUpdate=!1,this.terminal=this.options.terminal?this.options.terminal:new y8(this.options.stream),this.timer=null,this.isActive=!1,this.schedulingRate=this.terminal.isTTY()?this.options.throttleTime:this.options.notTTYSchedule,this.loggingBuffer=[],this.sigintCallback=null}create(u,C,F,E={}){let A=new S8(Object.assign({},this.options,{terminal:this.terminal},E));if(this.bars.push(A),this.options.noTTYOutput===!1&&this.terminal.isTTY()===!1)return A;if(this.sigintCallback===null&&this.options.gracefulExit)this.sigintCallback=this.stop.bind(this),process.once("SIGINT",this.sigintCallback),process.once("SIGTERM",this.sigintCallback);if(!this.isActive){if(this.options.hideCursor===!0)this.terminal.cursor(!1);if(this.options.linewrap===!1)this.terminal.lineWrapping(!1);this.timer=setTimeout(this.update.bind(this),this.schedulingRate)}return this.isActive=!0,A.start(u,C,F),this.emit("start"),A}remove(u){let C=this.bars.indexOf(u);if(C<0)return!1;return this.bars.splice(C,1),this.update(),this.terminal.newline(),this.terminal.clearBottom(),!0}update(){if(this.timer)clearTimeout(this.timer),this.timer=null;if(this.emit("update-pre"),this.terminal.cursorRelativeReset(),this.emit("redraw-pre"),this.loggingBuffer.length>0){this.terminal.clearLine();while(this.loggingBuffer.length>0)this.terminal.write(this.loggingBuffer.shift(),!0)}for(let u=0;u<this.bars.length;u++){if(u>0)this.terminal.newline();this.bars[u].render()}if(this.emit("redraw-post"),this.options.noTTYOutput&&this.terminal.isTTY()===!1)this.terminal.newline(),this.terminal.newline();if(this.timer=setTimeout(this.update.bind(this),this.schedulingRate),this.emit("update-post"),this.options.stopOnComplete&&!this.bars.find((u)=>u.isActive))this.stop()}stop(){if(clearTimeout(this.timer),this.timer=null,this.sigintCallback)process.removeListener("SIGINT",this.sigintCallback),process.removeListener("SIGTERM",this.sigintCallback),this.sigintCallback=null;if(this.isActive=!1,this.options.hideCursor===!0)this.terminal.cursor(!0);if(this.options.linewrap===!1)this.terminal.lineWrapping(!0);if(this.terminal.cursorRelativeReset(),this.emit("stop-pre-clear"),this.options.clearOnComplete)this.terminal.clearBottom();else{for(let u=0;u<this.bars.length;u++){if(u>0)this.terminal.newline();this.bars[u].render(),this.bars[u].stop()}this.terminal.newline()}this.emit("stop")}log(u){this.loggingBuffer.push(u)}}});var BF=H((z2,CF)=>{CF.exports={format:"progress [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}",barCompleteChar:"=",barIncompleteChar:"-"}});var ZF=H((q2,AF)=>{AF.exports={format:" {bar} {percentage}% | ETA: {eta}s | {value}/{total}",barCompleteChar:"█",barIncompleteChar:"░"}});var JF=H((I2,$F)=>{$F.exports={format:" \x1B[90m{bar}\x1B[0m {percentage}% | ETA: {eta}s | {value}/{total}",barCompleteChar:"█",barIncompleteChar:"░"}});var XF=H((V2,KF)=>{KF.exports={format:" {bar}■ {percentage}% | ETA: {eta}s | {value}/{total}",barCompleteChar:"■",barIncompleteChar:" "}});var GF=H((H2,YF)=>{var P8=BF(),h8=ZF(),f8=JF(),g8=XF();YF.exports={legacy:P8,shades_classic:h8,shades_grey:f8,rect:g8}});var NF=H((x2,WF)=>{var UF=uF(),m8=EF(),c8=GF(),p8=dD(),l8=cD(),d8=pD(),n8=lD();WF.exports={Bar:UF,SingleBar:UF,MultiBar:m8,Presets:c8,Format:{Formatter:p8,BarFormat:d8,ValueFormat:l8,TimeFormat:n8}}});import{join as QD,basename as Ru,extname as ju}from"node:path";import{randomUUID as W8}from"node:crypto";import{rm as Tu}from"node:fs/promises";import{spawn as g}from"node:child_process";import{appendFile as oF}from"node:fs/promises";var jD=null;function TD(D){jD=D}async function f(D){if(jD)try{await oF(jD,D,"utf-8")}catch(u){}}async function r(){return new Promise((D)=>{let u=g("ffmpeg",["-version"]);u.on("error",()=>D(!1)),u.on("close",(C)=>D(C===0))})}async function o(){return new Promise((D)=>{let u=g("MP4Box",["-version"]);u.on("error",()=>D(!1)),u.on("close",(C)=>D(C===0))})}async function t(){let D=await new Promise((E)=>{let A=g("ffmpeg",["-hide_banner","-encoders"]),B="";A.stdout.on("data",($)=>{B+=$.toString()}),A.on("error",()=>E("")),A.on("close",()=>E(B))}),u=(E)=>D.includes(E),C=[],F=[{acc:"nvenc",h264:u("h264_nvenc")?"h264_nvenc":void 0,av1:u("av1_nvenc")?"av1_nvenc":void 0},{acc:"qsv",h264:u("h264_qsv")?"h264_qsv":void 0,av1:u("av1_qsv")?"av1_qsv":void 0},{acc:"amf",h264:u("h264_amf")?"h264_amf":void 0,av1:u("av1_amf")?"av1_amf":void 0},{acc:"vaapi",h264:u("h264_vaapi")?"h264_vaapi":void 0,av1:u("av1_vaapi")?"av1_vaapi":void 0},{acc:"videotoolbox",h264:u("h264_videotoolbox")?"h264_videotoolbox":void 0,av1:u("av1_videotoolbox")?"av1_videotoolbox":void 0},{acc:"v4l2",h264:u("h264_v4l2m2m")?"h264_v4l2m2m":void 0,av1:u("av1_v4l2m2m")?"av1_v4l2m2m":void 0}];for(let E of F)if(E.h264||E.av1)C.push({accelerator:E.acc,h264Encoder:E.h264,av1Encoder:E.av1});return C}async function e(){let u=(await new Promise((E)=>{let A=g("ffmpeg",["-hide_banner","-hwaccels"]),B="";A.stdout.on("data",($)=>B+=$.toString()),A.on("error",()=>E("")),A.on("close",()=>E(B))})).split(`
`).map((E)=>E.trim()).filter(Boolean),C=[],F={cuda:"nvenc",qsv:"qsv",vaapi:"vaapi",videotoolbox:"videotoolbox",v4l2m2m:"v4l2",dxva2:"amf"};for(let E of u){let A=F[E];if(A)C.push({accelerator:A})}return C}async function GD(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((C)=>{let F=g("ffmpeg",u);F.on("error",()=>C(!1)),F.on("close",(E)=>C(E===0))})}async function UD(D,u){let C=["-v","error"];if(D==="nvenc")C.push("-hwaccel","cuda","-hwaccel_output_format","cuda");else if(D==="qsv")C.push("-hwaccel","qsv");else if(D==="vaapi")C.push("-hwaccel","vaapi","-vaapi_device","/dev/dri/renderD128");else if(D==="videotoolbox")C.push("-hwaccel","videotoolbox");else if(D==="v4l2")C.push("-hwaccel","v4l2m2m");else if(D==="amf")return!1;return C.push("-i",u,"-frames:v","1","-f","null","-"),new Promise((F)=>{let E=g("ffmpeg",C);E.on("error",()=>F(!1)),E.on("close",(A)=>F(A===0))})}async function l(D,u,C){let E=`
=== FFmpeg Command [${new Date().toISOString()}] ===
ffmpeg ${D.join(" ")}
`;return await f(E),new Promise((A,B)=>{let $=g("ffmpeg",D),K="";$.stderr.on("data",(X)=>{let G=X.toString();if(K+=G,u&&C){let Y=G.match(/time=(\d{2}):(\d{2}):(\d{2}\.\d{2})/);if(Y){let Z=parseInt(Y[1]),k=parseInt(Y[2]),_=parseFloat(Y[3]),J=Z*3600+k*60+_,N=Math.min(100,J/C*100);u(N)}}}),$.on("error",(X)=>{f(`ERROR: ${X.message}
`),B(Error(`FFmpeg error: ${X.message}`))}),$.on("close",(X)=>{if(X===0){let Y=K.split(`
`).filter((Z)=>Z.trim()).slice(-10).join(`
`);f(`SUCCESS: Exit code ${X}
--- Last 10 lines of output ---
${Y}
`),A()}else f(`FAILED: Exit code ${X}
--- Full error output ---
${K}
`),B(Error(`FFmpeg failed with exit code ${X}
${K}`))})})}async function wD(D){let C=`
=== MP4Box Command [${new Date().toISOString()}] ===
MP4Box ${D.join(" ")}
`;return await f(C),new Promise((F,E)=>{let A=g("MP4Box",D),B="",$="";A.stdout.on("data",(K)=>{B+=K.toString()}),A.stderr.on("data",(K)=>{$+=K.toString()}),A.on("error",(K)=>{f(`ERROR: ${K.message}
`),E(Error(`MP4Box error: ${K.message}`))}),A.on("close",(K)=>{if(K===0){let Y=(B||$).split(`
`).filter((Z)=>Z.trim()).slice(-10).join(`
`);f(`SUCCESS: Exit code ${K}
--- Last 10 lines of output ---
${Y}
`),F()}else{let X=$||B;f(`FAILED: Exit code ${K}
--- Full error output ---
${X}
`),E(Error(`MP4Box failed with exit code ${K}
${X}`))}})})}import{spawn as tF}from"node:child_process";async function DD(D){return new Promise((u,C)=>{let F=tF("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",(A)=>{E+=A.toString()}),F.on("error",(A)=>{C(Error(`ffprobe error: ${A.message}`))}),F.on("close",(A)=>{if(A!==0){C(Error(`ffprobe failed with exit code ${A}`));return}try{let B=JSON.parse(E),$=B.streams.find((J)=>J.codec_type==="video"),K=B.streams.find((J)=>J.codec_type==="audio"),X=B.format;if(!$){C(Error("No video stream found in input file"));return}let G=30;if($.r_frame_rate){let[J,N]=$.r_frame_rate.split("/").map(Number);if(J&&N&&N!==0)G=J/N}let Y=parseFloat($.duration||X.duration||"0"),Z=B.streams.find((J)=>J.codec_type==="audio"&&J.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;u({width:$.width,height:$.height,duration:Y,fps:G,codec:$.codec_name,hasAudio:Boolean(K),audioBitrate:k,videoBitrate:_})}catch(B){C(Error(`Failed to parse ffprobe output: ${B}`))}})})}function WD(D,u=256){if(!D)return`${u}k`;let F=Math.max(D,64),E=Math.min(F,u);if(E<=64)return"64k";if(E<=96)return"96k";if(E<=128)return"128k";if(E<=192)return"192k";return"256k"}function ND(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 eF,access as D8,constants as u8}from"node:fs/promises";async function d(D){try{await D8(D,u8.F_OK)}catch{await eF(D,{recursive:!0})}}function C8(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 v(D,u,C=30,F){let E=C8(D,u),A=Math.round(D*u*C*E/1000);if(F&&A>F)A=F;return`${A}k`}var yD=[{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 $D(D,u,C=30,F){let E=[],A=yD.filter((B)=>{return B.height<=u});for(let B of A)E.push({...B,videoBitrate:v(B.width,B.height,30,F),fps:30});return E}function B8(D,u,C){return{...D,name:`${D.name}-${u}`,videoBitrate:v(D.width,D.height,u,C),fps:u}}function Uu(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 Wu(D,u=30,C){let F=yD.find((E)=>E.name===D);if(!F)return null;if(u===30)return{...F,videoBitrate:v(F.width,F.height,30,C),fps:30};return B8(F,u,C)}function A8(D,u,C,F){let E=Uu(D);if(!E)return{error:`Invalid profile format: ${D}. Use format like: 360, 720@60, 1080-60`};let A=Wu(E.resolution,E.fps);if(!A)return{error:`Unknown resolution: ${E.resolution}. Available: 360, 480, 720, 1080, 1440, 2160`};if(A.height>C)return{error:`Source height (${C}px) is lower than requested ${D} height (${A.height}px)`};let B=120,$=E.fps,K;if(E.fps>F)$=Math.min(F,B),K=`Requested ${E.fps} FPS in ${D}, but source is ${F} FPS. Using ${$} FPS instead`;else if(E.fps>B)$=B,K=`Requested ${E.fps} FPS in ${D} exceeds maximum ${B} FPS. Using ${$} FPS instead`;return K?{warning:K,adjustedFps:$}:{}}function kD(D,u,C,F,E){let A=[],B=[],$=[];for(let K of D){let X=A8(K,u,C,F);if(X.error){B.push(X.error);continue}if(X.warning)$.push(X.warning);let G=Uu(K);if(!G)continue;let Y=X.adjustedFps!==void 0?X.adjustedFps:G.fps,Z=Wu(G.resolution,Y,E);if(Z)A.push(Z)}return{profiles:A,errors:B,warnings:$}}import{join as m}from"node:path";import{readdir as Z8,unlink as Nu,rmdir as $8,writeFile as ku}from"node:fs/promises";async function Qu(D,u,C="00:00:00"){let F=m(u,"poster.jpg"),E=/^\d+(\.\d+)?$/.test(C)?C:C;return await l(["-ss",E,"-i",D,"-vframes","1","-q:v","2","-y",F]),F}async function _u(D,u,C,F){let{width:E,height:A,interval:B,columns:$}=F,K=m(u,".thumbnails_temp");await d(K),await ku(m(K,".keep"),"");let X=m(K,"thumb_%04d.jpg");await l(["-i",D,"-vf",`fps=1/${B},scale=${E}:${A}`,"-q:v","5",X]);let Y=(await Z8(K)).filter((W)=>W.startsWith("thumb_")&&W.endsWith(".jpg")).sort();if(Y.length===0)throw Error("No thumbnails generated");let Z=Y.length,k=Math.ceil(Z/$),_=m(u,"thumbnails.jpg"),J=`tile=${$}x${k}`;await l(["-i",X,"-filter_complex",J,"-q:v","5",_]);let N=m(u,"thumbnails.vtt"),U=J8(Z,B,E,A,$,"thumbnails.jpg");await ku(N,U);for(let W of Y)await Nu(m(K,W));return await Nu(m(K,".keep")),await $8(K),{spritePath:_,vttPath:N}}function J8(D,u,C,F,E,A){let B=`WEBVTT
`;for(let $=0;$<D;$++){let K=$*u,X=($+1)*u,G=Math.floor($/E),Z=$%E*C,k=G*F;B+=`${ND(K)} --> ${ND(X)}
`,B+=`${A}#xywh=${Z},${k},${C},${F}
`}return B}import{join as K8}from"node:path";function X8(D,u,C){if(C)if(u==="h264")return 32;else return 42;else if(u==="h264"){if(D<=360)return 25;if(D<=480)return 24;if(D<=720)return 23;if(D<=1080)return 22;if(D<=1440)return 21;return 20}else{if(D<=360)return 40;if(D<=480)return 38;if(D<=720)return 35;if(D<=1080)return 32;if(D<=1440)return 30;return 28}}async function zu(D,u,C,F,E,A,B,$,K,X,G,Y=!1,Z,k){let _=K8(u,`video_${K}_${C.name}.mp4`),J=["-y"];if(Z){if(Z==="nvenc")J.push("-hwaccel","cuda","-hwaccel_output_format","cuda");else if(Z==="qsv")J.push("-hwaccel","qsv");else if(Z==="vaapi")J.push("-hwaccel","vaapi");else if(Z==="videotoolbox")J.push("-hwaccel","videotoolbox");else if(Z==="v4l2")J.push("-hwaccel","v4l2")}J.push("-i",D,"-c:v",F);let N=F.includes("nvenc")||F.includes("qsv")||F.includes("amf")||F.includes("vaapi")||F.includes("videotoolbox")||F.includes("v4l2"),U;if(N&&X?.cq!==void 0)U=X.cq;else if(!N&&X?.crf!==void 0)U=X.crf;else U=X8(C.height,K,N);if(F==="h264_nvenc")J.push("-rc:v","vbr"),J.push("-cq",String(U)),J.push("-preset",E),J.push("-2pass","0");else if(F==="av1_nvenc")J.push("-rc:v","vbr"),J.push("-cq",String(U)),J.push("-preset",E),J.push("-2pass","0");else if(F==="av1_qsv")J.push("-preset",E),J.push("-global_quality",String(U));else if(F==="h264_qsv")J.push("-preset",E),J.push("-global_quality",String(U));else if(F==="av1_amf")J.push("-quality","balanced"),J.push("-rc","cqp"),J.push("-qp_i",String(U)),J.push("-qp_p",String(U));else if(F==="h264_amf")J.push("-quality","balanced"),J.push("-rc","cqp"),J.push("-qp_i",String(U)),J.push("-qp_p",String(U));else if(F==="libsvtav1")J.push("-crf",String(U)),J.push("-preset",E),J.push("-svtav1-params","tune=0:enable-overlays=1");else if(F==="libx264")J.push("-crf",String(U)),J.push("-preset",E);else J.push("-preset",E);let W=K==="av1"?0.6:1,z=Math.round(parseInt(C.videoBitrate)*W*1.5);J.push("-maxrate",`${z}k`),J.push("-bufsize",`${z*2}k`);let j=C.fps||30,O=Math.round(j*B);J.push("-g",String(O),"-keyint_min",String(O),"-sc_threshold","0");let M=[],T=C.width,p=C.height;if(Z==="nvenc")M.push(`scale_cuda=${T}:${p}:force_original_aspect_ratio=decrease:force_divisible_by=2`);else M.push(`scale=${T}:${p}:force_original_aspect_ratio=decrease:force_divisible_by=2`);if(G){if(G.deinterlace)M.push("yadif");if(G.denoise)M.push("hqdn3d");if(G.customFilters)M.push(...G.customFilters)}if(M.push(`pad=${T}:${p}:(ow-iw)/2:(oh-ih)/2`,"setsar=1"),J.push("-vf",M.join(",")),!Y){let a=parseInt(C.audioBitrate)||256,xD=WD($,a);if(J.push("-c:a","aac","-b:a",xD),G?.audioNormalize)J.push("-af","loudnorm")}else J.push("-an");return J.push("-f","mp4",_),await l(J,k,A),_}async function qu(D,u,C,F,E,A,B,$,K,X,G,Y,Z,k=!1,_,J){let N=new Map;if(K&&C.length>1)for(let U=0;U<C.length;U+=X){let W=C.slice(U,U+X),z=W.map((O)=>zu(D,u,O,F,E,A,B,$,G,Y,Z,k,_,(M)=>{if(J)J(O.name,M)}));(await Promise.all(z)).forEach((O,M)=>{let T=W[M];N.set(T.name,O)})}else for(let U of C){let W=await zu(D,u,U,F,E,A,B,$,G,Y,Z,k,_,(z)=>{if(J)J(U.name,z)});N.set(U.name,W)}return N}import{join as L}from"node:path";import{readdir as Mu,rename as c3,mkdir as p3,writeFile as PD}from"node:fs/promises";import{readFile as SD,writeFile as bD}from"node:fs/promises";async function Iu(D){let u=await SD(D,"utf-8");u=u.replace(/\/\/>/g,"/>"),u=u.replace(/\/\s+\/>/g,"/>"),u=u.replace(/(<Representation[^>]+)\s+\/>/g,"$1/>"),u=u.replace(/<Representation\s+([^>]+)\/>\s*<\/Representation>/g,"<Representation $1/>"),u=u.replace(/<Representation\s+([^>]+)\/>\s*(<AudioChannelConfiguration[^>]*\/>)/g,`<Representation $1>
$2
</Representation>`),u=u.replace(/<Representation\s+([^>]+)>\s*(?=<(?:Representation|\/AdaptationSet))/g,`<Representation $1/>
`),await bD(D,u,"utf-8")}async function Vu(D){let u=await SD(D,"utf-8");u=u.replace(/media="\$RepresentationID\$_\$Number\$\.m4s"/g,'media="$RepresentationID$/$RepresentationID$_$Number$.m4s"'),u=u.replace(/initialization="\$RepresentationID\$_\.mp4"/g,'initialization="$RepresentationID$/$RepresentationID$_.mp4"'),await bD(D,u,"utf-8")}async function Hu(D){let C=(await SD(D,"utf-8")).split(`
`),F=[],E=0;while(E<C.length){let A=C[E];if(A.includes("<AdaptationSet")&&A.includes("maxWidth")){let B=E,$=[A],K=[],X=[],G=[],Y=!1;E++;while(E<C.length&&!C[E].includes("</AdaptationSet>")){let Z=C[E];if(Z.includes("<SegmentTemplate"))Y=!0;if(Y){if(K.push(Z),Z.includes("</SegmentTemplate>"))Y=!1}else if(Z.includes("<Representation")&&Z.includes("-h264"))X.push(Z);else if(Z.includes("<Representation")&&Z.includes("-av1"))G.push(Z);E++}if(X.length>0&&G.length>0)F.push(A),K.forEach((Z)=>F.push(Z)),X.forEach((Z)=>F.push(Z)),F.push(" </AdaptationSet>"),F.push(A),K.forEach((Z)=>F.push(Z)),G.forEach((Z)=>F.push(Z)),F.push(" </AdaptationSet>");else{F.push(A);for(let Z=B+1;Z<E;Z++)F.push(C[Z]);F.push(C[E])}E++}else F.push(A),E++}await bD(D,F.join(`
`),"utf-8")}function vD(D,u,C){let F=`#EXTM3U
`;F+=`#EXT-X-VERSION:6
`,F+=`#EXT-X-TARGETDURATION:${Math.ceil(C)}
`,F+=`#EXT-X-MEDIA-SEQUENCE:1
`,F+=`#EXT-X-INDEPENDENT-SEGMENTS
`,F+=`#EXT-X-MAP:URI="${u}"
`;for(let E of D)F+=`#EXTINF:${C},
`,F+=`${E}
`;return F+=`#EXT-X-ENDLIST
`,F}function xu(D,u){let C=`#EXTM3U
`;if(C+=`#EXT-X-VERSION:6
`,C+=`#EXT-X-INDEPENDENT-SEGMENTS
`,u)C+=`#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="audio",AUTOSELECT=YES,URI="audio/playlist.m3u8",CHANNELS="2"
`;for(let F of D){let E=u?"avc1.4D4020,mp4a.40.2":"avc1.4D4020";if(C+=`#EXT-X-STREAM-INF:BANDWIDTH=${F.bandwidth},CODECS="${E}",RESOLUTION=${F.resolution},FRAME-RATE=${F.fps}`,u)C+=',AUDIO="audio"';C+=`
`,C+=`${F.path}
`}return C}async function Y8(D,u,C,F,E,A){let B=L(u,"manifest.mpd"),$=E.length>1,K=["-dash",String(F*1000),"-frag",String(F*1000),"-rap","-segment-timeline","-segment-name","$RepresentationID$_$Number$","-out",B],X=!0;for(let[G,Y]of D.entries())for(let Z of C){let k=Y.get(Z.name);if(!k)throw Error(`MP4 file not found for profile: ${Z.name}, codec: ${G}`);let _=$?`${Z.name}-${G}`:Z.name;if(K.push(`${k}#video:id=${_}`),X&&A)K.push(`${k}#audio:id=audio`),X=!1}if(await wD(K),await G8(u,C,E,A),await Vu(B),$)await Hu(B);return await Iu(B),B}async function G8(D,u,C,F){let{readdir:E,rename:A,mkdir:B}=await import("node:fs/promises"),$=C.length>1,K=[];for(let Y of C)for(let Z of u){let k=$?`${Z.name}-${Y}`:Z.name;K.push(k);let _=L(D,k);await B(_,{recursive:!0})}let X=L(D,"audio");if(F)await B(X,{recursive:!0});let G=await E(D);for(let Y of G){if(Y==="manifest.mpd")continue;if(F&&(Y.startsWith("audio_")||Y==="audio_init.m4s")){let Z=L(D,Y),k=L(X,Y);await A(Z,k);continue}for(let Z of K)if(Y.startsWith(`${Z}_`)){let k=L(D,Y),_=L(D,Z,Y);await A(k,_);break}}}async function Ou(D,u,C,F,E,A,B){let $,K,X=A.length>0,G=A.includes("dash"),Y=A.includes("hls");if(X){if($=await Y8(D,u,C,F,E,B),!G)$=void 0}if(Y)K=await U8(u,C,F,E.length>1,B);return{manifestPath:$,hlsManifestPath:K}}async function U8(D,u,C,F,E){let A=L(D,"master.m3u8"),B=[];for(let G of u){let Y=F?`${G.name}-h264`:G.name,Z=L(D,Y),k=await Mu(Z),_=k.filter((z)=>z.endsWith(".m4s")).sort((z,j)=>{let O=parseInt(z.match(/_(\d+)\.m4s$/)?.[1]||"0"),M=parseInt(j.match(/_(\d+)\.m4s$/)?.[1]||"0");return O-M}),J=k.find((z)=>z.endsWith("_.mp4"));if(!J||_.length===0)continue;let N=vD(_,J,C),U=L(Z,"playlist.m3u8");await PD(U,N,"utf-8");let W=parseInt(G.videoBitrate)*1000;B.push({path:`${Y}/playlist.m3u8`,bandwidth:W,resolution:`${G.width}x${G.height}`,fps:G.fps||30})}let $,K=[];if(E){let G=L(D,"audio"),Y=[];try{Y=await Mu(G)}catch{Y=[]}if(K=Y.filter((Z)=>Z.endsWith(".m4s")).sort((Z,k)=>{let _=parseInt(Z.match(/_(\d+)\.m4s$/)?.[1]||"0"),J=parseInt(k.match(/_(\d+)\.m4s$/)?.[1]||"0");return _-J}),$=Y.find((Z)=>Z.endsWith("_.mp4")),$&&K.length>0){let Z=vD(K,$,C);await PD(L(G,"playlist.m3u8"),Z,"utf-8")}}let X=xu(B,E&&$!==void 0&&K.length>0);return await PD(A,X,"utf-8"),A}async function hD(D){let{input:u,outputDir:C,segmentDuration:F=2,profiles:E,customProfiles:A,codec:B=["h264"],formats:$=["dash","hls"],hardwareDecoder:K,hardwareAccelerator:X,quality:G,generateThumbnails:Y=!0,thumbnailConfig:Z={},generatePoster:k=!0,posterTimecode:_="00:00:00",parallel:J=!0,muted:N=!1,onProgress:U}=D,W=QD("/tmp",`dash-converter-${W8()}`);await d(W);let z=Ru(u,ju(u)),j=QD(C,z);await d(j);let O=QD(j,"conversion.log");TD(O);let{writeFile:M}=await import("node:fs/promises"),T=`===========================================
DASH Conversion Log
Started: ${new Date().toISOString()}
Input: ${u}
Output: ${j}
Codec: ${Array.isArray(B)?B.join(","):B}
Formats: ${$?.join(",")||"dash,hls"}
===========================================
`;await M(O,T,"utf-8");try{return await N8(u,C,W,F,E,A,B,$,X,K,G,Y,Z,k,_,J,N,U)}finally{let{appendFile:p}=await import("node:fs/promises");try{await p(O,`
Completed: ${new Date().toISOString()}
`,"utf-8")}catch(a){}try{await Tu(W,{recursive:!0,force:!0})}catch(a){console.warn(`Warning: Failed to cleanup temp directory: ${W}`)}}}async function N8(D,u,C,F,E,A,B,$,K,X,G,Y,Z,k,_,J,N,U){if(!await r())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 W=(q,V,LD,RD)=>{if(U)U({stage:q,percent:V,message:LD,currentProfile:RD})};W("analyzing",0,"Analyzing input video...");let z=await DD(D),j=!N&&z.hasAudio,O=z.duration,M=Math.max(1,Math.ceil(O/F)),T=O/M,p=K&&K!=="auto"?K:"auto",a=await t(),xD=await e(),yF=a.some((q)=>q.av1Encoder),uu=Array.isArray(B)?B:[B],Fu=uu.includes("h264"),MD=uu.includes("av1"),{selected:KD,h264Encoder:SF,av1Encoder:bF,warnings:Eu}=k8(a,p,Fu,MD);if(Eu.length>0)for(let q of Eu)console.warn(`⚠️ ${q}`);let{selected:XD}=Q8(xD,X||"auto");if(MD&&!yF)console.warn("⚠️ AV1 hardware encoder not detected. AV1 will use CPU encoder (slow).");let P=[];if(Fu)P.push("h264");if(MD)P.push("av1");if(P.length===0)P.push("h264");let Cu=$&&$.length>0?Array.from(new Set($)):["dash","hls"],R;if(A&&A.length>0){let q=kD(A,z.width,z.height,z.fps,z.videoBitrate);if(q.errors.length>0){console.warn(`
❌ Profile errors:`);for(let V of q.errors)console.warn(` - ${V}`);console.warn("")}if(q.warnings.length>0){console.warn(`
⚠️ Profile warnings:`);for(let V of q.warnings)console.warn(` - ${V}`);console.warn("")}if(R=q.profiles,R.length===0)throw Error("No valid profiles found in custom list. Check errors above.")}else if(E)R=E;else R=$D(z.width,z.height,z.fps,z.videoBitrate);if(R.length===0)throw Error("No suitable profiles found for input video resolution");let vF=Ru(D,ju(D)),AD=QD(u,vF);try{await Tu(AD,{recursive:!0,force:!0})}catch(q){}await d(AD);let h=[];if(P.includes("h264")){let q=SF||"libx264",V=Lu(q,"h264");h.push({type:"h264",codec:q,preset:V})}if(P.includes("av1")){let q=bF||"libsvtav1",V=Lu(q,"av1");h.push({type:"av1",codec:q,preset:V})}let PF=h.map((q)=>q.type.toUpperCase()).join(" + "),hF=KD==="cpu"?"CPU":KD.toUpperCase();W("analyzing",20,`Using ${PF} encoding (${hF}, decoder ${XD.toUpperCase()})`,void 0);let fF=KD==="cpu"?2:3,OD=new Map;for(let q=0;q<h.length;q++){let{type:V,codec:LD,preset:RD}=h[q],Ju=q/h.length,cF=1/h.length;W("encoding",25+Ju*40,`Stage 1: Encoding ${V.toUpperCase()} (${R.length} profiles)...`);let pF=V==="h264"?G?.h264:G?.av1,lF=await qu(D,C,R,LD,RD,z.duration,T,z.audioBitrate,J,fF,V,pF,void 0,N,XD==="cpu"?void 0:XD,(ZD,Ku)=>{let U3=R.findIndex((dF)=>dF.name===ZD),Xu=25+Ju*40,Yu=Ku/100*(40*cF/R.length);if(W("encoding",Xu+Yu,`Encoding ${V.toUpperCase()} ${ZD}...`,`${V}-${ZD}`),U)U({stage:"encoding",percent:Xu+Yu,currentProfile:`${V}-${ZD}`,profilePercent:Ku,message:`Encoding ${V.toUpperCase()} ${ZD}...`})});OD.set(V,lF)}W("encoding",65,"Stage 1 complete: All codecs and profiles encoded"),W("encoding",70,"Stage 2: Creating segments and manifests...");let{manifestPath:gF,hlsManifestPath:mF}=await Ou(OD,AD,R,T,P,Cu,j),Bu=[];for(let q of OD.values())Bu.push(...Array.from(q.values()));W("encoding",80,"Stage 2 complete: All formats packaged");let Au,Zu;if(Y){W("thumbnails",80,"Generating thumbnail sprites...");let q={width:Z.width||160,height:Z.height||90,interval:Z.interval||1,columns:Z.columns||10},V=await _u(D,AD,z.duration,q);Au=V.spritePath,Zu=V.vttPath,W("thumbnails",90,"Thumbnails generated")}let $u;if(k)W("thumbnails",92,"Generating poster image..."),$u=await Qu(D,AD,_),W("thumbnails",95,"Poster generated");return W("manifest",95,"Finalizing..."),W("complete",100,"Conversion complete!"),{manifestPath:gF,hlsManifestPath:mF,videoPaths:Bu,thumbnailSpritePath:Au,thumbnailVttPath:Zu,posterPath:$u,duration:z.duration,profiles:R,usedNvenc:h.some((q)=>q.codec.includes("nvenc")),selectedAccelerator:KD,selectedDecoder:XD,codecs:P,formats:Cu}}var uD={nvenc:100,qsv:90,amf:80,vaapi:70,videotoolbox:65,v4l2:60,cpu:1};function k8(D,u,C,F){let E=[],A=new Set(["nvenc","qsv","amf","vaapi","videotoolbox","v4l2"]),B=D.filter((N)=>C&&N.h264Encoder||F&&N.av1Encoder),$=B.filter((N)=>A.has(N.accelerator)),K=(N)=>B.find((U)=>U.accelerator===N);if(u==="cpu")return{selected:"cpu",h264Encoder:void 0,av1Encoder:void 0,warnings:E};let X;if(u!=="auto"){if(!A.has(u))E.push(`Ускоритель "${u}" пока не поддерживается, использую CPU`);else if(X=K(u),!X)throw Error(`Аппаратный ускоритель "${u}" недоступен в системе`)}else if(X=($.length>0?$:[]).sort((U,W)=>(uD[W.accelerator]||0)-(uD[U.accelerator]||0))[0],!X&&B.length>0)E.push("Доступен аппаратный ускоритель, но он пока не поддерживается пайплайном, использую CPU");let Y=($.length>0?$:[]).sort((N,U)=>(uD[U.accelerator]||0)-(uD[N.accelerator]||0)),Z=(N)=>{let U=N==="h264"?X?.h264Encoder:X?.av1Encoder;if(U)return{encoder:U,accel:X?.accelerator};let W=Y.find((z)=>N==="h264"?z.h264Encoder:z.av1Encoder);if(W){if(u!=="auto"&&X)E.push(`Выбранный ускоритель "${X.accelerator}" не поддерживает ${N.toUpperCase()}, использую ${W.accelerator}`);return{encoder:N==="h264"?W.h264Encoder:W.av1Encoder,accel:W.accelerator}}if(u!=="auto")E.push(`Ускоритель "${u}" не поддерживает ${N.toUpperCase()}, использую CPU`);return{encoder:void 0,accel:"cpu"}},k=C?Z("h264"):{encoder:void 0,accel:X?.accelerator},_=F?Z("av1"):{encoder:void 0,accel:X?.accelerator};return{selected:X?.accelerator||k.accel||_.accel||"cpu",h264Encoder:k.encoder,av1Encoder:_.encoder,warnings:E}}function Q8(D,u){let C=new Set(["nvenc","qsv","vaapi","videotoolbox","v4l2"]),F=(B)=>D.find(($)=>$.accelerator===B);if(u!=="auto"){if(u==="cpu")return{selected:"cpu"};let B=F(u);return{selected:B?B.accelerator:"cpu"}}let E=D.filter((B)=>C.has(B.accelerator));if(E.length===0)return{selected:"cpu"};return{selected:E.sort((B,$)=>(uD[$.accelerator]||0)-(uD[B.accelerator]||0))[0].accelerator}}function Lu(D,u){if(D.includes("nvenc"))return"p4";if(D.includes("qsv"))return"medium";if(D.includes("amf"))return"balanced";if(D.includes("vaapi"))return"5";if(D.includes("videotoolbox"))return"medium";if(D.includes("v4l2"))return"medium";if(D==="libsvtav1")return"8";if(D==="libx264")return"medium";return u==="av1"?"8":"medium"}var iD=YD(NF(),1);import{statSync as s8}from"node:fs";var Q=process.argv.slice(2),JD,oD,qD,tD=[],w,y,S,b,FD,ED,eD=!1;for(let D=0;D<Q.length;D++)if(Q[D]==="-r"||Q[D]==="--resolutions"){let u=[];for(let F=D+1;F<Q.length;F++){if(Q[F].startsWith("-"))break;u.push(Q[F]),D=F}JD=u.join(",").split(/[,\s]+/).map((F)=>F.trim()).filter((F)=>F.length>0)}else if(Q[D]==="-p"||Q[D]==="--poster")oD=Q[D+1],D++;else if(Q[D]==="-c"||Q[D]==="--codec"){let C=Q[D+1].split(/[,\s]+/).map((E)=>E.trim()).filter(Boolean),F=new Set(["h264","av1"]);for(let E of C)if(!F.has(E))console.error(`❌ Invalid codec: ${E}. Valid options: av1, h264`),process.exit(1);qD=Array.from(new Set(C)),D++}else if(Q[D]==="--h264-cq"){if(w=parseInt(Q[D+1]),isNaN(w)||w<0||w>51)console.error(`❌ Invalid H.264 CQ value: ${Q[D+1]}. Must be 0-51`),process.exit(1);D++}else if(Q[D]==="--h264-crf"){if(y=parseInt(Q[D+1]),isNaN(y)||y<0||y>51)console.error(`❌ Invalid H.264 CRF value: ${Q[D+1]}. Must be 0-51`),process.exit(1);D++}else if(Q[D]==="--av1-cq"){if(S=parseInt(Q[D+1]),isNaN(S)||S<0||S>51)console.error(`❌ Invalid AV1 CQ value: ${Q[D+1]}. Must be 0-51`),process.exit(1);D++}else if(Q[D]==="--av1-crf"){if(b=parseInt(Q[D+1]),isNaN(b)||b<0||b>63)console.error(`❌ Invalid AV1 CRF value: ${Q[D+1]}. Must be 0-63`),process.exit(1);D++}else if(Q[D]==="-e"||Q[D]==="--encoder"){let u=Q[D+1];if(!["auto","nvenc","qsv","amf","cpu","vaapi","videotoolbox","v4l2"].includes(u))console.error(`❌ Invalid accelerator: ${u}. Valid: auto, nvenc, qsv, amf, vaapi, videotoolbox, v4l2, cpu`),process.exit(1);FD=u,D++}else if(Q[D]==="-d"||Q[D]==="--decoder"){let u=Q[D+1];if(!["auto","nvenc","qsv","amf","vaapi","videotoolbox","v4l2","cpu"].includes(u))console.error(`❌ Invalid decoder: ${u}. Valid: auto, nvenc, qsv, amf, vaapi, videotoolbox, v4l2, cpu`),process.exit(1);ED=u,D++}else if(Q[D]==="-m"||Q[D]==="--muted")eD=!0;else if(!Q[D].startsWith("-"))tD.push(Q[D]);var s=tD[0],VF=tD[1]||".";if(!s)console.error("❌ Usage: create-vod <input-video> [output-dir] [options]"),console.error(`
Options:`),console.error(" -r, --resolutions Video resolutions (e.g., 360,480,720 or 720@60,1080@60)"),console.error(" -c, --codec Video codec: av1 or h264 (default: auto = h264 + AV1 if HW)"),console.error(" -f, --format Streaming format: dash or hls (default: auto = dash + hls)"),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(" -m, --muted Disable audio track (no audio in output)"),console.error(`
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 h264 --h264-cq 30"),console.error(" create-vod video.mp4 -f hls"),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 -p 10 --h264-cq 28"),process.exit(1);console.log(`\uD83D\uDD0D Checking system...
`);var HF=await r(),xF=await o(),MF=await t(),a8=await e(),i8=MF.some((D)=>D.av1Encoder),ID={nvenc:100,qsv:90,amf:80,vaapi:70,videotoolbox:65,v4l2:60,cpu:1},r8={nvenc:"h264_nvenc",qsv:"h264_qsv",amf:"h264_amf",vaapi:"h264_vaapi",videotoolbox:"h264_videotoolbox",v4l2:"h264_v4l2m2m",cpu:"libx264"},o8=Array.from(new Set([...MF.map((D)=>D.accelerator),"cpu"])),t8=Array.from(new Set([...a8.map((D)=>D.accelerator),"cpu"]));async function e8(){let D=[];for(let u of o8){if(u==="amf")continue;let C=r8[u]||"libx264";if(await GD(C))D.push(u)}return D}async function D3(){let D=[];for(let u of t8){if(u==="cpu"){D.push("cpu");continue}if(await UD(u,s))D.push(u)}return D}var OF=await e8(),LF=await D3(),CD=OF.slice().sort((D,u)=>(ID[u]||0)-(ID[D]||0))[0],BD=LF.slice().sort((D,u)=>(ID[u]||0)-(ID[D]||0))[0];console.log(`FFmpeg: ${HF?"✅":"❌"}`);console.log(`MP4Box: ${xF?"✅":"❌"}`);var kF=Array.from(new Set(OF.map((D)=>D.toUpperCase()))),QF=Array.from(new Set(LF.map((D)=>D.toUpperCase()))),_F=FD?FD.toUpperCase():CD&&CD.toUpperCase()||"CPU",RF=kF.length>0?kF:["CPU"],zF=ED?ED.toUpperCase():BD&&BD.toUpperCase()||"CPU",jF=QF.length>0?QF:["CPU"];console.log(`Encoder: ${_F==="AUTO"?CD&&CD.toUpperCase()||"CPU":_F} (${RF.join(", ")})`);console.log(`Decoder: ${zF==="AUTO"?BD&&BD.toUpperCase()||"CPU":zF} (${jF.join(", ")})`);console.log("");if(!HF)console.error("❌ FFmpeg not found. Please install FFmpeg first."),process.exit(1);if(!xF)console.error("❌ MP4Box not found. Please install: sudo pacman -S gpac"),process.exit(1);var Du=qD&&qD.length>0?qD:["h264"],VD=Du.includes("h264"),HD=Du.includes("av1");if(!VD)console.warn("⚠️ H.264 is mandatory for compatibility. Adding H.264."),VD=!0;if(HD&&!i8)console.error("⚠️ AV1 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.
`);var u3=!0,F3=!0;console.log(`\uD83D\uDCCA Analyzing video...
`);var x=await DD(s),E3=s8(s),C3=(E3.size/1048576).toFixed(2);console.log("\uD83D\uDCF9 Video Information:");console.log(` File: ${s}`);console.log(` Size: ${C3} MB`);console.log(` Resolution: ${x.width}x${x.height}`);console.log(` FPS: ${x.fps.toFixed(2)}`);console.log(` Duration: ${Math.floor(x.duration/60)}m ${Math.floor(x.duration%60)}s`);console.log(` Codec: ${x.codec}`);if(x.videoBitrate)console.log(` Video Bitrate: ${(x.videoBitrate/1000).toFixed(2)} Mbps`);if(x.audioBitrate)console.log(` Audio Bitrate: ${x.audioBitrate} kbps`);var rD=[];if(JD&&JD.length>0){let D=kD(JD,x.width,x.height,x.fps,x.videoBitrate);if(D.errors.length>0)console.error(`
❌ Profile errors:`),D.errors.forEach((u)=>console.error(` - ${u}`)),process.exit(1);if(D.warnings.length>0)console.warn(`
⚠️ Profile warnings:`),D.warnings.forEach((u)=>console.warn(` - ${u}`));rD=D.profiles.map((u)=>u.name)}else rD=$D(x.width,x.height,x.fps,x.videoBitrate).map((u)=>u.name);var B3=[u3?"DASH (manifest.mpd)":null,F3?"HLS (master.m3u8)":null].filter(Boolean).join(", "),A3=!0,Z3=oD||"00:00:00",$3=[VD?"h264":null,HD?"av1":null].filter(Boolean).join(", "),J3=!HD&&Du.includes("av1")?" (AV1 disabled: no HW)":"",TF=CD&&CD.toUpperCase()||"CPU",wF=BD&&BD.toUpperCase()||"CPU",qF=FD?FD.toUpperCase():TF,IF=ED?ED.toUpperCase():wF,K3=qF==="AUTO"?TF:qF,X3=IF==="AUTO"?wF:IF,Y3=RF.join(", "),G3=jF.join(", ");console.log(`
\uD83D\uDCE6 Parameters:`);console.log(` Input: ${s}`);console.log(` Output: ${VF}`);console.log(` Codec: ${$3}${J3}`);console.log(` Profiles: ${rD.join(", ")}`);console.log(` Manifests: ${B3}`);console.log(` Poster: ${Z3} (will be generated)`);console.log(` Thumbnails: ${A3?"yes (with VTT)":"no"}`);console.log(` Encoder: ${K3} (available: ${Y3})`);console.log(` Decoder: ${X3} (available: ${G3})`);console.log(` Audio: ${eD?"disabled (muted)":"enabled"}`);var c;if(w!==void 0||y!==void 0||S!==void 0||b!==void 0){if(c={},w!==void 0||y!==void 0){if(c.h264={},w!==void 0)c.h264.cq=w;if(y!==void 0)c.h264.crf=y;console.log(`\uD83C\uDF9A H.264 Quality: ${w!==void 0?`CQ ${w}`:""}${y!==void 0?` CRF ${y}`:""}`)}if(S!==void 0||b!==void 0){if(c.av1={},S!==void 0)c.av1.cq=S;if(b!==void 0)c.av1.crf=b;console.log(`\uD83C\uDF9A AV1 Quality: ${S!==void 0?`CQ ${S}`:""}${b!==void 0?` CRF ${b}`:""}`)}}console.log(`
\uD83D\uDE80 Starting conversion...
`);var zD=new iD.default.MultiBar({format:"{stage} | {bar} | {percentage}% | {name}",barCompleteChar:"█",barIncompleteChar:"░",hideCursor:!0,clearOnComplete:!1,stopOnComplete:!0},iD.default.Presets.shades_classic),sD={},aD=null;try{let D=Date.now(),u=await hD({input:s,outputDir:VF,customProfiles:JD,posterTimecode:oD,codec:[...VD?["h264"]:[],...HD?["av1"]:[]],segmentDuration:2,hardwareAccelerator:FD,hardwareDecoder:ED,quality:c,generateThumbnails:!0,generatePoster:!0,muted:eD,parallel:!0,onProgress:(E)=>{let A=E.stage==="encoding"?"Encoding":E.stage==="thumbnails"?"Thumbnails":E.stage==="manifest"?"Manifest":E.stage==="analyzing"?"Analyzing":"Complete";if(E.stage==="encoding"&&E.currentProfile){if(!sD[E.currentProfile])sD[E.currentProfile]=zD.create(100,0,{stage:"Encode",name:E.currentProfile});let B=E.profilePercent??E.percent;sD[E.currentProfile].update(B,{stage:"Encode",name:E.currentProfile})}if(!aD)aD=zD.create(100,0,{stage:A,name:"Overall"});aD.update(E.percent,{stage:A,name:E.message||"Overall"})}});zD.stop();let F=((Date.now()-D)/1000).toFixed(2);console.log(`
✅ Conversion completed successfully! (${F}s)
`)}catch(D){zD.stop(),console.error(`
❌ Error during conversion:`),console.error(D),process.exit(1)}