module.exports = TorrentList var h = require('virtual-dom/h') var hyperx = require('hyperx') var hx = hyperx(h) var prettyBytes = require('prettier-bytes') function TorrentList (state, dispatch) { var list = state.saved.torrents.map( (torrentSummary) => renderTorrent(torrentSummary, state, dispatch)) return hx`
${list}
Drop a torrent file here or paste a magnet link
` } // Renders a torrent in the torrent list // Includes name, download status, play button, background image // May be expanded for additional info, including the list of files inside function renderTorrent (torrentSummary, state, dispatch) { // Get ephemeral data (like progress %) directly from the WebTorrent handle var torrent = state.client.torrents.find((x) => x.infoHash === torrentSummary.infoHash) // Background image: show some nice visuals, like a frame from the movie, if possible var style = {} if (torrentSummary.posterURL) { style['background-image'] = 'linear-gradient(to bottom, ' + 'rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0) 100%), ' + `url("${torrentSummary.posterURL}")` } // Foreground: name of the torrent, basic info like size, play button, // cast buttons if available, and delete return hx`
${renderTorrentMetadata(torrent, torrentSummary)} ${renderTorrentButtons(torrentSummary, dispatch)}
` } // Show name, download status, % complete function renderTorrentMetadata (torrent, torrentSummary) { var name = torrentSummary.displayName || torrentSummary.name || 'Loading torrent...' var elements = [hx`
${name}
`] // If a torrent is paused and we only get the torrentSummary // If it's downloading/seeding then we have more information if (torrent) { var progress = Math.floor(100 * torrent.progress) var downloaded = prettyBytes(torrent.downloaded) var total = prettyBytes(torrent.length || 0) if (downloaded !== total) downloaded += ` / ${total}` elements.push(hx`
${getFilesLength()} ${getPeers()} ↓ ${prettyBytes(torrent.downloadSpeed || 0)}/s ↑ ${prettyBytes(torrent.uploadSpeed || 0)}/s
`) elements.push(hx`
${progress}% ${downloaded}
`) } return hx`
${elements}
` function getPeers () { var count = torrent.numPeers === 1 ? 'peer' : 'peers' return `${torrent.numPeers} ${count}` } function getFilesLength () { if (torrent.ready && torrent.files.length > 1) { return hx`${torrent.files.length} files` } } } // Download button toggles between torrenting (DL/seed) and paused // Play button starts streaming the torrent immediately, unpausing if needed function renderTorrentButtons (torrentSummary, dispatch) { return hx`
dispatch('toggleTorrent', torrentSummary)}> ${torrentSummary.status === 'seeding' ? 'file_upload' : 'file_download'} dispatch('openPlayer', torrentSummary)}> ${torrentSummary.playStatus === 'timeout' ? 'warning' : 'play_arrow'} dispatch('deleteTorrent', torrentSummary)}> close
` }