From 925bb881cfe90cc055f67e747df693f32d265733 Mon Sep 17 00:00:00 2001 From: Brad Marsden Date: Fri, 18 May 2018 15:43:36 +0100 Subject: Implements BEP53 to allow file selection using &so in magnetURIs (#1396) * Implements BEP53 to allow file selection using &so in magnetURI. --- lib/torrent.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/torrent.js b/lib/torrent.js index c0e8aaf..6d53ee9 100644 --- a/lib/torrent.js +++ b/lib/torrent.js @@ -30,6 +30,7 @@ var speedometer = require('speedometer') var uniq = require('uniq') var utMetadata = require('ut_metadata') var utPex = require('ut_pex') // browser exclude +var parseRange = require('parse-numeric-range') var File = require('./file') var Peer = require('./peer') @@ -482,11 +483,6 @@ Torrent.prototype._onMetadata = function (metadata) { }) } - // start off selecting the entire torrent with low priority - if (self.pieces.length !== 0) { - self.select(0, self.pieces.length - 1, false) - } - self._rarityMap = new RarityMap(self) self.store = new ImmediateChunkStore( @@ -509,6 +505,20 @@ Torrent.prototype._onMetadata = function (metadata) { return new File(self, file) }) + // Select only specified files (BEP53) http://www.bittorrent.org/beps/bep_0053.html + if (self.so) { + var selectOnlyFiles = parseRange.parse(self.so) + + self.files.forEach(function (v, i) { + if (selectOnlyFiles.includes(i)) self.files[i].select(true) + }) + } else { + // start off selecting the entire torrent with low priority + if (self.pieces.length !== 0) { + self.select(0, self.pieces.length - 1, false) + } + } + self._hashes = self.pieces self.pieces = self.pieces.map(function (hash, i) { -- cgit v1.2.3