Animarr/src/MagnetService.js

79 lines
2.3 KiB
JavaScript

const DHT = require('bittorrent-dht')
const magnet = require('magnet-uri')
const sha1 = require('sha1')
const fetchMetadata = require('bep9-metadata-dl')
const bencode = require('bencode')
var fs = require('fs')
var magnetFolder = process.argv[2];
var torrentFolder = process.argv[3];
//var uri = 'magnet:?xt=urn:btih:e3811b9539cacff680e418124272177c47477157'
//var parsed = magnet(uri)
//console.log(parsed.infoHash) // 'e3811b9539cacff680e418124272177c47477157'
const dht = new DHT({
nodeId: sha1("AnimarrDHTNode"), // 160-bit DHT node ID (Buffer or hex string, default: randomly generated)
bootstrap: [
"router.bittorrent.com:6881",
"router.utorrent.com:6881",
"router.bitcomet.com:6881",
"dht.aelitis.com:6881",
"dht.transmissionbt.com:6881",
"dht.libtorrent.org:25401"
],
host: false,
concurrency: 200
})
dht.listen(function () {
console.log('[MagnetService] DHT node started!')
dht.on('ready', function () {
console.log('[MagnetService] Bootstrap completed')
})
})
dht.on('peer', function (peer, infoHash, from) {
//console.log('found potential peer ' + peer.host + ':' + peer.port + ' through ' + from.address + ':' + from.port + ' for ' + infoHash.toString('hex'))
})
updateFunction = function(){
fs.readdir(magnetFolder, function(err, files){
if(err){
return;
}
files.forEach( function( file, index ) {
if(file.charAt(0) == "."){
return;
}
var magnetFile = magnetFolder + "/" + file;
var magnetContents = fs.readFileSync(magnetFile).toString();
var parsed = magnet(magnetContents);
//console.log('[MagnetService] Added ' + parsed.infoHash);
fs.unlinkSync(magnetFile);
fetchMetadata(parsed.infoHash, { maxConns: 200, fetchTimeout: 30000, socketTimeout: 5000, dht}).then(metadata => {
var contents = bencode.encode(metadata);
var infoContents = bencode.encode(metadata.info);
var hash = sha1(infoContents).toUpperCase();
console.log('[MagnetService] Fetched ' + hash + ' (' + metadata.info.name + ')!');
fs.writeFile(torrentFolder + "/" + hash + ".torrent", contents, function(err) {});
}).catch(err => {
});
} );
});
};
setInterval(updateFunction, 10000)
updateFunction();