From d81a3a6ab4b4aacdf175088fa614b09730501aca Mon Sep 17 00:00:00 2001 From: C4illin Date: Sat, 25 May 2024 15:52:04 +0200 Subject: [PATCH] migrate to vips --- Dockerfile | 3 +- bun.lockb | Bin 100750 -> 90334 bytes package.json | 3 +- src/components/header.tsx | 5 +- src/converters/ffmpeg.ts | 3 +- src/converters/graphicsmagick.ts | 4 +- src/converters/main.ts | 27 +++---- src/converters/pandoc.ts | 13 ++- src/converters/sharp.ts | 78 +++++++++++++++++- src/converters/vips.ts | 133 +++++++++++++++++++++++++++++++ src/index.tsx | 67 +++++++++------- 11 files changed, 277 insertions(+), 59 deletions(-) create mode 100644 src/converters/vips.ts diff --git a/Dockerfile b/Dockerfile index 999d6f0..2bf2751 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,7 +33,8 @@ RUN rm -rf /var/lib/apt/lists/partial && apt-get update -o Acquire::CompressionT texlive-latex-recommended \ ffmpeg \ graphicsmagick \ - ghostscript + ghostscript \ + libvips-tools COPY --from=install /temp/prod/node_modules node_modules # COPY --from=prerelease /app/src/index.tsx /app/src/ diff --git a/bun.lockb b/bun.lockb index 4f5fd0fa141749e4e9fa290bf69702eede5496de..29e86be4e884ca2544f2a792b39a76a3a4d3424e 100755 GIT binary patch delta 16107 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 F{}(H+XzTz0 delta 22890 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 diff --git a/package.json b/package.json index 2bfac22..21c8976 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,7 @@ "@elysiajs/jwt": "^1.0.2", "@elysiajs/static": "^1.0.3", "@picocss/pico": "^2.0.6", - "elysia": "^1.0.22", - "sharp": "^0.33.4" + "elysia": "^1.0.22" }, "module": "src/index.tsx", "bun-create": { diff --git a/src/components/header.tsx b/src/components/header.tsx index 21aab6a..d81b0b1 100644 --- a/src/components/header.tsx +++ b/src/components/header.tsx @@ -4,7 +4,7 @@ export const Header = ({ loggedIn }: { loggedIn?: boolean }) => { rightNav = (

  • - History + History
  • Logout @@ -35,8 +35,7 @@ export const Header = ({ loggedIn }: { loggedIn?: boolean }) => { style={{ textDecoration: "none", color: "inherit", - }} - > + }}> ConvertX diff --git a/src/converters/ffmpeg.ts b/src/converters/ffmpeg.ts index 212f4d2..874d2ea 100644 --- a/src/converters/ffmpeg.ts +++ b/src/converters/ffmpeg.ts @@ -809,8 +809,7 @@ export async function convert( return exec(command, (error, stdout, stderr) => { if (error) { - console.error(`exec error: ${error}`); - return; + return error; } if (stdout) { diff --git a/src/converters/graphicsmagick.ts b/src/converters/graphicsmagick.ts index 67f6b9d..c4f292d 100644 --- a/src/converters/graphicsmagick.ts +++ b/src/converters/graphicsmagick.ts @@ -320,9 +320,9 @@ export function convert( `gm convert "${filePath}" "${targetPath}"`, (error, stdout, stderr) => { if (error) { - console.error(`exec error: ${error}`); - return; + return error; } + if (stdout) { console.log(`stdout: ${stdout}`); } diff --git a/src/converters/main.ts b/src/converters/main.ts index 114787e..3245841 100644 --- a/src/converters/main.ts +++ b/src/converters/main.ts @@ -1,23 +1,22 @@ -import { - properties as propertiesImage, - convert as convertImage, -} from "./sharp"; +import { convert as convertImage, properties as propertiesImage } from "./vips"; import { - properties as propertiesPandoc, convert as convertPandoc, + properties as propertiesPandoc, } from "./pandoc"; import { - properties as propertiesFFmpeg, convert as convertFFmpeg, + properties as propertiesFFmpeg, } from "./ffmpeg"; import { - properties as propertiesGraphicsmagick, convert as convertGraphicsmagick, + properties as propertiesGraphicsmagick, } from "./graphicsmagick"; +import { normalizeFiletype } from "../helpers/normalizeFiletype"; + // This should probably be reconstructed so that the functions are not imported instead the functions hook into this to make the converters more modular const properties: { @@ -38,8 +37,7 @@ const properties: { converter: ( filePath: string, fileType: string, - // biome-ignore lint/suspicious/noExplicitAny: - convertTo: any, + convertTo: string, targetPath: string, // biome-ignore lint/suspicious/noExplicitAny: options?: any, @@ -47,7 +45,7 @@ const properties: { ) => any; }; } = { - sharp: { + vips: { properties: propertiesImage, converter: convertImage, }, @@ -65,8 +63,6 @@ const properties: { }, }; -import { normalizeFiletype } from "../helpers/normalizeFiletype"; - export async function mainConverter( inputFilePath: string, fileTypeOriginal: string, @@ -112,7 +108,7 @@ export async function mainConverter( console.log( `No available converter supports converting from ${fileType} to ${convertTo}.`, ); - return; + return "File type not supported" } try { @@ -123,14 +119,17 @@ export async function mainConverter( targetPath, options, ); + console.log( `Converted ${inputFilePath} from ${fileType} to ${convertTo} successfully using ${converterName}.`, ); + return "Done" } catch (error) { console.error( `Failed to convert ${inputFilePath} from ${fileType} to ${convertTo} using ${converterName}.`, error, ); + return "Failed, check logs" } } @@ -256,4 +255,4 @@ export const getAllInputs = (converter: string) => { // } // // print the number of unique Inputs and Outputs -// console.log(`Unique Formats: ${uniqueFormats.size}`); \ No newline at end of file +// console.log(`Unique Formats: ${uniqueFormats.size}`); diff --git a/src/converters/pandoc.ts b/src/converters/pandoc.ts index 0f1c56e..e874e32 100644 --- a/src/converters/pandoc.ts +++ b/src/converters/pandoc.ts @@ -131,11 +131,16 @@ export function convert( `pandoc "${filePath}" -f ${fileType} -t ${convertTo} -o "${targetPath}"`, (error, stdout, stderr) => { if (error) { - console.error(`exec error: ${error}`); - return; + return error; + } + + if (stdout) { + console.log(`stdout: ${stdout}`); + } + + if (stderr) { + console.error(`stderr: ${stderr}`); } - console.log(`stdout: ${stdout}`); - console.error(`stderr: ${stderr}`); }, ); } diff --git a/src/converters/sharp.ts b/src/converters/sharp.ts index 6c00a39..afacd45 100644 --- a/src/converters/sharp.ts +++ b/src/converters/sharp.ts @@ -3,8 +3,82 @@ import type { FormatEnum } from "sharp"; // declare possible conversions export const properties = { - from: { images: ["jpeg", "png", "webp", "gif", "avif", "tiff", "svg"] }, - to: { images: ["jpeg", "png", "webp", "gif", "avif", "tiff"] }, + from: { + images: [ + "avif", + "bif", + "csv", + "exr", + "fits", + "gif", + "hdr.gz", + "hdr", + "heic", + "heif", + "img.gz", + "img", + "j2c", + "j2k", + "jp2", + "jpeg", + "jpx", + "jxl", + "mat", + "mrxs", + "ndpi", + "nia.gz", + "nia", + "nii.gz", + "nii", + "pdf", + "pfm", + "pgm", + "pic", + "png", + "ppm", + "raw", + "scn", + "svg", + "svs", + "svslide", + "szi", + "tif", + "tiff", + "v", + "vips", + "vms", + "vmu", + "webp", + "zip", + ], + }, + to: { + images: [ + "avif", + "dzi", + "fits", + "gif", + "hdr.gz", + "heic", + "heif", + "img.gz", + "j2c", + "j2k", + "jp2", + "jpeg", + "jpx", + "jxl", + "mat", + "nia.gz", + "nia", + "nii.gz", + "nii", + "png", + "tiff", + "vips", + "webp", + ], + }, options: { svg: { scale: { diff --git a/src/converters/vips.ts b/src/converters/vips.ts new file mode 100644 index 0000000..8708317 --- /dev/null +++ b/src/converters/vips.ts @@ -0,0 +1,133 @@ +import { exec } from "node:child_process"; + +// declare possible conversions +export const properties = { + from: { + images: [ + "avif", + "bif", + "csv", + "exr", + "fits", + "gif", + "hdr.gz", + "hdr", + "heic", + "heif", + "img.gz", + "img", + "j2c", + "j2k", + "jp2", + "jpeg", + "jpx", + "jxl", + "mat", + "mrxs", + "ndpi", + "nia.gz", + "nia", + "nii.gz", + "nii", + "pdf", + "pfm", + "pgm", + "pic", + "png", + "ppm", + "raw", + "scn", + "svg", + "svs", + "svslide", + "szi", + "tif", + "tiff", + "v", + "vips", + "vms", + "vmu", + "webp", + "zip", + ], + }, + to: { + images: [ + "avif", + "dzi", + "fits", + "gif", + "hdr.gz", + "heic", + "heif", + "img.gz", + "j2c", + "j2k", + "jp2", + "jpeg", + "jpx", + "jxl", + "mat", + "nia.gz", + "nia", + "nii.gz", + "nii", + "png", + "tiff", + "vips", + "webp", + ], + }, + options: { + svg: { + scale: { + description: "Scale the image up or down", + type: "number", + default: 1, + }, + }, + }, +}; + +export function convert( + filePath: string, + fileType: string, + convertTo: string, + targetPath: string, + // biome-ignore lint/suspicious/noExplicitAny: + options?: any, +) { + // if (fileType === "svg") { + // const scale = options.scale || 1; + // const metadata = await sharp(filePath).metadata(); + + // if (!metadata || !metadata.width || !metadata.height) { + // throw new Error("Could not get metadata from image"); + // } + + // const newWidth = Math.round(metadata.width * scale); + // const newHeight = Math.round(metadata.height * scale); + + // return await sharp(filePath) + // .resize(newWidth, newHeight) + // .toFormat(convertTo) + // .toFile(targetPath); + // } + + return exec( + `vips copy ${filePath} ${targetPath}`, + (error, stdout, stderr) => { + if (error) { + return error; + } + + if (stdout) { + console.log(`stdout: ${stdout}`); + } + + if (stderr) { + console.error(`stderr: ${stderr}`); + } + }, + ); +} diff --git a/src/index.tsx b/src/index.tsx index 89f851b..e11cdb8 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,25 +1,24 @@ +import { Database } from "bun:sqlite"; import { randomUUID } from "node:crypto"; +import { rmSync } from "node:fs"; import { mkdir, unlink } from "node:fs/promises"; import cookie from "@elysiajs/cookie"; import { html } from "@elysiajs/html"; import { jwt } from "@elysiajs/jwt"; import { staticPlugin } from "@elysiajs/static"; -import { Database } from "bun:sqlite"; import { Elysia, t } from "elysia"; import { BaseHtml } from "./components/base"; import { Header } from "./components/header"; import { - mainConverter, - getPossibleTargets, - getPossibleInputs, - getAllTargets, getAllInputs, + getAllTargets, + getPossibleTargets, + mainConverter, } from "./converters/main"; import { normalizeFiletype, normalizeOutputFiletype, } from "./helpers/normalizeFiletype"; -import { rmSync } from "node:fs"; const db = new Database("./data/mydb.sqlite", { create: true }); const uploadsDir = "./data/uploads/"; @@ -45,6 +44,7 @@ CREATE TABLE IF NOT EXISTS file_names ( job_id INTEGER NOT NULL, file_name TEXT NOT NULL, output_file_name TEXT NOT NULL, + status TEXT DEFAULT 'not started', FOREIGN KEY (job_id) REFERENCES jobs(id) ); CREATE TABLE IF NOT EXISTS jobs ( @@ -56,6 +56,14 @@ CREATE TABLE IF NOT EXISTS jobs ( FOREIGN KEY (user_id) REFERENCES users(id) );`); +const dbVersion = ( + db.query("PRAGMA user_version").get() as { user_version?: number } +).user_version; +if (dbVersion === 0) { + db.exec("ALTER TABLE file_names ADD COLUMN status TEXT DEFAULT 'not started';"); + db.exec("PRAGMA user_version = 1;"); +} + let FIRST_RUN = db.query("SELECT * FROM users").get() === null || false; interface IUser { @@ -69,6 +77,7 @@ interface IFileNames { job_id: number; file_name: string; output_file_name: string; + status: string; } interface IJobs { @@ -204,27 +213,27 @@ const app = new Elysia() }; } const savedPassword = await Bun.password.hash(body.password); - + db.query("INSERT INTO users (email, password) VALUES (?, ?)").run( body.email, savedPassword, ); - + const user = (await db .query("SELECT * FROM users WHERE email = ?") .get(body.email)) as IUser; - + const accessToken = await jwt.sign({ id: String(user.id), }); - + if (!auth) { set.status = 500; return { message: "No auth cookie, perhaps your browser is blocking cookies.", }; } - + // set cookie auth.set({ value: accessToken, @@ -233,8 +242,8 @@ const app = new Elysia() maxAge: 60 * 60 * 24 * 7, sameSite: "strict", }); - - redirect("/"); + + return redirect("/"); }, { body: t.Object({ email: t.String(), password: t.String() }) }, ) @@ -408,6 +417,8 @@ const app = new Elysia() sameSite: "strict", }); + console.log("jobId set to:", id); + return (
    @@ -610,7 +621,7 @@ const app = new Elysia() ); const query = db.query( - "INSERT INTO file_names (job_id, file_name, output_file_name) VALUES (?, ?, ?)", + "INSERT INTO file_names (job_id, file_name, output_file_name, status) VALUES (?, ?, ?, ?)", ); // Start the conversion process in the background @@ -623,7 +634,7 @@ const app = new Elysia() const newFileName = fileName.replace(fileTypeOrig, newFileExt); const targetPath = `${userOutputDir}${newFileName}`; - await mainConverter( + const result = await mainConverter( filePath, fileType, convertTo, @@ -631,7 +642,8 @@ const app = new Elysia() {}, converterName, ); - query.run(jobId.value, fileName, newFileName); + + query.run(jobId.value, fileName, newFileName, result); }), ) .then(() => { @@ -642,7 +654,7 @@ const app = new Elysia() ); // delete all uploaded files in userUploadsDir - rmSync(userUploadsDir, { recursive: true, force: true }); + // rmSync(userUploadsDir, { recursive: true, force: true }); }) .catch((error) => { console.error("Error in conversion process:", error); @@ -658,7 +670,7 @@ const app = new Elysia() }), }, ) - .get("/test", async ({ jwt, redirect, cookie: { auth } }) => { + .get("/history", async ({ jwt, redirect, cookie: { auth } }) => { if (!auth?.value) { return redirect("/login"); } @@ -775,6 +787,7 @@ const app = new Elysia() Converted File Name + Status View Download @@ -784,6 +797,7 @@ const app = new Elysia() // biome-ignore lint/correctness/useJsxKeyInIterable: {file.output_file_name} + {file.status} @@ -1021,16 +1035,11 @@ const clearJobs = () => { const jobs = db .query("SELECT * FROM jobs WHERE date_created < ?") .all(new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString()) as IJobs[]; - - for (const job of jobs) { - const files = db - .query("SELECT * FROM file_names WHERE job_id = ?") - .all(job.id) as IFileNames[]; - for (const file of files) { - // delete the file - unlink(`${outputDir}${job.user_id}/${job.id}/${file.output_file_name}`); - } + for (const job of jobs) { + // delete the directories + rmSync(`${outputDir}${job.user_id}/${job.id}`, { recursive: true }); + rmSync(`${uploadsDir}${job.user_id}/${job.id}`, { recursive: true }); // delete the job db.query("DELETE FROM jobs WHERE id = ?").run(job.id); @@ -1038,5 +1047,5 @@ const clearJobs = () => { // run every 24 hours setTimeout(clearJobs, 24 * 60 * 60 * 1000); -} -clearJobs(); \ No newline at end of file +}; +clearJobs();