86 lines
56 KiB
JavaScript
Executable File
86 lines
56 KiB
JavaScript
Executable File
#!/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)}
|