import Profile from "./models/profile.ts"; import { checkFileExists, getImageMagickCommand, runCommand } from "./utils.ts"; import { log } from "./log.ts"; const tmpImgDir = "/tmp/substr/img"; const magick = await getImageMagickCommand(); if (!magick) { log("ImageMagick is not installed. Cannot generate preview images", "yellow") } function createProfileImage(profile: Profile) { if (!magick || !profile.picture) return false; const args = [ profile.picture, '-resize', '256x256^', '-gravity', 'center', '-extent', '256x256', `${tmpImgDir}/p-${profile.event.id}.png` ]; return runCommand(magick, args); } async function createRoundedProfileImage(profile: Profile) { if (!magick || !profile.picture) return false; const status = await generateProfileImage(profile); if (status && status.success) { const args = [ `${tmpImgDir}/p-${profile.event.id}.png`, '-resize', '256x256^', '-gravity', 'center', '-extent', '256x256', '(', '+clone', '-alpha', 'extract', '-draw', "fill black polygon 0,0 0,128 128,0 fill white circle 128,128 128,0", '(', '+clone', '-flip', ')', '-compose', 'Multiply', '-composite', '(', '+clone', '-flop', ')', '-compose', 'Multiply', '-composite', ')', '-alpha', 'off', '-compose', 'CopyOpacity', '-composite', `${tmpImgDir}/p-${profile.event.id}-rounded.png` ]; return runCommand(magick, args); } else { return false; } } async function createOgImage(profile: Profile, ogImagePath: string, backgroundColor: string) { if (!magick) return false; const status = await createRoundedProfileImage(profile); if (status && status.success) { const args = [ `${tmpImgDir}/p-${profile.event.id}-rounded.png`, '-resize', '256x256', '-background', backgroundColor, '-gravity', 'center', '-extent', '1200x630', '-size', '1200x630', "-format", "png", ogImagePath ]; return runCommand(magick, args); } }; export async function generateProfileImage(profile: Profile) { if (!magick || !profile.picture) return false; const imagePath = `${tmpImgDir}/p-${profile.event.id}.png`; const fileExists = await checkFileExists(imagePath); if (fileExists) { return { success: true }; } else { const status = await createProfileImage(profile); if (status && status.success) { log(`Created avatar image for ${profile.username}: ${imagePath}`, "blue") return status; } else { log(`Could not create avatar image for ${profile.username}`, "yellow") } } } export async function generateOgProfileImage(profile: Profile) { if (!magick || !profile.picture) return false; const ogImagePath = `${tmpImgDir}/og-p-${profile.event.id}.png`; const backgroundColor = "#333333"; const fileExists = await checkFileExists(ogImagePath); if (fileExists) { return { success: true }; } else { const status = await createOgImage(profile, ogImagePath, backgroundColor); if (status && status.success) { log(`Created OG image for ${profile.username}: ${ogImagePath}`, "blue") return status; } else { log(`Could not create OG image for ${profile.username}`, "yellow") } } }