Add Button to Fetch Files List from Peers

This commit is contained in:
Leo Herzog
2020-07-01 21:03:05 -04:00
parent e910039451
commit 41ce85ffe9
4 changed files with 16240 additions and 3591 deletions

19764
bundle.js

File diff suppressed because it is too large Load Diff

View File

@@ -48,8 +48,8 @@
<label for="announce">Tracker URLs</label> <label for="announce">Tracker URLs</label>
<button id="addTrackers"> <button id="addTrackers">
<span class="fa-stack fa-2x"> <span class="fa-stack fa-2x">
<i class="fas fa-cloud fa-stack-2x"></i> <span class="fas fa-cloud fa-stack-2x"></span>
<i class="fas fa-plus fa-stack-1x fa-inverse" data-fa-transform="down-2"></i> <span class="fas fa-plus fa-stack-1x fa-inverse" data-fa-transform="down-2"></span>
</span> </span>
</button> </button>
<button id="addTracker" data-type="announce"> <button id="addTracker" data-type="announce">
@@ -74,6 +74,9 @@
<div class="form-group"> <div class="form-group">
<label for="files">Files</label> <label for="files">Files</label>
<button id="getFiles">
<span class="fad fa-chart-network"></span>
</button>
<table id="files"> <table id="files">
<tbody id="filesBody"></tbody> <tbody id="filesBody"></tbody>
</table> </table>

View File

