Code Cleanup

This commit is contained in:
anarch3 2022-11-19 19:07:28 -05:00
parent 76a3f57736
commit 833cf41203
9 changed files with 170 additions and 46 deletions

View file

@ -5,10 +5,7 @@ A media host specialized in good looking embeds for services like Discord. No fi
<img src="readmegif.gif">
Upcoming Features:
* Smooth out mp4s similar to imgur and gfycat
* Guest user accounts
* ShareX support
* Expirey/auto-delete support
## Run

26
app.js
View file

@ -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`);
});
});
});

View file

@ -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([

126
package-lock.json generated
View file

@ -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",

View file

@ -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": {

View file

@ -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 = ?", [

View file

@ -1,3 +1 @@
<h1><%= message %></h1>
<h2><%= error.status %></h2>
<pre><%= error.stack %></pre>
<h1><%= error %></h1>

View file

@ -8,6 +8,7 @@ function extension(str){
<!DOCTYPE html>
<html>
<head>
<% if (extension(url)[1] == ".mp4" || extension(url)[1] == ".gif") { %>
<meta name="twitter:image" content="<%= host %>/uploads/<%= extension(url)[0] %>.gif">
<meta name="twitter:card" content="player"></meta>
<meta name="twitter:player" content="<%= host %>/uploads/<%= extension(url)[0] %>.mp4">
@ -15,7 +16,7 @@ function extension(str){
<meta name="twitter:player:height" content="<%= height %>"></meta>
<meta name="twitter:player:stream" content="<%= host %>/uploads/<%= extension(url)[0] %>.mp4">
<meta name="twitter:player:stream:content_type" content="text/mp4"></meta>
<link rel="alternate" type="application/json+oembed" href="<%= host %>/uploads/oembed-<%= extension(url)[0] %>.json"></link>
<link rel="alternate" type="application/json+oembed" href="<%= host %>/uploads/oembed-<%= extension(url)[0]+extension(url)[1] %>.json"></link>
<meta property="og:title" content="<%= extension(url)[0] %>.gif"></meta>
<meta property="og:url" content="<%= host %>/uploads/<%= extension(url)[0] %>.gif"></meta>
<meta property="og:description" content="Click to view the GIF"></meta>
@ -29,8 +30,28 @@ function extension(str){
<meta property="og:video:type" content="text/mp4"></meta>
<meta property="og:video:width" content="<%= width %>"></meta>
<meta property="og:video:height" content="<%= height %>"></meta>
<% } else { %>
<meta name="twitter:image" content="<%= host %>/uploads/<%= extension(url)[0] + extension(url)[1] %>">
<meta name="twitter:card" content="player"></meta>
<meta name="twitter:player" content="<%= host %>/uploads/<%= extension(url)[0] + extension(url)[1] %>">
<meta name="twitter:player:width" content="<%= width %>"></meta>
<meta name="twitter:player:height" content="<%= height %>"></meta>
<link rel="alternate" type="application/json+oembed" href="<%= host %>/uploads/oembed-<%= extension(url)[0]+extension(url)[1] %>.json"></link>
<meta property="og:title" content="<%= extension(url)[0] + extension(url)[1] %>"></meta>
<meta property="og:url" content="<%= host %>/uploads/<%= extension(url)[0] + extension(url)[1] %>"></meta>
<meta property="og:description" content="Click to view the Image"></meta>
<meta property="og:type" content="video.other"></meta>
<meta property="og:image" content="<%= host %>/uploads/<%= extension(url)[0] + extension(url)[1] %>"></meta>
<meta property="og:image:type" content="image/<%= extension(url)[1].substr(1,extension(url)[1].length) %>"></meta>
<meta property="og:image:width" content="<%= width %>"></meta>
<meta property="og:image:height" content="<%= height %>"></meta>
<% } %>
</head>
<body>
<% if (extension(url)[1] == ".mp4" || extension(url)[1] == ".gif") { %>
<video autoplay loop muted playsinline class="image" width="100%"><source src="/uploads/<%= extension(url)[0] %>.mp4"></video>
<% } else { %>
<img src="/uploads/<%= extension(url)[0] + extension(url)[1] %>" class="image" width="100%">
<% } %>
</body>
</html>