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 @@
-
<%= error.stack %>+