94 lines
2.2 KiB
JavaScript
94 lines
2.2 KiB
JavaScript
const WebTorrent = require('webtorrent')
|
|
const fs = require('fs')
|
|
|
|
const torrentClient = new WebTorrent({webSeeds: false})
|
|
torrentClient.saveSession = (sessionFile) => {
|
|
fs.writeFileSync(sessionFile, JSON.stringify({
|
|
torrents: torrentClient.torrents.map(torrent => ({
|
|
infoHash: torrent.infoHash,
|
|
path: torrent.path,
|
|
torrent: torrent.torrentObject,
|
|
|
|
removeOnDone: torrent.removeOnDone,
|
|
paused: torrent.paused || torrent._paused,
|
|
selection: torrent.files.map(file => typeof file.selected === 'undefined' || file.selected)
|
|
}))
|
|
}, null, 4), 'utf8');
|
|
}
|
|
torrentClient.loadSession = (sessionFile) => {
|
|
if(!fs.existsSync(sessionFile))
|
|
{
|
|
logT('downloader', 'no download sessions - ignore')
|
|
return
|
|
}
|
|
|
|
const data = fs.readFileSync(sessionFile, 'utf8')
|
|
const obj = JSON.parse(data);
|
|
if(!obj.torrents)
|
|
{
|
|
logT('downloader', 'no torrents list for loading session')
|
|
return
|
|
}
|
|
if(!torrentClient._add)
|
|
{
|
|
logT('downloader', 'no overriden _add() method')
|
|
return
|
|
}
|
|
const {torrents} = obj
|
|
torrents.forEach(({torrent, infoHash, path, removeOnDone, paused, selection}) => {
|
|
if(!torrent || !infoHash || !path)
|
|
{
|
|
logT('downloader', 'no info for starting download this torrent')
|
|
return
|
|
}
|
|
logT('downloader', 'restore download session:', torrent.name)
|
|
const download = torrentClient._add(torrent, path)
|
|
if(download)
|
|
{
|
|
logT('downloader', 'restore options')
|
|
// restore options
|
|
download.removeOnDone = removeOnDone
|
|
if(paused)
|
|
{
|
|
download._paused = true
|
|
}
|
|
if(selection)
|
|
{
|
|
download.on('metadata', () => {
|
|
logT('downloader', 'load torrent selection from session')
|
|
download.selectFiles(selection)
|
|
})
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
const metaHashes = {}
|
|
|
|
torrentClient.dht.on('peer', (peer, infoHash) => {
|
|
const hash = infoHash.toString('hex')
|
|
if(!(hash in metaHashes))
|
|
return
|
|
|
|
if(torrentClient._downloader)
|
|
{
|
|
torrentClient._downloader(peer, infoHash, (...data) => {
|
|
if(metaHashes[hash])
|
|
metaHashes[hash](...data)
|
|
|
|
delete metaHashes[hash]
|
|
})
|
|
}
|
|
else
|
|
{
|
|
delete metaHashes[hash]
|
|
}
|
|
})
|
|
|
|
torrentClient.getMetadata = (hash, callback) => {
|
|
hash = hash.toLowerCase()
|
|
torrentClient.dht.lookup(hash)
|
|
metaHashes[hash] = callback
|
|
}
|
|
|
|
module.exports = torrentClient |