Jelajahi Sumber

Merge pull request #148 from Aymendje/feat-assimp

Emrik Östling 10 bulan lalu
induk
melakukan
2b4b8f9551
5 mengubah file dengan 166 tambahan dan 3 penghapusan
  1. 2 1
      Dockerfile
  2. 2 1
      README.md
  3. 139 0
      src/converters/assimp.ts
  4. 13 1
      src/converters/main.ts
  5. 10 0
      src/helpers/printVersions.ts

+ 2 - 1
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 \

+ 2 - 1
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         |

+ 139 - 0
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: <explanation>
+  options?: any,
+): Promise<string> {
+  // 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");
+    });
+  });
+}

+ 13 - 1
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<string, {
     properties: propertiesGraphicsmagick,
     converter: convertGraphicsmagick,
   },
+  assimp: {
+    properties: propertiesassimp,
+    converter: convertassimp,
+  },
   ffmpeg: {
     properties: propertiesFFmpeg,
     converter: convertFFmpeg,

+ 10 - 0
src/helpers/printVersions.ts

@@ -83,6 +83,16 @@ if (process.env.NODE_ENV === "production") {
     }
   });
 
+  exec("assimp version", (error, stdout) => {
+    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");