ytdownload
Version:
Download YouTube Videos Easily (Now with CLI support!)
73 lines (71 loc) • 1.99 kB
text/typescript
import { createWriteStream, mkdir } from "fs";
import { clearLine, cursorTo } from "readline";
import { table } from "table";
import ytdl, { getInfo } from "ytdl-core";
export const downlaod = (url: string, logging = true): Promise<string> => {
return new Promise((resolve, reject) => {
mkdir("videos", (err) => {
if (err && err.code !== "EEXIST")
reject(
`[YTDownload] ${err} \n\nFOR MORE ADVANCED HELP: https://discord.com/invite/BjEJFwh`,
);
getInfo(url)
.then((info) => {
const video = ytdl(info.videoDetails.video_url);
const filePath = `./videos/${info.videoDetails.title.replace(
/[\W_]+/g,
" ",
)}.mp4`;
video.pipe(createWriteStream(filePath));
if (logging) {
const data = table([
["YTDownload", "Status", "Percent"],
[
info.videoDetails.title,
"Starting Download",
"0%",
],
]);
console.info(data);
}
video.on("end", () => {
if (logging) {
const data = table([
["YTDownload", "Status", "Percent"],
[
info.videoDetails.title,
"Download Finished",
"100%",
],
]);
console.log(`\n${data}`);
}
resolve(filePath);
});
video.on("error", (error) =>
reject(
`[YTDownload] ${error} \n\nFOR MORE ADVANCED HELP: https://discord.com/invite/BjEJFwh`,
),
);
video.on("progress", (chunk, downloaded, total) => {
if (logging) {
const percent = (
(downloaded * 100) /
total
).toFixed(3);
clearLine(process.stdout, 0);
cursorTo(process.stdout, 0);
process.stdout.write(
`[YTDownload] Downloading ${percent}%`,
);
}
});
})
.catch((err) =>
reject(
`[YTDownload] ${err} \n\nFOR MORE ADVANCED HELP: https://discord.com/invite/BjEJFwh`,
),
);
});
});
};