UNPKG

ytdlp-nodejs

Version:

A TypeScript wrapper for the yt-dlp executable

4 lines (3 loc) 4.6 kB
#!/usr/bin/env node "use strict";var R=Object.create;var A=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var C=Object.getPrototypeOf,N=Object.prototype.hasOwnProperty;var $=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of _(e))!N.call(r,a)&&a!==t&&A(r,a,{get:()=>e[a],enumerable:!(s=M(e,a))||s.enumerable});return r};var o=(r,e,t)=>(t=r!=null?R(C(r)):{},$(e||!r||!r.__esModule?A(t,"default",{value:r,enumerable:!0}):t,r));var B=require("util");var D=o(require("path"));var y=o(require("path")),g=o(require("fs"));var j=o(require("https")),L=o(require("http")),b=require("url"),f=o(require("fs"));function O(r,e={}){return new Promise((t,s)=>{let i=(new b.URL(r).protocol==="https:"?j:L).get(r,e,n=>{if(n.statusCode>=300&&n.statusCode<400&&n.headers.location){let c=new b.URL(n.headers.location,r).toString();O(c,e).then(t).catch(s);return}t(n)});i.on("error",s),i.setTimeout(3e4,()=>{i.destroy(),s(new Error("Request timed out"))})})}async function p(r,e){try{let t=f.createWriteStream(e),s=await O(r);if(s.statusCode!==200)throw t.close(),f.unlinkSync(e),new Error(`Failed to download file: ${s.statusCode} ${s.statusMessage}`);let a=parseInt(s.headers["content-length"]||"0",10),u=0;return s.on("data",i=>{u+=i.length;let n=u/a*100;process.stdout.write(`Progress: ${Math.round(n)}%\r`)}),s.pipe(t),new Promise((i,n)=>{t.on("finish",()=>{t.close(),console.log(` Download complete!`),i()}),t.on("error",c=>{t.close(),f.unlinkSync(e),n(c)}),s.on("error",c=>{t.close(),f.unlinkSync(e),n(c)})})}catch(t){throw f.existsSync(e)&&f.unlinkSync(e),t}}var W="https://github.com/iqbal-rashed/ytdlp-nodejs/releases/download/ffmpeg-latest",w={win32:{x64:["win-x64-ffmpeg.exe","win-x64-ffprobe.exe"],ia32:["win-ia32-ffmpeg.exe","win-ia32-ffprobe.exe"],arm64:["win-arm64-ffmpeg.exe","win-arm64-ffprobe.exe"]},linux:{x64:["linux-x64-ffmpeg","linux-x64-ffprobe"],arm64:["linux-arm64-ffmpeg","linux-arm64-ffprobe"]},darwin:{x64:["macos-x64-ffmpeg","macos-x64-ffprobe"],arm64:["macos-arm64-ffmpeg","macos-arm64-ffprobe"]},android:{arm64:["linux-arm64-ffmpeg","linux-arm64-ffprobe"]}};function I(){let r=process.platform,e=process.arch;if(!w[r]||!w[r][e])throw new Error(`No FFmpeg build available for platform: ${r}, architecture: ${e}`);return w[r][e]}async function F(r){let e=r||h,t=x();if(t)return console.log("Already downloaded"),t;try{let s=I();if(!s.length)throw new Error;let a=s.map(i=>`${W}/${i}`),u=s.map(i=>y.default.join(e,String(i.split("-").pop())));g.default.existsSync(e)||g.default.mkdirSync(e,{recursive:!0}),console.log("Downloading FFmpeg and FFprobe...");for(let i=0;i<s.length;i++){let n=a[i],c=u[i];console.log("Downloading...",y.default.basename(n)),await p(n,c)}try{for(let i of u)g.default.chmodSync(i,493)}catch{console.log("Note: Could not set executable permissions (likely Windows)")}return x()}catch(s){throw console.error(`Download failed: ${s}`),s}}function x(){try{let r=I();if(!r.length)throw new Error;let e=y.default.join(h,String(r[0].split("-").pop()));if(!g.default.existsSync(e))throw new Error("FFmpeg binary not found. Please download it first.");return e}catch{return}}var m=o(require("fs")),T=o(require("path"));var V="https://github.com/yt-dlp/yt-dlp/releases/latest/download",v={win32:{x64:"yt-dlp.exe",ia32:"yt-dlp_x86.exe"},linux:{x64:"yt-dlp",armv7l:"yt-dlp_linux_armv7l",aarch64:"yt-dlp_linux_aarch64"},darwin:{x64:"yt-dlp_macos",arm64:"yt-dlp_macos"},android:{arm64:"yt-dlp"}};function z(){let r=process.platform,e=process.arch;if(!v[r]||!v[r][e])throw new Error(`No FFmpeg build available for ${r} ${e}`);return v[r][e]}async function k(r){let e=r||h,t=z(),s=`${V}/${t}`,a=T.join(e,t);if(m.existsSync(a))return a;console.log("Downloading yt-dlp...",s),m.existsSync(e)||m.mkdirSync(e,{recursive:!0});try{await p(s,a),console.log(`yt-dlp downloaded successfully to: ${a}`);try{m.chmodSync(a,493)}catch{console.log("Error while chmod")}return a}catch(i){throw console.error(`Download failed: ${i}`),i}}var h=D.join(__dirname,"..","bin");var P=o(require("fs")),E=o(require("path"));var U=process.argv.slice(2),{values:S}=(0,B.parseArgs)({args:U,options:{download:{type:"string",short:"d",choices:["ffmpeg","ytdlp"],default:"ffmpeg"},out:{type:"string",short:"o",default:h}}}),d=E.default.resolve(S.out);if(!P.default.existsSync(d))try{P.default.mkdirSync(d,{recursive:!0}),console.log(`Created directory: ${d}`)}catch(r){console.error(`Error creating directory ${d}:`,r),process.exit(1)}S.download=="ytdlp"?k(d):S.download=="ffmpeg"?F(d):console.error("Please select ffmpeg or ytdlp to download");