diff --git a/index.js b/index.js index e68d690..e1eca6d 100644 --- a/index.js +++ b/index.js @@ -1,4 +1,3 @@ -const { randomInt } = require('crypto'); const ytdl = require('ytdl-core'), fs = require('fs'), path = require('path'), @@ -8,6 +7,13 @@ const ytdl = require('ytdl-core'), const PORT = process.env.PORT || 8080 const app = express() +if (fs.existsSync(path.join(__dirname, 'cached'))) { + fs.unlinkSync(path.join(__dirname, 'cached')) +} + +fs.mkdirSync(path.join(__dirname, 'cached')) + +const cacheDuration = 15 || process.env.CACHEDUR process.on('uncaughtException', (err, origin) => { fs.writeSync( @@ -19,50 +25,117 @@ process.on('uncaughtException', (err, origin) => { app.use(bodyParser.urlencoded({ extended: false })) -app.get("/download", async (req, res) => { +app.get("/getLink", async (req, res) => { const filename = req.query.filename const url = req.query.url const format = req.query.format const quality = req.query.quality if (!ytdl.validateURL(url)) { - res.send("Invalid URL!") + res.header("Content-Type", "text/html") + res.write(``) + res.write(`

Invalid URL! Check the url for any errors!
${url}

`) return } - res.header('Content-Disposition', `attachment; filename="${filename}.${format}"`); + res.setHeader("Content-Type", "text/html"); - var ytpath = path.join(__dirname, 'cached/' + ytdl.getVideoID(url) + String(Math.floor(Math.random() * 100000)) + '.mp4') + res.write(``) + // String(Math.floor(Math.random() * 100000)) + + var ytpath = path.join(__dirname, 'cached/' + ytdl.getVideoID(url) + '.mp4') var vidinfo = await ytdl.getBasicInfo(url) - var ytvid = ytdl(url, { 'quality': quality }) - .pipe(fs.createWriteStream(ytpath)) - .on("close", ()=> { - console.log("Downloaded!") - var proc = new ffmpeg(ytpath) - proc.then(function(video) { - video - .setVideoDuration(vidinfo.videoDetails.lengthSeconds) - .setVideoFormat(format) - .save('cached/' + ytdl.getVideoID(url) + String(Math.floor(Math.random() * 100000)) + "Converted." + format,function (err, file) { - console.log("Converted!") - fs.createReadStream(file).pipe(res) - .on("close", () => { - console.log("Freed!") - fs.unlinkSync(file) - if (fs.existsSync(ytpath)) { - fs.unlinkSync(ytpath) + var lastp = 0 + var ytvid = ytdl(url, { 'quality': quality, 'format': 'mp4' }) + + .on("progress", (data, ctotal, etotal) => { + var integer = 1 + var percent = (Math.ceil(ctotal / etotal * 100)) + if (percent % integer == 0 && lastp != percent) { + res.write(`

Downloading... ${percent}%

`) + res.write(` + + `) + lastp = percent + } }) - }) - - + .pipe(fs.createWriteStream(ytpath)) + .on("close", () => { + res.write("

Downloaded!

") + var proc = new ffmpeg(ytpath) + // res.write(`

Converting... (May take a while, doesn't support progress updates yet)

`) + var endpath = ('cached/' + ytdl.getVideoID(url) + String(Math.floor(Math.random() * 100000)) + "Converted." + format) + res.write(`

Converting... 0% (Potentially Innacurate, Experimental!)

`) + proc.then(function (video) { + video + .setVideoDuration(vidinfo.videoDetails.lengthSeconds) + .setVideoFormat(format) + .save(endpath, (error, file)=>{ + res.write("

Converted!

") + res.write(`

Link to video download! (Link is deleted after 15 minutes!)

`) + setTimeout(()=>{ + if (fs.existsSync(ytpath)) { + fs.unlinkSync(ytpath) + } + if (fs.existsSync(file)) { + fs.unlinkSync(file) + } + }, 60 * 1000) + }) + }) + var integer = 1 + var lastc = 0 + var percent = 0 + async function update() { + if (fs.existsSync(endpath)) { + var ffile = await fs.readFileSync(endpath) + var yt = await fs.readFileSync(ytpath) + percent = (Math.round(ffile.length / yt.length * (100 / integer))) * integer + if (percent % integer == 0 && percent != lastc) { + res.write(`

Converting... ${Math.min(percent, 100)}% (Potentially Innacurate, Experimental!)

`) + res.write(` + + `) + lastc = percent + } + } + if (percent < 100) { + setTimeout(() => { + update() + }, 500); + } + } + update() + }) }); +app.get('/download', (req, res) => { + var file = req.query.path + var filename = req.query.filename + var dest = path.join(__dirname, 'cached/', file) + + if (fs.existsSync(dest)) { + res.header('Content-Disposition', `attachment; filename="${filename}"`); + fs.createReadStream(dest).pipe(res) + } else { + res.header("Content-Type", "text/html") + res.write(``) + res.write(`

Uh oh! It seems that video couldn't be found... Maybe the URL expired? Or, the link was invalid.
If you believe this was a mistake, please put a issue on Github

`, ()=>{ + res.end() + }) + } +}) + app.use(express.static(path.join(__dirname, 'static'))) app.listen(PORT, function () { diff --git a/package-lock.json b/package-lock.json index ba4345e..e661fc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "youtubeconverter", - "version": "0.4.0", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/package.json b/package.json index b8c23c6..97e63c1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "youtubeconverter", - "version": "0.4.0", + "version": "2.0.0", "description": "A web youtube converter for converting videos to mp4, mp3, and other supported formats", "main": "index.js", "scripts": { diff --git a/static/index.html b/static/index.html index ca2139c..ddbae7d 100644 --- a/static/index.html +++ b/static/index.html @@ -12,11 +12,11 @@ -

Youtube Downloader

v0.4

+

Youtube Downloader

v2.0


-
+

Video URL:

Quality:

@@ -43,6 +43,7 @@

+

Warning!: Although the tab might seem frozen, it is not! When you download a video, it first downloads, then converts, then sends it! If you would know any ways to indicated without javascript the progress of the conversion, or how to pipe the ffmpeg conversion automatically, please help!

Please consider donating or host the website yourself! Anything helps! (Check github for more info)