diff --git a/endpoints/audio.js b/endpoints/audio.js new file mode 100644 index 0000000..2636e53 --- /dev/null +++ b/endpoints/audio.js @@ -0,0 +1,105 @@ +var parameters = require('../helpers/parameters'); +var properties = require('../helpers/properties'); +var files = require('../helpers/files'); +var core = require('../helpers/core'); + +var uuid = require('node-uuid'); +var mkdirp = require('mkdirp'); +var async = require('async'); + +function init(req, res) { + res.set("Content-Type", "application/json"); + + /* Verifica se os paramêtros [transparencia, texto] possuem algum valor */ + if (req.body.transparencia === '') { + res.send(500, parameters.errorMessage('O valor de algum parâmetro está vazio')); + return; + } + + /* Verifica se o paramêtro transparencia possui os seus únicos valores possíveis */ + if (parameters.checkTransparency(req.body.transparencia) === false) { + res.send(500, parameters.errorMessage('Parâmetros insuficientes ou inválidos')); + return; + } + + process(req, res); +}; + +function process(req, res) { + var id = uuid.v4(); + var folder = properties.uploads_folder + id; + var locals = {}; + + async.series([ + // Cria a pasta apropriada + function(callback) { + console.log("== Criando pasta " + folder); + + mkdirp(folder, function(err) { + var error; + + if (err) { error = "Erro na criação da pasta com o id: " + id + "; " + err; } + + callback(error); + }); + }, + + // Baixa e move os arquivos para a pasta correta + function(callback) { + console.log("== Baixando os arquivos"); + + downloadAndMoveFiles(folder, req, locals, callback); + }, + + // Chama o core + function(callback) { + console.log("== Chamando o core"); + + // Faz a chamada ao core + try { + callCore(id, locals.audio, req, res); + callback(); + } catch (err) { + callback(err); + } + } + ], function(err) { + // Se tiver erro + if (err) { + res.send(500, parameters.errorMessage(err)); + + return; + } + }); +} + + +function downloadAndMoveFiles(folder, req, locals, callback) { + async.parallel([ + // Download audio + function(callback) { + files.downloadAndMoveAudio(folder, req, locals, callback); + } + ], function(err) { + console.log("=== audio baixado"); + + // Callback chamado depois de todas as tarefas + // Se tiver erro, vai passar para cima + callback(err); + }); +} + + +function callCore(id, audio, req, res) { + + /* Cria a linha de comando */ + /* slice(2) é para transformar ./path em path */ + var command_line = 'vlibras_user/vlibras-core/./vlibras ' + parameters.getServiceType(req.body.servico) + ' ' + + audio.path.slice(2) + ' ' + parameters.getTransparency(req.body.transparencia) + ' ' + id + ' > /tmp/core_log 2>&1'; + + console.log("=== Core: " + command_line); + + core.call(id, command_line, req, res); +}; + +module.exports.init = init; diff --git a/helpers/core.js b/helpers/core.js index 8bde42c..0ad7a14 100644 --- a/helpers/core.js +++ b/helpers/core.js @@ -27,7 +27,7 @@ function call(id, command_line, req, res) { } // Se o core executou normal - res.send(200, { 'response' : 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.flv', 'id' : id }); + res.send(200, { 'response' : 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.mp4'}); }); // Se a chamada deu erro diff --git a/helpers/files.js b/helpers/files.js index b619d40..e6fb466 100644 --- a/helpers/files.js +++ b/helpers/files.js @@ -175,5 +175,88 @@ function downloadAndMoveSubtitle(folder, req, locals, callback) { } } +function downloadAndMoveAudio(folder, req, locals, callback) { + + // Se enviou o arquivo na requisição + if (req.files.audio !== undefined) { + + // Se a validação falhar + if (parameters.checkAudio(req.files.audio.name) === false) { + var error = 'Áudio enviado com extensão inválida'; + return callback(error); + } + + /* Move o áudio submetido para a pasta com o seu ID correspondente */ + try { + fs.renameSync(req.files.audio.path, folder + '/' + req.files.audio.name); + } catch (err) { + callback("Erro ao mover o áudio submetido: " + err); + } + + // Se não, retorna o áudio enviado + locals.audio = { + 'path': folder + '/' + req.files.audio.name + } + + return callback(); + + // Se o arquivo não foi enviado, mas um audio_url foi + } else if (req.body.audio_url !== undefined) { + + // Requisição para baixar o vídeo + http.get(req.body.audio_url, function(response) { + + // Se o áudio não foi baixado com sucesso + if (response.statusCode !== 200) { + var error = 'Problema ao carregar audio_url: status ' + response.statusCode; + return callback(error); + } + + // Nome do arquivo + var filename = req.body.audio_url.substring(req.body.audio_url.lastIndexOf('/') + 1); + + // Tira os parâmetros HTTP + if (filename.lastIndexOf("?") !== -1) { + filename = filename.substring(0, filename.lastIndexOf("?")); + } + + var path = folder + '/' + filename; + + // Cria o stream para escrita + var file = fs.createWriteStream(path); + + // Salva o arquivo em disco + response.pipe(file); + + // Quando a escrita acabar + file.on('finish', function() { + + // Fecha o arquivo + file.close(function() { + + // Retorna o áudio baixado + locals.audio = { + 'path': path + } + + // Chama o callback para prosseguir execução + callback(); + }); + }); + + // Se deu erro na requisição de baixar o áudio + }).on('error', function(e) { + var error = 'Problema ao carregar audio_url: ' + e.message; + return callback(error); + }); + + // Se nem o áudio foi enviado e nem o audio_url foi preenchido + } else { + var error = "Áudio deve ser enviado como parâmetro 'audio' ou como 'audio_url'"; + return callback(error); + } +} + module.exports.downloadAndMoveVideo = downloadAndMoveVideo; -module.exports.downloadAndMoveSubtitle = downloadAndMoveSubtitle; \ No newline at end of file +module.exports.downloadAndMoveSubtitle = downloadAndMoveSubtitle; +module.exports.downloadAndMoveAudio = downloadAndMoveAudio; \ No newline at end of file diff --git a/helpers/parameters.js b/helpers/parameters.js index df89d14..3e86726 100644 --- a/helpers/parameters.js +++ b/helpers/parameters.js @@ -1,5 +1,5 @@ function getServiceType(service_type) { - switch(service_type) { + switch(service_type) { case 'video-legenda': return 2; break; @@ -19,6 +19,9 @@ function getServiceType(service_type) { case 'legenda': return 5; break; + case 'audio': + return 6; + break; } }; @@ -152,6 +155,11 @@ function checkSubtitle(file) { return check_type(file, accepted_file_types) }; +function checkAudio(file) { + var accepted_file_types = ['mp3', 'wav']; + return check_type(file, accepted_file_types) +}; + function check_type(file, accepted_file_types) { var ext = file.substring(file.lastIndexOf('.') + 1).toLowerCase(); @@ -189,5 +197,6 @@ module.exports.checkTransparency = checkTransparency; module.exports.checkVideo = checkVideo; module.exports.checkSubtitle = checkSubtitle; +module.exports.checkAudio = checkAudio; module.exports.errorMessage = errorMessage; \ No newline at end of file diff --git a/helpers/properties.js b/helpers/properties.js index 11fe1ca..fccc906 100644 --- a/helpers/properties.js +++ b/helpers/properties.js @@ -1,6 +1,5 @@ var host = '0.0.0.0'; var port = 5000; -var SERVER_IP = '150.165.204.30'; var uploads_folder = './uploads/'; var ip = require('ip'); diff --git a/server.js b/server.js index 4be7a3f..7e3b3c4 100644 --- a/server.js +++ b/server.js @@ -4,6 +4,7 @@ var properties = require('./helpers/properties'); var ep_texto = require('./endpoints/texto'); var ep_ios = require('./endpoints/ios'); var ep_video = require('./endpoints/video'); +var ep_audio = require('./endpoints/audio'); var ep_legenda = require('./endpoints/legenda'); var ep_video_legenda = require('./endpoints/video_legenda'); @@ -43,6 +44,11 @@ app.post('/api', function(req, res) { ep_video.init(req, res); break; + /* Tipo de Serviço: Só o Áudio */ + case 'audio': + ep_audio.init(req, res); + break; + /* Tipo de Serviço: Só a Legenda */ case 'legenda': ep_legenda.init(req, res); -- libgit2 0.21.2