videornp.js 5.78 KB
var parameters = require('../helpers/parameters');
var properties = require('../helpers/properties');
var files = require('../helpers/files');
var core = require('../helpers/core');
var db = require('../db/api');

var uuid = require('node-uuid');
var mkdirp = require('mkdirp');
var async = require('async');

function init(req, res, Request) {
	res.set("Content-Type", "application/json");

        /* Verifica se os paramêtros [transparencia, texto] possuem algum valor */	
	if (((req.body.legenda_url === '') && (req.body.video_url === '')) || ((typeof req.body.legenda_url === 'undefined') && (typeof req.body.video_url === 'undefined'))) {	
		res.send(500, parameters.errorMessage('O valor de algum parâmetro está vazio'));
		return;
        }

        /* Verifica se os paramêtros [transparencia, texto] possuem algum valor */
        if ((typeof req.body.revisaomanual === 'undefined') || ((req.body.revisaomanual.toUpperCase() !== "SIM") && (req.body.revisaomanual.toUpperCase() !== "NAO"))) {
                res.send(500, parameters.errorMessage('O valor do parâmetro revisaomanual é inválido.'));
                return;
        }

        if ((typeof req.body.conteudista === 'undefined') || (req.body.conteudista === '')) {
                res.send(500, parameters.errorMessage('O valor de algum parâmetro está vazio'));
                return;
        }

        if ((typeof req.body.instituicao === 'undefined') || (req.body.instituicao === '')) {
                res.send(500, parameters.errorMessage('O valor de algum parâmetro está vazio'));
                return;
        }

        if ((typeof req.body.usuario === 'undefined') || (req.body.usuario === '')) {
                res.send(500, parameters.errorMessage('O valor de algum parâmetro está vazio'));
                return;
        }

	process(req, res, Request);
};

function process(req, res, Request) {
	var id = uuid.v4();
	var folder = properties.uploads_folder + id;
	var locals = {};

	var request_object = new Request({
		id: id,
		type: req.body.servico,
		status: 'Submitted',
		link: 'http://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.mp4',
		user: req.body.usuario,
		institution: req.body.instituicao,
		author: req.body.conteudista,
		manualrevision: req.body.revisaomanual,
		reasonofrevision: req.body.motivodarevisao,
		subtitle: 'http://150.165.204.30:5000/api/subtitle.srt',
		dictionary: '1.0',
		created_at: new Date(),
		updated_at: new Date(),
	});

	db.create(request_object, function(result) {
		if (result !== null) {
			res.send(200, { 'id':  result.id });
		} else {
			res.send(500, { 'error': 'Erro na criação da requisição.'});
		}
	});
	
	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.video, locals.subtitle, req, res, Request, request_object);
				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 video
		function(callback) {
			files.downloadAndMoveVideo(folder, req, locals, callback);
		}
	], function(err) {
		console.log("=== Video baixado");

		// Callback chamado depois de todas as tarefas
		// Se tiver erro, vai passar para cima
		callback(err);
	});
}


function callCore(id, video, subtitle, req, res, Request, request_object) {

	/* Cria a linha de comando */
	/* slice(2) é para transformar ./path em path */
	var command_line = 'vlibras_user/vlibras-core/./vlibras -V ' + video.path.slice(2) + ' -p bottom_right -r large - -b opaque --no-mixer --id ' + id + ' --mode devel > /tmp/core_log 2>&1';

	console.log("=== Core: " + command_line);

	console.log("ID: " + request_object.id);
	core.call(id, command_line, req, res, Request, request_object);
};

function callCoreSubtitle(id, subtitle, req, res, Request, request_object) {
                /* Move a legenda submetido para a pasta com o seu ID correspondente */
                fs.rename(req.files.legenda.path, __dirname + '/uploads/' + id + '/' + req.files.legenda.name, function(error) {
                        if (error) { console.log(error); }
                });

                /* Cria a linha de comando */
                var command_line = 'vlibras_user/vlibras-core/./vlibras -S ' +  ' uploads/' + id + '/' +
                                                        req.files.legenda.name + ' -l portugues -b opaco --id' + id + ' --mode devel > /tmp/core_log 2>&1';

                /* 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://' + properties.SERVER_IP + ':' + properties.port + '/' + id + '.flv' });
                });

                /* Listener que dispara quando a requisição ao core da erro */
                child.on('error', function(code, signal){
                        res.send(500, parameters.errorMessage('Erro na chamada ao core'));
                });

};

module.exports.init = init;