forked from kozervar/napi-js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnapi-js.js
133 lines (118 loc) · 5.44 KB
/
napi-js.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
'use strict';
var querystring = require('querystring'),
http = require('http'),
fs = require('fs'),
path = require('path'),
md5pf = require('md5-part-file'),
xml2js = require('xml2js'),
Q = require('q');
var LANGUAGE = {
POLISH: 'PL',
ENGLISH: 'EN'
};
function downloadSubtitles(fileName, language) {
var deferred = Q.defer();
if (!fileName) {
deferred.reject('File name is missing');
return deferred.promise;
}
if (!language) {
deferred.reject('Language is missing');
return deferred.promise;
}
fs.stat(fileName, function (err) {
if (err) {
if (err.code === 'ENOENT') {
deferred.reject('Such a file does not exist.');
} else {
deferred.reject(err);
}
} else {
deferred.notify('Generating hash for file ' + fileName);
md5pf(fileName, 0, 10485760, function (err, hash) {
if (err) {
deferred.reject('Something went wrong during md5 hash calculation of partial file.');
} else {
deferred.notify('Hash: ' + hash);
var post_data = querystring.stringify({
'downloaded_subtitles_lang': language,
'downloaded_subtitles_txt': '1',
'client_ver': '1.0',
'downloaded_subtitles_id': hash,
'client': 'AutoMove',
'mode': '1'
});
var post_options = {
host: 'www.napiprojekt.pl',
port: '80',
path: '/api/api-napiprojekt3.php',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': post_data.length
}
};
var req = http.request(post_options, function (res) {
res.setEncoding('utf-8');
deferred.notify('Response from server received');
deferred.notify('Downloading...');
var responseString = '';
res.on('data', function (data) {
deferred.notify(data.length);
responseString += data;
});
res.on('end', function () {
deferred.notify('Downloaded.');
deferred.notify('Parsing response to JSON.');
xml2js.parseString(responseString, function (err, result) {
deferred.notify('Response parsed.');
if (err) {
return deferred.reject(err);
}
if (result.result) {
if (result.result.subtitles) {
if (result.result.subtitles.length === 1) {
var subsFileName = path.join(
path.dirname(fileName),
path.basename(fileName, path.extname(fileName)) + '.txt'
);
deferred.notify('Saving file ' + subsFileName);
var file = fs.createWriteStream(subsFileName);
var subs = result.result.subtitles[0];
var b = new Buffer(subs.content[0], 'base64');
file.write(b.toString('UTF-8'));
file.on('error', function (err) {
deferred.reject(err);
});
file.on('finish', function () {
deferred.notify('File saved successfully');
file.close(function () {
deferred.resolve(subsFileName);
});
});
file.end();
} else {
deferred.reject('Wrong number of subtitles');
}
} else {
deferred.reject('No subtitles in result');
}
} else {
deferred.reject('No result');
}
});
});
});
req.on('error', function (e) {
deferred.reject(e);
});
req.write(post_data);
req.end();
}
});
}
});
return deferred.promise;
}
module.exports.LANGUAGE = LANGUAGE;
module.exports.downloadSubtitles = downloadSubtitles;