From 833cf41203842e8c9add839175a8cab4c06d46d0 Mon Sep 17 00:00:00 2001 From: anarch3 Date: Sat, 19 Nov 2022 19:07:28 -0500 Subject: [PATCH] Code Cleanup --- README.md | 3 -- app.js | 26 +++------- middleware.js | 12 ++--- package-lock.json | 126 ++++++++++++++++++++++++++++++++++++++++++++-- package.json | 1 + routes/index.js | 19 +++---- views/error.ejs | 4 +- views/gifv.ejs | 23 ++++++++- views/index.ejs | 2 +- 9 files changed, 170 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index e34392c..a38fe82 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,7 @@ A media host specialized in good looking embeds for services like Discord. No fi Upcoming Features: -* Smooth out mp4s similar to imgur and gfycat * Guest user accounts -* ShareX support -* Expirey/auto-delete support ## Run diff --git a/app.js b/app.js index cd82ea2..a88421d 100644 --- a/app.js +++ b/app.js @@ -4,7 +4,6 @@ require("dotenv").config(); let express = require("express"); let passport = require("passport"); let session = require("express-session"); -let createError = require("http-errors"); let cookieParser = require("cookie-parser"); let SQLiteStore = require("connect-sqlite3")(session); @@ -47,21 +46,10 @@ app.use("/", authRouter); app.use("/uploads", express.static("uploads")); -// catch 404 and forward to error handler -app.use(function(req, res, next) { - next(createError(404)); -}); - // error handler -app.use(function(err, req, res) { - // set locals, only providing error in development - console.log(err); - res.locals.message = err.message; - res.locals.error = req.app.get("env") === "development" ? err : {}; - - // render the error page - res.status(err.status || 500); - res.render("error"); +app.use((err, req, res) => { + console.error(err.stack); + res.status(500).send("Something broke!"); }); function prune () { @@ -72,17 +60,17 @@ function prune () { console.log("Expired rows: " + rows); if (err) return console.error(err); rows.forEach((row) => { - console.log("Deleting " + row.path); - fs.unlink("uploads/" + row.path, (err) => { + console.log(`Deleting ${row.path}`); + fs.unlink(`uploads/${row.path}`, (err) => { if (err) { if(err.errno == -4058) return; //file doesn't exist return console.error(err); } - console.log("Deleted " + row.path); + console.log(`Deleted ${row.path}`); }); db.run("DELETE FROM media WHERE expire > ?", [Date.now()], (err) => { if (err) return console.error(err); - console.log("Deleted " + row.path + " from database"); + console.log(`Deleted ${row.path} from database`); }); }); }); diff --git a/middleware.js b/middleware.js index b099019..3063edc 100644 --- a/middleware.js +++ b/middleware.js @@ -50,28 +50,28 @@ function convert(req, res, next) { height: 360 }; - fs.writeFile(`uploads/oembed-${nameAndExtension[0]}.json`, JSON.stringify(oembed), function (err) { + fs.writeFile(`uploads/oembed-${nameAndExtension[0]}${nameAndExtension[1]}.json`, JSON.stringify(oembed), function (err) { if (err) return next(err); - console.log("oembed file created " + nameAndExtension[0] + ".json"); + console.log(`oembed file created ${nameAndExtension[0]}${nameAndExtension[1]}.json`); }); if (nameAndExtension[1] == ".mp4") { console.log("Converting " + nameAndExtension[0] + nameAndExtension[1] + " to gif"); console.log(nameAndExtension[0] + nameAndExtension[1]); ffmpeg() - .input("uploads/" + req.files[file].originalname) + .input(`uploads/${nameAndExtension[0]}${nameAndExtension[1]}`) .inputFormat("mp4") .outputFormat("gif") - .output("uploads/" + nameAndExtension[0] + ".gif") + .output(`uploads/${nameAndExtension[0]}.gif`) .on("end", function() { console.log("Conversion complete"); - console.log("Uploaded to uploads/" + nameAndExtension[0] + ".gif"); + console.log(`Uploaded to uploads/${nameAndExtension[0]}.gif`); }) .on("error", (e) => console.log(e)) .run(); } else if (nameAndExtension[1] == ".gif") { console.log(`Converting ${nameAndExtension[0]}${nameAndExtension[1]} to mp4`); - ffmpeg("uploads/" + req.files[file].originalname) + ffmpeg(`uploads/${nameAndExtension[0]}${nameAndExtension[1]}`) .inputFormat("gif") .outputFormat("mp4") .outputOptions([ diff --git a/package-lock.json b/package-lock.json index 7df838b..d63984f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "multer": "^1.4.5-lts.1", "passport": "^0.6.0", "passport-local": "^1.0.0", + "probe-image-size": "^7.2.3", "sqlite3": "^5.0.2" }, "devDependencies": { @@ -1751,6 +1752,17 @@ "ms": "^2.0.0" } }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -1960,8 +1972,7 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/lru-cache": { "version": "6.0.0", @@ -2228,6 +2239,35 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/needle/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -2554,6 +2594,16 @@ "node": ">= 0.8.0" } }, + "node_modules/probe-image-size": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", + "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", + "dependencies": { + "lodash.merge": "^4.6.2", + "needle": "^2.5.2", + "stream-parser": "~0.3.1" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -2743,6 +2793,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", @@ -2933,6 +2988,14 @@ "node": ">= 0.6" } }, + "node_modules/stream-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", + "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", + "dependencies": { + "debug": "2" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -4510,6 +4573,14 @@ "ms": "^2.0.0" } }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -4671,8 +4742,7 @@ "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "lru-cache": { "version": "6.0.0", @@ -4872,6 +4942,31 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -5104,6 +5199,16 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "probe-image-size": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", + "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", + "requires": { + "lodash.merge": "^4.6.2", + "needle": "^2.5.2", + "stream-parser": "~0.3.1" + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -5222,6 +5327,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", @@ -5360,6 +5470,14 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" }, + "stream-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", + "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", + "requires": { + "debug": "2" + } + }, "streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", diff --git a/package.json b/package.json index 90c3137..eb4e3ed 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "multer": "^1.4.5-lts.1", "passport": "^0.6.0", "passport-local": "^1.0.0", + "probe-image-size": "^7.2.3", "sqlite3": "^5.0.2" }, "devDependencies": { diff --git a/routes/index.js b/routes/index.js index cff7a6a..371e3d1 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,6 +1,7 @@ let multer = require("multer"); let express = require("express"); let ffmpeg = require("fluent-ffmpeg"); +let imageProbe = require("probe-image-size"); let ffmpegpath = require("@ffmpeg-installer/ffmpeg").path; let ffprobepath = require("@ffprobe-installer/ffprobe").path; @@ -91,8 +92,8 @@ router.get("/", function (req, res, next) { res.render("index", { user: req.user }); }); -router.get("/gifv/:file", function (req, res, next) { - let url = req.protocol + "://" + req.get("host") + "/uploads/" + req.params.file; +router.get("/gifv/:file", async function (req, res, next) { + let url = `${req.protocol}://${req.get("host")}/uploads/${req.params.file}`; let width; let height; let nameAndExtension = extension("uploads/" + req.params.file); @@ -104,8 +105,7 @@ router.get("/gifv/:file", function (req, res, next) { if (err) return next(err); width = data.streams[0].width; height = data.streams[0].height; - console.log(width + "x" + height); - return res.render("gifv", { url: url, host: req.protocol + "://" + req.get("host"), width: width, height: height }); + return res.render("gifv", { url: url, host: `${req.protocol}://${req.get("host")}`, width: width, height: height }); }); } else if (nameAndExtension[1] == ".gif") { ffmpeg() @@ -115,9 +115,11 @@ router.get("/gifv/:file", function (req, res, next) { if (err) return next(err); width = data.streams[0].width; height = data.streams[0].height; - console.log(width + "x" + height); - return res.render("gifv", { url: url, host: req.protocol + "://" + req.get("host"), width: width, height: height }); + return res.render("gifv", { url: url, host: `${req.protocol}://${req.get("host")}`, width: width, height: height }); }); + } else { + let imageData = await imageProbe(fs.createReadStream("uploads/" + req.params.file)); + return res.render("gifv", { url: url, host: `${req.protocol}://${req.get("host")}`, width: imageData.width, height: imageData.height }); } }); @@ -132,7 +134,7 @@ router.post("/sharex", [checkAuth, upload.array("fileupload"), convert, handleUp router.post("/:id(\\d+)/delete", function(req, res, next) { db.all("SELECT path FROM media WHERE id = ?", [ req.params.id ], function(err, path) { if (err) { return next(err); } - fs.unlink("uploads/" + path[0].path, (err => { + fs.unlink(`uploads/${path[0].path}`, (err => { if (err) { console.log(err); if (err.errno == -4058) { //File just doesnt exist anymore @@ -146,8 +148,7 @@ router.post("/:id(\\d+)/delete", function(req, res, next) { console.log(err); return res.redirect("/"); } - } - else { + } else { console.log(`Deleted ${path}`); //Callback Hell :D db.run("DELETE FROM media WHERE id = ?", [ diff --git a/views/error.ejs b/views/error.ejs index 7cf94ed..69bfa1d 100644 --- a/views/error.ejs +++ b/views/error.ejs @@ -1,3 +1 @@ -

<%= message %>

-

<%= error.status %>

-
<%= error.stack %>
+

<%= error %>

diff --git a/views/gifv.ejs b/views/gifv.ejs index 612ff9d..8238107 100644 --- a/views/gifv.ejs +++ b/views/gifv.ejs @@ -8,6 +8,7 @@ function extension(str){ + <% if (extension(url)[1] == ".mp4" || extension(url)[1] == ".gif") { %> @@ -15,7 +16,7 @@ function extension(str){ - + @@ -29,8 +30,28 @@ function extension(str){ + <% } else { %> + + + + + + + + + + + + + + + <% } %> + <% if (extension(url)[1] == ".mp4" || extension(url)[1] == ".gif") { %> + <% } else { %> + + <% } %> diff --git a/views/index.ejs b/views/index.ejs index 910c1f7..b701cd5 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -71,7 +71,7 @@ return string.slice((string.lastIndexOf(".") - 2 >>> 0) + 2);
Copy as GIFv
- + <% } else if (extension(file.path) == ".jpg" || extension(file.path) == ".jpeg" || extension(file.path) == ".png" || extension(file.path) == ".gif" || extension(file.path) == ".webp" ) { %> <% } else {%>