diff --git a/Makefile b/Makefile index 28f9202..3320046 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,11 @@ install: - @npm install - @sudo npm install -g forever + @read -p "Você deseja instalar o módulo Forever? (y/n) " choice; \ + if [ "$$choice" = "y" ]; then \ + sudo npm install -g forever; \ + npm install; \ + else \ + npm install; \ + fi run: @forever start server.js diff --git a/helpers/parameters.js b/helpers/parameters.js index 9a09224..c69cc3b 100644 --- a/helpers/parameters.js +++ b/helpers/parameters.js @@ -1,13 +1,65 @@ -function service_type(parameter) { - switch(parameter) { +function getServiceType(service_type) { + switch(service_type) { + case "video": + return 3; + break; + case "texto": return 4; break; } }; -function transparency(parameter) { - switch(parameter) { +function getLanguage(language) { + switch(language) { + case "portugues": + return 1; + break; + + case "glosa": + return 2; + break; + } +}; + +function getPosition(position) { + switch(position) { + case "superior-esquerdo": + return 1; + break; + + case "superior-direito": + return 2; + break; + + case "inferior-direito": + return 3; + break; + + case "inferior-esquerdo": + return 4; + break; + } +}; + +function getSize(size) { + switch(size) { + case "pequeno": + return 1; + break; + + case "medio": + return 2; + break; + + case "grande": + return 3; + break; + } +}; + +function getTransparency(transparency) { + switch(transparency) { case "opaco": return 0; break; @@ -18,7 +70,63 @@ function transparency(parameter) { } }; -function verifyTransparency(transparency) { +function checkServiceType(service_type) { + var t_types = ["video", "texto"]; + + for (var i = 0; i < t_types.length; i++){ + if (service_type === t_types[i]) { + return true; + } + + if ((i + 1) === t_types.length) { + return false; + } + } +}; + +function checkLanguage(language) { + var t_types = ["portugues", "glosa"]; + + for (var i = 0; i < t_types.length; i++){ + if (language === t_types[i]) { + return true; + } + + if ((i + 1) === t_types.length) { + return false; + } + } +}; + +function checkPosition(position) { + var t_types = ["superior-esquerdo", "superior-direito", "inferior-esquerdo", "inferior-direito"]; + + for (var i = 0; i < t_types.length; i++){ + if (position === t_types[i]) { + return true; + } + + if ((i + 1) === t_types.length) { + return false; + } + } +}; + +function checkSize(size) { + var t_types = ["pequeno", "medio", "grande"]; + + for (var i = 0; i < t_types.length; i++){ + if (size === t_types[i]) { + return true; + } + + if ((i + 1) === t_types.length) { + return false; + } + } +}; + +function checkTransparency(transparency) { var t_types = ["opaco", "transparente"]; for (var i = 0; i < t_types.length; i++){ @@ -32,6 +140,54 @@ function verifyTransparency(transparency) { } }; -module.exports.service_type = service_type; -module.exports.transparency = transparency; -module.exports.verifyTransparency = verifyTransparency; +function errorMessage(message) { + return { "error": message } +}; + +function checkVideo(file) { + var accepted_file_types = ["flv", "ts", "avi", "mp4", "mov", "webm", "wmv", "mkv",]; + return check_type(file, accepted_file_types) +}; + +function checkSubtitle(file) { + var accepted_file_types = ["srt"]; + return check_type(file, accepted_file_types) +}; + +function check_type(file, accepted_file_types) { + + console.log(file); + + var ext = file.substring(file.lastIndexOf('.') + 1).toLowerCase(); + var isValidFile = false; + + for (var i = 0; i < accepted_file_types.length; i++) { + if (ext == accepted_file_types[i]) { + isValidFile = true; + break; + } + } + + if (!isValidFile) { + file.value = null; + } + + return isValidFile; +}; + +module.exports.getServiceType = getServiceType; +module.exports.getLanguage = getLanguage; +module.exports.getPosition = getPosition; +module.exports.getSize = getSize; +module.exports.getTransparency = getTransparency; + +module.exports.checkServiceType = checkServiceType; +module.exports.checkLanguage = checkLanguage; +module.exports.checkPosition = checkPosition; +module.exports.checkSize = checkSize; +module.exports.checkTransparency = checkTransparency; + +module.exports.checkVideo = checkVideo; +module.exports.checkSubtitle = checkSubtitle; + +module.exports.errorMessage = errorMessage; \ No newline at end of file diff --git a/server.js b/server.js index 5b99c87..8ef34d1 100644 --- a/server.js +++ b/server.js @@ -1,5 +1,7 @@ var parameters = require('./helpers/parameters'); var exec = require('child_process').exec, child; +var path = require('path'); +var fs = require('fs'); var express = require("express"); var host = '0.0.0.0'; @@ -7,10 +9,11 @@ var port = 5000; var app = express(); -var ID_FROM_BD = 0; +var ID_FROM_BD = 1; var SERVER_IP = "150.165.204.30"; -app.use(express.static(__dirname + "/videos")); +app.use(express.static(path.join(__dirname, "/videos"))); +app.use(express.bodyParser({ keepExtensions: true, uploadDir: path.join(__dirname, '/uploads') })); app.get("/", function(req, res){ res.send(200, "

Server " + host + ":" + port + " is running

"); @@ -18,42 +21,96 @@ app.get("/", function(req, res){ app.post("/api", function(req, res){ - ID_FROM_BD++; - + /* Verifica se o paramêtro [servico] possui algum valor */ if (req.query.servico !== "") { + /* Verifica qual é o Tipo de Serviço fornecido */ switch(req.query.servico) { + /* Case para o Tipo de Serviço: Texto */ case "texto": + /* Verifica se os paramêtros [transparencia, texto] possuem algum valor */ if ((req.query.transparencia !== "") && (req.query.texto !== "")) { + /* Verifica se o paramêtro [transparencia] possui os únicos valores possíveis [opaco, transparente] */ + if (parameters.getTransparency(req.query.transparencia)) { + /* Cria a linha de comando */ + var command_line = "echo " + req.query.texto + " >> " + __dirname + "/text_files/" + ID_FROM_BD + " && cd ../vlibras-core" + + " && ./gtaaas " + parameters.getServiceType(req.query.servico) + " ../vlibras-api/text_files/" + + ID_FROM_BD + " " + parameters.getTransparency(req.query.transparencia) + " " + ID_FROM_BD + " WEB"; - if (parameters.verifyTransparency(req.query.transparencia)) { - child = exec("echo " + req.query.texto + " >> " + __dirname + "/text_files/" + ID_FROM_BD + - " && cd ../vlibras-core" + - " && ./gtaaas " + parameters.service_type(req.query.servico) + " ../vlibras-api/text_files/" + - ID_FROM_BD + " " + parameters.transparency(req.query.transparencia) + " " + ID_FROM_BD + " WEB", function(err, stdout, stderr) { - // [stdout] = vlibras-core output - }); + /* Executa a linha de comando */ + child = exec(command_line, function(err, stdout, stderr) { + // [stdout] = vlibras-core output + // console.log(stdout); + }); + /* Listener que dispara quando a requisição ao core finaliza */ child.on("close", function(code, signal){ res.send(200, { "response" : "http://" + SERVER_IP + ":" + port + "/" + ID_FROM_BD + ".webm" }); + ID_FROM_BD++; }); + } else { + res.send(500, parameters.errorMessage('Parâmetros insuficientes ou inválidos')); + } + } else { + res.send(500, parameters.errorMessage('O valor de algum parâmetro está vazio')); + } + break; + case 'video': + + /* Verifica se os paramêtros [transparencia, texto] possuem algum valor */ + if ((req.query.posicao !== "") && (req.query.tamanho !== "") && (req.query.transparencia !== "")) { + /* Verifica se os paramêtros [linguagem, posicao, tamanho, transparencia] possuem os seus únicos valores possíveis */ + if ((parameters.checkPosition(req.query.posicao) === true) && (parameters.checkSize(req.query.tamanho) === true) && (parameters.checkTransparency(req.query.transparencia) === true)) { + /* Checa se o arquivo de vídeo submetivo possui uma extensão válida */ + if (parameters.checkVideo(req.files.video.name)) { + /* Cria uma pasta cujo o nome é o ID */ + child = exec('mkdir ' + __dirname + '/uploads/' + ID_FROM_BD); + + /* Listener que dispara quando a pasta é criada */ + child.on('close', function(code, signal){ + /* Move o vídeo submetido para a pasta com o seu ID correspondente */ + fs.rename(req.files.video.path, __dirname + '/uploads/' + ID_FROM_BD + '/' + req.files.video.name, function(error) { + if (error) { console.log(error); } + }); + + /* Cria a linha de comando */ + var command_line = "cd ../vlibras-core && ./gtaaas " + parameters.getServiceType(req.query.servico) + " ../vlibras-api/uploads/" + ID_FROM_BD + "/" + + req.files.video.name + " 1 " + parameters.getPosition(req.query.posicao) + " " + parameters.getSize(req.query.tamanho) + " " + + parameters.getTransparency(req.query.transparencia) + " " + ID_FROM_BD; + + /* Executa a linha de comando */ + child = exec(command_line, function(err, stdout, stderr) { + // [stdout] = vlibras-core output + // console.log(stdout); + }); + + /* Listener que dispara quando a requisição ao core finaliza */ + child.on("close", function(code, signal){ + res.send(200, { "response" : "http://" + SERVER_IP + ":" + port + "/" + ID_FROM_BD + ".flv" }); + }); + }); + } else { + res.send(500, parameters.errorMessage('Vídeo com Extensão Inválida')); + } } else { - res.send(500, "

Valor de Transparência Inválido

"); + res.send(500, parameters.errorMessage('Parâmetros insuficientes ou inválidos')); } } else { - res.send(500, "

Parâmetro Vazio

"); + res.send(500, parameters.errorMessage('O valor de algum parâmetro está vazio')); } break; + /* Case para um Tipo de Serviço inválido */ default: - res.send(500, "

Tipo de Serviço Inválido

"); + res.send(500, parameters.errorMessage('Tipo do serviço inválido')); break; } } else { - res.send(500, "

Especifique o Tipo de Serviço

"); + res.send(500, parameters.errorMessage('Especifique o tipo do serviço')); } + }); app.listen(port, host, function(){ - console.log("Server running on " + host + ":" + port); + console.log('Server running on ' + host + ':' + port); }); diff --git a/uploads/.gitempty b/uploads/.gitempty new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/uploads/.gitempty -- libgit2 0.21.2