112 lines
3.2 KiB
TypeScript
112 lines
3.2 KiB
TypeScript
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")
|
|
}
|
|
}
|
|
}
|