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);
});