mirror of
https://github.com/ThaUnknown/miru.git
synced 2026-04-21 06:51:58 +00:00
feat: #314
This commit is contained in:
parent
ae3e7cfdd2
commit
7520c3feaa
2 changed files with 25 additions and 2 deletions
|
|
@ -4,6 +4,9 @@ import HTTPTracker from 'bittorrent-tracker/lib/client/http-tracker.js'
|
||||||
import { hex2bin, arr2hex, text2arr } from 'uint8-util'
|
import { hex2bin, arr2hex, text2arr } from 'uint8-util'
|
||||||
import Parser from './parser.js'
|
import Parser from './parser.js'
|
||||||
import { defaults, fontRx, subRx, videoRx } from '../common/util.js'
|
import { defaults, fontRx, subRx, videoRx } from '../common/util.js'
|
||||||
|
import { statfs } from 'fs/promises'
|
||||||
|
|
||||||
|
const LARGE_FILESIZE = 32_000_000_000
|
||||||
|
|
||||||
class TorrentClient extends WebTorrent {
|
class TorrentClient extends WebTorrent {
|
||||||
static excludedErrorMessages = ['WebSocket', 'User-Initiated Abort, reason=', 'Connection failed.']
|
static excludedErrorMessages = ['WebSocket', 'User-Initiated Abort, reason=', 'Connection failed.']
|
||||||
|
|
@ -65,7 +68,7 @@ class TorrentClient extends WebTorrent {
|
||||||
if (torrent) this.addTorrent(new Uint8Array(JSON.parse(torrent)), JSON.parse(localStorage.getItem('lastFinished')))
|
if (torrent) this.addTorrent(new Uint8Array(JSON.parse(torrent)), JSON.parse(localStorage.getItem('lastFinished')))
|
||||||
}
|
}
|
||||||
|
|
||||||
handleTorrent (torrent) {
|
async handleTorrent (torrent) {
|
||||||
const files = torrent.files.map(file => {
|
const files = torrent.files.map(file => {
|
||||||
return {
|
return {
|
||||||
infoHash: torrent.infoHash,
|
infoHash: torrent.infoHash,
|
||||||
|
|
@ -76,9 +79,21 @@ class TorrentClient extends WebTorrent {
|
||||||
url: 'http://localhost:' + this.server.address().port + file.streamURL
|
url: 'http://localhost:' + this.server.address().port + file.streamURL
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
if (torrent.length > LARGE_FILESIZE) {
|
||||||
|
for (const file of torrent.files) {
|
||||||
|
file.deselect()
|
||||||
|
}
|
||||||
|
this.dispatch('warn', 'Detected Large Torrent! To Conserve Drive Space Files Will Be Downloaded Selectively Instead Of Downloading The Entire Torrent.')
|
||||||
|
}
|
||||||
this.dispatch('files', files)
|
this.dispatch('files', files)
|
||||||
this.dispatch('magnet', { magnet: torrent.magnetURI, hash: torrent.infoHash })
|
this.dispatch('magnet', { magnet: torrent.magnetURI, hash: torrent.infoHash })
|
||||||
localStorage.setItem('torrent', JSON.stringify([...torrent.torrentFile]))
|
localStorage.setItem('torrent', JSON.stringify([...torrent.torrentFile]))
|
||||||
|
|
||||||
|
const { bsize, bavail } = await statfs(torrent.path)
|
||||||
|
|
||||||
|
if (torrent.length > bsize * bavail) {
|
||||||
|
this.dispatch('error', 'Torrent Too Big! This Torrent Exceeds The Selected Drive\'s Available Space. Change Download Location In Torrent Settings To A Drive With More Space And Restart The App!')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async findFontFiles (targetFile) {
|
async findFontFiles (targetFile) {
|
||||||
|
|
@ -180,11 +195,14 @@ class TorrentClient extends WebTorrent {
|
||||||
switch (data.type) {
|
switch (data.type) {
|
||||||
case 'current': {
|
case 'current': {
|
||||||
if (data.data) {
|
if (data.data) {
|
||||||
const found = (await this.get(data.data.infoHash))?.files.find(file => file.path === data.data.path)
|
const torrent = await this.get(data.data.infoHash)
|
||||||
|
const found = torrent?.files.find(file => file.path === data.data.path)
|
||||||
|
if (!found) return
|
||||||
if (this.current) {
|
if (this.current) {
|
||||||
this.current.removeAllListeners('stream')
|
this.current.removeAllListeners('stream')
|
||||||
}
|
}
|
||||||
this.parser?.destroy()
|
this.parser?.destroy()
|
||||||
|
found.select()
|
||||||
this.current = found
|
this.current = found
|
||||||
this.parser = new Parser(this, found)
|
this.parser = new Parser(this, found)
|
||||||
this.findSubtitleFiles(found)
|
this.findSubtitleFiles(found)
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,11 @@ client.on('error', ({ detail }) => {
|
||||||
toast.error('Torrent Error', { description: detail.message || detail })
|
toast.error('Torrent Error', { description: detail.message || detail })
|
||||||
})
|
})
|
||||||
|
|
||||||
|
client.on('warn', ({ detail }) => {
|
||||||
|
console.error(detail)
|
||||||
|
toast.warning('Torrent Warning', { description: detail.message || detail })
|
||||||
|
})
|
||||||
|
|
||||||
export async function add (torrentID, hide) {
|
export async function add (torrentID, hide) {
|
||||||
if (torrentID) {
|
if (torrentID) {
|
||||||
console.info('Torrent: adding torrent', { torrentID })
|
console.info('Torrent: adding torrent', { torrentID })
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue