/
tracker.js
72 lines (61 loc) · 1.86 KB
/
tracker.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
const Client = require('bittorrent-tracker');
const config = require('./../config');
const updateRecord = async (knex, record) => {
if (config.debug) {
console.log(`${record.infoHash} - ${record.complete}:${record.incomplete}`);
}
await knex('torrents')
.update({
leechers: record.incomplete,
searchUpdate: false,
seeders: record.complete,
trackerUpdated: new Date(),
})
.where({ infohash: record.infoHash });
};
const scrape = async (knex, records) => {
const options = {
announce: [config.tracker.host],
infoHash: records.map(({ infohash }) => infohash),
};
try {
const results = await new Promise((resolve, reject) => {
Client.scrape(options, (error, data) => (error ? reject(error) : resolve(data)));
});
if (results.infoHash) {
await updateRecord(knex, results);
} else {
const hashes = Object.keys(results);
for (let i = 0; i < hashes.length; i += 1) {
await updateRecord(knex, results[hashes[i]]); // eslint-disable-line no-await-in-loop
}
}
} catch (error) {
// Do nothing
}
};
const getRecords = async (knex) => {
const newRecords = await knex('torrents')
.select('infohash')
.whereNull('trackerUpdated')
.limit(config.tracker.limit);
const newLimit = config.tracker.limit - newRecords.length;
const age = new Date(Date.now() - 1000 * 60 * config.tracker.age);
const outdatedRecords = await knex('torrents')
.select('infohash')
.where('trackerUpdated', '<', age)
.limit(newLimit);
return [...newRecords, ...outdatedRecords];
};
const tracker = async (knex) => {
const records = await getRecords(knex);
if (records.length > 0) {
try {
await scrape(knex, records);
} catch (error) {
// Do nothing
}
}
setTimeout(() => tracker(knex), config.tracker.frequency * 1000);
};
module.exports = tracker;