From 63a4328d4a1e01df3e0ec4a877bad8c8ffe71129 Mon Sep 17 00:00:00 2001 From: Aymen Djellal Date: Thu, 26 Sep 2024 08:23:28 -0400 Subject: [PATCH] feat: Add support for 3d assets through assimp converter This is a start for #144 It does not support all the 3d formats, but its a good few --- Dockerfile | 3 +- README.md | 3 +- src/converters/assimp.ts | 139 +++++++++++++++++++++++++++++++++++ src/converters/main.ts | 14 +++- src/helpers/printVersions.ts | 10 +++ 5 files changed, 166 insertions(+), 3 deletions(-) create mode 100644 src/converters/assimp.ts diff --git a/Dockerfile b/Dockerfile index 551eb79..7f0bed5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -49,7 +49,8 @@ RUN apk --no-cache add \ vips-tools \ vips-poppler \ vips-jxl \ - libjxl-tools + libjxl-tools \ + assimp # this might be needed for some latex use cases, will add it if needed. # texmf-dist-fontsextra \ diff --git a/README.md b/README.md index b93cac2..4553dec 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ![Docker container size](https://ghcr-badge.egpl.dev/c4illin/convertx/size?color=%230375b6&tag=latest&label=image+size&trim=) ![GitHub top language](https://img.shields.io/github/languages/top/C4illin/ConvertX) -A self-hosted online file converter. Supports 831 different formats. Written with TypeScript, Bun and Elysia. +A self-hosted online file converter. Supports over a thousand different formats. Written with TypeScript, Bun and Elysia. ## Features @@ -23,6 +23,7 @@ A self-hosted online file converter. Supports 831 different formats. Written wit | [libjxl](https://github.com/libjxl/libjxl) | JPEG XL | 11 | 11 | | [resvg](https://github.com/RazrFalcon/resvg) | SVG | 1 | 1 | | [Vips](https://github.com/libvips/libvips) | Images | 45 | 23 | +| [Assimp](https://github.com/assimp/assimp) | 3D Assets | 70 | 24 | | [XeLaTeX](https://tug.org/xetex/) | LaTeX | 1 | 1 | | [Pandoc](https://pandoc.org/) | Documents | 43 | 65 | | [GraphicsMagick](http://www.graphicsmagick.org/) | Images | 166 | 133 | diff --git a/src/converters/assimp.ts b/src/converters/assimp.ts new file mode 100644 index 0000000..ea44b6d --- /dev/null +++ b/src/converters/assimp.ts @@ -0,0 +1,139 @@ +import { exec } from "node:child_process"; + +// This could be done dynamically by running `ffmpeg -formats` and parsing the output +export const properties = { + from: { + muxer: [ + "3d", + "3ds", + "3mf", + "ac", + "ac3d", + "acc", + "amf", + "ase", + "ask", + "assbin", + "b3d", + "blend", + "bsp", + "bvh", + "cob", + "csm", + "dae", + "dxf", + "enff", + "fbx", + "glb", + "gltf", + "hmp", + "ifc", + "ifczip", + "iqm", + "irr", + "irrmesh", + "lwo", + "lws", + "lxo", + "md2", + "md3", + "md5anim", + "md5camera", + "md5mesh", + "mdc", + "mdl", + "mesh", + "mesh.xml", + "mot", + "ms3d", + "ndo", + "nff", + "obj", + "off", + "ogex", + "pk3", + "ply", + "pmx", + "prj", + "q3o", + "q3s", + "raw", + "scn", + "sib", + "smd", + "step", + "stl", + "stp", + "ter", + "uc", + "vta", + "x", + "x3d", + "x3db", + "xgl", + "xml", + "zae", + "zgl", + ], + }, + to: { + muxer: [ + "collada", + "x", + "stp", + "obj", + "objnomtl", + "stl", + "stlb", + "ply", + "plyb", + "3ds", + "gltf2", + "glb2", + "gltf", + "glb", + "assbin", + "assxml", + "x3d", + "fbx", + "fbxa", + "m3d", + "m3da", + "3mf", + "pbrt", + "assjson", + ], + }, +}; + +export async function convert( + filePath: string, + fileType: string, + convertTo: string, + targetPath: string, + // biome-ignore lint/suspicious/noExplicitAny: + options?: any, +): Promise { + // let command = "ffmpeg"; + + + const command = `assimp export "${filePath}" "${targetPath}"`; + + return new Promise((resolve, reject) => { + exec(command, (error, stdout, stderr) => { + if (error) { + reject(`error: ${error}`); + } + + if (stdout) { + console.log(`stdout: ${stdout}`); + } + + if (stderr) { + console.error(`stderr: ${stderr}`); + } + + resolve("success"); + }); + }); +} diff --git a/src/converters/main.ts b/src/converters/main.ts index 3be2ba0..f477116 100644 --- a/src/converters/main.ts +++ b/src/converters/main.ts @@ -1,4 +1,7 @@ -import { convert as convertImage, properties as propertiesImage } from "./vips"; +import { + convert as convertImage, + properties as propertiesImage +} from "./vips"; import { convert as convertPandoc, @@ -30,6 +33,11 @@ import { properties as propertiesresvg, } from "./resvg"; +import { + convert as convertassimp, + properties as propertiesassimp, +} from "./assimp"; + 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 @@ -78,6 +86,10 @@ const properties: Record { + if (error) { + console.error("assimp is not installed"); + } + + if (stdout) { + console.log(`assimp v${stdout.split("\n")[5]}`); + } + }); + exec("bun -v", (error, stdout) => { if (error) { console.error("Bun is not installed. wait what");