-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathconvert.js
91 lines (81 loc) · 2.21 KB
/
convert.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
var Q = require('q');
var temp = require('temp');
var path = require('path');
var fs = require('fs');
var ffmpegBin = require('ffmpeg-static').path;
var ffmpeg = require('fluent-ffmpeg');
ffmpeg.setFfmpegPath(ffmpegBin)
var targetDir = path.resolve(__dirname, 'cache')
temp.track();
function createTempDir (dirName) {
var defered = Q.defer();
temp.mkdir('ffmpegTemp', function(err, dirPath) {
if (err) return defered.reject(err);
defered.resolve(dirPath)
})
return defered.promise;
}
function isFileExist(path) {
var defered = Q.defer();
fs.stat(path, function (err, stat) {
if (err) return defered.resolve(false);
defered.resolve(true);
})
return defered.promise
}
function convert(stream, id, toExt) {
var targetFileName = path.resolve(targetDir, id + '.' + toExt);
var defered = Q.defer();
if (0 > ['png', 'jpg', 'jpeg', 'gif', 'webp'].indexOf(toExt)) {
defered.reject(new Error('not allowed extension'));
return defered.promise;
}
isFileExist(targetFileName)
.then(function (exist) {
if (exist) throw defered.resolve(targetFileName);
return createTempDir('ffmpeg_temp');
})
.then(function (dirPath) {
var defered = Q.defer();
var tempfileName = path.resolve(dirPath, 'file');
var tempDirStream = fs.createWriteStream(tempfileName);
stream.pipe(tempDirStream);
var called = false;
stream.on('error', function (err) {
if (called) return;
called = true;
defered.reject(tempfileName)
})
stream.on('close', function () {
if (called) return;
called = true;
defered.resolve(tempfileName)
})
return defered.promise;
})
.then(function (tempFileName) {
var defered = Q.defer();
var called = false;
ffmpeg(tempFileName)
.on('error', function(err) {
if (called) return;
called = true;
defered.reject(err);
})
.on('end', function() {
if (called) return;
called = true;
defered.resolve(targetFileName);
})
.save(targetFileName);
return defered.promise;
})
.then(function (targetFileName) {
defered.resolve(targetFileName)
})
.catch(function (err) {
defered.reject(err);
})
return defered.promise;
}
module.exports = convert;