-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
153 lines (142 loc) · 4.87 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
const express = require('express')
const fileUpload = require('express-fileupload')
const CloudConvert = require('cloudconvert')
const fs = require('fs')
require('dotenv').config()
const app = express()
app.listen(3000, () => console.log("listening on port 3000"))
app.use(express.static('public'))
app.use(express.json({limit: '1mb'}))
app.use(fileUpload())
const sgMail = require('@sendgrid/mail')
const http = require("http");
const SG_API_KEY = process.env.SENDGRID_API_KEY
const CLOUD_CONVERT_API_KEY = process.env.CLOUD_CONVERT_API_KEY
const CLOUD_CONVERT_SANDBOX_KEY = process.env.CLOUD_CONVERT_SANDBOX_KEY
sgMail.setApiKey(SG_API_KEY)
const senderID = process.env.SENDER_ID
app.post('/email', (request, response) => {
console.log(request.body)
const data = request.body
let body = ''
data.urls.forEach(url => {
body += '<a href="' + url + '"> Download File </a><br>'
})
const msg = {
to: data.recipient, // Change to your recipient
from: senderID, // Change to your verified sender
subject: data.from + ' file successfully converted to ' + data.to,
text: request.body.url,
html: body,
}
sgMail
.send(msg)
.then(() => {
console.log('Email sent')
})
.catch((error) => {
console.error(error)
})
})
const cloudConvert = new CloudConvert(CLOUD_CONVERT_API_KEY)
app.post('/convert', async (request, response) => {
const data = request.files
console.log(data)
let file_name
let to
let from
for (let i in data) {
// console.log(i)
let file = data[i]
let fromTo = i.split('_')
from = fromTo[0]
to = fromTo[1]
file_name = file.name
let buffer = file.data
fs.open(file_name, 'w', function (err, fd) {
if (err) {
throw 'could not open file: ' + err;
}
// write the contents of the buffer, from position 0 to the end, to the file descriptor returned in opening our file
fs.write(fd, buffer, 0, buffer.length, null, function (err) {
if (err) throw 'error writing file: ' + err;
fs.close(fd, function () {
console.log('wrote the file successfully');
});
});
});
}
let conversionDict = {
"operation": "convert",
"input_format": from,
"output_format": to,
"engine": 'ffmpeg',
"input": [
"import_task"
]
}
if (from === 'mp3') {
conversionDict['audio_bitrate'] = 128
if (to === 'wav') {
conversionDict['audio_codec'] = 'pcm_s16le'
} else conversionDict['audio_codec'] = 'aac'
} else if (from === 'wav') {
conversionDict['audio_codec'] = 'mp3'
conversionDict['audio_qscale'] = 0
} else if (from === 'ogg') {
if (to === 'mp3') {
conversionDict['audio_codec'] = 'mp3'
conversionDict['audio_qscale'] = 0
} else {
conversionDict['audio_codec'] = 'copy'
conversionDict['audio_bitrate'] = 128
}
} else if (from === 'm4a') {
conversionDict['audio_codec'] = 'mp3'
conversionDict['audio_qscale'] = 0
} else {
conversionDict['video_codec'] = 'x264'
conversionDict['crf'] = 23
conversionDict['preset'] = 'medium'
conversionDict['subtitles_mode'] = 'none'
conversionDict['audio_codec'] = 'aac'
conversionDict['audio_bitrate'] = 128
}
let job = await cloudConvert.jobs.create({
"tasks": {
"import_task": {
"operation": "import/upload"
},
"conversion_task": conversionDict,
"export_task": {
"operation": "export/url",
"input": [
"conversion_task"
],
"inline": false,
"archive_multiple_files": false
}
},
});
const uploadTask = job.tasks.filter(task => task.name === 'import_task')[0]
const inputFile = fs.createReadStream('./' + file_name)
await cloudConvert.tasks.upload(uploadTask, inputFile, file_name);
job = await cloudConvert.jobs.wait(job.id)
const exportTask = job.tasks.filter(task => task.operation === 'export/url' && task.status === 'finished')[0];
const file = exportTask.result.files[0];
console.log(file)
// const writeStream = fs.createWriteStream('./out/' + file.filename);
//
// http.get(file.url, function(response) {
// response.pipe(writeStream);
// });
//
// await new Promise((resolve, reject) => {
// writeStream.on('finish', resolve);
// writeStream.on('error', reject);
// });
response.writeHead(200, {
'Content-Type': 'application/json'
})
response.end(JSON.stringify({status: 'success', url: file.url}))
})