Spaces:
No application file
No application file
| require('dotenv').config(); | |
| const express = require('express'); | |
| const morgan = require('morgan'); | |
| const os = require('os'); | |
| const axios = require('axios'); | |
| const { launchBrowser, closeBrowser } = require('./services/browser'); | |
| const { generateBrat } = require('./services/brat'); | |
| const Upload = require('./services/uploader') | |
| const { urlToBuffer } = require('./services/function') | |
| const { generateImage } = require('./services/editimg.js') | |
| const { bigjpg } = require('./services/upscaler') | |
| const { tes } = require('./services/tes') | |
| const { takeScreenshot } = require('./services/screenshot'); | |
| const { executePlaywright } = require('./services/run-playwright'); | |
| const app = express(); | |
| const PORT = process.env.PORT || 3000; | |
| const API_KEY = process.env.API_KEY; // API Key dari .envv | |
| app.use(morgan('common')); | |
| app.use(express.json()); // Parsing JSON | |
| launchBrowser(); | |
| // Hit Counter | |
| async function fetchCount() { | |
| try { | |
| return (await axios.get("https://api.counterapi.dev/v1/aqul/brat/up")).data?.count || 0; | |
| } catch { | |
| return 0; | |
| } | |
| } | |
| // Route `/brat?q=` | |
| app.get('/brat', async (req, res) => { | |
| const { q } = req.query; | |
| if (!q) return res.status(400).json({ error: "Parameter `q` diperlukan" }); | |
| try { | |
| const image = await generateBrat(q); | |
| res.set('Content-Type', 'image/png'); | |
| res.send(image); | |
| } catch (error) { | |
| res.status(500).json({ error: 'Gagal menghasilkan brat', detail: error.message }); | |
| } | |
| }); | |
| app.get('/editimg', async (req, res) => { | |
| const { q, url } = req.query; | |
| if (!q && !url) return res.status(400).json({ error: "Parameter `q` diperlukan" }); | |
| try { | |
| let buffer = await urlToBuffer(url) | |
| const image = await generateImage(q, buffer); | |
| res.set('Content-Type', 'image/png'); | |
| res.send(image); | |
| } catch (error) { | |
| res.status(500).json({ error: 'Gagal menghasilkan image', detail: error.message }); | |
| } | |
| }); | |
| //upscaler | |
| app.get('/upscaler', async (req, res) =>{ | |
| const { url, style } = req.query | |
| if (!url) return res.status(400).json({ error: "Parameter `url` diperlukan" }); | |
| try { | |
| //const image = await urlToBuffer(url) | |
| const up = await bigjpg.upscale(url, { style }) | |
| //const u = await Upload(up) | |
| res.json(up) | |
| } catch (e) { | |
| res.status(500).json({ error: 'Gagal menghdkan', detail: e }); | |
| } | |
| }) | |
| // Route `/ss?url=` | |
| app.get('/ss', async (req, res) => { | |
| const { url, device } = req.query; | |
| if (!url) return res.status(400).json({ error: "Parameter `url` diperlukan" }); | |
| try { | |
| const image = await takeScreenshot(url, device); | |
| res.set('Content-Type', 'image/png'); | |
| res.send(image); | |
| } catch (error) { | |
| res.status(500).json({ error: 'Gagal mengambil screenshot', detail: error.message }); | |
| } | |
| }); | |
| app.get('/tes', async (req, res) => { | |
| let iya = await tes() | |
| return res.json({ | |
| html: iya, | |
| }) | |
| }) | |
| // Endpoint `POST /run` untuk eksekusi Playwright kustom | |
| app.post('/run', async (req, res) => { | |
| const { api_key, code } = req.body; | |
| // Validasi API Key | |
| if (api_key !== API_KEY) { | |
| return res.status(403).json({ error: "Unauthorized" }); | |
| } | |
| if (!code) { | |
| return res.status(400).json({ error: "Parameter `code` diperlukan" }); | |
| } | |
| try { | |
| const result = await executePlaywright(code); | |
| res.json(result); | |
| } catch (error) { | |
| res.status(500).json({ error: "Runtime Error", detail: error.message }); | |
| } | |
| }); | |
| // Root Route | |
| app.get('/', async (req, res) => { | |
| res.json({ | |
| author: 'cipungmo', | |
| repository: { github: 'https://github.com/cifumo' }, | |
| hit: await fetchCount(), | |
| message: "Gunakan endpoint `/brat?q=`, `/ss?url=`, atau `/run`", | |
| 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`, | |
| }, | |
| }); | |
| }); | |
| // Menangani Penutupan Server | |
| process.on('SIGINT', async () => { | |
| console.log('SIGINT diterima, menutup browser...'); | |
| await closeBrowser(); | |
| process.exit(0); | |
| }); | |
| process.on('SIGTERM', async () => { | |
| console.log('SIGTERM diterima, menutup browser...'); | |
| await closeBrowser(); | |
| process.exit(0); | |
| }); | |
| process.on('exit', async () => { | |
| console.log('Proses keluar, menutup browser...'); | |
| await closeBrowser(); | |
| }); | |
| app.listen(PORT, () => console.log(`Server berjalan di port ${PORT}`)); |