Commit f729bf45a7bdbdb69520b1947a5fe1152f29b9d0

Authored by Cassio Cabral
2 parents abb9e9f6 e63322c4
Exists in master and in 1 other branch devel

Merge branch 'devel' of git.lavid.ufpb.br:vlibras-api into devel

.gitignore 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +.DS_Store
  2 +node_modules
  3 +text_files/*
  4 +uploads/*
  5 +videos/*
  6 +!videos/plugin/
  7 +vlibras_user
  8 +npm-debug.log
  9 +tmp/
... ...
Makefile 0 → 100644
... ... @@ -0,0 +1,30 @@
  1 +install:
  2 + @read -p "Você deseja instalar o módulo Forever? (y/n) " choice; \
  3 + if [ "$$choice" = "y" ]; then \
  4 + sudo npm install -g forever; \
  5 + npm install; \
  6 + ln -s $$HOME vlibras_user \
  7 + else \
  8 + ln -s $$HOME vlibras_user \
  9 + npm install; \
  10 + fi
  11 +
  12 +sym_link:
  13 + @ln -s $$HOME vlibras_user
  14 +
  15 +run:
  16 + @forever start server.js
  17 +
  18 +node: clean
  19 + @node server.js
  20 +
  21 +stop:
  22 + @forever stop server.js
  23 +
  24 +list:
  25 + @forever list
  26 +
  27 +clean:
  28 + @rm -f text_files/*
  29 + @rm -f videos/*
  30 + @rm -rf uploads/*
... ...
README 0 → 100644
... ... @@ -0,0 +1,3 @@
  1 +$ node install
  2 +
  3 +$ nodemon
0 4 \ No newline at end of file
... ...
endpoints/audio.js 0 → 100644
... ... @@ -0,0 +1,105 @@
  1 +var parameters = require('../helpers/parameters');
  2 +var properties = require('../helpers/properties');
  3 +var files = require('../helpers/files');
  4 +var core = require('../helpers/core');
  5 +
  6 +var uuid = require('node-uuid');
  7 +var mkdirp = require('mkdirp');
  8 +var async = require('async');
  9 +
  10 +function init(req, res) {
  11 + res.set("Content-Type", "application/json");
  12 +
  13 + /* Verifica se os paramêtros [transparencia, texto] possuem algum valor */
  14 + if (req.body.transparencia === '') {
  15 + res.send(500, parameters.errorMessage('O valor de algum parâmetro está vazio'));
  16 + return;
  17 + }
  18 +
  19 + /* Verifica se o paramêtro transparencia possui os seus únicos valores possíveis */
  20 + if (parameters.checkTransparency(req.body.transparencia) === false) {
  21 + res.send(500, parameters.errorMessage('Parâmetros insuficientes ou inválidos'));
  22 + return;
  23 + }
  24 +
  25 + process(req, res);
  26 +};
  27 +
  28 +function process(req, res) {
  29 + var id = uuid.v4();
  30 + var folder = properties.uploads_folder + id;
  31 + var locals = {};
  32 +
  33 + async.series([
  34 + // Cria a pasta apropriada
  35 + function(callback) {
  36 + console.log("== Criando pasta " + folder);
  37 +
  38 + mkdirp(folder, function(err) {
  39 + var error;
  40 +
  41 + if (err) { error = "Erro na criação da pasta com o id: " + id + "; " + err; }
  42 +
  43 + callback(error);
  44 + });
  45 + },
  46 +
  47 + // Baixa e move os arquivos para a pasta correta
  48 + function(callback) {
  49 + console.log("== Baixando os arquivos");
  50 +
  51 + downloadAndMoveFiles(folder, req, locals, callback);
  52 + },
  53 +
  54 + // Chama o core
  55 + function(callback) {
  56 + console.log("== Chamando o core");
  57 +
  58 + // Faz a chamada ao core
  59 + try {
  60 + callCore(id, locals.audio, req, res);
  61 + callback();
  62 + } catch (err) {
  63 + callback(err);
  64 + }
  65 + }
  66 + ], function(err) {
  67 + // Se tiver erro
  68 + if (err) {
  69 + res.send(500, parameters.errorMessage(err));
  70 +
  71 + return;
  72 + }
  73 + });
  74 +}
  75 +
  76 +
  77 +function downloadAndMoveFiles(folder, req, locals, callback) {
  78 + async.parallel([
  79 + // Download audio
  80 + function(callback) {
  81 + files.downloadAndMoveAudio(folder, req, locals, callback);
  82 + }
  83 + ], function(err) {
  84 + console.log("=== audio baixado");
  85 +
  86 + // Callback chamado depois de todas as tarefas
  87 + // Se tiver erro, vai passar para cima
  88 + callback(err);
  89 + });
  90 +}
  91 +
  92 +
  93 +function callCore(id, audio, req, res) {
  94 +
  95 + /* Cria a linha de comando */
  96 + /* slice(2) é para transformar ./path em path */
  97 + var command_line = 'vlibras_user/vlibras-core/./vlibras ' + parameters.getServiceType(req.body.servico) + ' ' +
  98 + audio.path.slice(2) + ' ' + parameters.getTransparency(req.body.transparencia) + ' ' + id + ' > /tmp/core_log 2>&1';
  99 +
  100 + console.log("=== Core: " + command_line);
  101 +
  102 + core.call(id, command_line, req, res);
  103 +};
  104 +
  105 +module.exports.init = init;
