mirror of
https://github.com/hotheadhacker/seedbox-lite.git
synced 2025-09-02 00:51:36 +03:00
Refactor WebTorrent configuration and enhance torrent loading with improved debugging and new endpoints for file and stats retrieval
This commit is contained in:
@@ -21,13 +21,10 @@ const config = {
|
|||||||
|
|
||||||
const app = express();
|
const app = express();
|
||||||
|
|
||||||
// OPTIMIZED DOWNLOAD-ONLY WebTorrent configuration
|
// SIMPLE WORKING WebTorrent configuration - minimal and functional
|
||||||
const client = new WebTorrent({
|
const client = new WebTorrent({
|
||||||
uploadLimit: 0, // Strict no-upload policy
|
uploadLimit: 1024, // Allow minimal upload (required for peer reciprocity)
|
||||||
maxConns: 50, // Allow more peer connections
|
downloadLimit: -1 // No download limit
|
||||||
dht: true, // Enable DHT for peer discovery
|
|
||||||
lsd: true, // Enable Local Service Discovery
|
|
||||||
pex: true // Enable Peer Exchange
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// UNIVERSAL STORAGE SYSTEM - Multiple ways to find torrents
|
// UNIVERSAL STORAGE SYSTEM - Multiple ways to find torrents
|
||||||
@@ -109,19 +106,29 @@ const loadTorrentFromId = (torrentId) => {
|
|||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
console.log(`🔄 Loading torrent: ${torrentId}`);
|
console.log(`🔄 Loading torrent: ${torrentId}`);
|
||||||
|
|
||||||
// If it's just a hash, construct a basic magnet link
|
// If it's just a hash, construct a basic magnet link with reliable trackers
|
||||||
let magnetUri = torrentId;
|
let magnetUri = torrentId;
|
||||||
if (torrentId.length === 40 && !torrentId.startsWith('magnet:')) {
|
if (torrentId.length === 40 && !torrentId.startsWith('magnet:')) {
|
||||||
magnetUri = `magnet:?xt=urn:btih:${torrentId}&tr=udp://tracker.opentrackr.org:1337&tr=udp://tracker.leechers-paradise.org:6969&tr=udp://9.rarbg.to:2710&tr=udp://exodus.desync.com:6969`;
|
magnetUri = `magnet:?xt=urn:btih:${torrentId}&tr=udp://tracker.opentrackr.org:1337/announce&tr=udp://open.demonii.com:1337/announce&tr=udp://tracker.openbittorrent.com:6969/announce&tr=udp://exodus.desync.com:6969/announce&tr=udp://tracker.torrent.eu.org:451/announce&tr=udp://tracker.tiny-vps.com:6969/announce&tr=udp://retracker.lanta-net.ru:2710/announce`;
|
||||||
console.log(`🧲 Constructed magnet URI from hash: ${magnetUri}`);
|
console.log(`🧲 Constructed magnet URI from hash: ${magnetUri}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const torrent = client.add(magnetUri, {
|
const torrent = client.add(magnetUri);
|
||||||
path: './downloads' // Simple download path
|
|
||||||
});
|
|
||||||
|
|
||||||
let resolved = false;
|
let resolved = false;
|
||||||
|
|
||||||
|
// Add comprehensive debugging
|
||||||
|
console.log(`🎯 Added torrent to WebTorrent client: ${torrent.infoHash}`);
|
||||||
|
|
||||||
|
torrent.on('infoHash', () => {
|
||||||
|
console.log(`🔗 Info hash available: ${torrent.infoHash}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
torrent.on('metadata', () => {
|
||||||
|
console.log(`📋 Metadata received for: ${torrent.name || 'Unknown'}`);
|
||||||
|
console.log(`📊 Files found: ${torrent.files.length}`);
|
||||||
|
});
|
||||||
|
|
||||||
torrent.on('ready', () => {
|
torrent.on('ready', () => {
|
||||||
if (resolved) return;
|
if (resolved) return;
|
||||||
resolved = true;
|
resolved = true;
|
||||||
@@ -138,31 +145,8 @@ const loadTorrentFromId = (torrentId) => {
|
|||||||
|
|
||||||
torrent.addedAt = new Date().toISOString();
|
torrent.addedAt = new Date().toISOString();
|
||||||
|
|
||||||
// ENFORCE STRICT NO-UPLOAD POLICY
|
// MINIMAL upload limit for peer reciprocity (required for downloads)
|
||||||
torrent.uploadSpeed = 0;
|
torrent.uploadLimit = 1024; // 1KB/s - minimal but functional
|
||||||
torrent._uploadLimit = 0;
|
|
||||||
|
|
||||||
// Block all upload attempts
|
|
||||||
torrent.on('upload', () => {
|
|
||||||
torrent.uploadSpeed = 0;
|
|
||||||
torrent._uploadLimit = 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Monitor and block any wire connections that try to upload
|
|
||||||
torrent.on('wire', (wire) => {
|
|
||||||
wire.uploaded = 0;
|
|
||||||
wire.uploadSpeed = 0;
|
|
||||||
console.log(`🔒 Wire connected with upload blocking: ${wire.remoteAddress}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Monitor peer connections
|
|
||||||
torrent.on('peer', (peer) => {
|
|
||||||
console.log(`👥 Peer connected: ${peer}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
torrent.on('noPeers', () => {
|
|
||||||
console.log(`⚠️ No peers found for: ${torrent.name}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Configure files for streaming
|
// Configure files for streaming
|
||||||
torrent.files.forEach((file, index) => {
|
torrent.files.forEach((file, index) => {
|
||||||
@@ -195,14 +179,15 @@ const loadTorrentFromId = (torrentId) => {
|
|||||||
reject(error);
|
reject(error);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Extended timeout for peer discovery
|
// Moderate timeout for peer discovery
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
if (!resolved) {
|
if (!resolved) {
|
||||||
resolved = true;
|
resolved = true;
|
||||||
console.log(`⏰ Timeout loading torrent after 60 seconds: ${torrentId}`);
|
console.log(`⏰ Timeout loading torrent after 30 seconds: ${torrentId}`);
|
||||||
|
console.log(`🔍 Client has ${client.torrents.length} torrents total`);
|
||||||
reject(new Error('Timeout loading torrent'));
|
reject(new Error('Timeout loading torrent'));
|
||||||
}
|
}
|
||||||
}, 60000);
|
}, 30000);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -359,6 +344,64 @@ app.get('/api/torrents/:identifier', async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// UNIVERSAL FILES ENDPOINT - Returns just the files array
|
||||||
|
app.get('/api/torrents/:identifier/files', async (req, res) => {
|
||||||
|
const identifier = req.params.identifier;
|
||||||
|
console.log(`📁 UNIVERSAL FILES: ${identifier}`);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const torrent = await universalTorrentResolver(identifier);
|
||||||
|
|
||||||
|
if (!torrent) {
|
||||||
|
return res.status(404).json({ error: 'Torrent not found' });
|
||||||
|
}
|
||||||
|
|
||||||
|
const files = torrent.files.map((file, index) => ({
|
||||||
|
index,
|
||||||
|
name: file.name,
|
||||||
|
size: file.length,
|
||||||
|
downloaded: file.downloaded,
|
||||||
|
progress: file.progress
|
||||||
|
}));
|
||||||
|
|
||||||
|
res.json(files);
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`❌ Universal files failed:`, error.message);
|
||||||
|
res.status(500).json({ error: 'Failed to get torrent files: ' + error.message });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// UNIVERSAL STATS ENDPOINT - Returns just the torrent stats
|
||||||
|
app.get('/api/torrents/:identifier/stats', async (req, res) => {
|
||||||
|
const identifier = req.params.identifier;
|
||||||
|
console.log(`📊 UNIVERSAL STATS: ${identifier}`);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const torrent = await universalTorrentResolver(identifier);
|
||||||
|
|
||||||
|
if (!torrent) {
|
||||||
|
return res.status(404).json({ error: 'Torrent not found' });
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
infoHash: torrent.infoHash,
|
||||||
|
name: torrent.name,
|
||||||
|
size: torrent.length,
|
||||||
|
downloaded: torrent.downloaded,
|
||||||
|
uploaded: 0,
|
||||||
|
progress: torrent.progress,
|
||||||
|
downloadSpeed: torrent.downloadSpeed,
|
||||||
|
uploadSpeed: 0,
|
||||||
|
peers: torrent.numPeers
|
||||||
|
});
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`❌ Universal stats failed:`, error.message);
|
||||||
|
res.status(500).json({ error: 'Failed to get torrent stats: ' + error.message });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// UNIVERSAL STREAMING - Always works if torrent exists
|
// UNIVERSAL STREAMING - Always works if torrent exists
|
||||||
app.get('/api/torrents/:identifier/files/:fileIdx/stream', async (req, res) => {
|
app.get('/api/torrents/:identifier/files/:fileIdx/stream', async (req, res) => {
|
||||||
const { identifier, fileIdx } = req.params;
|
const { identifier, fileIdx } = req.params;
|
||||||
|
|||||||
Reference in New Issue
Block a user