-
Notifications
You must be signed in to change notification settings - Fork 8
/
opensrt.js
122 lines (109 loc) · 3 KB
/
opensrt.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
var xmlrpc = require("xmlrpc");
var async = require("async");
var USER_AGENT;
var client = xmlrpc.createClient({ host: 'api.opensubtitles.org', port: 80, path: '/xml-rpc'})
var token = "";
var OpenSRT = function(userAgent) {
if(!userAgent) {
throw new Error("User Agent must be supplied");
return;
}
USER_AGENT = userAgent;
}
OpenSRT.prototype.getToken = function getToken(cb) {
client.methodCall('LogIn', ['', '', 'en', USER_AGENT], function (err, res) {
if(err) return cb(err, null);
if(res.status === '414 Unknown User Agent') {
throw new Error('Unknown User Agent');
return;
}
token = res.token;
cb(null, res.token);
})
},
OpenSRT.prototype.searchEpisode = function(data, cb) {
if(!data.token) {
this.getToken(function(err, token) {
if(err) {
return cb(err, null);
}
data.token = token;
return searchEpisode(data, cb);
});
}
else {
return searchEpisode(data, cb);
}
}
function searchEpisode(data, cb) {
var opts = {};
opts.sublanguageid = "all";
// Do a hash or filename check first (either), then fallback to imdb+season+episode
if(data.hash) {
opts.moviehash = hash;
}
if(!data.filename) {
opts.imdbid = data.imdbid.replace("tt", "");
opts.season = data.season;
opts.episode = data.episode;
}
else {
opts.tag = data.filename;
}
client.methodCall('SearchSubtitles', [
data.token,
[
opts
]
],
function(err, res){
if(err || typeof res.data === 'undefined') return cb(err, null);
if(res.status === '414 Unknown User Agent') {
throw new Error('Unknown User Agent');
return;
}
var subs = {};
async.eachSeries(res.data, function(sub, callback) {
if(sub.SubFormat != "srt") return callback();
if(data.season && data.episode) {// definitely an episode check
if(parseInt(sub.SeriesIMDBParent, 10) != parseInt(data.imdbid.replace("tt", ""), 10)) return callback();
if(sub.SeriesSeason != data.season) return callback();
if(sub.SeriesEpisode != data.episode) return callback();
}
var tmp = {};
tmp.url = sub.SubDownloadLink.replace(".gz", ".srt");
tmp.lang = sub.ISO639;
tmp.downloads = sub.SubDownloadsCnt;
tmp.score = 0;
if(sub.MatchedBy == "moviehash") tmp.score += 100;
if(sub.MatchedBy == "tag") tmp.score += 50;
if(sub.UserRank == "trusted") tmp.score += 100;
if(!subs[tmp.lang]) {
subs[tmp.lang] = tmp;
}
else {
// If score is 0 or equal, sort by downloads
if(tmp.score > subs[tmp.lang].score || (tmp.score == subs[tmp.lang].score && tmp.downloads > subs[tmp.lang].score.downloads)) {
subs[tmp.lang] = tmp;
}
}
return callback();
},
function(err) {
// Do 1 extra query by imdb / season / episode in case no tag match for a lang
if(!data.recheck && data.imdbid && data.season && data.episode) {
return searchEpisode({
imdbid: data.imdbid.replace("tt", ""),
season: data.season,
episode: data.episode,
recheck: true,
token: data.token
}, cb);
}
else {
return cb(err, subs);
}
})
})
}
module.exports = OpenSRT;