From 3ed7b0b5c7ebd2b727d8e6fc2f760ca9a6f4c863 Mon Sep 17 00:00:00 2001 From: waveringana Date: Wed, 29 Nov 2023 00:30:15 -0500 Subject: [PATCH] htmx is so cool --- app/lib/db.ts | 120 +++++++++-------- app/lib/ffmpeg.ts | 50 ++++--- app/lib/lib.ts | 11 ++ app/lib/middleware.ts | 53 +++++--- app/public/css/app.css | 54 ++++++++ app/public/js/index.js | 220 ++++++++++++++++++++++++------- app/routes/index.ts | 82 ++++++++---- app/views/index.ejs | 158 ++++++++++++---------- app/views/partials/_fileList.ejs | 197 +++++++-------------------- bun.lockb | Bin 0 -> 170718 bytes docker/bun-Dockerfile | 12 ++ 11 files changed, 557 insertions(+), 400 deletions(-) create mode 100755 bun.lockb create mode 100644 docker/bun-Dockerfile diff --git a/app/lib/db.ts b/app/lib/db.ts index adc4ff9..42da724 100644 --- a/app/lib/db.ts +++ b/app/lib/db.ts @@ -8,62 +8,74 @@ mkdirp.sync("./var/db"); export const db = new sqlite3.Database("./var/db/media.db"); /**Create the database schema for the embedders app*/ -export function createDatabase(version: number){ +export function createDatabase(version: number) { console.log("Creating database"); - db.run("CREATE TABLE IF NOT EXISTS users ( \ + db.run( + "CREATE TABLE IF NOT EXISTS users ( \ id INTEGER PRIMARY KEY, \ username TEXT UNIQUE, \ hashed_password BLOB, \ expire INTEGER, \ salt BLOB \ - )", () => createUser("admin", process.env.EBPASS || "changeme")); + )", + () => createUser("admin", process.env.EBPASS || "changeme") + ); - db.run("CREATE TABLE IF NOT EXISTS media ( \ + db.run( + "CREATE TABLE IF NOT EXISTS media ( \ id INTEGER PRIMARY KEY, \ path TEXT NOT NULL, \ expire INTEGER, \ username TEXT \ - )"); + )" + ); db.run(`PRAGMA user_version = ${version}`); } /**Updates old Database schema to new */ -export function updateDatabase(oldVersion: number, newVersion: number){ +export function updateDatabase(oldVersion: number, newVersion: number) { if (oldVersion == 1) { console.log(`Updating database from ${oldVersion} to ${newVersion}`); db.run("PRAGMA user_version = 2", (err) => { - if(err) return; + if (err) return; }); db.run("ALTER TABLE media ADD COLUMN username TEXT", (err) => { - if(err) return; + if (err) return; }); - + db.run("ALTER TABLE users ADD COLUMN expire TEXT", (err) => { - if(err) return; + if (err) return; }); } } /**Inserts into the media table */ -export function insertToDB (filename: string, expireDate: Date, username: string) { - const params: MediaParams = [ - filename, - expireDate, - username - ]; - - db.run("INSERT INTO media (path, expire, username) VALUES (?, ?, ?)", params, function (err) { - if (err) { - console.log(err); - return err; - } - console.log(`Uploaded ${filename} to database`); - if (expireDate == null) - console.log("It will not expire"); - else if (expireDate != null || expireDate != undefined) - console.log(`It will expire on ${expireDate}`); +export function insertToDB( + filename: string, + expireDate: Date, + username: string +): Promise { + return new Promise((resolve, reject) => { + const params: MediaParams = [filename, expireDate, username]; + + db.run( + "INSERT INTO media (path, expire, username) VALUES (?, ?, ?)", + params, + function (err) { + if (err) { + console.log(err); + reject(err); + } else { + console.log(`Uploaded ${filename} to database`); + if (expireDate == null) console.log("It will not expire"); + else if (expireDate != null || expireDate != undefined) + console.log(`It will expire on ${expireDate}`); + resolve(); + } + } + ); }); } @@ -74,7 +86,7 @@ export function searchImages(imagename: string, partial: boolean) { }); } -export function updateImageName(oldimagename: string, newname:string) { +export function updateImageName(oldimagename: string, newname: string) { return new Promise((resolve, reject) => { console.log(`updating ${oldimagename} to ${newname}`); }); @@ -85,12 +97,11 @@ export function createUser(username: string, password: string) { return new Promise((resolve, reject) => { console.log(`Creating user ${username}`); const salt = crypto.randomBytes(16); - - db.run("INSERT OR IGNORE INTO users (username, hashed_password, salt) VALUES (?, ?, ?)", [ - username, - crypto.pbkdf2Sync(password, salt, 310000, 32, "sha256"), - salt - ]); + + db.run( + "INSERT OR IGNORE INTO users (username, hashed_password, salt) VALUES (?, ?, ?)", + [username, crypto.pbkdf2Sync(password, salt, 310000, 32, "sha256"), salt] + ); resolve(null); }); @@ -102,7 +113,9 @@ export function getPath(id: number | string) { const query = "SELECT path FROM media WHERE id = ?"; db.get(query, [id], (err: Error, path: object) => { - if (err) {reject(err);} + if (err) { + reject(err); + } resolve(path); }); }); @@ -114,14 +127,17 @@ export function deleteId(database: string, id: number | string) { const query = `DELETE FROM ${database} WHERE id = ?`; db.run(query, [id], (err: Error) => { - if (err) {reject(err); return;} + if (err) { + reject(err); + return; + } resolve(null); }); }); } /**Expires a database row given a Date in unix time */ -export function expire(database: string, column: string, expiration:number) { +export function expire(database: string, column: string, expiration: number) { return new Promise((resolve, reject) => { const query = `SELECT * FROM ${database} WHERE ${column} < ?`; @@ -136,30 +152,26 @@ export function expire(database: string, column: string, expiration:number) { /**A generic database row */ export interface GenericRow { - id? : number | string, - username?: string - expire? :Date + id?: number | string; + username?: string; + expire?: Date; } /**A row for the media database */ export interface MediaRow { - id? : number | string, - path: string, - expire: Date, - username?: string + id?: number | string; + path: string; + expire: Date; + username?: string; } /**Params type for doing work with media database */ -export type MediaParams = [ - path: string, - expire: Date, - username?: string -] +export type MediaParams = [path: string, expire: Date, username?: string]; /**A row for the user database */ export interface UserRow { - id? : number | string, - username: string, - hashed_password: any, - salt: any -} \ No newline at end of file + id?: number | string; + username: string; + hashed_password: any; + salt: any; +} diff --git a/app/lib/ffmpeg.ts b/app/lib/ffmpeg.ts index 45d70ae..0f3a938 100644 --- a/app/lib/ffmpeg.ts +++ b/app/lib/ffmpeg.ts @@ -54,8 +54,8 @@ export const setEncodingType = (type: EncodingType) => { const getExecutablePath = ( envVar: string, executable: string, - installer: { path: string } -) => { + installer: { path: string }, +): string => { if (process.env[envVar]) { return process.env[envVar]; } @@ -70,12 +70,13 @@ const getExecutablePath = ( const ffmpegPath = getExecutablePath( "EB_FFMPEG_PATH", "ffmpeg", - ffmpegInstaller + ffmpegInstaller, ); + const ffprobePath = getExecutablePath( "EB_FFPROBE_PATH", "ffprobe", - ffprobeInstaller + ffprobeInstaller, ); console.log(`Using ffmpeg from path: ${ffmpegPath}`); @@ -89,14 +90,14 @@ const checkEnvForEncoder = () => { if (envEncoder && Object.keys(EncodingType).includes(envEncoder)) { setEncodingType( - EncodingType[envEncoder as keyof typeof EncodingType] as EncodingType + EncodingType[envEncoder as keyof typeof EncodingType] as EncodingType, ); console.log( - `Setting encoding type to ${envEncoder} based on environment variable.` + `Setting encoding type to ${envEncoder} based on environment variable.`, ); } else if (envEncoder) { console.warn( - `Invalid encoder value "${envEncoder}" in environment variable, defaulting to CPU.` + `Invalid encoder value "${envEncoder}" in environment variable, defaulting to CPU.`, ); } }; @@ -121,7 +122,7 @@ checkEnvForEncoder(); export const ffmpegDownscale = ( path: string, filename: string, - extension: string + extension: string, ) => { const startTime = Date.now(); const outputOptions = [ @@ -136,32 +137,31 @@ export const ffmpegDownscale = ( ]; return new Promise((resolve, reject) => { + const progressFile = `uploads/${filename}${extension}-progress.json`; + ffmpeg() .input(path) .outputOptions(outputOptions) .output(`uploads/720p-${filename}${extension}`) - .on("start", () => { - // Create the .processing file - fs.closeSync( - fs.openSync(`uploads/720p-${filename}${extension}.processing`, "w") - ); + .on("progress", function(progress) { + fs.writeFileSync(progressFile, JSON.stringify({ progress: progress.percent / 100 })); }) .on("end", () => { console.log( `720p copy complete using ${currentEncoding}, took ${ Date.now() - startTime - }ms to complete` + }ms to complete`, ); // Delete the .processing file - fs.unlinkSync(`uploads/720p-${filename}${extension}.processing`); + fs.unlinkSync(progressFile); resolve(); }) .on("error", (e) => { // Ensure to delete the .processing file even on error - if (fs.existsSync(`uploads/720p-${filename}${extension}.processing`)) { - fs.unlinkSync(`uploads/720p-${filename}${extension}.processing`); + if (fs.existsSync(progressFile)) { + fs.unlinkSync(progressFile); } reject(new Error(e)); @@ -188,7 +188,7 @@ export const ffmpegDownscale = ( export const ffmpegConvert = ( path: string, filename: string, - extension: string + extension: string, ) => { const startTime = Date.now(); const outputOptions = [ @@ -217,15 +217,20 @@ export const ffmpegConvert = ( } return new Promise((resolve, reject) => { + const progressFile = `uploads/${filename}${extension}-progress.json`; + ffmpeg() .input(path) .outputOptions(outputOptions) .output("uploads/") .outputFormat(outputFormat) .output(`uploads/${filename}${outputFormat}`) + .on("progress", function(progress) { + fs.writeFileSync(progressFile, JSON.stringify({ progress: progress.percent / 100 })); + }) .on("end", function () { console.log( - `Conversion complete, took ${Date.now() - startTime} to complete` + `Conversion complete, took ${Date.now() - startTime} to complete`, ); console.log(`uploads/${filename}${outputFormat}`); resolve(); @@ -238,9 +243,14 @@ export const ffmpegConvert = ( export const ffProbe = async ( path: string, filename: string, - extension: string + extension: string, ) => { return new Promise((resolve, reject) => { + if (!videoExtensions.includes(extension) && !imageExtensions.includes(extension)) { + console.log(`Extension is ${extension}`); + reject(`Submitted file is neither a video nor an image: ${path}`); + } + ffprobe(path, (err, data) => { if (err) reject(err); resolve(data); diff --git a/app/lib/lib.ts b/app/lib/lib.ts index 6dfafb5..74576ce 100644 --- a/app/lib/lib.ts +++ b/app/lib/lib.ts @@ -25,6 +25,17 @@ export interface User { salt?: any; } +export interface oembedObj { + type: string; + version: string; + provider_name: string; + provider_url: string; + cache_age: number; + html: string; + width?: number; + height?: number; +} + export const videoExtensions = [ ".mp4", ".mov", diff --git a/app/lib/middleware.ts b/app/lib/middleware.ts index 49ac254..b2805b2 100644 --- a/app/lib/middleware.ts +++ b/app/lib/middleware.ts @@ -3,7 +3,7 @@ import type { RequestHandler as Middleware, NextFunction } from "express"; import fs from "fs"; import process from "process"; -import { extension, videoExtensions, imageExtensions } from "./lib"; +import { extension, videoExtensions, imageExtensions, oembedObj } from "./lib"; import { insertToDB } from "./db"; import { ffmpegDownscale, ffProbe } from "./ffmpeg"; import { ffprobe } from "fluent-ffmpeg"; @@ -50,15 +50,9 @@ export const createEmbedData: Middleware = async (req, res, next) => { const files = req.files as Express.Multer.File[]; for (const file in files) { const nameAndExtension = extension(files[file].originalname); - const ffProbeData = await ffProbe( - `uploads/${files[file].originalname}`, - nameAndExtension[0], - nameAndExtension[1], - ); - const width = ffProbeData.streams[0].width; - const height = ffProbeData.streams[0].height; + const isMedia = videoExtensions.includes(nameAndExtension[1]) || imageExtensions.includes(nameAndExtension[1]); - const oembed = { + const oembed: oembedObj = { type: "video", version: "1.0", provider_name: "embedder", @@ -66,11 +60,24 @@ export const createEmbedData: Middleware = async (req, res, next) => { cache_age: 86400, html: ``, - width: width, - height: height, + }${nameAndExtension[1]}'>` }; + if (isMedia) { + let ffProbeData; + try { ffProbeData = await ffProbe( + `uploads/${files[file].originalname}`, + nameAndExtension[0], + nameAndExtension[1], + ); } catch (error) { + console.log(`Error: ${error}`); + console.log(nameAndExtension[1]); + } + + oembed.width = ffProbeData.streams[0].width; + oembed.height = ffProbeData.streams[0].height; + } + fs.writeFile( `uploads/oembed-${nameAndExtension[0]}${nameAndExtension[1]}.json`, JSON.stringify(oembed), @@ -121,23 +128,27 @@ export const convertTo720p: Middleware = (req, res, next) => { }; /**Middleware for handling uploaded files. Inserts it into the database */ -export const handleUpload: Middleware = (req, res, next) => { +export const handleUpload: Middleware = async (req, res, next) => { if (!req.file && !req.files) { console.log("No files were uploaded"); return res.status(400).send("No files were uploaded."); } - const files = req.files ? (req.files as Express.Multer.File[]) : req.file; //Check if a single file was uploaded or multiple - const username = req.user ? req.user.username : "sharex"; //if no username was provided, we can presume that it is sharex + const files = req.files ? (req.files as Express.Multer.File[]) : req.file; + const username = req.user ? req.user.username : "sharex"; const expireDate: Date = req.body.expire ? new Date(Date.now() + req.body.expire * 24 * 60 * 60 * 1000) : null; - if (files instanceof Array) { - for (const file in files) { - insertToDB(files[file].filename, expireDate, username); + try { + if (files instanceof Array) { + await Promise.all(files.map(file => insertToDB(file.filename, expireDate, username))); + } else { + await insertToDB(files.filename, expireDate, username); } - } else insertToDB(files.filename, expireDate, username); - - next(); + next(); + } catch (error) { + console.error("Error in handleUpload:", error); + res.status(500).send("Error processing files."); + } }; diff --git a/app/public/css/app.css b/app/public/css/app.css index 5a72026..da81a13 100644 --- a/app/public/css/app.css +++ b/app/public/css/app.css @@ -21,6 +21,60 @@ line-height: 40px; } +.spinner { + /* Positioning and Sizing */ + width: 100px; + height: 100px; + position: relative; + margin: 50px auto; + /* Centering the spinner */ + + /* Text Styling */ + color: #555; + text-align: center; + font-family: Arial, sans-serif; + font-size: 14px; + padding-top: 80px; + /* Adjust as needed for text position */ + + /* Adding a background to the spinner for better visibility */ + background-color: rgba(255, 255, 255, 0.8); + border-radius: 10px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + } + + /* Keyframes for the spinner animation */ + @keyframes spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } + } + + /* Spinner Animation */ + .spinner::before { + content: ''; + box-sizing: border-box; + position: absolute; + top: 50%; + left: 50%; + width: 40px; + /* Spinner Size */ + height: 40px; + margin-top: -20px; + /* Half of height */ + margin-left: -20px; + /* Half of width */ + border-radius: 50%; + border: 2px solid transparent; + border-top-color: #007bff; + /* Spinner Color */ + animation: spin 1s linear infinite; + } + #search { padding: 6px 12px; background: rgb(31, 32, 35); diff --git a/app/public/js/index.js b/app/public/js/index.js index c33ba4b..b64136d 100644 --- a/app/public/js/index.js +++ b/app/public/js/index.js @@ -1,59 +1,74 @@ +/* eslint-disable no-undef */ /* eslint-env browser: true */ +let files; + function copyURI(evt) { evt.preventDefault(); - navigator.clipboard.writeText(absolutePath(evt.target.getAttribute("src"))).then(() => { - /* clipboard successfully set */ - console.log("copied"); - }, () => { - /* clipboard write failed */ - console.log("failed"); - }); + navigator.clipboard + .writeText(absolutePath(evt.target.getAttribute("src"))) + .then( + () => { + /* clipboard successfully set */ + console.log("copied"); + }, + () => { + /* clipboard write failed */ + console.log("failed"); + } + ); } function copyA(evt) { evt.preventDefault(); - navigator.clipboard.writeText(absolutePath(evt.target.getAttribute("href"))).then(() => { - console.log("copied"); - }, () => { - console.log("failed"); - }); + 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"); - }, () => { - console.log("failed"); - }); + navigator.clipboard.writeText(absolutePath(evt)).then( + () => { + console.log("copied"); + }, + () => { + console.log("failed"); + } + ); } -function absolutePath (href) { +function absolutePath(href) { let link = document.createElement("a"); link.href = href; return link.href; } function extension(string) { - return string.slice((string.lastIndexOf(".") - 2 >>> 0) + 2); + return string.slice(((string.lastIndexOf(".") - 2) >>> 0) + 2); } let dropArea = document.getElementById("dropArea"); -["dragenter", "dragover", "dragleave", "drop"].forEach(eventName => { +["dragenter", "dragover", "dragleave", "drop"].forEach((eventName) => { dropArea.addEventListener(eventName, preventDefaults, false); }); -function preventDefaults (e) { +function preventDefaults(e) { e.preventDefault(); e.stopPropagation(); } -["dragenter", "dragover"].forEach(eventName => { +["dragenter", "dragover"].forEach((eventName) => { dropArea.addEventListener(eventName, highlight, false); -}) - -;["dragleave", "drop"].forEach(eventName => { +}); +["dragleave", "drop"].forEach((eventName) => { dropArea.addEventListener(eventName, unhighlight, false); }); @@ -100,16 +115,14 @@ function handleFiles(files) { files.forEach(previewFile); } - function previewFile(file) { let reader = new FileReader(); reader.readAsDataURL(file); - reader.onloadend = function() { + reader.onloadend = function () { let img = document.createElement("img"); img.src = reader.result; img.className = "image"; document.getElementById("gallery").appendChild(img); - console.log(document.getElementById("fileupload")); document.getElementById("fileupload").src = img.src; }; } @@ -118,15 +131,20 @@ function uploadFile(file) { let xhr = new XMLHttpRequest(); let formData = new FormData(); let reader = new FileReader(); - + xhr.open("POST", "/", true); - xhr.addEventListener("readystatechange", function(e) { - if (xhr.readyState == 4 && xhr.status == 200) { - location.reload(); - } - else if (xhr.readyState == 4 && xhr.status != 200) { - alert(`Upload failed, error code: ${xhr.status}`) + xhr.addEventListener("readystatechange", function (e) { + if (xhr.readyState == 4) { + if (xhr.status == 200) { + let response = xhr.responseText; + //document.getElementById("embedder-list").innerHTML = response; + htmx.ajax("GET", "/media-list", {target: "#embedder-list", swap: "innerHTML"}); + document.getElementById("gallery").innerHTML = ""; + htmx.process(document.body); + } else { + alert(`Upload failed, error code: ${xhr.status}`); + } } }); @@ -136,7 +154,6 @@ function uploadFile(file) { formData.append("fileupload", file); formData.append("expire", document.getElementById("expire").value); - console.log(formData); xhr.send(formData); } @@ -149,18 +166,27 @@ function openFullSize(imageUrl) { video.src = imageUrl; video.controls = true; - if (extension(imageUrl) == ".jpg" || extension(imageUrl) == ".png" || extension(imageUrl) == ".gif" || extension(imageUrl) == ".jpeg" || extension(imageUrl) == ".webp") { + if ( + extension(imageUrl) == ".jpg" || + extension(imageUrl) == ".png" || + extension(imageUrl) == ".gif" || + extension(imageUrl) == ".jpeg" || + extension(imageUrl) == ".webp" + ) { modal.appendChild(img); - } - else if (extension(imageUrl) == ".mp4" || extension(imageUrl) == ".webm" || extension(imageUrl) == ".mov") { + } else if ( + extension(imageUrl) == ".mp4" || + extension(imageUrl) == ".webm" || + extension(imageUrl) == ".mov" + ) { modal.appendChild(video); } - + // Add the modal to the page document.body.appendChild(modal); - + // Add an event listener to close the modal when the user clicks on it - modal.addEventListener("click", function() { + modal.addEventListener("click", function () { modal.remove(); }); } @@ -172,20 +198,112 @@ searchInput.addEventListener("input", () => { let mediaList = document.querySelectorAll("ul.embedder-list li"); mediaList.forEach((li) => { - if (!li.id.toLowerCase().includes(searchValue)) { //make lowercase to allow case insensitivity + if (!li.id.toLowerCase().includes(searchValue)) { + //make lowercase to allow case insensitivity li.classList.add("hide"); li.classList.remove("show"); - li.addEventListener("animationend", function() { - if (searchInput.value !== "") { - this.style.display = "none"; - } - }, {once: true}); // The {once: true} option automatically removes the event listener after it has been called + li.addEventListener( + "animationend", + function () { + if (searchInput.value !== "") { + this.style.display = "none"; + } + }, + { once: true } + ); // The {once: true} option automatically removes the event listener after it has been called } else { - li.style.display = ""; + li.style.display = ""; li.classList.remove("hide"); - if (searchValue === "" && !li.classList.contains("show")) { + if (searchValue === "" && !li.classList.contains("show")) { li.classList.add("show"); } } }); -}); \ No newline at end of file +}); + +function checkFileAvailability(filePath) { + const checkFile = () => { + console.log(`Checking if ${filePath} is processed...`); + fetch(`/uploads/${filePath}-progress.json`) + .then((response) => { + if (response.ok) { + console.log(`${filePath} still processing`); + return response.json(); + } else { + console.log(`${filePath} finished processing`); + console.log(`/uploads/720p-${filePath}-progress.json finished`); + clearInterval(interval); + createVideoElement(filePath); + return; + } + }) + .then((jsonData) => { + // Handle your JSON data here + console.log(jsonData); + }) + .catch((error) => console.error("Error:", error)); + }; + + checkFile(); + const interval = setInterval(checkFile, 5000); +} + +function createVideoElement(filePath) { + const videoContainer = document.getElementById(`video-${filePath}`); + videoContainer.outerHTML = ` + + `; + videoContainer.style.display = "block"; + document.getElementById(`spinner-${filePath}`).style.display = "none"; +} + +async function updateMediaList() { + try { + const response = await fetch("/media-list"); + if (!response.ok) { + throw new Error("Network response was not ok"); + } + + const data = await response.text(); + + document.getElementById("embedder-list").innerHTML = data; + htmx.process(document.body); + } catch (error) { + console.error("There was a problem with the fetch operation:", error); + } +} + +function refreshMediaList(files) { + files.forEach(file => { + console.log(`Checking ${file.path}...`); + if (videoExtensions.includes(extension(file.path))) { + const progressFileName = `uploads/${file.path}-progress.json`; + console.log(`Fetching ${progressFileName}...`); + checkFileAvailability(file.path); + } else { + console.log(`File ${file.path} is not a video, displaying...`); + } + }); +} + +const videoExtensions = [ + ".mp4", + ".mov", + ".avi", + ".flv", + ".mkv", + ".wmv", + ".webm", +]; +const imageExtensions = [ + ".jpg", + ".jpeg", + ".png", + ".gif", + ".bmp", + ".svg", + ".tiff", + ".webp", +]; \ No newline at end of file diff --git a/app/routes/index.ts b/app/routes/index.ts index 00a74db..5fe2d8f 100644 --- a/app/routes/index.ts +++ b/app/routes/index.ts @@ -12,6 +12,7 @@ import imageProbe from "probe-image-size"; import { ffProbe } from "../lib/ffmpeg"; import fs from "fs"; +import path from "path"; import { extension, videoExtensions } from "../lib/lib"; import { db, MediaRow, getPath, deleteId } from "../lib/db"; @@ -26,6 +27,7 @@ import { const upload = multer({ storage: fileStorage /**, fileFilter: fileFilter**/ }); //maybe make this a env variable? /**Middleware to grab media from media database */ + const fetchMedia: Middleware = (req, res, next) => { const admin: boolean = req.user.username == "admin" ? true : false; /**Check if the user is an admin, if so, show all posts from all users */ @@ -63,12 +65,12 @@ router.get( (req: Request, res: Response) => { res.locals.filter = null; res.render("index", { user: req.user }); - }, + } ); -/*router.get("/media-list", fetchMedia, (req: Request, res: Response) => { - res.render("partials/_fileList"); // Render only the file list partial -});*/ +router.get("/media-list", fetchMedia, (req: Request, res: Response) => { + res.render("partials/_fileList", { user: req.user }); // Render only the file list partial +}); router.get( "/gifv/:file", @@ -89,7 +91,7 @@ router.get( const imageData = ffProbe( `uploads/${req.params.file}`, nameAndExtension[0], - nameAndExtension[1], + nameAndExtension[1] ); width = (await imageData).streams[0].width; @@ -103,7 +105,7 @@ router.get( }); } else { const imageData = await imageProbe( - fs.createReadStream(`uploads/${req.params.file}`), + fs.createReadStream(`uploads/${req.params.file}`) ); return res.render("gifv", { url: url, @@ -112,7 +114,7 @@ router.get( height: imageData.height, }); } - }, + } ); router.post( @@ -123,10 +125,11 @@ router.post( convertTo720p, createEmbedData, handleUpload, + fetchMedia, ], (req: Request, res: Response) => { - res.redirect("/"); - }, + return res.render("partials/_fileList", { user: req.user }); // Render only the file list partial + } ); router.post( @@ -134,40 +137,63 @@ router.post( [checkSharexAuth, upload.single("fileupload"), createEmbedData, handleUpload], (req: Request, res: Response) => { return res.send( - `${req.protocol}://${req.get("host")}/uploads/${req.file.filename}`, + `${req.protocol}://${req.get("host")}/uploads/${req.file.filename}` ); - }, + } ); -router.post( +router.get( "/:id(\\d+)/delete", [checkAuth], - async (req: Request, res: Response) => { - const path: any = await getPath(req.params.id); + async (req: Request, res: Response, next: NextFunction) => { + const filename: any = await getPath(req.params.id); + console.log(filename); + const filePath = path.join(__dirname , "../../uploads/" + filename.path); + const oembed = path.join( + __dirname , "../../uploads/oembed-" + filename.path + ".json" + ); - const nameAndExtension = extension(path.path); - - const filesToDelete = [path.path, "oembed-" + path.path + ".json"]; + const nameAndExtension = extension(filePath); + const filesToDelete = [filePath, oembed]; if ( videoExtensions.includes(nameAndExtension[1]) || nameAndExtension[1] == ".gif" ) { - filesToDelete.push("720p-" + path.path); + filesToDelete.push( + path.join(__dirname , "../../uploads/720p-" + filename.path) + ); } - filesToDelete.forEach((path) => { - fs.unlink(path, async (err) => { - console.log(`Deleting ${path}`); - if (err && err.errno == -4058) { - await deleteId("media", req.params.id); - } - await deleteId("media", req.params.id); - }); - }); + // Wait for all file deletions and database operations to complete + await Promise.all( + filesToDelete.map(async (path) => { + return new Promise((resolve, reject) => { + fs.unlink(path, async (err) => { + console.log(`Deleting ${path}`); + if (err) { + if ([-4058, -2].includes(err.errno)) { + //file not found + console.log("File not found, deleting from database"); + await deleteId("media", req.params.id); + } + console.error(`Error deleting file ${path}:`, err); + reject(err); + return; + } + await deleteId("media", req.params.id); + resolve(); + }); + }); + }) + ); - return res.redirect("/"); + next(); }, + [fetchMedia], + (req: Request, res: Response) => { + return res.render("partials/_fileList", { user: req.user }); + } ); export default router; diff --git a/app/views/index.ejs b/app/views/index.ejs index ab7aaba..56a1d8e 100644 --- a/app/views/index.ejs +++ b/app/views/index.ejs @@ -1,75 +1,87 @@ - - - - Embedder - - - - - - - - - - -
-
-

Embedder

- -
-
-
-

Upload a file, copy paste, or drag n' drop into the dashed region

- -

-
-
-

- Select file expiration date: - -

-

Click the file to copy the url

-
-
-
-
    - <% if (files && files.length > 0) { %> - <%- include('partials/_fileList.ejs',) %> - <% } %> -
-
-
- - - - + + + + + Embedder + + + + + + + + + + + + +
+
+

Embedder

+ +
+
+
+

Upload a file, copy paste, or drag n' drop into the dashed region

+ +

+
+
+

+ Select file expiration date: + +

+

Click the file to copy the url

+
+
+
+
    +
    +
    + + + + + + \ No newline at end of file diff --git a/app/views/partials/_fileList.ejs b/app/views/partials/_fileList.ejs index 63cb381..6744f3d 100644 --- a/app/views/partials/_fileList.ejs +++ b/app/views/partials/_fileList.ejs @@ -7,170 +7,61 @@ const videoExtensions = ['.mp4', '.mov', '.avi', '.flv', '.mkv', '.wmv', '.webm' const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg', '.tiff', '.webp']; %> - - - - - <% files.forEach(function(file) { %>
  • -
    -
    - <% if (videoExtensions.includes(extension(file.path))) { %> - -
    Optimizing Video for Sharing...
    +
    + <% if (videoExtensions.includes(extension(file.path))) { %> + +
    Optimizing Video for Sharing...
    - -
    - -
    - <% if(user.username == "admin" && file.username != "admin") { %> - <%= file.username %> -
    - <% } %> - Copy as GIFv -
    -
    - <% } else if (extension(file.path) == ".gif") { %> -
    - -
    - <% if(user.username == "admin" && file.username != "admin") { %> - <%= file.username %> -
    - <% } %> - Copy as GIFv -
    -
    - <% } else if (imageExtensions.includes(extension(file.path))) { %> -
    - + +
    + +
    <% if(user.username == "admin" && file.username != "admin") { %> -
    - <%= file.username %> -
    + <%= file.username %> +
    <% } %> + Copy as GIFv
    - <% } else {%> - -
    -

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

    +
    + <% } else if (extension(file.path) == ".gif") { %> +
    + +
    <% if(user.username == "admin" && file.username != "admin") { %> -
    - <%= file.username %> -
    + <%= file.username %> +
    <% } %> + Copy as GIFv +
    +
    + <% } else if (imageExtensions.includes(extension(file.path))) { %> +
    + + <% if(user.username == "admin" && file.username != "admin") { %> +
    + <%= file.username %>
    <% } %> - - -
    - -
    -
    + <% } else {%> + +
    +

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

    + <% if(user.username == "admin" && file.username != "admin") { %> +
    + <%= file.username %> +
    + <% } %> +
    + <% } %> + + + +
  • <% }); %> \ No newline at end of file diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..f92a79b265328737e5556214fd5ab8435247ea2d GIT binary patch literal 170718 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