As a part of my self-learning process, I am trying to write a program that creates a torrent from a file. so I opened a torrent file. I got this info from it. I like to know what is the "pieces". and how can I extract this "pieces" info from the file.
{
"infoHash": "d2474e86c95b19b8bcfdb92bc12c9d44667cfa36",
"name": "nothing.epub",
"encoding": "UTF-8",
"created": 1375363666,
"createdBy": "uTorrent/3300",
"comment": "Torrent downloaded from torrent cache at http://itorrents.org",
"announce": [
"http://tracker.example.com/announce"
],
"urlList": [],
"files": [
{
"path": "nothing.epub",
"length": 362017
}
],
"pieceLength": 16384,
"pieces": [
"1f9c3f59beec079715ec53324bde8569e4a0b4eb",
"ec42307d4ce5557b5d3964c5ef55d354cf4a6ecc",
"7bf1bcaf79d11fa5e0be06593c8faafc0c2ba2cf",
"76d71c5b01526b23007f9e9929beafc5151e6511",
"0931a1b44c21bf1e68b9138f90495e690dbc55f5",
"72e4c2944cbacf26e6b3ae8a7229d88aafa05f61",
"eaae6abf3f07cb6db9677cc6aded4dd3985e4586",
"27567fa7639f065f71b18954304aca6366729e0b",
"4773d77ae80caa96a524804dfe4b9bd3deaef999",
"c9dd51027467519d5eb2561ae2cc01467de5f643",
"0a60bcba24797692efa8770d23df0a830d91cb35",
"b3407a88baa0590dc8c9aa6a120f274367dcd867",
"e88e8338c572a06e3c801b29f519df532b3e76f6",
"70cf6aee53107f3d39378483f69cf80fa568b1ea",
"c53b506159e988d8bc16922d125d77d803d652c3",
"ca3070c16eed9172ab506d20e522ea3f1ab674b3",
"f923d76fe8f44ff32e372c3b376564c6fb5f0dbe",
"52164f03629fd1322636babb2c014b7dae582da4",
"1363965261e6ce12b43701f0a8c9ed1520a70eba",
"004400a267765f6d3dd5c7beb5bd3c75f3df2a54",
"560a61801147fa4ec7cf568e703acb04e5610a4d",
"56dcc242d03293e9446cf5e457d8eb3d9588fd90",
"c698de9b0dad92980906c026d8c1408fa08fe4ec"
]
From BEP-3:
piece length maps to the number of bytes in each piece the file is split into. For the purposes of transfer, files are split into fixed-size pieces which are all the same length except for possibly the last one which may be truncated. piece length is almost always a power of two, most commonly 2 18 = 256 K (BitTorrent prior to version 3.2 uses 2 20 = 1 M as default).
pieces maps to a string whose length is a multiple of 20. It is to be subdivided into strings of length 20, each of which is the SHA1 hash of the piece at the corresponding index.
To calculate the pieces hashes for a file, you need to open the file, read in 'piece length` bytes and calculate the SHA1 hash of that piece. Keep doing that till you've run into the end of the file.
The final piece is allowed to be less than the piece size if the file isn't an exact multiple of the piece length.
Oh, and for multi-file torrents, you need to treat all of the files as one contiguous file for the purposes of pieces. That means, for instance, if you had two files, one 100 bytes, and one 500000 bytes, the first piece would be 100 bytes of the first file concatenated with (piece length - 100) bytes of the second file.
Knowing this, you can use some code like this to get the first piece from a file:
var fs = require('fs');
var crypto = require('crypto');
var pieceLength = 16384;
var filename = 'nothing.epub';
const stream = fs.createReadStream(filename, { start: 0, end: pieceLength - 1 });
var hash = crypto.createHash('sha1');
hash.setEncoding('hex');
stream.on('end', function() {
hash.end();
console.log(hash.read());
})
stream.pipe(hash);