Add server, DB, and image processing modules

Introduce initial project scaffold: Express webhook server (server.js) for Immich uploads, DB pool (modules/database.js) using pg, immich repository (repositories/immichRepo.js) with get/update functions, image processing via sharp (modules/image_processor.js), a small execution helper (modules/execution_helper.js), and package.json + package-lock. Server validates a bearer token, filters non-image assets, waits briefly, compresses the image and updates DB path. Requires env vars: DB_HOST, DB_USER, DB_PORT, DB_NAME, DB_PASS, PASS_CODE, IMMICH_DATA_PATH, IMG_COMPRESSION_OUTPUT_FORMAT, IMG_COMPRESSION_OUTPUT_QUALITY, PORT.
This commit is contained in:
2026-09-01 20:12:29 +02:00
parent feb3e9a417
commit d5563ad946
7 changed files with 2152 additions and 0 deletions
+18
View File
@@ -0,0 +1,18 @@
import { Pool } from "pg"
export const pool = new Pool({
host: process.env.DB_HOST,
user: process.env.DB_USER,
port: process.env.DB_PORT,
database: process.env.DB_NAME,
password: process.env.DB_PASS,
})
export async function connect() {
await pool.connect()
}
export default {
pool,
connect
}
+7
View File
@@ -0,0 +1,7 @@
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
export default {
sleep
}
+43
View File
@@ -0,0 +1,43 @@
import path from "node:path"
import fs from "node:fs/promises"
import sharp from "sharp"
const IMAGE_EXTENSIONS = new Set([ ".jpg", ".jpeg", ".png", ".heic", ".heif", ".gif", ".tiff", ".bmp", ".svg", ".avif", ".raw", ".dng" ])
const VIDEO_EXTENSIONS = new Set([ ".mp4", ".mov", ".avi", ".mkv", ".webm", ".flv", ".wmv", ".m4v", ".3gp", ".ts" ])
function getMediaType(filePath) {
if (!filePath) return "unknown"
const ext = path.extname(filePath).toLowerCase()
if (IMAGE_EXTENSIONS.has(ext)) return "image"
if (VIDEO_EXTENSIONS.has(ext)) return "video"
return "unknown"
}
function changeExtension(filePath, newExt) {
const formattedExt = newExt.startsWith(".") ? newExt : `.${newExt}`
const parsed = path.parse(filePath)
parsed.base = `${parsed.name}${formattedExt}`
parsed.ext = formattedExt
return path.format(parsed)
}
async function processCompression($file) {
const file = $file.replace("/data", process.env.IMMICH_DATA_PATH)
const newFilePath = changeExtension(file, process.env.IMG_COMPRESSION_OUTPUT_FORMAT)
const compressedFile = await sharp(file)
.toFormat(process.env.IMG_COMPRESSION_OUTPUT_FORMAT,
{ quality: parseInt(process.env.IMG_COMPRESSION_OUTPUT_QUALITY) || 80 }
)
.toFile(newFilePath)
}
export default {
getMediaType,
changeExtension,
processCompression
}