forked from lildadou/t411-api
-
Notifications
You must be signed in to change notification settings - Fork 0
/
t411-api.js
132 lines (116 loc) · 4.91 KB
/
t411-api.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
var async = require('async');
var request = require('request');
var qs = require('qs');
var winston = require('winston');
/**Cette classe a pour objectif de fournir une interface conviviale
* avec l'API de T411. Pour plus de performance, les methodes sont
* asynchrones. La classe possède 2 états : authentifié et
* non-authentifié. Vous ne pourrez réaliser aucune opération
* avant d'être authentifié (l'API T411 exige une authentification)
*
* Vous pouvez vous identifier via la méthode login
* @property {string} apiUrl L'URL de l'API de t411.me qui est utilisé par Client
* @property {string} token Jeton d'authentification utilisé par le client
* @constructor
*/
T411ApiClient = function () {
var _debug = true;
this.authenticated = false;
this.token = null;
this.logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({ level: (_debug)?'debug':'info' })
//new (winston.transports.File)({ filename: 'somefile.log' })
]
});
};
T411ApiClient.prototype = {
/**L'URL par défaut de l'API de t411.me */
apiUri : 'https://api.t411.me',
/**Méthode qui permet de vous authentifier et d'utiliser les
* autres méthode de l'API une fois authentifié.
* @param {string} username String Le nom d'utilisateur
* @param {string} password Le mot de passe
* @param {function} [callback] Callback
*/
login: function (username, password, callback) {
request({
uri : (this.apiUri+'/auth'),
method : 'POST',
form : {
'username' : username,
'password' : password
}
}, function(error, response, body) {
var authResult = JSON.parse(body);
if (authResult.error) {
this.logger.warn("L'authentification a échouée: (%d) %s", authResult.code, authResult.error);
} else {
this.logger.info("Authentification réussie");
this.token = authResult.token;
}
if (typeof callback ==='function') callback();
}.bind(this));
},
/**Indique si le client est dans l'état <em>authentifié</em>
* @returns {Boolean}
*/
isAuthenticated : function() { return (this.token != null); },
prebuildApiRequest : function(path) {
return {
uri : this.apiUri+path,
headers : { 'Authorization': this.token}
};
},
/**Effectue une recherche
* @param {SearchOptions} [options] Les paramètres de recherche
* @param {function} [callback] Callback de résultat
*/
rawSearch : function(options, callback) {
if (typeof options != 'object') options={};
var hasQuery= (typeof options.query ==='string') && (options.query.length > 0);
var baseUrl = '/torrents/search/'+(hasQuery)?options.query:'';
var reqOpt = this.prebuildApiRequest(baseUrl);
if (typeof options.limit ==='number') reqOpt.qs.limit = options.limit;
if (typeof options.offset ==='number') reqOpt.qs.offset = options.offset;
if (typeof options.cid ==='number') reqOpt.qs.limit = options.cid;
request(reqOpt, function(error, response, body) {
var bodyLines = body.split('\n');
var reqResult = JSON.parse((bodyLines.length>0)?bodyLines[3]:bodyLines[0]);
var lastTorrents= reqResult.torrents;
var createRequests = [];
for (var itTorrent=0; itTorrent < lastTorrents.length; itTorrent++) {
// Ici, on ajoute les tâches à la liste de tâches paralleles
createRequests.push(function(tInfo, asyncFinish) {
// On mets les 2 sous-taches en series
// et en callback on met celui de la tâche!
async.series([
this.addTorrentEntry.bind(this, tInfo.entry),
this.addTorrentStatus.bind(this,tInfo.status)
], asyncFinish);
}.bind(this, this.extractTorrentInfos(lastTorrents[itTorrent])));
}
async.parallel(createRequests, callback);
}.bind(this));
}
};
/**Ensemble des paramètres utilisables lors d'une recherche de torrent
* @property {String} [query=<empty>] L'expression de la recherche
* @property {number} [limit=10] Quantité de résultats maximal
* @property {number} [offset=0] Numéro de la page de recherche
* @property {number} [cid=null] Filtre de (sous-)catégorie
* @constructor
*/
SearchOptions = function() {
};
SearchOptions.prototype = {
query : '',
limit : 10,
offset : 0,
cid : null
//TODO: terms : []
};
module.exports = {
"ApiClient" : T411ApiClient,
"SearchOptions" : SearchOptions
};