File size: 6,023 Bytes
4595df6 |
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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 |
const http = require('http');
const fs = require('fs');
const path = require('path');
// Porta do servidor
const PORT = 8081;
// Tipos MIME para diferentes extensões de arquivo
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'
};
// Função para servir arquivos estáticos
function serveStaticFile(res, pathname, contentType) {
// Se for a raiz, servir o index.html
if (pathname === '/') {
pathname = '/index.html';
}
let filePath;
// Verificar se é um diretório de história em quadrinhos
if (pathname.startsWith('/comic_')) {
// Servir arquivos de histórias em quadrinhos do diretório raiz
filePath = path.join(process.cwd(), pathname);
} else {
// Servir arquivos web do diretório web
filePath = path.join(process.cwd(), 'web', pathname);
}
// Verificar se o arquivo existe
fs.access(filePath, fs.constants.F_OK, (err) => {
if (err) {
// Arquivo não encontrado
res.writeHead(404, { 'Content-Type': 'text/html' });
res.end('<h1>404 Not Found</h1><p>O arquivo solicitado não foi encontrado.</p>');
return;
}
// Ler e servir o arquivo
fs.readFile(filePath, (err, data) => {
if (err) {
// Erro ao ler o arquivo
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;
}
// Servir o arquivo com o tipo de conteúdo correto
res.writeHead(200, { 'Content-Type': contentType });
res.end(data);
});
});
}
// Função para gerar uma história em quadrinhos
function generateComicStory(theme, title, res) {
const { spawn } = require('child_process');
// Criar um processo filho para executar o script Python
const pythonProcess = spawn('python3', ['comic_story_generator.py', theme, title], {
cwd: process.cwd()
});
let output = '';
let errorOutput = '';
// Capturar a saída do processo
pythonProcess.stdout.on('data', (data) => {
output += data.toString();
});
// Capturar erros do processo
pythonProcess.stderr.on('data', (data) => {
errorOutput += data.toString();
});
// Quando o processo terminar
pythonProcess.on('close', (code) => {
if (code === 0) {
// Processo terminou com sucesso
// Procurar o nome do diretório da história gerada na saída
const directoryMatch = output.match(/Saving to directory: (comic_\d+)/);
if (directoryMatch) {
const directory = directoryMatch[1];
// Gerar o visualizador HTML
const viewerProcess = spawn('python3', ['comic_viewer.py', directory], {
cwd: process.cwd()
});
viewerProcess.on('close', (viewerCode) => {
if (viewerCode === 0) {
// Retornar sucesso com o diretório da história gerada
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
success: true,
directory: directory,
message: 'História em quadrinhos gerada com sucesso!'
}));
} else {
// Erro ao gerar o visualizador
res.writeHead(500, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
success: false,
error: 'Erro ao gerar o visualizador HTML',
details: errorOutput
}));
}
});
} else {
// Não foi possível encontrar o diretório da história gerada
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 {
// Processo terminou com erro
res.writeHead(500, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
success: false,
error: 'Erro ao gerar a história em quadrinhos',
details: errorOutput
}));
}
});
}
// Criar o servidor
const server = http.createServer((req, res) => {
console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);
// Endpoint para gerar histórias em quadrinhos
if (req.method === 'POST' && req.url === '/api/generate-comic') {
let body = '';
// Coletar os dados da requisição
req.on('data', chunk => {
body += chunk.toString();
});
// Processar a requisição quando todos os dados forem recebidos
req.on('end', () => {
try {
const data = JSON.parse(body);
const { theme, title } = data;
// Validar os dados
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;
}
// Gerar a história em quadrinhos
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;
}
// Determinar o tipo de conteúdo com base na extensão do arquivo
const extname = path.extname(req.url);
const contentType = MIME_TYPES[extname] || 'text/html';
// Servir o arquivo solicitado
serveStaticFile(res, req.url, contentType);
});
// Iniciar o servidor
server.listen(PORT, () => {
console.log(`Servidor HD French Comic Generator rodando em http://localhost:${PORT}`);
console.log('Pressione Ctrl+C para parar o servidor');
});
|