... ...
endpoints/ios.js 0 → 100644
... ... @@ -0,0 +1,46 @@
  1 +var parameters = require('../helpers/parameters');
  2 +var properties = require('../helpers/properties');
  3 +
  4 +var exec = require('child_process').exec, child;
  5 +var uuid = require('node-uuid');
  6 +var fs = require('fs');
  7 +
  8 +function init(req, res) {
  9 +
  10 + var id = uuid.v4();
  11 +
  12 + /* Verifica se os paramêtros [transparencia, texto] possuem algum valor */
  13 + if ((req.body.transparencia === '') || (req.body.texto === '')) {
  14 + res.send(500, parameters.errorMessage('O valor de algum parâmetro está vazio'));
  15 + return;
  16 + }
  17 +
  18 + /* Verifica se o paramêtro [transparencia] possui os únicos valores possíveis [opaco, transparente] */
  19 + if (parameters.checkTransparency(req.body.transparencia) === false) {
  20 + res.send(500, parameters.errorMessage('Parâmetros insuficientes ou inválidos'));
  21 + return;
  22 + }
  23 +
  24 + /* Cria a linha de comando */
  25 + var command_line = 'echo ' + req.body.texto + ' >> text_files/' + id + ' && mkdir uploads/' + id + ' && vlibras_user/vlibras-core/./vlibras ' + parameters.getServiceType(req.body.servico) + ' text_files/' +
  26 + id + ' ' + parameters.getTransparency(req.body.transparencia) + ' ' + id + ' IOS > /tmp/core_log 2>&1';
  27 +
  28 + console.log(command_line)
  29 +
  30 + /* Executa a linha de comando */
  31 + child = exec(command_line, function(err, stdout, stderr) {
  32 + // [stdout] = vlibras-core output
  33 + });
  34 +
  35 + /* Listener que dispara quando a requisição ao core finaliza */
  36 + child.on('close', function(code, signal){
  37 + res.send(200, { 'response' : 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.mp4' });
  38 + });
  39 +
  40 + /* Listener que dispara quando a requisição ao core da erro */
  41 + child.on('error', function(code, signal){
  42 + res.send(500, parameters.errorMessage('Erro na chamada ao core'));
  43 + });
  44 +};
  45 +
  46 +module.exports.init = init;
... ...
endpoints/legenda.js 0 → 100644
... ... @@ -0,0 +1,62 @@
  1 +var parameters = require('../helpers/parameters');
  2 +var properties = require('../helpers/properties');
  3 +
  4 +var exec = require('child_process').exec, child;
  5 +var uuid = require('node-uuid');
  6 +var fs = require('fs');
  7 +
  8 +function init(req, res) {
  9 +
  10 + var id = uuid.v4();
  11 +
  12 + /* Verifica se o paramêtro [transparencia] possue algum valor */
  13 + if (req.body.transparencia !== '') {
  14 + res.send(500, parameters.errorMessage('O valor de algum parâmetro está vazio'));
  15 + return;
  16 + }
  17 +
  18 + /* Verifica se os paramêtros [transparencia] possuem os seus únicos valores possíveis */
  19 + if ((parameters.checkTransparency(req.body.transparencia) === true)) {
  20 + res.send(500, parameters.errorMessage('Parâmetros insuficientes ou inválidos'));
  21 + return;
  22 + }
  23 +
  24 + /* Checa se o arquivo de legenda submetivo possui uma extensão válida */
  25 + if (parameters.checkSubtitle(req.files.legenda.name)) {
  26 + res.send(500, parameters.errorMessage('Legenda com Extensão Inválida'));
  27 + return;
  28 + }
  29 +
  30 + /* Cria uma pasta cujo o nome é o ID */
  31 + child = exec('mkdir ' + __dirname + '/uploads/' + id);
  32 +
  33 + /* Listener que dispara quando a pasta é criada */
  34 + child.on('close', function(code, signal){
  35 + /* Move a legenda submetido para a pasta com o seu ID correspondente */
  36 + fs.rename(req.files.legenda.path, __dirname + '/uploads/' + id + '/' + req.files.legenda.name, function(error) {
  37 + if (error) { console.log(error); }
  38 + });
  39 +
  40 + /* Cria a linha de comando */
  41 + var command_line = 'vlibras_user/vlibras-core/./vlibras ' + parameters.getServiceType(req.body.servico) + ' uploads/' + id + '/' +
  42 + req.files.legenda.name + ' ' + parameters.getTransparency(req.body.transparencia) + ' ' + id;
  43 +
  44 + /* Executa a linha de comando */
  45 + child = exec(command_line, function(err, stdout, stderr) {
  46 + // [stdout] = vlibras-core output
  47 + // console.log(stdout);
  48 + });
  49 +
  50 + /* Listener que dispara quando a requisição ao core finaliza */
  51 + child.on('close', function(code, signal){
  52 + res.send(200, { 'response' : 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.flv' });
  53 + });
  54 +
  55 + /* Listener que dispara quando a requisição ao core da erro */
  56 + child.on('error', function(code, signal){
  57 + res.send(500, parameters.errorMessage('Erro na chamada ao core'));
  58 + });
  59 + });
  60 +};
  61 +
  62 +module.exports.init = init;
0 63 \ No newline at end of file
... ...
endpoints/texto.js 0 → 100644
... ... @@ -0,0 +1,46 @@
  1 +var parameters = require('../helpers/parameters');
  2 +var properties = require('../helpers/properties');
  3 +
  4 +var exec = require('child_process').exec, child;
  5 +var uuid = require('node-uuid');
  6 +var fs = require('fs');
  7 +
  8 +function init(req, res) {
  9 +
  10 + var id = uuid.v4();
  11 +
  12 + /* Verifica se os paramêtros [transparencia, texto] possuem algum valor */
  13 + if ((req.body.transparencia === '') || (req.body.texto === '')) {
  14 + res.send(500, parameters.errorMessage('O valor de algum parâmetro está vazio'));
  15 + return;
  16 + }
  17 +
  18 + /* Verifica se o paramêtro [transparencia] possui os únicos valores possíveis [opaco, transparente] */
  19 + if (parameters.checkTransparency(req.body.transparencia) === false) {
  20 + res.send(500, parameters.errorMessage('Parâmetros insuficientes ou inválidos'));
  21 + return;
  22 + }
  23 +
  24 + /* Cria a linha de comando */
  25 + var command_line = 'echo ' + req.body.texto + ' >> text_files/' + id + ' && mkdir uploads/' + id + ' && vlibras_user/vlibras-core/./vlibras ' + parameters.getServiceType(req.body.servico) + ' text_files/' +
  26 + id + ' ' + parameters.getTransparency(req.body.transparencia) + ' ' + id + ' WEB > /tmp/core_log 2>&1';
  27 +
  28 + console.log(command_line)
  29 +
  30 + /* Executa a linha de comando */
  31 + child = exec(command_line, function(err, stdout, stderr) {
  32 + // [stdout] = vlibras-core output
  33 + });
  34 +
  35 + /* Listener que dispara quando a requisição ao core finaliza */
  36 + child.on('close', function(code, signal){
  37 + res.send(200, { 'response' : 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.webm' });
  38 + });
  39 +
  40 + /* Listener que dispara quando a requisição ao core da erro */
  41 + child.on('error', function(code, signal){
  42 + res.send(500, parameters.errorMessage('Erro na chamada ao core'));
  43 + });
  44 +};
  45 +
  46 +module.exports.init = init;
... ...
endpoints/video.js 0 → 100644
... ... @@ -0,0 +1,106 @@
  1 +var parameters = require('../helpers/parameters');
  2 +var properties = require('../helpers/properties');
  3 +var files = require('../helpers/files');
  4 +var core = require('../helpers/core');
  5 +
  6 +var uuid = require('node-uuid');
  7 +var mkdirp = require('mkdirp');
  8 +var async = require('async');
  9 +
  10 +function init(req, res) {
  11 + res.set("Content-Type", "application/json");
  12 +
  13 + /* Verifica se os paramêtros [transparencia, texto] possuem algum valor */
  14 + if ((req.body.posicao === '') || (req.body.tamanho === '') || (req.body.transparencia === '')) {
  15 + res.send(500, parameters.errorMessage('O valor de algum parâmetro está vazio'));
  16 + return;
  17 + }
  18 +
  19 + /* Verifica se os paramêtros [linguagem, posicao, tamanho, transparencia] possuem os seus únicos valores possíveis */
  20 + if ((parameters.checkPosition(req.body.posicao) === false) || (parameters.checkSize(req.body.tamanho) === false) || (parameters.checkTransparency(req.body.transparencia) === false)) {
  21 + res.send(500, parameters.errorMessage('Parâmetros insuficientes ou inválidos'));
  22 + return;
  23 + }
  24 +
  25 + process(req, res);
  26 +};
  27 +
  28 +function process(req, res) {
  29 + var id = uuid.v4();
  30 + var folder = properties.uploads_folder + id;
  31 + var locals = {};
  32 +
  33 + async.series([
  34 + // Cria a pasta apropriada
  35 + function(callback) {
  36 + console.log("== Criando pasta " + folder);
  37 +
  38 + mkdirp(folder, function(err) {
  39 + var error;
  40 +
  41 + if (err) { error = "Erro na criação da pasta com o id: " + id + "; " + err; }
  42 +
  43 + callback(error);
  44 + });
  45 + },
  46 +
  47 + // Baixa e move os arquivos para a pasta correta
  48 + function(callback) {
  49 + console.log("== Baixando os arquivos");
  50 +
  51 + downloadAndMoveFiles(folder, req, locals, callback);
  52 + },
  53 +
  54 + // Chama o core
  55 + function(callback) {
  56 + console.log("== Chamando o core");
  57 +
  58 + // Faz a chamada ao core
  59 + try {
  60 + callCore(id, locals.video, locals.subtitle, req, res);
  61 + callback();
  62 + } catch (err) {
  63 + callback(err);
  64 + }
  65 + }
  66 + ], function(err) {
  67 + // Se tiver erro
  68 + if (err) {
  69 + res.send(500, parameters.errorMessage(err));
  70 +
  71 + return;
  72 + }
  73 + });
  74 +}
  75 +
  76 +
  77 +function downloadAndMoveFiles(folder, req, locals, callback) {
  78 + async.parallel([
  79 + // Download video
  80 + function(callback) {
  81 + files.downloadAndMoveVideo(folder, req, locals, callback);
  82 + }
  83 + ], function(err) {
  84 + console.log("=== Video baixado");
  85 +
  86 + // Callback chamado depois de todas as tarefas
  87 + // Se tiver erro, vai passar para cima
  88 + callback(err);
  89 + });
  90 +}
  91 +
  92 +
  93 +function callCore(id, video, subtitle, req, res) {
  94 +
  95 + /* Cria a linha de comando */
  96 + /* slice(2) é para transformar ./path em path */
  97 + var command_line = 'vlibras_user/vlibras-core/./vlibras ' + parameters.getServiceType(req.body.servico) + ' ' +
  98 + video.path.slice(2) + ' 1 ' + parameters.getPosition(req.body.posicao) + ' ' + parameters.getSize(req.body.tamanho) + ' ' +
  99 + parameters.getTransparency(req.body.transparencia) + ' ' + id + ' > /tmp/core_log 2>&1';
  100 +
  101 + console.log("=== Core: " + command_line);
  102 +
  103 + core.call(id, command_line, req, res);
  104 +};
  105 +
  106 +module.exports.init = init;
... ...
endpoints/video_legenda.js 0 → 100644
... ... @@ -0,0 +1,112 @@
  1 +var parameters = require('../helpers/parameters');
  2 +var properties = require('../helpers/properties');
  3 +var files = require('../helpers/files');
  4 +var core = require('../helpers/core');
  5 +
  6 +var uuid = require('node-uuid');
  7 +var mkdirp = require('mkdirp');
  8 +var async = require('async');
  9 +
  10 +function init(req, res) {
  11 + res.set("Content-Type", "application/json");
  12 +
  13 + /* Verifica se os paramêtros [transparencia, texto] possuem algum valor */
  14 + if ((req.body.linguagem === '') || (req.body.posicao === '') || (req.body.tamanho === '') || (req.body.transparencia === '')) {
  15 + res.send(500, parameters.errorMessage('O valor de algum parâmetro está vazio'));
  16 + return;
  17 + }
  18 +
  19 + /* Verifica se os paramêtros [linguagem, posicao, tamanho, transparencia] possuem os seus únicos valores possíveis */
  20 + if ((parameters.checkLanguage(req.body.linguagem) === false) || (parameters.checkPosition(req.body.posicao) === false) || (parameters.checkSize(req.body.tamanho) === false) || (parameters.checkTransparency(req.body.transparencia) === false)) {
  21 + res.send(500, parameters.errorMessage('Parâmetros insuficientes ou inválidos'));
  22 + return;
  23 + }
  24 +
  25 + process(req, res);
  26 +};
  27 +
  28 +function process(req, res) {
  29 + var id = uuid.v4();
  30 + var folder = properties.uploads_folder + id;
  31 + var locals = {};
  32 +
  33 + async.series([
  34 + // Cria a pasta apropriada
  35 + function(callback) {
  36 + console.log("== Criando pasta " + folder);
  37 +
  38 + mkdirp(folder, function(err) {
  39 + var error;
  40 +
  41 + if (err) { error = "Erro na criação da pasta com o id: " + id + "; " + err; }
  42 +
  43 + callback(error);
  44 + });
  45 + },
  46 +
  47 + // Baixa e move os arquivos para a pasta correta
  48 + function(callback) {
  49 + console.log("== Baixando os arquivos");
  50 +
  51 + downloadAndMoveFiles(folder, req, locals, callback);
  52 + },
  53 +
  54 + // Chama o core
  55 + function(callback) {
  56 + console.log("== Chamando o core");
  57 +
  58 + // Faz a chamada ao core
  59 + try {
  60 + callCore(id, locals.video, locals.subtitle, req, res);
  61 + callback();
  62 + } catch (err) {
  63 + callback(err);
  64 + }
  65 + }
  66 + ], function(err) {
  67 + // Se tiver erro
  68 + if (err) {
  69 + res.send(500, parameters.errorMessage(err));
  70 +
  71 + return;
  72 + }
  73 + });
  74 +}
  75 +
  76 +
  77 +function downloadAndMoveFiles(folder, req, locals, callback) {
  78 + async.parallel([
  79 + // Download video
  80 + function(callback) {
  81 + files.downloadAndMoveVideo(folder, req, locals, callback);
  82 + },
  83 +
  84 + // Download subtitle
  85 + function(callback) {
  86 + files.downloadAndMoveSubtitle(folder, req, locals, callback);
  87 + }
  88 + ], function(err) {
  89 + console.log("=== Legenda e video baixados");
  90 +
  91 + // Callback chamado depois de todas as tarefas
  92 + // Se tiver erro, vai passar para cima
  93 + callback(err);
  94 + });
  95 +}
  96 +
  97 +
  98 +function callCore(id, video, subtitle, req, res) {
  99 +
  100 + /* Cria a linha de comando */
  101 + /* slice(2) é para transformar ./path em path */
  102 + var command_line = 'vlibras_user/vlibras-core/./vlibras ' + parameters.getServiceType(req.body.servico) + ' ' +
  103 + video.path.slice(2) + ' ' + subtitle.path.slice(2) + ' ' + parameters.getLanguage(req.body.linguagem) +
  104 + ' ' + parameters.getPosition(req.body.posicao) + ' ' + parameters.getSize(req.body.tamanho) + ' ' +
  105 + parameters.getTransparency(req.body.transparencia) + ' ' + id + ' > /tmp/core_log 2>&1';
  106 +
  107 + console.log("=== Core: " + command_line);
  108 +
  109 + core.call(id, command_line, req, res);
  110 +};
  111 +
  112 +module.exports.init = init;
... ...
helpers/core.js 0 → 100644
... ... @@ -0,0 +1,72 @@
  1 +var requests = require('../helpers/requests');
  2 +var properties = require('../helpers/properties');
  3 +
  4 +var url = require('url');
  5 +var http = require('http');
  6 +var querystring = require('querystring');
  7 +var exec = require('child_process').exec, child;
  8 +
  9 +function call(id, command_line, req, res) {
  10 + /* Executa a linha de comando */
  11 + child = exec(command_line, function(err, stdout, stderr) {
  12 + // [stdout] = vlibras-core output
  13 + // console.log('Err: ' + err);
  14 + // console.log('STDOUT: ' + stdout);
  15 + // console.log('STDERR: ' + stderr);
  16 + });
  17 +
  18 + // Se o callback não foi definido
  19 + if (req.body.callback === undefined) {
  20 +
  21 + // Se a chamada foi feita com sucesso
  22 + child.on('close', function(code, signal) {
  23 +
  24 + // Se o core executou com erro
  25 + if (code !== 0) {
  26 + throw "Erro no retorno do core. Código: " + code;
  27 + }
  28 +
  29 + // Se o core executou normal
  30 + res.send(200, { 'response' : 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.mp4'});
  31 + });
  32 +
  33 + // Se a chamada deu erro
  34 + child.on('error', function(code, signal) {
  35 + throw "Erro na chamada ao core";
  36 + });
  37 +
  38 +
  39 + // Se o callback foi definido
  40 + } else {
  41 +
  42 + // Se a chamada foi feita com sucesso
  43 + child.on('close', function(code, signal) {
  44 +
  45 + // Endereço do callback
  46 + var path = url.parse(req.body.callback);
  47 +
  48 + // Se o core executou com erro
  49 + if (code === 0) {
  50 + var data = querystring.stringify({ 'response' : 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.mp4', 'id' : id });
  51 + } else {
  52 + var data = querystring.stringify({ 'error': 'Erro no Core', 'code': code, 'id' : id });
  53 + }
  54 +
  55 + // Chama o callback
  56 + requests.postRequest(path, data);
  57 + });
  58 +
  59 + // Se a chamada deu erro
  60 + child.on('error', function(code, signal) {
  61 + var path = url.parse(req.body.callback);
  62 + var data = querystring.stringify( { 'error': 'Erro na chamada ao core', 'code': code, 'id': id } );
  63 +
  64 + requests.postRequest(path, data);
  65 + });
  66 +
  67 + // Retorno da primeira requisição
  68 + res.send(200, JSON.stringify({ 'id': id }));
  69 + }
  70 +}
  71 +
  72 +module.exports.call = call;
0 73 \ No newline at end of file
... ...
helpers/files.js 0 → 100644
... ... @@ -0,0 +1,262 @@
  1 +var parameters = require('../helpers/parameters');
  2 +
  3 +var http = require('http');
  4 +var fs = require('fs');
  5 +
  6 +/*
  7 +* Função que processa o vídeo (seja baixando, seja pegando o vídeo enviado)
  8 +* Deve retornar um objeto contendo o nome e o caminho
  9 +*/
  10 +function downloadAndMoveVideo(folder, req, locals, callback) {
  11 +
  12 + // Se enviou o arquivo na requisição
  13 + if (req.files.video !== undefined) {
  14 +
  15 + // Se a validação falhar
  16 + if (parameters.checkVideo(req.files.video.name) === false) {
  17 + var error = 'Vídeo enviado com extensão inválida';
  18 + return callback(error);
  19 + }
  20 +
  21 + /* Move o vídeo submetido para a pasta com o seu ID correspondente */
  22 + try {
  23 + fs.renameSync(req.files.video.path, folder + '/' + req.files.video.name);
  24 + } catch (err) {
  25 + callback("Erro ao mover o vídeo submetido: " + err);
  26 + }
  27 +
  28 + // Se não, retorna o vídeo enviado
  29 + locals.video = {
  30 + 'path': folder + '/' + req.files.video.name
  31 + }
  32 +
  33 + return callback();
  34 +
  35 + // Se o arquivo não foi enviado, mas um video_url foi
  36 + } else if (req.body.video_url !== undefined) {
  37 +
  38 + // Requisição para baixar o vídeo
  39 + http.get(req.body.video_url, function(response) {
  40 +
  41 + // Se o vídeo não foi baixado com sucesso
  42 + if (response.statusCode !== 200) {
  43 + var error = 'Problema ao carregar video_url: status ' + response.statusCode;
  44 + return callback(error);
  45 + }
  46 +
  47 + // Nome do arquivo
  48 + var filename = req.body.video_url.substring(req.body.video_url.lastIndexOf('/') + 1);
  49 +
  50 + // Tira os parâmetros HTTP
  51 + if (filename.lastIndexOf("?") !== -1) {
  52 + filename = filename.substring(0, filename.lastIndexOf("?"));
  53 + }
  54 +
  55 + var path = folder + '/' + filename;
  56 +
  57 + // Cria o stream para escrita
  58 + var file = fs.createWriteStream(path);
  59 +
  60 + // Salva o arquivo em disco
  61 + response.pipe(file);
  62 +
  63 + // Quando a escrita acabar
  64 + file.on('finish', function() {
  65 +
  66 + // Fecha o arquivo
  67 + file.close(function() {
  68 +
  69 + // Retorna o vídeo baixado
  70 + locals.video = {
  71 + 'path': path
  72 + }
  73 +
  74 + // Chama o callback para prosseguir execução
  75 + callback();
  76 + });
  77 + });
  78 +
  79 + // Se deu erro na requisição de baixar o vídeo
  80 + }).on('error', function(e) {
  81 + var error = 'Problema ao carregar video_url: ' + e.message;
  82 + return callback(error);
  83 + });
  84 +
  85 + // Se nem o vídeo foi enviado e nem o video_url foi preenchido
  86 + } else {
  87 + var error = "Video deve ser enviado como parâmetro 'video' ou como 'video_url'";
  88 + return callback(error);
  89 + }
  90 +}
  91 +
  92 +/*
  93 +* Função que processa a legenda (seja baixando, seja pegando o vídeo enviado)
  94 +* Deve retornar um objeto contendo o nome e o caminho
  95 +*/
  96 +function downloadAndMoveSubtitle(folder, req, locals, callback) {
  97 +
  98 + // Se enviou o arquivo na requisição
  99 + if (req.files.legenda !== undefined) {
  100 +
  101 + // Se a validação falhar
  102 + if (parameters.checkSubtitle(req.files.legenda.name) === false) {
  103 + var error = 'Legenda enviado com extensão inválida';
  104 + return callback(error);
  105 + }
  106 +
  107 + /* Move o vídeo submetido para a pasta com o seu ID correspondente */
  108 + try {
  109 + fs.renameSync(req.files.legenda.path, folder + '/' + req.files.legenda.name);
  110 + } catch (err) {
  111 + callback("Erro ao mover a legenda submetida: " + err);
  112 + }
  113 +
  114 + // Se não, retorna o vídeo enviado
  115 + locals.subtitle = {
  116 + 'path': folder + '/' + req.files.legenda.name
  117 + }
  118 +
  119 + return callback();
  120 +
  121 + // Se o arquivo não foi enviado, mas um legenda_url foi
  122 + } else if (req.body.legenda_url !== undefined) {
  123 +
  124 + // Requisição para baixar a legenda
  125 + http.get(req.body.legenda_url, function(response) {
  126 +
  127 + // Se a legenda não foi baixado com sucesso
  128 + if (response.statusCode !== 200) {
  129 + var error = 'Problema ao carregar legenda_url: status ' + response.statusCode;
  130 + return callback(error);
  131 + }
  132 +
  133 + // Nome do arquivo
  134 + var filename = req.body.legenda_url.substring(req.body.legenda_url.lastIndexOf('/') + 1);
  135 +
  136 + // Tira os parâmetros HTTP
  137 + if (filename.lastIndexOf("?") !== -1) {
  138 + filename = filename.substring(0, filename.lastIndexOf("?"));
  139 + }
  140 +
  141 + var path = folder + '/' + filename;
  142 +
  143 + // Cria o stream para escrita
  144 + var file = fs.createWriteStream(path);
  145 +
  146 + // Salva o arquivo em disco
  147 + response.pipe(file);
  148 +
  149 + // Quando a escrita acabar
  150 + file.on('finish', function() {
  151 +
  152 + // Fecha o arquivo
  153 + file.close(function() {
  154 +
  155 + // Retorna o vídeo baixado
  156 + locals.subtitle = {
  157 + 'path': path
  158 + }
  159 +
  160 + // Chama o callback para prosseguir execução
  161 + callback();
  162 + });
  163 + });
  164 +
  165 + // Se deu erro na requisição de baixar a legenda
  166 + }).on('error', function(e) {
  167 + var error = 'Problema ao carregar legenda_url: ' + e.message;
  168 + return callback(error);
  169 + });
  170 +
  171 + // Se nem a legenda foi enviada e nem a legenda_url foi preenchida
  172 + } else {
  173 + var error = "Legenda deve ser enviada como parâmetro 'legenda' ou como 'legenda_url'";
  174 + return callback(error);
  175 + }
  176 +}
  177 +
  178 +function downloadAndMoveAudio(folder, req, locals, callback) {
  179 +
  180 + // Se enviou o arquivo na requisição
  181 + if (req.files.audio !== undefined) {
  182 +
  183 + // Se a validação falhar
  184 + if (parameters.checkAudio(req.files.audio.name) === false) {
  185 + var error = 'Áudio enviado com extensão inválida';
  186 + return callback(error);
  187 + }
  188 +
  189 + /* Move o áudio submetido para a pasta com o seu ID correspondente */
  190 + try {
  191 + fs.renameSync(req.files.audio.path, folder + '/' + req.files.audio.name);
  192 + } catch (err) {
  193 + callback("Erro ao mover o áudio submetido: " + err);
  194 + }
  195 +
  196 + // Se não, retorna o áudio enviado
  197 + locals.audio = {
  198 + 'path': folder + '/' + req.files.audio.name
  199 + }
  200 +
  201 + return callback();
  202 +
  203 + // Se o arquivo não foi enviado, mas um audio_url foi
  204 + } else if (req.body.audio_url !== undefined) {
  205 +
  206 + // Requisição para baixar o vídeo
  207 + http.get(req.body.audio_url, function(response) {
  208 +
  209 + // Se o áudio não foi baixado com sucesso
  210 + if (response.statusCode !== 200) {
  211 + var error = 'Problema ao carregar audio_url: status ' + response.statusCode;
  212 + return callback(error);
  213 + }
  214 +
  215 + // Nome do arquivo
  216 + var filename = req.body.audio_url.substring(req.body.audio_url.lastIndexOf('/') + 1);
  217 +
  218 + // Tira os parâmetros HTTP
  219 + if (filename.lastIndexOf("?") !== -1) {
  220 + filename = filename.substring(0, filename.lastIndexOf("?"));
  221 + }
  222 +
  223 + var path = folder + '/' + filename;
  224 +
  225 + // Cria o stream para escrita
  226 + var file = fs.createWriteStream(path);
  227 +
  228 + // Salva o arquivo em disco
  229 + response.pipe(file);
  230 +
  231 + // Quando a escrita acabar
  232 + file.on('finish', function() {
  233 +
  234 + // Fecha o arquivo
  235 + file.close(function() {
  236 +
  237 + // Retorna o áudio baixado
  238 + locals.audio = {
  239 + 'path': path
  240 + }
  241 +
  242 + // Chama o callback para prosseguir execução
  243 + callback();
  244 + });
  245 + });
  246 +
  247 + // Se deu erro na requisição de baixar o áudio
  248 + }).on('error', function(e) {
  249 + var error = 'Problema ao carregar audio_url: ' + e.message;
  250 + return callback(error);
  251 + });
  252 +
  253 + // Se nem o áudio foi enviado e nem o audio_url foi preenchido
  254 + } else {
  255 + var error = "Áudio deve ser enviado como parâmetro 'audio' ou como 'audio_url'";
  256 + return callback(error);
  257 + }
  258 +}
  259 +
  260 +module.exports.downloadAndMoveVideo = downloadAndMoveVideo;
  261 +module.exports.downloadAndMoveSubtitle = downloadAndMoveSubtitle;
  262 +module.exports.downloadAndMoveAudio = downloadAndMoveAudio;
0 263 \ No newline at end of file
... ...
helpers/parameters.js 0 → 100644
... ... @@ -0,0 +1,202 @@
  1 +function getServiceType(service_type) {
  2 + switch(service_type) {
  3 + case 'video-legenda':
  4 + return 2;
  5 + break;
  6 +
  7 + case 'video':
  8 + return 3;
  9 + break;
  10 +
  11 + case 'texto':
  12 + return 4;
  13 + break;
  14 +
  15 + case 'ios':
  16 + return 4;
  17 + break;
  18 +
  19 + case 'legenda':
  20 + return 5;
  21 + break;
  22 + case 'audio':
  23 + return 6;
  24 + break;
  25 + }
  26 +};
  27 +
  28 +function getLanguage(language) {
  29 + switch(language) {
  30 + case 'portugues':
  31 + return 1;
  32 + break;
  33 +
  34 + case 'glosa':
  35 + return 2;
  36 + break;
  37 + }
  38 +};
  39 +
  40 +function getPosition(position) {
  41 + switch(position) {
  42 + case 'superior-esquerdo':
  43 + return 1;
  44 + break;
  45 +
  46 + case 'superior-direito':
  47 + return 2;
  48 + break;
  49 +
  50 + case 'inferior-direito':
  51 + return 3;
  52 + break;
  53 +
  54 + case 'inferior-esquerdo':
  55 + return 4;
  56 + break;
  57 + }
  58 +};
  59 +
  60 +function getSize(size) {
  61 + switch(size) {
  62 + case 'pequeno':
  63 + return 1;
  64 + break;
  65 +
  66 + case 'medio':
  67 + return 2;
  68 + break;
  69 +
  70 + case 'grande':
  71 + return 3;
  72 + break;
  73 + }
  74 +};
  75 +
  76 +function getTransparency(transparency) {
  77 + switch(transparency) {
  78 + case 'opaco':
  79 + return 0;
  80 + break;
  81 +
  82 + case 'transparente':
  83 + return 1;
  84 + break;
  85 + }
  86 +};
  87 +
  88 +function checkServiceType(service_type) {
  89 + var t_types = ['video', 'texto'];
  90 +
  91 + for (var i = 0; i < t_types.length; i++){
  92 + if (service_type === t_types[i]) {
  93 + return true;
  94 + }
  95 + }
  96 +
  97 + return false;
  98 +};
  99 +
  100 +function checkLanguage(language) {
  101 + var t_types = ['portugues', 'glosa'];
  102 +
  103 + for (var i = 0; i < t_types.length; i++){
  104 + if (language === t_types[i]) {
  105 + return true;
  106 + }
  107 + }
  108 +
  109 + return false;
  110 +};
  111 +
  112 +function checkPosition(position) {
  113 + var t_types = ['superior-esquerdo', 'superior-direito', 'inferior-esquerdo', 'inferior-direito'];
  114 +
  115 + for (var i = 0; i < t_types.length; i++){
  116 + if (position === t_types[i]) {
  117 + return true;
  118 + }
  119 + }
  120 +
  121 + return false;
  122 +};
  123 +
  124 +function checkSize(size) {
  125 + var t_types = ['pequeno', 'medio', 'grande'];
  126 +
  127 + for (var i = 0; i < t_types.length; i++){
  128 + if (size === t_types[i]) {
  129 + return true;
  130 + }
  131 + }
  132 +
  133 + return false;
  134 +};
  135 +
  136 +function checkTransparency(transparency) {
  137 + var t_types = ['opaco', 'transparente'];
  138 +
  139 + for (var i = 0; i < t_types.length; i++){
  140 + if (transparency === t_types[i]) {
  141 + return true;
  142 + }
  143 + }
  144 +
  145 + return false;
  146 +};
  147 +
  148 +function checkVideo(file) {
  149 + var accepted_file_types = ['flv', 'ts', 'avi', 'mp4', 'mov', 'webm', 'wmv', 'mkv'];
  150 + return check_type(file, accepted_file_types)
  151 +};
  152 +
  153 +function checkSubtitle(file) {
  154 + var accepted_file_types = ['srt'];
  155 + return check_type(file, accepted_file_types)
  156 +};
  157 +
  158 +function checkAudio(file) {
  159 + var accepted_file_types = ['mp3', 'wav', 'aac', 'flac', 'ogg', 'wma'];
  160 + return check_type(file, accepted_file_types)
  161 +};
  162 +
  163 +function check_type(file, accepted_file_types) {
  164 +
  165 + var ext = file.substring(file.lastIndexOf('.') + 1).toLowerCase();
  166 + var isValidFile = false;
  167 +
  168 + for (var i = 0; i < accepted_file_types.length; i++) {
  169 + if (ext == accepted_file_types[i]) {
  170 + isValidFile = true;
  171 + break;
  172 + }
  173 + }
  174 +
  175 + if (!isValidFile) {
  176 + file.value = null;
  177 + }
  178 +
  179 + return isValidFile;
  180 +};
  181 +
  182 +function errorMessage(message) {
  183 + return JSON.stringify({ 'error': message })
  184 +};
  185 +
  186 +module.exports.getServiceType = getServiceType;
  187 +module.exports.getLanguage = getLanguage;
  188 +module.exports.getPosition = getPosition;
  189 +module.exports.getSize = getSize;
  190 +module.exports.getTransparency = getTransparency;
  191 +
  192 +module.exports.checkServiceType = checkServiceType;
  193 +module.exports.checkLanguage = checkLanguage;
  194 +module.exports.checkPosition = checkPosition;
  195 +module.exports.checkSize = checkSize;
  196 +module.exports.checkTransparency = checkTransparency;
  197 +
  198 +module.exports.checkVideo = checkVideo;
  199 +module.exports.checkSubtitle = checkSubtitle;
  200 +module.exports.checkAudio = checkAudio;
  201 +
  202 +module.exports.errorMessage = errorMessage;
... ...
helpers/properties.js 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +var host = '0.0.0.0';
  2 +var port = 5000;
  3 +var uploads_folder = './uploads/';
  4 +var ip = require('ip');
  5 +
  6 +module.exports.host = host;
  7 +module.exports.port = port;
  8 +module.exports.uploads_folder = uploads_folder;
  9 +module.exports.SERVER_IP = ip.address();
0 10 \ No newline at end of file
... ...
helpers/requests.js 0 → 100644
... ... @@ -0,0 +1,38 @@
  1 +var http = require('http');
  2 +
  3 +function postRequest(path, data) {
  4 + var options = {
  5 + host: path.hostname,
  6 + port: path.port,
  7 + path: path.path,
  8 + method: 'POST',
  9 + headers: {
  10 + 'Content-Type': 'application/x-www-form-urlencoded',
  11 + 'Content-Length': Buffer.byteLength(data)
  12 + }
  13 + };
  14 +
  15 + var requesting = http.request(options, function(res) {
  16 + /* Debugging */
  17 +
  18 + console.log('== Chamando callback: ' + path.hostname)
  19 + console.log('=== Response status: ' + res.statusCode);
  20 + console.log('=== Response headers: ' + JSON.stringify(res.headers));
  21 +
  22 + res.setEncoding('utf8');
  23 +
  24 + res.on('data', function (chunk) {
  25 + console.log('=== Response body: ' + chunk);
  26 + });
  27 +
  28 + });
  29 +
  30 + requesting.on('error', function (e) {
  31 + console.log("=== Não foi possível chamar a URL de callback");
  32 + });
  33 +
  34 + requesting.write(data);
  35 + requesting.end();
  36 +}
  37 +
  38 +module.exports.postRequest = postRequest;
0 39 \ No newline at end of file
... ...
package.json 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +{
  2 + "name": "vlibras-api",
  3 + "version": "0.0.1",
  4 + "description": "An API for VLibras Suite",
  5 + "main": "server.js",
  6 + "scripts": {
  7 + "test": "echo \"Error: no test specified\" && exit 1",
  8 + "start": "node server.js"
  9 + },
  10 + "author": "LAViD",
  11 + "license": "ISC",
  12 + "dependencies": {
  13 + "async": "^0.9.0",
  14 + "express": "~3.5.1",
  15 + "mkdirp": "^0.5.0",
  16 + "node-uuid": "^1.4.1",
  17 + "ip": "latest"
  18 + }
  19 +}
... ...
server.js 0 → 100644
... ... @@ -0,0 +1,74 @@
  1 +var parameters = require('./helpers/parameters');
  2 +var properties = require('./helpers/properties');
  3 +
  4 +var ep_texto = require('./endpoints/texto');
  5 +var ep_ios = require('./endpoints/ios');
  6 +var ep_video = require('./endpoints/video');
  7 +var ep_audio = require('./endpoints/audio');
  8 +var ep_legenda = require('./endpoints/legenda');
  9 +var ep_video_legenda = require('./endpoints/video_legenda');
  10 +
  11 +var express = require('express');
  12 +var path = require('path');
  13 +var util = require('util');
  14 +var app = express();
  15 +
  16 +app.use(express.static(path.join(__dirname, '/videos')));
  17 +app.use(express.bodyParser({ keepExtensions: true, uploadDir: path.join(__dirname, '/uploads') }));
  18 +
  19 +app.get('/', function(req, res){
  20 + res.send(200, { 'status': 'server is running!' } );
  21 +});
  22 +
  23 +app.post('/api', function(req, res) {
  24 + console.log("\n\n\n=============================================");
  25 + console.log("[" + new Date().toISOString() + "] Requisição do IP: " + req.ip);
  26 + console.log("== Parametros: " + util.inspect(req.body));
  27 +
  28 + /* Verifica se o paramêtro [servico] possui algum valor */
  29 + if (req.body.servico !== '') {
  30 + /* Verifica qual é o Tipo de Serviço fornecido */
  31 + switch(req.body.servico) {
  32 + /* Tipo de Serviço: Texto */
  33 + case 'texto':
  34 + ep_texto.init(req, res);
  35 + break;
  36 +
  37 + /* Tipo de Serviço: iOS */
  38 + case 'ios':
  39 + ep_ios.init(req, res);
  40 + break;
  41 +
  42 + /* Tipo de Serviço: Só o Vídeo */
  43 + case 'video':
  44 + ep_video.init(req, res);
  45 + break;
  46 +
  47 + /* Tipo de Serviço: Só o Áudio */
  48 + case 'audio':
  49 + ep_audio.init(req, res);
  50 + break;
  51 +
  52 + /* Tipo de Serviço: Só a Legenda */
  53 + case 'legenda':
  54 + ep_legenda.init(req, res);
  55 + break;
  56 +
  57 + /* Tipo de Serviço: Video + Legenda */
  58 + case 'video-legenda':
  59 + ep_video_legenda.init(req, res);
  60 + break;
  61 +
  62 + /* Case para um Tipo de Serviço inválido */
  63 + default:
  64 + res.send(500, parameters.errorMessage('Tipo do serviço inválido'));
  65 + break;
  66 + }
  67 + } else {
  68 + res.send(500, parameters.errorMessage('Especifique o tipo do serviço'));
  69 + }
  70 +});
  71 +
  72 +app.listen(properties.port, properties.host, function(){
  73 + console.log('Server running on ' + properties.host + ':' + properties.port);
  74 +});
... ...
text_files/.gitempty 0 → 100644
uploads/.gitempty 0 → 100644
videos/.gitempty 0 → 100644
videos/plugin/background.webm 0 → 100644
No preview for this file type
videos/plugin/preloader.webm 0 → 100644
No preview for this file type