From 1a2ea34bb406f25fd71e2d87cfa8f23965c7af37 Mon Sep 17 00:00:00 2001 From: Jesse Chan Date: Sun, 6 Sep 2020 00:36:44 +0800 Subject: [PATCH] server: also modify torrent file on "Set Tracker" --- package-lock.json | 8 +++++++ package.json | 1 + server/constants/torrentListPropMap.js | 5 +++++ server/models/client.js | 4 ++++ server/util/torrentFileUtil.js | 29 ++++++++++++++++++++++++++ 5 files changed, 47 insertions(+) create mode 100644 server/util/torrentFileUtil.js diff --git a/package-lock.json b/package-lock.json index a153c9b8..859cda3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3298,6 +3298,14 @@ "tweetnacl": "^0.14.3" } }, + "bencode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bencode/-/bencode-2.0.1.tgz", + "integrity": "sha512-2uhEl8FdjSBUyb69qDTgOEeeqDTa+n3yMQzLW0cOzNf1Ow5bwcg3idf+qsWisIKRH8Bk8oC7UXL8irRcPA8ZEQ==", + "requires": { + "safe-buffer": "^5.1.1" + } + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", diff --git a/package.json b/package.json index 7316d5de..98c2aaa9 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "axios": "^0.20.0", "babel-eslint": "^10.1.0", "babel-loader": "^8.0.6", + "bencode": "^2.0.1", "body-parser": "^1.18.3", "case-sensitive-paths-webpack-plugin": "2.3.0", "chalk": "^4.1.0", diff --git a/server/constants/torrentListPropMap.js b/server/constants/torrentListPropMap.js index bc7f5baa..970e4674 100644 --- a/server/constants/torrentListPropMap.js +++ b/server/constants/torrentListPropMap.js @@ -249,4 +249,9 @@ torrentListPropMap.set('peersTotal', { transformValue: (value) => Number(value.substr(0, value.indexOf('|||'))), }); +torrentListPropMap.set('session', { + methodCall: 'cat=(session.path), (d.hash)', + transformValue: defaultTransformer, +}); + module.exports = torrentListPropMap; diff --git a/server/models/client.js b/server/models/client.js index 662a6301..8f25bd45 100644 --- a/server/models/client.js +++ b/server/models/client.js @@ -10,6 +10,7 @@ const fileUtil = require('../util/fileUtil'); const settings = require('./settings'); const torrentFilePropsMap = require('../../shared/constants/torrentFilePropsMap'); const torrentPeerPropsMap = require('../../shared/constants/torrentPeerPropsMap'); +const torrentFileUtil = require('../util/torrentFileUtil'); const torrentStatusMap = require('../../shared/constants/torrentStatusMap'); const torrentTrackerPropsMap = require('../../shared/constants/torrentTrackerPropsMap'); @@ -385,6 +386,9 @@ const client = { request.setTracker(data); request.onComplete((response, error) => { + // Modify tracker URL in torrent files + torrentFileUtil.setTracker(services, data); + // Fetch the latest torrent list to re-index trackerURI. services.torrentService.fetchTorrentList(); callback(response, error); diff --git a/server/util/torrentFileUtil.js b/server/util/torrentFileUtil.js new file mode 100644 index 00000000..60f3a244 --- /dev/null +++ b/server/util/torrentFileUtil.js @@ -0,0 +1,29 @@ +const bencode = require('bencode'); +const fs = require('fs'); + +const setTracker = (services, options) => { + const {tracker, hashes} = options; + + [...new Set(hashes)].forEach((hash) => { + const torrent = services.torrentService.getTorrent(hash).session.concat('.torrent'); + fs.readFile(torrent, (err, data) => { + if (err) { + return; + } + + const torrentData = bencode.decode(data); + + if (torrentData.announce != null) { + torrentData.announce = Buffer.from(tracker); + + fs.writeFileSync(torrent, bencode.encode(torrentData)); + } + }); + }); +}; + +const torrentFileUtil = { + setTracker, +}; + +module.exports = torrentFileUtil;