From f4acf57fde6ad7b63d66f3e1fa040a30068e1c00 Mon Sep 17 00:00:00 2001 From: anarch3 Date: Fri, 18 Nov 2022 17:08:26 -0500 Subject: [PATCH 01/14] gifv support? --- public/css/app.css | 24 ++++++++++++++++++++++++ public/js/index.js | 9 +++++++++ routes/index.js | 6 +++++- views/gifv.ejs | 14 ++++++++++++++ views/index.ejs | 8 +++++++- 5 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 views/gifv.ejs diff --git a/public/css/app.css b/public/css/app.css index ff1fb2c..d2f2227 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -90,3 +90,27 @@ div.nonmedia p { label { text-align: center; } + +.video { + position: relative; +} + +.video .overlay { + position: absolute; + top: 0%; + left: 70%; + transform: translateY(0%) translateX(70%); + z-index: 1; + border-radius: 25px; + border: 2px solid #73AD21; + padding: 5px; + background-color: #eee; +} + +.video .overlay a { + color: #73AD21; + font-size: 12px; + font-weight: 400; + line-height: 20px; + text-align: center; +} diff --git a/public/js/index.js b/public/js/index.js index 9e5fe7e..948f363 100644 --- a/public/js/index.js +++ b/public/js/index.js @@ -9,6 +9,15 @@ function copyURI(evt) { }); } +function copyA(evt) { + evt.preventDefault(); + navigator.clipboard.writeText(absolutePath(evt.target.getAttribute('href'))).then(() => { + console.log("copied"); + }, () => { + console.log("failed"); + }); +} + function copyPath(evt) { navigator.clipboard.writeText(absolutePath(evt)).then(() => { console.log("copied"); diff --git a/routes/index.js b/routes/index.js index 6b489a2..676dc3a 100644 --- a/routes/index.js +++ b/routes/index.js @@ -103,6 +103,11 @@ 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; + return res.render('gifv', { url: url }); +}); + router.post('/', upload.array('fileupload'), function(req, res, next) { if (!req.files || Object.keys(req.files).length === 0) { console.log(req) @@ -138,7 +143,6 @@ router.post('/sharex', [checkAuth, upload.array('fileupload')], function(req, re } }); - 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); } diff --git a/views/gifv.ejs b/views/gifv.ejs new file mode 100644 index 0000000..7aef16e --- /dev/null +++ b/views/gifv.ejs @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/views/index.ejs b/views/index.ejs index a91f993..a6b384d 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -49,7 +49,13 @@ return string.slice((string.lastIndexOf(".") - 2 >>> 0) + 2);
<% if (extension(file.path) == ".mp4" || extension(file.path) == ".mov" || extension(file.path) == "webp") { %> - +
+ + <% } else if (extension(file.path) == ".jpg" || extension(file.path) == ".jpeg" || extension(file.path) == ".png" || extension(file.path) == ".gif" || extension(file.path) == ".webp" ) { %> <% } else {%> From eefd73e610cba0af28027a7bacb84fdce72b9387 Mon Sep 17 00:00:00 2001 From: anarch3 Date: Fri, 18 Nov 2022 17:41:55 -0500 Subject: [PATCH 02/14] more tags --- views/gifv.ejs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/views/gifv.ejs b/views/gifv.ejs index 7aef16e..da0cca9 100644 --- a/views/gifv.ejs +++ b/views/gifv.ejs @@ -2,13 +2,17 @@ + - + + + + - + From 107cb29f73a06536803fdd14ca1913ef733e32c7 Mon Sep 17 00:00:00 2001 From: anarch3 Date: Fri, 18 Nov 2022 19:11:39 -0500 Subject: [PATCH 03/14] ffmpeg --- package-lock.json | 230 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 2 + routes/index.js | 53 ++++++++++- views/gifv.ejs | 26 ++++-- 4 files changed, 297 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 86bf19d..cae7f95 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,14 @@ "version": "0.0.0", "license": "Unlicense", "dependencies": { + "@ffmpeg-installer/ffmpeg": "^1.1.0", "connect-sqlite3": "^0.9.13", "cookie-parser": "~1.4.4", "dotenv": "^8.6.0", "ejs": "^3.1.8", "express": "~4.16.1", "express-session": "^1.17.3", + "fluent-ffmpeg": "^2.1.2", "http-errors": "~1.6.3", "mkdirp": "^1.0.4", "multer": "^1.4.5-lts.1", @@ -23,6 +25,123 @@ "sqlite3": "^5.0.2" } }, + "node_modules/@ffmpeg-installer/darwin-arm64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/darwin-arm64/-/darwin-arm64-4.1.5.tgz", + "integrity": "sha512-hYqTiP63mXz7wSQfuqfFwfLOfwwFChUedeCVKkBtl/cliaTM7/ePI9bVzfZ2c+dWu3TqCwLDRWNSJ5pqZl8otA==", + "cpu": [ + "arm64" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@ffmpeg-installer/darwin-x64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/darwin-x64/-/darwin-x64-4.1.0.tgz", + "integrity": "sha512-Z4EyG3cIFjdhlY8wI9aLUXuH8nVt7E9SlMVZtWvSPnm2sm37/yC2CwjUzyCQbJbySnef1tQwGG2Sx+uWhd9IAw==", + "cpu": [ + "x64" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@ffmpeg-installer/ffmpeg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/ffmpeg/-/ffmpeg-1.1.0.tgz", + "integrity": "sha512-Uq4rmwkdGxIa9A6Bd/VqqYbT7zqh1GrT5/rFwCwKM70b42W5gIjWeVETq6SdcL0zXqDtY081Ws/iJWhr1+xvQg==", + "optionalDependencies": { + "@ffmpeg-installer/darwin-arm64": "4.1.5", + "@ffmpeg-installer/darwin-x64": "4.1.0", + "@ffmpeg-installer/linux-arm": "4.1.3", + "@ffmpeg-installer/linux-arm64": "4.1.4", + "@ffmpeg-installer/linux-ia32": "4.1.0", + "@ffmpeg-installer/linux-x64": "4.1.0", + "@ffmpeg-installer/win32-ia32": "4.1.0", + "@ffmpeg-installer/win32-x64": "4.1.0" + } + }, + "node_modules/@ffmpeg-installer/linux-arm": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-arm/-/linux-arm-4.1.3.tgz", + "integrity": "sha512-NDf5V6l8AfzZ8WzUGZ5mV8O/xMzRag2ETR6+TlGIsMHp81agx51cqpPItXPib/nAZYmo55Bl2L6/WOMI3A5YRg==", + "cpu": [ + "arm" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ffmpeg-installer/linux-arm64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-arm64/-/linux-arm64-4.1.4.tgz", + "integrity": "sha512-dljEqAOD0oIM6O6DxBW9US/FkvqvQwgJ2lGHOwHDDwu/pX8+V0YsDL1xqHbj1DMX/+nP9rxw7G7gcUvGspSoKg==", + "cpu": [ + "arm64" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ffmpeg-installer/linux-ia32": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-ia32/-/linux-ia32-4.1.0.tgz", + "integrity": "sha512-0LWyFQnPf+Ij9GQGD034hS6A90URNu9HCtQ5cTqo5MxOEc7Rd8gLXrJvn++UmxhU0J5RyRE9KRYstdCVUjkNOQ==", + "cpu": [ + "ia32" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ffmpeg-installer/linux-x64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-x64/-/linux-x64-4.1.0.tgz", + "integrity": "sha512-Y5BWhGLU/WpQjOArNIgXD3z5mxxdV8c41C+U15nsE5yF8tVcdCGet5zPs5Zy3Ta6bU7haGpIzryutqCGQA/W8A==", + "cpu": [ + "x64" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ffmpeg-installer/win32-ia32": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/win32-ia32/-/win32-ia32-4.1.0.tgz", + "integrity": "sha512-FV2D7RlaZv/lrtdhaQ4oETwoFUsUjlUiasiZLDxhEUPdNDWcH1OU9K1xTvqz+OXLdsmYelUDuBS/zkMOTtlUAw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@ffmpeg-installer/win32-x64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/win32-x64/-/win32-x64-4.1.0.tgz", + "integrity": "sha512-Drt5u2vzDnIONf4ZEkKtFlbvwj6rI3kxw1Ck9fpudmtgaZIHD4ucsWB2lCZBXRxJgXR+2IMSti+4rtM4C4rXgg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -773,6 +892,29 @@ "node": ">= 0.8" } }, + "node_modules/fluent-ffmpeg": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz", + "integrity": "sha512-IZTB4kq5GK0DPp7sGQ0q/BWurGHffRtQQwVkiqDgeO6wYJLLV5ZhgNOQ65loZxxuPMKZKZcICCUnaGtlxBiR0Q==", + "dependencies": { + "async": ">=0.2.9", + "which": "^1.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fluent-ffmpeg/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1035,8 +1177,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "optional": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/jake": { "version": "10.8.5", @@ -2052,6 +2193,69 @@ } }, "dependencies": { + "@ffmpeg-installer/darwin-arm64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/darwin-arm64/-/darwin-arm64-4.1.5.tgz", + "integrity": "sha512-hYqTiP63mXz7wSQfuqfFwfLOfwwFChUedeCVKkBtl/cliaTM7/ePI9bVzfZ2c+dWu3TqCwLDRWNSJ5pqZl8otA==", + "optional": true + }, + "@ffmpeg-installer/darwin-x64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/darwin-x64/-/darwin-x64-4.1.0.tgz", + "integrity": "sha512-Z4EyG3cIFjdhlY8wI9aLUXuH8nVt7E9SlMVZtWvSPnm2sm37/yC2CwjUzyCQbJbySnef1tQwGG2Sx+uWhd9IAw==", + "optional": true + }, + "@ffmpeg-installer/ffmpeg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/ffmpeg/-/ffmpeg-1.1.0.tgz", + "integrity": "sha512-Uq4rmwkdGxIa9A6Bd/VqqYbT7zqh1GrT5/rFwCwKM70b42W5gIjWeVETq6SdcL0zXqDtY081Ws/iJWhr1+xvQg==", + "requires": { + "@ffmpeg-installer/darwin-arm64": "4.1.5", + "@ffmpeg-installer/darwin-x64": "4.1.0", + "@ffmpeg-installer/linux-arm": "4.1.3", + "@ffmpeg-installer/linux-arm64": "4.1.4", + "@ffmpeg-installer/linux-ia32": "4.1.0", + "@ffmpeg-installer/linux-x64": "4.1.0", + "@ffmpeg-installer/win32-ia32": "4.1.0", + "@ffmpeg-installer/win32-x64": "4.1.0" + } + }, + "@ffmpeg-installer/linux-arm": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-arm/-/linux-arm-4.1.3.tgz", + "integrity": "sha512-NDf5V6l8AfzZ8WzUGZ5mV8O/xMzRag2ETR6+TlGIsMHp81agx51cqpPItXPib/nAZYmo55Bl2L6/WOMI3A5YRg==", + "optional": true + }, + "@ffmpeg-installer/linux-arm64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-arm64/-/linux-arm64-4.1.4.tgz", + "integrity": "sha512-dljEqAOD0oIM6O6DxBW9US/FkvqvQwgJ2lGHOwHDDwu/pX8+V0YsDL1xqHbj1DMX/+nP9rxw7G7gcUvGspSoKg==", + "optional": true + }, + "@ffmpeg-installer/linux-ia32": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-ia32/-/linux-ia32-4.1.0.tgz", + "integrity": "sha512-0LWyFQnPf+Ij9GQGD034hS6A90URNu9HCtQ5cTqo5MxOEc7Rd8gLXrJvn++UmxhU0J5RyRE9KRYstdCVUjkNOQ==", + "optional": true + }, + "@ffmpeg-installer/linux-x64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-x64/-/linux-x64-4.1.0.tgz", + "integrity": "sha512-Y5BWhGLU/WpQjOArNIgXD3z5mxxdV8c41C+U15nsE5yF8tVcdCGet5zPs5Zy3Ta6bU7haGpIzryutqCGQA/W8A==", + "optional": true + }, + "@ffmpeg-installer/win32-ia32": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/win32-ia32/-/win32-ia32-4.1.0.tgz", + "integrity": "sha512-FV2D7RlaZv/lrtdhaQ4oETwoFUsUjlUiasiZLDxhEUPdNDWcH1OU9K1xTvqz+OXLdsmYelUDuBS/zkMOTtlUAw==", + "optional": true + }, + "@ffmpeg-installer/win32-x64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/win32-x64/-/win32-x64-4.1.0.tgz", + "integrity": "sha512-Drt5u2vzDnIONf4ZEkKtFlbvwj6rI3kxw1Ck9fpudmtgaZIHD4ucsWB2lCZBXRxJgXR+2IMSti+4rtM4C4rXgg==", + "optional": true + }, "@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -2650,6 +2854,25 @@ "unpipe": "~1.0.0" } }, + "fluent-ffmpeg": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz", + "integrity": "sha512-IZTB4kq5GK0DPp7sGQ0q/BWurGHffRtQQwVkiqDgeO6wYJLLV5ZhgNOQ65loZxxuPMKZKZcICCUnaGtlxBiR0Q==", + "requires": { + "async": ">=0.2.9", + "which": "^1.1.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -2858,8 +3081,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "optional": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "jake": { "version": "10.8.5", diff --git a/package.json b/package.json index 124bcdb..71c5ed5 100644 --- a/package.json +++ b/package.json @@ -24,12 +24,14 @@ "start": "node ./bin/www" }, "dependencies": { + "@ffmpeg-installer/ffmpeg": "^1.1.0", "connect-sqlite3": "^0.9.13", "cookie-parser": "~1.4.4", "dotenv": "^8.6.0", "ejs": "^3.1.8", "express": "~4.16.1", "express-session": "^1.17.3", + "fluent-ffmpeg": "^2.1.2", "http-errors": "~1.6.3", "mkdirp": "^1.0.4", "multer": "^1.4.5-lts.1", diff --git a/routes/index.js b/routes/index.js index 676dc3a..f09b52a 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,5 +1,8 @@ let express = require('express'); let multer = require('multer'); +let ffmpegpath = require('@ffmpeg-installer/ffmpeg').path; +let ffmpeg = require('fluent-ffmpeg'); +ffmpeg.setFfmpegPath(ffmpegpath); let db = require('../db'); let fs = require('fs'); @@ -14,6 +17,7 @@ const storage = multer.diskStorage({ cb(null, 'uploads/') }, filename : function(req, file, cb) { + console.log(file) let nameAndExtension = extension(file.originalname); db.all('SELECT * FROM media WHERE path = ?', [nameAndExtension[0] + nameAndExtension[1]], function (err, exists) { if (exists.length != 0) { @@ -73,6 +77,9 @@ function fetchMedia(req, res, next) { }); } + +//middleware +//Checks ShareX key function checkAuth(req, res, next) { let auth = process.env.EBAPI_KEY || process.env.EBPASS || 'pleaseSetAPI_KEY'; let key = null; @@ -93,6 +100,48 @@ function checkAuth(req, res, next) { next(); } +//Converts mp4 to gif and vice versa with ffmpeg +function convert(req, res, next) { + for (file in req.files) { + let nameAndExtension = extension(req.files[file].path); + if (nameAndExtension[1] == '.mp4') { + console.log('Converting ' + nameAndExtension[0] + nameAndExtension[1] + ' to gif'); + console.log(req.files[file].path); + ffmpeg() + .input(req.files[file].path) + .inputFormat('mp4') + .outputFormat('gif') + .output(nameAndExtension[0] + '.gif') + .on('end', function() { + console.log('Conversion complete'); + 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(req.files[file].path) + .inputFormat('gif') + .outputFormat('mp4') + .outputOptions([ + '-pix_fmt yuv420p', + '-c:v libx264', + '-movflags +faststart', + "filter:v crop='floor(in_w/2)*2:floor(in_h/2)*2'" + ]) + .noAudio() + .output(nameAndExtension[0] + '.mp4') + .on('end', function() { + console.log('Conversion complete'); + console.log('Uploaded to uploads/' + nameAndExtension[0] + '.mp4'); + }) + .run(); + } + } + + next(); +}; + let router = express.Router(); router.get('/', function (req, res, next) { @@ -105,10 +154,10 @@ router.get('/', function (req, res, next) { router.get('/gifv/:file', function (req, res, next) { let url = req.protocol + '://' + req.get('host') + '/uploads/' + req.params.file; - return res.render('gifv', { url: url }); + return res.render('gifv', { url: url, host: req.protocol + '://' + req.get('host') }); }); -router.post('/', upload.array('fileupload'), function(req, res, next) { +router.post('/', [upload.array('fileupload'), convert], function(req, res, next) { if (!req.files || Object.keys(req.files).length === 0) { console.log(req) return res.status(400).send('No files were uploaded.'); diff --git a/views/gifv.ejs b/views/gifv.ejs index da0cca9..0c975a4 100644 --- a/views/gifv.ejs +++ b/views/gifv.ejs @@ -1,18 +1,28 @@ +<% +function extension(str){ + let file = str.split('/').pop(); + return [file.substr(0,file.lastIndexOf('.')),file.substr(file.lastIndexOf('.'),file.length).toLowerCase()] +} +%> + - - - - - - - + + + + + + + + + + - + From ffef2ecddfb03ce17996620813e3a72d19e43cd1 Mon Sep 17 00:00:00 2001 From: anarch3 Date: Fri, 18 Nov 2022 21:00:38 -0500 Subject: [PATCH 04/14] more tags, ffprobe --- app.js | 1 + package-lock.json | 181 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + routes/index.js | 32 +++++++- views/gifv.ejs | 12 ++- 5 files changed, 221 insertions(+), 6 deletions(-) diff --git a/app.js b/app.js index 2586852..7dd859a 100644 --- a/app.js +++ b/app.js @@ -13,6 +13,7 @@ let indexRouter = require('./routes/index'); let authRouter = require('./routes/auth'); let app = express(); +app.enable('trust proxy'); // view engine setup app.set('views', path.join(__dirname, 'views')); diff --git a/package-lock.json b/package-lock.json index cae7f95..a36f34f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "Unlicense", "dependencies": { "@ffmpeg-installer/ffmpeg": "^1.1.0", + "@ffprobe-installer/ffprobe": "^1.4.1", "connect-sqlite3": "^0.9.13", "cookie-parser": "~1.4.4", "dotenv": "^8.6.0", @@ -142,6 +143,123 @@ "win32" ] }, + "node_modules/@ffprobe-installer/darwin-arm64": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/darwin-arm64/-/darwin-arm64-5.0.1.tgz", + "integrity": "sha512-vwNCNjokH8hfkbl6m95zICHwkSzhEvDC3GVBcUp5HX8+4wsX10SP3B+bGur7XUzTIZ4cQpgJmEIAx6TUwRepMg==", + "cpu": [ + "arm64" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@ffprobe-installer/darwin-x64": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/darwin-x64/-/darwin-x64-5.0.0.tgz", + "integrity": "sha512-Zl0UkZ+wW/eyMKBPLTUCcNQch2VDnZz/cBn1DXv3YtCBVbYd9aYzGj4MImdxgWcoE0+GpbfbO6mKGwMq5HCm6A==", + "cpu": [ + "x64" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@ffprobe-installer/ffprobe": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/ffprobe/-/ffprobe-1.4.1.tgz", + "integrity": "sha512-3WJvxU0f4d7IOZdzoVCAj9fYtiQNC6E0521FJFe9iP5Ej8auTXU7TsrUzIAG1CydeQI+BnM3vGog92SCcF9KtA==", + "optionalDependencies": { + "@ffprobe-installer/darwin-arm64": "5.0.1", + "@ffprobe-installer/darwin-x64": "5.0.0", + "@ffprobe-installer/linux-arm": "5.0.0", + "@ffprobe-installer/linux-arm64": "5.0.0", + "@ffprobe-installer/linux-ia32": "5.0.0", + "@ffprobe-installer/linux-x64": "5.0.0", + "@ffprobe-installer/win32-ia32": "5.0.0", + "@ffprobe-installer/win32-x64": "5.0.0" + } + }, + "node_modules/@ffprobe-installer/linux-arm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/linux-arm/-/linux-arm-5.0.0.tgz", + "integrity": "sha512-mM1PPxP2UX5SUvhy0urcj5U8UolwbYgmnXA/eBWbW78k6N2Wk1COvcHYzOPs6c5yXXL6oshS2rZHU1kowigw7g==", + "cpu": [ + "arm" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ffprobe-installer/linux-arm64": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/linux-arm64/-/linux-arm64-5.0.0.tgz", + "integrity": "sha512-IwFbzhe1UydR849YXLPP0RMpHgHXSuPO1kznaCHcU5FscFBV5gOZLkdD8e/xrcC8g/nhKqy0xMjn5kv6KkFQlQ==", + "cpu": [ + "arm64" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ffprobe-installer/linux-ia32": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/linux-ia32/-/linux-ia32-5.0.0.tgz", + "integrity": "sha512-c3bWlWEDMST59SAZycVh0oyc2eNS/CxxeRjoNryGRgqcZX3EJWJJQL1rAXbpQOMLMi8to1RqnmMuwPJgLLjjUA==", + "cpu": [ + "ia32" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ffprobe-installer/linux-x64": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/linux-x64/-/linux-x64-5.0.0.tgz", + "integrity": "sha512-zgLnWJFvMGCaw1txGtz84sMEQt6mQUzdw86ih9S/kZOWnp06Gj/ams/EXxEkAxgAACCVM6/O0mkDe/6biY5tgA==", + "cpu": [ + "x64" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ffprobe-installer/win32-ia32": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/win32-ia32/-/win32-ia32-5.0.0.tgz", + "integrity": "sha512-NnDdAZD6ShFXzJeCkAFl2ZjAv7GcJWYudLA+0T/vjZwvskBop+sq1PGfdmVltfFDcdQiomoThRhn9Xiy9ZC71g==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@ffprobe-installer/win32-x64": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/win32-x64/-/win32-x64-5.0.0.tgz", + "integrity": "sha512-P4ZMRFxVMnfMsOyTfBM/+nkTodLeOUfXNPo+X1bKEWBiZxRErqX/IHS5sLA0yAH8XmtKZcL7Cu6M26ztGcQYxw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -2256,6 +2374,69 @@ "integrity": "sha512-Drt5u2vzDnIONf4ZEkKtFlbvwj6rI3kxw1Ck9fpudmtgaZIHD4ucsWB2lCZBXRxJgXR+2IMSti+4rtM4C4rXgg==", "optional": true }, + "@ffprobe-installer/darwin-arm64": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/darwin-arm64/-/darwin-arm64-5.0.1.tgz", + "integrity": "sha512-vwNCNjokH8hfkbl6m95zICHwkSzhEvDC3GVBcUp5HX8+4wsX10SP3B+bGur7XUzTIZ4cQpgJmEIAx6TUwRepMg==", + "optional": true + }, + "@ffprobe-installer/darwin-x64": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/darwin-x64/-/darwin-x64-5.0.0.tgz", + "integrity": "sha512-Zl0UkZ+wW/eyMKBPLTUCcNQch2VDnZz/cBn1DXv3YtCBVbYd9aYzGj4MImdxgWcoE0+GpbfbO6mKGwMq5HCm6A==", + "optional": true + }, + "@ffprobe-installer/ffprobe": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/ffprobe/-/ffprobe-1.4.1.tgz", + "integrity": "sha512-3WJvxU0f4d7IOZdzoVCAj9fYtiQNC6E0521FJFe9iP5Ej8auTXU7TsrUzIAG1CydeQI+BnM3vGog92SCcF9KtA==", + "requires": { + "@ffprobe-installer/darwin-arm64": "5.0.1", + "@ffprobe-installer/darwin-x64": "5.0.0", + "@ffprobe-installer/linux-arm": "5.0.0", + "@ffprobe-installer/linux-arm64": "5.0.0", + "@ffprobe-installer/linux-ia32": "5.0.0", + "@ffprobe-installer/linux-x64": "5.0.0", + "@ffprobe-installer/win32-ia32": "5.0.0", + "@ffprobe-installer/win32-x64": "5.0.0" + } + }, + "@ffprobe-installer/linux-arm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/linux-arm/-/linux-arm-5.0.0.tgz", + "integrity": "sha512-mM1PPxP2UX5SUvhy0urcj5U8UolwbYgmnXA/eBWbW78k6N2Wk1COvcHYzOPs6c5yXXL6oshS2rZHU1kowigw7g==", + "optional": true + }, + "@ffprobe-installer/linux-arm64": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/linux-arm64/-/linux-arm64-5.0.0.tgz", + "integrity": "sha512-IwFbzhe1UydR849YXLPP0RMpHgHXSuPO1kznaCHcU5FscFBV5gOZLkdD8e/xrcC8g/nhKqy0xMjn5kv6KkFQlQ==", + "optional": true + }, + "@ffprobe-installer/linux-ia32": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/linux-ia32/-/linux-ia32-5.0.0.tgz", + "integrity": "sha512-c3bWlWEDMST59SAZycVh0oyc2eNS/CxxeRjoNryGRgqcZX3EJWJJQL1rAXbpQOMLMi8to1RqnmMuwPJgLLjjUA==", + "optional": true + }, + "@ffprobe-installer/linux-x64": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/linux-x64/-/linux-x64-5.0.0.tgz", + "integrity": "sha512-zgLnWJFvMGCaw1txGtz84sMEQt6mQUzdw86ih9S/kZOWnp06Gj/ams/EXxEkAxgAACCVM6/O0mkDe/6biY5tgA==", + "optional": true + }, + "@ffprobe-installer/win32-ia32": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/win32-ia32/-/win32-ia32-5.0.0.tgz", + "integrity": "sha512-NnDdAZD6ShFXzJeCkAFl2ZjAv7GcJWYudLA+0T/vjZwvskBop+sq1PGfdmVltfFDcdQiomoThRhn9Xiy9ZC71g==", + "optional": true + }, + "@ffprobe-installer/win32-x64": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@ffprobe-installer/win32-x64/-/win32-x64-5.0.0.tgz", + "integrity": "sha512-P4ZMRFxVMnfMsOyTfBM/+nkTodLeOUfXNPo+X1bKEWBiZxRErqX/IHS5sLA0yAH8XmtKZcL7Cu6M26ztGcQYxw==", + "optional": true + }, "@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", diff --git a/package.json b/package.json index 71c5ed5..462e388 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ }, "dependencies": { "@ffmpeg-installer/ffmpeg": "^1.1.0", + "@ffprobe-installer/ffprobe": "^1.4.1", "connect-sqlite3": "^0.9.13", "cookie-parser": "~1.4.4", "dotenv": "^8.6.0", diff --git a/routes/index.js b/routes/index.js index f09b52a..7083487 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,8 +1,10 @@ let express = require('express'); let multer = require('multer'); let ffmpegpath = require('@ffmpeg-installer/ffmpeg').path; +let ffprobepath = require('@ffprobe-installer/ffprobe').path; let ffmpeg = require('fluent-ffmpeg'); ffmpeg.setFfmpegPath(ffmpegpath); +ffmpeg.setFfprobePath(ffprobepath); let db = require('../db'); let fs = require('fs'); @@ -126,8 +128,7 @@ function convert(req, res, next) { .outputOptions([ '-pix_fmt yuv420p', '-c:v libx264', - '-movflags +faststart', - "filter:v crop='floor(in_w/2)*2:floor(in_h/2)*2'" + '-movflags +faststart' ]) .noAudio() .output(nameAndExtension[0] + '.mp4') @@ -154,7 +155,32 @@ router.get('/', function (req, res, next) { router.get('/gifv/:file', function (req, res, next) { let url = req.protocol + '://' + req.get('host') + '/uploads/' + req.params.file; - return res.render('gifv', { url: url, host: req.protocol + '://' + req.get('host') }); + let width; let height; + + nameAndExtension = extension('uploads/' + req.params.file); + if (nameAndExtension[1] == '.mp4') { + ffmpeg() + .input('uploads/' + req.params.file) + .inputFormat('mp4') + .ffprobe(function(err, data) { + 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 }); + }); + } else if (nameAndExtension[1] == '.gif') { + ffmpeg() + .input('uploads/' + req.params.file) + .inputFormat('gif') + .ffprobe(function(err, data) { + 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 }); + }); + } }); router.post('/', [upload.array('fileupload'), convert], function(req, res, next) { diff --git a/views/gifv.ejs b/views/gifv.ejs index 0c975a4..46ee920 100644 --- a/views/gifv.ejs +++ b/views/gifv.ejs @@ -10,17 +10,23 @@ function extension(str){ + + + + + + + + + - From c95ac3d17e405db44bc8e7178b676adb90f83e62 Mon Sep 17 00:00:00 2001 From: anarch3 Date: Fri, 18 Nov 2022 21:33:58 -0500 Subject: [PATCH 05/14] fix variable names --- routes/index.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/routes/index.js b/routes/index.js index 7083487..628373f 100644 --- a/routes/index.js +++ b/routes/index.js @@ -19,7 +19,6 @@ const storage = multer.diskStorage({ cb(null, 'uploads/') }, filename : function(req, file, cb) { - console.log(file) let nameAndExtension = extension(file.originalname); db.all('SELECT * FROM media WHERE path = ?', [nameAndExtension[0] + nameAndExtension[1]], function (err, exists) { if (exists.length != 0) { @@ -105,15 +104,15 @@ function checkAuth(req, res, next) { //Converts mp4 to gif and vice versa with ffmpeg function convert(req, res, next) { for (file in req.files) { - let nameAndExtension = extension(req.files[file].path); + let nameAndExtension = extension(req.files[file].originalname); if (nameAndExtension[1] == '.mp4') { console.log('Converting ' + nameAndExtension[0] + nameAndExtension[1] + ' to gif'); - console.log(req.files[file].path); + console.log(nameAndExtension[0] + nameAndExtension[1]); ffmpeg() - .input(req.files[file].path) + .input('uploads/' + req.files[file].originalname) .inputFormat('mp4') .outputFormat('gif') - .output(nameAndExtension[0] + '.gif') + .output('uploads/' + nameAndExtension[0] + '.gif') .on('end', function() { console.log('Conversion complete'); console.log('Uploaded to uploads/' + nameAndExtension[0] + '.gif'); @@ -122,7 +121,7 @@ function convert(req, res, next) { .run(); } else if (nameAndExtension[1] == '.gif') { console.log('Converting ' + nameAndExtension[0] + nameAndExtension[1] + ' to mp4'); - ffmpeg(req.files[file].path) + ffmpeg(req.files[file].originalname) .inputFormat('gif') .outputFormat('mp4') .outputOptions([ @@ -131,7 +130,7 @@ function convert(req, res, next) { '-movflags +faststart' ]) .noAudio() - .output(nameAndExtension[0] + '.mp4') + .output('uploads/' + nameAndExtension[0] + '.mp4') .on('end', function() { console.log('Conversion complete'); console.log('Uploaded to uploads/' + nameAndExtension[0] + '.mp4'); From e9fa87335572ac837b3b6c1887c16e41a5d17393 Mon Sep 17 00:00:00 2001 From: anarch3 Date: Fri, 18 Nov 2022 21:56:49 -0500 Subject: [PATCH 06/14] rearrange meta tages --- views/gifv.ejs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/views/gifv.ejs b/views/gifv.ejs index 46ee920..a2a1bc6 100644 --- a/views/gifv.ejs +++ b/views/gifv.ejs @@ -9,24 +9,23 @@ function extension(str){ + - - + - + + - - - + - - + + From 6d6a5127486632f4a5d845614239976320c9bef4 Mon Sep 17 00:00:00 2001 From: anarch3 Date: Fri, 18 Nov 2022 22:05:41 -0500 Subject: [PATCH 07/14] rearrange meta tages2 --- views/gifv.ejs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/views/gifv.ejs b/views/gifv.ejs index a2a1bc6..63d52b9 100644 --- a/views/gifv.ejs +++ b/views/gifv.ejs @@ -8,20 +8,21 @@ function extension(str){ + + + + + + + + + - - - - - - - - From 84a29252d19b7096750f7b23517e733962a85d96 Mon Sep 17 00:00:00 2001 From: anarch3 Date: Fri, 18 Nov 2022 22:13:10 -0500 Subject: [PATCH 08/14] fix gif --- routes/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/index.js b/routes/index.js index 628373f..ca58de6 100644 --- a/routes/index.js +++ b/routes/index.js @@ -121,7 +121,7 @@ function convert(req, res, next) { .run(); } else if (nameAndExtension[1] == '.gif') { console.log('Converting ' + nameAndExtension[0] + nameAndExtension[1] + ' to mp4'); - ffmpeg(req.files[file].originalname) + ffmpeg('uploads/' + req.files[file].originalname) .inputFormat('gif') .outputFormat('mp4') .outputOptions([ From 03cd2e4d557c5f0b1e23e4ad46b5e1843db03a2b Mon Sep 17 00:00:00 2001 From: anarch3 Date: Fri, 18 Nov 2022 23:07:02 -0500 Subject: [PATCH 09/14] add oembed --- routes/index.js | 16 ++++++++++++++++ views/gifv.ejs | 3 ++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/routes/index.js b/routes/index.js index ca58de6..7338627 100644 --- a/routes/index.js +++ b/routes/index.js @@ -105,6 +105,22 @@ function checkAuth(req, res, next) { function convert(req, res, next) { for (file in req.files) { let nameAndExtension = extension(req.files[file].originalname); + let oembed = { + type: "video", + version: "1.0", + provider_name: "embedder", + provider_url: "https://github.com/WaveringAna/embedder", + cache_age: 86400, + html: "", + width: 640, + height: 360 + }; + + fs.writeFile('uploads/oembed-' + req.files[file].filename + '.json', JSON.stringify(oembed), function (err) { + if (err) return next(err); + console.log('oembed file created ' + req.files[file].filename + '.json'); + }); + if (nameAndExtension[1] == '.mp4') { console.log('Converting ' + nameAndExtension[0] + nameAndExtension[1] + ' to gif'); console.log(nameAndExtension[0] + nameAndExtension[1]); diff --git a/views/gifv.ejs b/views/gifv.ejs index 63d52b9..2d4cb64 100644 --- a/views/gifv.ejs +++ b/views/gifv.ejs @@ -13,8 +13,9 @@ function extension(str){ - + + From e58f441788d1f54479869921f11afca38eddbe64 Mon Sep 17 00:00:00 2001 From: anarch3 Date: Fri, 18 Nov 2022 23:26:14 -0500 Subject: [PATCH 10/14] update oembed --- routes/index.js | 2 +- views/gifv.ejs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/routes/index.js b/routes/index.js index 7338627..d887728 100644 --- a/routes/index.js +++ b/routes/index.js @@ -111,7 +111,7 @@ function convert(req, res, next) { provider_name: "embedder", provider_url: "https://github.com/WaveringAna/embedder", cache_age: 86400, - html: "", + html: "", width: 640, height: 360 }; diff --git a/views/gifv.ejs b/views/gifv.ejs index 2d4cb64..1108504 100644 --- a/views/gifv.ejs +++ b/views/gifv.ejs @@ -15,7 +15,7 @@ function extension(str){ - + From bdee471b91efa1b9988ef881f5ea6cb265b3d8c0 Mon Sep 17 00:00:00 2001 From: anarch3 Date: Fri, 18 Nov 2022 23:35:56 -0500 Subject: [PATCH 11/14] typo fix --- routes/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routes/index.js b/routes/index.js index d887728..ff8e951 100644 --- a/routes/index.js +++ b/routes/index.js @@ -116,9 +116,9 @@ function convert(req, res, next) { height: 360 }; - fs.writeFile('uploads/oembed-' + req.files[file].filename + '.json', JSON.stringify(oembed), function (err) { + fs.writeFile('uploads/oembed-' + nameAndExtension[0] + '.json', JSON.stringify(oembed), function (err) { if (err) return next(err); - console.log('oembed file created ' + req.files[file].filename + '.json'); + console.log('oembed file created ' + nameAndExtension[0] + '.json'); }); if (nameAndExtension[1] == '.mp4') { From 7aeccd5151a5be8f9e91efb6433d9663fe579044 Mon Sep 17 00:00:00 2001 From: anarch3 Date: Fri, 18 Nov 2022 23:51:54 -0500 Subject: [PATCH 12/14] .gifv overlay for gif --- views/index.ejs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/views/index.ejs b/views/index.ejs index a6b384d..1cf135e 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -56,13 +56,21 @@ return string.slice((string.lastIndexOf(".") - 2 >>> 0) + 2); +
+ <% } else if (extension(file.path) == ".gif") { %> +
+ + +
<% } else if (extension(file.path) == ".jpg" || extension(file.path) == ".jpeg" || extension(file.path) == ".png" || extension(file.path) == ".gif" || extension(file.path) == ".webp" ) { %> - <% } else {%> -
-

<%=extension(file.path)%> file

-
- <% } %> + <% } else {%> +
+

<%=extension(file.path)%> file

+
+ <% } %>
From eb139c3b52fd1298a7a57e735c0c6236f0e15b8f Mon Sep 17 00:00:00 2001 From: anarch3 Date: Sat, 19 Nov 2022 00:05:49 -0500 Subject: [PATCH 13/14] final meta tag --- views/gifv.ejs | 1 + 1 file changed, 1 insertion(+) diff --git a/views/gifv.ejs b/views/gifv.ejs index 1108504..b323fb6 100644 --- a/views/gifv.ejs +++ b/views/gifv.ejs @@ -16,6 +16,7 @@ function extension(str){ + From da127b3118cc4a426cab1c67e86eb1010db9085e Mon Sep 17 00:00:00 2001 From: anarch3 Date: Sat, 19 Nov 2022 00:14:55 -0500 Subject: [PATCH 14/14] fix title --- views/gifv.ejs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/gifv.ejs b/views/gifv.ejs index b323fb6..612ff9d 100644 --- a/views/gifv.ejs +++ b/views/gifv.ejs @@ -16,7 +16,7 @@ function extension(str){ - +