@@ -10,7 +10,8 @@
"clipboard": "latest", "clipboard": "latest",
"dropzone": "latest", "dropzone": "latest",
"mime-types": "latest", "mime-types": "latest",
"parse-torrent": "latest" "parse-torrent": "latest",
"webtorrent": "latest"
}, },
"devDependencies": { "devDependencies": {
"watchify": "latest" "watchify": "latest"

View File

@@ -3,6 +3,7 @@ const parser = require('parse-torrent');
const Buffer = require('Buffer'); const Buffer = require('Buffer');
const bytes = require('bytes'); const bytes = require('bytes');
const mime = require('mime-types'); const mime = require('mime-types');
const WebTorrent = require('webtorrent');
var properties = document.getElementById('properties'); var properties = document.getElementById('properties');
var originalSourceIcon = document.getElementById('originalSourceIcon'); var originalSourceIcon = document.getElementById('originalSourceIcon');
@@ -20,10 +21,12 @@ var urlList = document.getElementById('urlList');
var addWebseed = document.getElementById('addWebseed'); var addWebseed = document.getElementById('addWebseed');
var removeWebseeds = document.getElementById('removeWebseeds'); var removeWebseeds = document.getElementById('removeWebseeds');
var files = document.getElementById('filesBody'); var files = document.getElementById('filesBody');
var getFiles = document.getElementById('getFiles');
var copyURL = document.getElementById('copyURL'); var copyURL = document.getElementById('copyURL');
var copyMagnet = document.getElementById('copyMagnet'); var copyMagnet = document.getElementById('copyMagnet');
var downloadTorrent = document.getElementById('downloadTorrent'); var downloadTorrent = document.getElementById('downloadTorrent');
var parsed; var parsed;
var client = new WebTorrent();
document.addEventListener('DOMContentLoaded', start); document.addEventListener('DOMContentLoaded', start);
@@ -40,11 +43,16 @@ function start() {
document.getElementById('torrent').addEventListener('change', function(event) { document.getElementById('torrent').addEventListener('change', function(event) {
event.preventDefault(); event.preventDefault();
event.target.files[0].arrayBuffer().then(function(arrayBuffer) { try {
originalSourceIcon.innerHTML = '<span class="fad fa-file fa-fw"></span>'; event.target.files[0].arrayBuffer().then(function(arrayBuffer) {
originalSourceIcon.title = 'Originally sourced from Torrent file'; originalSourceIcon.innerHTML = '<span class="fad fa-file fa-fw"></span>';
parse(Buffer.from(arrayBuffer)); originalSourceIcon.title = 'Originally sourced from Torrent file';
}); parse(Buffer.from(arrayBuffer));
});
}
catch(e) {
console.error(e); // TODO: Alert user to error
}
}); });
let copyurl = new clipboard('#copyURL'); let copyurl = new clipboard('#copyURL');
@@ -77,6 +85,7 @@ function start() {
removeTrackers.addEventListener('click', () => removeAllRows('announce')); removeTrackers.addEventListener('click', () => removeAllRows('announce'));
addWebseed.addEventListener('click', addRow); addWebseed.addEventListener('click', addRow);
removeWebseeds.addEventListener('click', () => removeAllRows('urlList')); removeWebseeds.addEventListener('click', () => removeAllRows('urlList'));
getFiles.addEventListener('click', getFilesFromPeers);
if (window.location.hash) { if (window.location.hash) {
originalSourceIcon.innerHTML = '<span class="fad fa-link fa-fw"></span>'; originalSourceIcon.innerHTML = '<span class="fad fa-link fa-fw"></span>';
@@ -92,7 +101,7 @@ function parse(toLoad) {
parsed = parser(toLoad); parsed = parser(toLoad);
display(); display();
if (parsed.xs) { if (parsed.xs) {
console.log("Magnet includes xs, attempting remote parse"); console.info("Magnet includes xs, attempting remote parse");
parseRemote(parsed.xs); parseRemote(parsed.xs);
} }
} }
@@ -177,17 +186,19 @@ function display() {
files.innerHTML = ""; files.innerHTML = "";
if (parsed.files && parsed.files.length) { if (parsed.files && parsed.files.length) {
downloadTorrent.addEventListener('click', saveTorrent); getFiles.disabled = true;
downloadTorrent.disabled = false;
for (let file of parsed.files) { for (let file of parsed.files) {
let icon = getFontAwesomeIconForMimetype(mime.lookup(file.name)); let icon = getFontAwesomeIconForMimetype(mime.lookup(file.name));
files.appendChild(createFileRow(icon, file.name, file.length)); files.appendChild(createFileRow(icon, file.name, file.length));
} }
files.appendChild(createFileRow('folder-tree', '', parsed.length)); files.appendChild(createFileRow('folder-tree', '', parsed.length));
downloadTorrent.addEventListener('click', saveTorrent);
downloadTorrent.disabled = false;
} else { } else {
getFiles.disabled = false;
files.innerHTML = "<em>Files information isn't included in the URL/File provided</em>";
downloadTorrent.removeEventListener('click', saveTorrent); downloadTorrent.removeEventListener('click', saveTorrent);
downloadTorrent.disabled = true; downloadTorrent.disabled = true;
files.innerHTML = "<em>Files information isn't included in the URL/File provided</em>";
} }
copyURL.setAttribute('data-clipboard-text', window.location.origin + "#" + parser.toMagnetURI(parsed)); copyURL.setAttribute('data-clipboard-text', window.location.origin + "#" + parser.toMagnetURI(parsed));
@@ -268,6 +279,9 @@ function resetProperties() {
hash.value = ""; hash.value = "";
announce.innerHTML = ""; announce.innerHTML = "";
urlList.innerHTML = ""; urlList.innerHTML = "";
client.torrents.forEach(torrent => torrent.destroy());
getFiles.disabled = false;
getFiles.innerHTML = '<span class="fad fa-chart-network"></span>';
files.innerHTML = ""; files.innerHTML = "";
window.location.hash = ""; window.location.hash = "";
copyURL.setAttribute('data-clipboard-text', ""); copyURL.setAttribute('data-clipboard-text', "");
@@ -277,7 +291,7 @@ function resetProperties() {
async function addCurrentTrackers() { async function addCurrentTrackers() {
addTrackers.disabled = true; addTrackers.disabled = true;
addTrackers.classList.add('fa-blink'); addTrackers.innerHTML = '<span class="fa-blink fa-stack fa-2x"><span class="fas fa-cloud fa-stack-2x"></span><span class="fas fa-plus fa-stack-1x fa-inverse" data-fa-transform="down-2"></span></span>'
try { try {
let response = await fetch("https://newtrackon.com/api/100"); // get trackers with 100% uptime let response = await fetch("https://newtrackon.com/api/100"); // get trackers with 100% uptime
let trackers = await response.text(); let trackers = await response.text();
@@ -288,7 +302,7 @@ async function addCurrentTrackers() {
catch(e) { catch(e) {
console.error(e); // TODO: Alert user to error console.error(e); // TODO: Alert user to error
} }
addTrackers.classList.remove('fa-blink'); addTrackers.innerHTML = '<span class="fa-stack fa-2x"><span class="fas fa-cloud fa-stack-2x"></span><span class="fas fa-plus fa-stack-1x fa-inverse" data-fa-transform="down-2"></span></span>'
addTrackers.disabled = false; addTrackers.disabled = false;
display(); display();
} }
@@ -300,7 +314,6 @@ function removeAllRows(type) {
} }
function addRow() { function addRow() {
console.log(this.dataset.type);
parsed[this.dataset.type].push(""); parsed[this.dataset.type].push("");
display(); display();
} }
@@ -315,6 +328,26 @@ function updateModified() {
parsed.createdBy = "Torrent Parts <https://torrent.parts/>"; parsed.createdBy = "Torrent Parts <https://torrent.parts/>";
} }
function getFilesFromPeers() {
console.info("Attempting fetching files from Webtorrent");
parsed.announce.push("wss://tracker.webtorrent.io");
parsed.announce.push("wss://tracker.openwebtorrent.com");
parsed.announce.push("wss://tracker.btorrent.xyz");
parsed.announce.push("wss://tracker.fastcast.nz");
parsed.announce = parsed.announce.filter((v,i) => v && parsed.announce.indexOf(v) === i); // remove duplicates and empties
display();
getFiles.disabled = true;
getFiles.innerHTML = '<span class="fa-blink fad fa-chart-network"></span>';
client.add(parser.toMagnetURI(parsed), (torrent) => {
parsed.files = torrent.files;
parsed.infoBuffer = torrent.infoBuffer;
parsed.length = torrent.length;
getFiles.innerHTML = '<span class="fad fa-chart-network"></span>';
display();
torrent.destroy();
});
}
// https://stackoverflow.com/a/36899900/2700296 // https://stackoverflow.com/a/36899900/2700296
function saveTorrent() { function saveTorrent() {
let data = parser.toTorrentFile(parsed); let data = parser.toTorrentFile(parsed);