diff --git a/lib/torrent.js b/lib/torrent.js index f94fc47..62d42d1 100644 --- a/lib/torrent.js +++ b/lib/torrent.js @@ -1,13 +1,37 @@ const torrentStream = require('torrent-stream'); const needle = require('needle'); const parseTorrent = require('parse-torrent'); +const async = require('async'); +const decode = require('magnet-uri'); const { retrieveTorrentFiles } = require('./cache'); const MAX_PEER_CONNECTIONS = process.env.MAX_PEER_CONNECTIONS || 20; +const SEEDS_CHECK_TIMEOUT = process.env.SEEDS_CHECK_TIMEOUT || 10 * 1000; // 10 secs const EXTENSIONS = ["3g2", "3gp", "avi", "flv", "mkv", "mov", "mp2", "mp4", "mpe", "mpeg", "mpg", "mpv", "webm", "wmv"]; module.exports.updateCurrentSeeders = function (torrent) { - return Promise.resolve({ ...torrent, seeders: torrent.seeders || 0 }); + return new Promise((resolve) => { + if (!torrent.magnetLink) { + return resolve(0); + } + const Tracker = require("peer-search/tracker"); + + const seeders = {}; + const decodedMagnetLink = decode(torrent.magnetLink); + const trackers = decodedMagnetLink && decodedMagnetLink.tr; + const callback = () => resolve(Math.max(...Object.values(seeders).map(values => values[0]).concat(0))); + setTimeout(callback, SEEDS_CHECK_TIMEOUT); + + async.each(trackers, function (tracker, ready) { + const t = new Tracker(tracker, {}, torrent.infoHash); + console.error = () => 0; // do nothing + t.run(); + t.on("info", function (inf) { + seeders[tracker] = [inf.seeders, inf.leechers]; + ready(); + }); + }, callback); + }).then((seeders) => ({ ...torrent, seeders: torrent.seeders || seeders })); }; module.exports.torrentFiles = function (torrent) { diff --git a/package.json b/package.json index ccfacee..ee89e85 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "parse-torrent": "^6.1.2", "parse-torrent-title": "git://github.com/TheBeastLT/parse-torrent-title.git#master", "peer-search": "^0.6.x", + "async": "0.9.2", "pg": "^7.8.2", "pg-hstore": "^2.3.2", "sequelize": "^4.43.0",