3 var _ = require('lodash');
4 var Upload = require('../../models').Upload;
5 var uploadFile = require('upload-file');
6 var sr = require('simple-random');
7 var sox = require('sox');
8 var path = require('path');
9 var config = require('../../config/environment');
10 var fs = require('fs');
11 var sequelize = require('../../models').sequelize;
12 var base64 = require('file-base64');
14 // Get list of uploads
15 exports.index = function(req, res) {
18 .then(function(uploads) {
19 return res.status(200).send(uploads);
21 .catch(function(err) {
22 return handleError(res, err);
26 // Get a single upload
27 exports.show = function(req, res) {
29 .findById(req.params.id)
30 .then(function(upload) {
32 return res.sendStatus(404);
34 return res.send(upload);
36 .catch(function(err) {
37 return handleError(res, err);
41 // Creates a new upload in the DB.
42 exports.create = function(req, res) {
43 var upload = new uploadFile({
44 dest: path.join(config.root, 'server/files/sounds/original'),
45 maxFileSize: 15 * 1000000,
48 acceptFileTypes: /(\.|\/)(wav|mp3|gsm|ogg)$/i,
49 rename: function(name, file) {
50 return sr() + path.extname(file.filename);
53 maxNumberOfFiles: "Max number of files upload exceeded",
54 acceptFileTypes: "Only wav,mp3,gsm, and ogg format accepted",
55 maxFileSize: "The maximum file size is 15 Mb",
56 invalidRequest: "Invalid request"
60 upload.on('end', function(fields, files) {
62 job_details.description = "";
63 job_details.name = job_details.display_name = path.basename(files.file.path, path.extname(files.file.filename));
64 job_details.save_name = path.basename(files.file.filename, path.extname(files.file.filename));
65 job_details.original_path = path.join(config.root, 'server/files/sounds/original');
66 job_details.converted_path = path.join(config.root, 'server/files/sounds/converted');
68 if (!files.file.filename) {
69 return res.status(500).send(upload);
72 var filepath = path.join(job_details.original_path, job_details.save_name + path.extname(files.file.filename));
73 var destination = path.join(job_details.converted_path, job_details.save_name + '.wav');
76 fs.chmodSync(filepath, parseInt('0777', 8));
77 sox.identify(filepath, function(err, result) {
78 console.log('************** Result: ', result);
81 var job = sox.transcode(filepath, destination, {
86 compressionQuality: 5,
91 job.on('error', function(err) {
92 console.error('********** Conversion Error: ', err);
93 fs.unlink(filepath, function(err) {
95 return handleError(res, err);
97 return handleError(res, err);
100 job.on('progress', function(amountDone, amountTotal) {
101 // console.log("*********** Progress", amountDone, amountTotal);
104 job.on('src', function(info) {
105 // console.log('********** src: ', info);
116 job_details.original_format = info.format;
117 job_details.original_duration = info.duration * 1000;
118 job_details.original_sampleCount = info.sampleCount;
119 job_details.original_channelCount = info.channelCount;
120 job_details.original_bitRate = info.bitRate;
121 job_details.original_sampleRate = info.sampleRate;
124 job.on('dest', function(info) {
125 // console.log('********** dest: ', info);
136 job_details.converted_format = info.format;
137 job_details.converted_duration = info.duration * 1000;
138 job_details.converted_sampleCount = info.sampleCount;
139 job_details.converted_channelCount = info.channelCount;
140 job_details.converted_bitRate = info.bitRate;
141 job_details.converted_sampleRate = info.sampleRate;
144 job.on('end', function() {
145 console.log("Conversion completed");
146 fs.chmodSync(destination, parseInt('0777', 8));
149 .then(function(upload) {
150 return res.status(201).send(upload);
152 .catch(function(err) {
153 return handleError(res, err);
161 upload.on('error', function(err) {
162 console.log('********** Upload error :', err)
163 return handleError(res, err);
169 // Updates an existing upload in the DB.
170 exports.update = function(req, res) {
175 .findById(req.params.id)
176 .then(function(upload) {
178 return res.sendStatus(404);
180 var updated = _.merge(upload, req.body);
183 return res.status(200).send(upload);
185 .catch(function(err) {
186 return handleError(res, err);
189 .catch(function(err) {
190 return handleError(res, err);
194 // Deletes a upload from the DB.
195 exports.destroy = function(req, res) {
197 .findById(req.params.id)
198 .then(function(upload) {
200 return res.status(404).send(upload);
202 var original_filepath = path.join(upload.original_path, upload.save_name + '.' + upload.original_format);
203 var converted_filepath = path.join(upload.converted_path, upload.save_name + '.' + upload.converted_format);
204 return sequelize.transaction(function(t) {
205 return upload.destroy({
209 fs.unlink(original_filepath, function(err) {
211 return handleError(res, err);
213 fs.unlink(converted_filepath, function(err) {
215 return handleError(res, err);
217 return res.status(200).send(upload);
220 .catch(function(err) {
221 return handleError(res, err);
224 .catch(function(err) {
225 return handleError(res, err);
228 //Download an uploaded file
229 exports.download = function(req, res) {
231 .findById(req.params.id)
232 .then(function(upload) {
234 return res.status(404).send(upload);
236 var original_filepath = path.join(upload.original_path, upload.save_name + '.' + upload.original_format);
237 res.status(200).download(original_filepath, upload.display_name + '.' + upload.original_format, function(err) {
239 return handleError(res, err);
241 console.log("Sent file under :", original_filepath);
247 //Stream an uploaded file
248 exports.stream = function(req, res) {
250 .findById(req.params.id)
251 .then(function(upload) {
253 return res.status(404).send(upload);
255 var original_filepath = path.join(upload.converted_path, upload.save_name + '.' + upload.original_format);
256 base64.encode(original_filepath, function(err, base64String) {
259 return handleError(res, err);
261 return res.status(200).send(base64String);
267 function handleError(res, err) {
268 return res.status(500).send(err);