-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathindex.js
125 lines (112 loc) · 4.2 KB
/
index.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
var path = require('path'),
xml2js = require('xml2js'),
glob = require('glob'),
exec = require('child_process').exec;
function getCmd() {
var arch = process.arch.match(/64/) ? '64' : '32';
switch (process.platform) {
case 'darwin':
return safeLocalPath(path.join(__dirname, '/lib/osx64/mediainfo'));
case 'win32':
return safeLocalPath(path.join(__dirname, '/lib/win32/mediainfo.exe'));
case 'linux':
return "LD_LIBRARY_PATH=" + safeLocalPath(path.join(__dirname, '/lib/linux' + arch)) + " " + safeLocalPath(path.join(__dirname, '/lib/linux' + arch, '/mediainfo'));
default:
throw 'unsupported platform';
}
}
function buildOutput(obj) {
var out = {};
var idVid = idAud = idTex = idMen = idOth = 0;
for (var i in obj.track) {
if (obj.track[i]['$']['type'] === 'General') {
out.file = obj.track[i]['Complete_name'][0];
out.general = {};
for (var f in obj.track[i]) {
if (f !== '$') out.general[f.toLowerCase()] = obj.track[i][f];
}
} else if (obj.track[i]['$']['type'] === 'Video') {
if (!idVid) out.video = [];
out.video[idVid] = {};
for (var f in obj.track[i]) {
if (f !== '$') out.video[idVid][f.toLowerCase()] = obj.track[i][f];
}
idVid++;
} else if (obj.track[i]['$']['type'] === 'Audio') {
if (!idAud) out.audio = [];
out.audio[idAud] = {};
for (var f in obj.track[i]) {
if (f !== '$') out.audio[idAud][f.toLowerCase()] = obj.track[i][f];
}
idAud++;
} else if (obj.track[i]['$']['type'] === 'Text') {
if (!idTex) out.text = [];
out.text[idTex] = {};
for (var f in obj.track[i]) {
if (f !== '$') out.text[idTex][f.toLowerCase()] = obj.track[i][f];
}
idTex++;
} else if (obj.track[i]['$']['type'] === 'Menu') {
if (!idMen) out.menu = [];
out.menu[idMen] = {};
for (var f in obj.track[i]) {
if (f !== '$') out.menu[idMen][f.toLowerCase()] = obj.track[i][f];
}
idMen++;
} else {
if (!idOth) out.other = [];
out.other[idOth] = {};
for (var f in obj.track[i]) {
if (f !== '$') out.other[idOth][f.toLowerCase()] = obj.track[i][f];
}
idOth++;
}
}
return out;
}
function buildJson(xml) {
return new Promise(function (resolve, reject) {
xml2js.parseString(xml, function (err, obj) {
if (err) return reject(err);
if (!obj['Mediainfo']) return reject('Something went wrong');
obj = obj['Mediainfo'];
var out = [];
if (Array.isArray(obj.File)) {
for (var i in obj.File) {
out.push(buildOutput(obj.File[i]));
}
} else {
out.push(buildOutput(obj.File));
}
resolve(out);
});
});
}
function safeLocalPath(path) {
if (process.platform.match('win32')) {
path = '"' + path + '"';// wrap with double quotes
} else {
path = path.replace(/'/g, "'\"'\"'"); // escape single quotes
path = "'" + path + "'";// wrap with single quotes
}
return path;
}
module.exports = function MediaInfo() {
var args = [].slice.call(arguments);
var cmd_options = typeof args[0] === "object" ? args.shift() : {};
var cmd = [];
cmd.push(getCmd()); // base command
cmd.push('--Output=XML --Full'); // args
Array.prototype.slice.apply(args).forEach(function (val, idx) {
var files = glob.sync(val, {cwd: (cmd_options.cwd || process.cwd()), nonull: true});
for (var i in files) {
cmd.push(safeLocalPath(files[i])); // files
}
});
return new Promise(function (resolve, reject) {
exec(cmd.join(' '), cmd_options, function (error, stdout, stderr) {
if (error !== null || stderr !== '') return reject(error || stderr);
buildJson(stdout).then(resolve).catch(reject);
});
});
};