| const http = require('http'); |
| const fs = require('fs'); |
| const path = require('path'); |
|
|
| |
| const PORT = 8081; |
|
|
| |
| const MIME_TYPES = { |
| '.html': 'text/html', |
| '.css': 'text/css', |
| '.js': 'text/javascript', |
| '.json': 'application/json', |
| '.png': 'image/png', |
| '.jpg': 'image/jpeg', |
| '.gif': 'image/gif', |
| '.svg': 'image/svg+xml', |
| '.ico': 'image/x-icon' |
| }; |
|
|
| |
| function serveStaticFile(res, pathname, contentType) { |
| |
| if (pathname === '/') { |
| pathname = '/index.html'; |
| } |
| |
| let filePath; |
| |
| |
| if (pathname.startsWith('/comic_')) { |
| |
| filePath = path.join(process.cwd(), pathname); |
| } else { |
| |
| filePath = path.join(process.cwd(), 'web', pathname); |
| } |
| |
| |
| fs.access(filePath, fs.constants.F_OK, (err) => { |
| if (err) { |
| |
| res.writeHead(404, { 'Content-Type': 'text/html' }); |
| res.end('<h1>404 Not Found</h1><p>O arquivo solicitado n茫o foi encontrado.</p>'); |
| return; |
| } |
| |
| |
| fs.readFile(filePath, (err, data) => { |
| if (err) { |
| |
| res.writeHead(500, { 'Content-Type': 'text/html' }); |
| res.end('<h1>500 Internal Server Error</h1><p>Ocorreu um erro ao ler o arquivo.</p>'); |
| return; |
| } |
| |
| |
| res.writeHead(200, { 'Content-Type': contentType }); |
| res.end(data); |
| }); |
| }); |
| } |
|
|
| |
| function generateComicStory(theme, title, res) { |
| const { spawn } = require('child_process'); |
| |
| |
| const pythonProcess = spawn('python3', ['comic_story_generator.py', theme, title], { |
| cwd: process.cwd() |
| }); |
| |
| let output = ''; |
| let errorOutput = ''; |
| |
| |
| pythonProcess.stdout.on('data', (data) => { |
| output += data.toString(); |
| }); |
| |
| |
| pythonProcess.stderr.on('data', (data) => { |
| errorOutput += data.toString(); |
| }); |
| |
| |
| pythonProcess.on('close', (code) => { |
| if (code === 0) { |
| |
| |
| const directoryMatch = output.match(/Saving to directory: (comic_\d+)/); |
| if (directoryMatch) { |
| const directory = directoryMatch[1]; |
| |
| |
| const viewerProcess = spawn('python3', ['comic_viewer.py', directory], { |
| cwd: process.cwd() |
| }); |
| |
| viewerProcess.on('close', (viewerCode) => { |
| if (viewerCode === 0) { |
| |
| res.writeHead(200, { 'Content-Type': 'application/json' }); |
| res.end(JSON.stringify({ |
| success: true, |
| directory: directory, |
| message: 'Hist贸ria em quadrinhos gerada com sucesso!' |
| })); |
| } else { |
| |
| res.writeHead(500, { 'Content-Type': 'application/json' }); |
| res.end(JSON.stringify({ |
| success: false, |
| error: 'Erro ao gerar o visualizador HTML', |
| details: errorOutput |
| })); |
| } |
| }); |
| } else { |
| |
| res.writeHead(500, { 'Content-Type': 'application/json' }); |
| res.end(JSON.stringify({ |
| success: false, |
| error: 'N茫o foi poss铆vel encontrar o diret贸rio da hist贸ria gerada', |
| output: output |
| })); |
| } |
| } else { |
| |
| res.writeHead(500, { 'Content-Type': 'application/json' }); |
| res.end(JSON.stringify({ |
| success: false, |
| error: 'Erro ao gerar a hist贸ria em quadrinhos', |
| details: errorOutput |
| })); |
| } |
| }); |
| } |
|
|
| |
| const server = http.createServer((req, res) => { |
| console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`); |
| |
| |
| if (req.method === 'POST' && req.url === '/api/generate-comic') { |
| let body = ''; |
| |
| |
| req.on('data', chunk => { |
| body += chunk.toString(); |
| }); |
| |
| |
| req.on('end', () => { |
| try { |
| const data = JSON.parse(body); |
| const { theme, title } = data; |
| |
| |
| if (!theme || !title) { |
| res.writeHead(400, { 'Content-Type': 'application/json' }); |
| res.end(JSON.stringify({ |
| success: false, |
| error: 'Tema e t铆tulo s茫o obrigat贸rios' |
| })); |
| return; |
| } |
| |
| |
| generateComicStory(theme, title, res); |
| } catch (error) { |
| res.writeHead(400, { 'Content-Type': 'application/json' }); |
| res.end(JSON.stringify({ |
| success: false, |
| error: 'Dados inv谩lidos', |
| details: error.message |
| })); |
| } |
| }); |
| |
| return; |
| } |
| |
| |
| const extname = path.extname(req.url); |
| const contentType = MIME_TYPES[extname] || 'text/html'; |
| |
| |
| serveStaticFile(res, req.url, contentType); |
| }); |
|
|
| |
| server.listen(PORT, () => { |
| console.log(`Servidor HD French Comic Generator rodando em http://localhost:${PORT}`); |
| console.log('Pressione Ctrl+C para parar o servidor'); |
| }); |
|
|