From a8fa9b97832eee1ef921a30b33420fc3516d1c8f Mon Sep 17 00:00:00 2001 From: Bingus_Violet Date: Wed, 22 Nov 2023 22:52:44 -0600 Subject: [PATCH] Converter update! --- .gitignore | 2 +- index.js | 34 ++++++++- package-lock.json | 141 ++++++++++++++++++++++++++++++++++++-- package.json | 3 +- static/convert/index.html | 57 +++++++++++++++ static/index.html | 21 ++++-- static/style.css | 17 +++-- 7 files changed, 257 insertions(+), 18 deletions(-) create mode 100644 static/convert/index.html diff --git a/.gitignore b/.gitignore index d91c45f..4919b1c 100644 --- a/.gitignore +++ b/.gitignore @@ -130,4 +130,4 @@ dist .pnp.* # ytdl -cached \ No newline at end of file +uploads \ No newline at end of file diff --git a/index.js b/index.js index fc04b92..7f286fe 100644 --- a/index.js +++ b/index.js @@ -2,14 +2,18 @@ const ytdl = require('ytdl-core'), fs = require('fs'), path = require('path'), express = require('express'), + multer = require('multer'), bodyParser = require('body-parser'), cp = require("child_process"), - ffmpeg = require('ffmpeg-static') + ffmpeg = require('ffmpeg-static'), + stream = require('stream') const PORT = process.env.PORT || 8080 const app = express() +var upload = multer({ dest: 'uploads' }) + var formats = { "matroska": "mkv" } @@ -26,6 +30,34 @@ process.on('uncaughtException', (err, origin) => { app.use(bodyParser.urlencoded({ extended: false })) +app.post("/converter", upload.single("video"), async (req, res) => { + var videoInfo = req.file + var format = req.body.format + + const ffmpegProcess = cp.spawn(ffmpeg, [ + '-i', videoInfo.path, + '-c:v', 'copy', + '-c:a', 'libmp3lame', + '-crf','27', + '-preset','veryfast', + '-movflags','frag_keyframe+empty_moov', + '-f', format, + '-loglevel','error', + '-' +], { + stdio: [ + 'pipe', 'pipe', 'pipe', 'pipe', 'pipe', + ], +}) + res.setHeader('Content-Disposition', `attachment; filename="${videoInfo.originalname.substring(0, videoInfo.originalname.lastIndexOf('.') +1)}${format}"`); + + ffmpegProcess.stdio[1] + .pipe(res) + .on("close", () => { + fs.rmSync(videoInfo.path) + }) +}) + app.get("/download", async (req, res) => { const url = req.query.url const format = req.query.format diff --git a/package-lock.json b/package-lock.json index 509c96a..ef20f99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,18 @@ { - "name": "youtubeconverter", - "version": "2.1.0", + "name": "univerter", + "version": "3.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "youtubeconverter", - "version": "2.1.0", + "name": "univerter", + "version": "3.1.0", "license": "MIT", "dependencies": { "body-parser": "^1.20.2", "express": "^4.18.2", "ffmpeg-static": "^5.2.0", + "multer": "^1.4.5-lts.1", "ytdl-core": "^4.11.5" } }, @@ -78,6 +79,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -111,6 +117,17 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -182,6 +199,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -487,6 +509,11 @@ "node": ">= 0.10" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/m3u8stream": { "version": "0.8.6", "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.6.tgz", @@ -558,11 +585,88 @@ "node": ">=12" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/multer/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/multer/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/multer/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/multer/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -571,6 +675,14 @@ "node": ">= 0.6" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -608,6 +720,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -774,6 +891,14 @@ "node": ">= 0.8" } }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -836,6 +961,14 @@ "node": ">= 0.8" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/ytdl-core": { "version": "4.11.5", "resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-4.11.5.tgz", diff --git a/package.json b/package.json index 037ca3c..e048e1e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "univerter", - "version": "3.0.0", + "version": "3.1.0", "description": "A web youtube converter for converting videos to mp4, mp3, and other supported formats", "main": "index.js", "scripts": { @@ -26,6 +26,7 @@ "body-parser": "^1.20.2", "express": "^4.18.2", "ffmpeg-static": "^5.2.0", + "multer": "^1.4.5-lts.1", "ytdl-core": "^4.11.5" } } diff --git a/static/convert/index.html b/static/convert/index.html new file mode 100644 index 0000000..f66c069 --- /dev/null +++ b/static/convert/index.html @@ -0,0 +1,57 @@ + + + + + + + + + + + Univerter - Video Converter + + + +

Univerter - Video Converter

v1.0

+
+

+ +
+ + +
+ +


+ +
+
+

Video:

+ +
+ +
+

Format:

+ +
+ +
+
+

This video converter is experimental. Please report issues on Codeberg!

+

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

+ + + \ No newline at end of file diff --git a/static/index.html b/static/index.html index 3f3950c..a15d3bd 100644 --- a/static/index.html +++ b/static/index.html @@ -6,25 +6,35 @@ - + - Univerter + Univerter - YT Downloader -

Univerter

v3.0

+

Univerter - YT Downloader

v3.0


+ +
+ + +
+ +


Video URL:

- +

Quality:

-
-

diff --git a/static/style.css b/static/style.css index 3741f30..406b2f3 100644 --- a/static/style.css +++ b/static/style.css @@ -1,3 +1,6 @@ +@import url("https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"); +@import url('https://fonts.googleapis.com/css2?family=Rubik:wght@300;400&display=swap'); + :root { --primary-color: rgb(230, 210, 255); --text-color: rgb(230, 230, 255); @@ -8,7 +11,7 @@ * { text-align: center; color: var(--text-color); - font-family: Verdana, Geneva, Tahoma, sans-serif; + font-family: 'Rubik', Verdana, Geneva, Tahoma, sans-serif; } h1, @@ -19,12 +22,11 @@ h1>* { p, select, input { - font-size: 1.4rem; + font-size: 1.3rem; } p { margin: 5px; - display: inline-block; } body, @@ -39,13 +41,13 @@ html { select, input { - display: inline-block; + display: block; background-color: var(--second-bg-color); color: var(--text-color); margin: 5px auto; border: 2px var(--primary-color) solid; border-radius: 5px; - padding: 5px; + padding: 7px; } .col-sm-3 { @@ -75,3 +77,8 @@ hr { display: block; margin: 5px; } + +div, a, h2 { + padding: 0 !important; + margin: auto !important; +} \ No newline at end of file