File size: 3,311 Bytes
77f6a35 abc92ad 77f6a35 abc92ad 77f6a35 abc92ad 01f9943 abc92ad 77f6a35 01f9943 77f6a35 01f9943 abc92ad 01f9943 abc92ad 01f9943 abc92ad 01f9943 abc92ad 01f9943 77f6a35 abc92ad 01f9943 abc92ad 77f6a35 01f9943 abc92ad 77f6a35 01f9943 77f6a35 01f9943 77f6a35 01f9943 77f6a35 01f9943 abc92ad 01f9943 abc92ad 01f9943 abc92ad 77f6a35 01f9943 abc92ad 01f9943 abc92ad 01f9943 77f6a35 01f9943 77f6a35 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
import express from 'express';
import { chromium } from 'playwright';
import cors from 'cors';
import dotenv from 'dotenv';
import os from 'os';
import sharp from 'sharp';
dotenv.config();
const config = {
maxTextLength: 100,
viewport: { width: 1920, height: 1080 },
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
};
let browser, page;
const utils = {
async initialize() {
if (!browser) {
browser = await chromium.launch({ headless: true });
const context = await browser.newContext({
viewport: config.viewport,
userAgent: config.userAgent
});
await context.route('**/*', (route) => {
const url = route.request().url();
if (url.endsWith('.png') || url.endsWith('.jpg') || url.includes('google-analytics')) {
return route.abort();
}
route.continue();
});
page = await context.newPage();
await page.goto('https://www.bratgenerator.com/', { waitUntil: 'domcontentloaded', timeout: 10000 });
try {
await page.click('#onetrust-accept-btn-handler', { timeout: 2000 });
} catch { }
await page.evaluate(() => setupTheme('white'));
}
},
async generateBrat(text) {
await page.fill('#textInput', text);
const overlay = page.locator('#textOverlay');
// Ambil screenshot dalam format PNG
const pngBuffer = await overlay.screenshot({
timeout: 3000,
type: 'png'
});
// Konversi ke WebP menggunakan sharp
return sharp(pngBuffer)
.webp({ quality: 80 })
.toBuffer();
},
async close() {
if (browser) await browser.close();
}
};
const app = express();
app.use(express.json());
app.use(cors());
app.get('*', async (req, res) => {
try {
const { q } = req.query;
if (!q) {
return res.json({
name: 'HD Bart Generator API',
message: 'Parameter q di perlukan',
version: '2.1.0',
runtime: {
os: os.type(),
platform: os.platform(),
architecture: os.arch(),
cpuCount: os.cpus().length,
uptime: `${os.uptime()} seconds`,
memoryUsage: `${Math.round((os.totalmem() - os.freemem()) / 1024 / 1024)} MB used of ${Math.round(os.totalmem() / 1024 / 1024)} MB`
}
});
}
const imageBuffer = await utils.generateBrat(q);
res.set('Content-Type', 'image/webp');
res.send(imageBuffer);
} catch (error) {
res.status(500).json({
status: false,
message: 'Error generating image',
error: process.env.NODE_ENV === 'development' ? error.message : undefined
});
}
});
const PORT = process.env.PORT || 7860;
app.listen(PORT, async () => {
console.log(`Server running on port ${PORT}`);
await utils.initialize();
});
process.on('SIGINT', async () => {
await utils.close();
process.exit(0);
}); |