From abc2051b886d3ea64408574327ff63792796789f Mon Sep 17 00:00:00 2001 From: Brad Marsden Date: Fri, 18 May 2018 01:39:07 +0100 Subject: [PATCH 1/2] Implements BEP53 to allow file selection using &so in magnetURI. --- lib/torrent.js | 22 +++++++++++++++++----- package.json | 1 + 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/lib/torrent.js b/lib/torrent.js index c0e8aafc..3a59aa1a 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,22 @@ Torrent.prototype._onMetadata = function (metadata) { return new File(self, file) }) + // Only select specified files (BEP53) + if (self.so) { + var specificFiles = parseRange.parse(self.so) + // https://github.com/webtorrent/webtorrent/issues/164 + self.deselect(0, self.pieces.length - 1, false) + + self.files.forEach(function (v, i) { + specificFiles.indexOf(i) === -1 ? self.files[i].deselect() : 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) { diff --git a/package.json b/package.json index 71e49537..763ab5f0 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "mime": "^2.2.0", "multistream": "^2.0.5", "package-json-versionify": "^1.0.2", + "parse-numeric-range": "^0.0.2", "parse-torrent": "^6.0.0", "pump": "^3.0.0", "random-iterate": "^1.0.1", From 113363223b4e77d766a5f917b649c7435974c56a Mon Sep 17 00:00:00 2001 From: Brad Marsden Date: Fri, 18 May 2018 15:16:40 +0100 Subject: [PATCH 2/2] Makes things clearer and removes redundant / unused code. --- lib/torrent.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/torrent.js b/lib/torrent.js index 3a59aa1a..6d53ee9c 100644 --- a/lib/torrent.js +++ b/lib/torrent.js @@ -505,14 +505,12 @@ Torrent.prototype._onMetadata = function (metadata) { return new File(self, file) }) - // Only select specified files (BEP53) + // Select only specified files (BEP53) http://www.bittorrent.org/beps/bep_0053.html if (self.so) { - var specificFiles = parseRange.parse(self.so) - // https://github.com/webtorrent/webtorrent/issues/164 - self.deselect(0, self.pieces.length - 1, false) + var selectOnlyFiles = parseRange.parse(self.so) self.files.forEach(function (v, i) { - specificFiles.indexOf(i) === -1 ? self.files[i].deselect() : self.files[i].select(true) + if (selectOnlyFiles.includes(i)) self.files[i].select(true) }) } else { // start off selecting the entire torrent with low priority