import videojs from 'video.js' import { PeerTubeP2PInfoButtonOptions, PlayerNetworkInfo } from '../../types' import { bytes } from '../common' const Button = videojs.getComponent('Button') class P2pInfoButton extends Button { constructor (player: videojs.Player, options?: PeerTubeP2PInfoButtonOptions) { super(player, options as any) } createEl () { const div = videojs.dom.createEl('div', { className: 'vjs-peertube' }) const subDivWebtorrent = videojs.dom.createEl('div', { className: 'vjs-peertube-hidden' // Hide the stats before we get the info }) as HTMLDivElement div.appendChild(subDivWebtorrent) // Stop here if P2P is not enabled const p2pEnabled = (this.options_ as PeerTubeP2PInfoButtonOptions).p2pEnabled if (!p2pEnabled) return div as HTMLButtonElement const downloadIcon = videojs.dom.createEl('span', { className: 'icon icon-download' }) subDivWebtorrent.appendChild(downloadIcon) const downloadSpeedText = videojs.dom.createEl('span', { className: 'download-speed-text' }) const downloadSpeedNumber = videojs.dom.createEl('span', { className: 'download-speed-number' }) const downloadSpeedUnit = videojs.dom.createEl('span') downloadSpeedText.appendChild(downloadSpeedNumber) downloadSpeedText.appendChild(downloadSpeedUnit) subDivWebtorrent.appendChild(downloadSpeedText) const uploadIcon = videojs.dom.createEl('span', { className: 'icon icon-upload' }) subDivWebtorrent.appendChild(uploadIcon) const uploadSpeedText = videojs.dom.createEl('span', { className: 'upload-speed-text' }) const uploadSpeedNumber = videojs.dom.createEl('span', { className: 'upload-speed-number' }) const uploadSpeedUnit = videojs.dom.createEl('span') uploadSpeedText.appendChild(uploadSpeedNumber) uploadSpeedText.appendChild(uploadSpeedUnit) subDivWebtorrent.appendChild(uploadSpeedText) const peersText = videojs.dom.createEl('span', { className: 'peers-text' }) const peersNumber = videojs.dom.createEl('span', { className: 'peers-number' }) subDivWebtorrent.appendChild(peersNumber) subDivWebtorrent.appendChild(peersText) const subDivHttp = videojs.dom.createEl('div', { className: 'vjs-peertube-hidden' }) const subDivHttpText = videojs.dom.createEl('span', { className: 'http-fallback', textContent: 'HTTP' }) subDivHttp.appendChild(subDivHttpText) div.appendChild(subDivHttp) this.player_.on('p2pInfo', (event: any, data: PlayerNetworkInfo) => { // We are in HTTP fallback if (!data) { subDivHttp.className = 'vjs-peertube-displayed' subDivWebtorrent.className = 'vjs-peertube-hidden' return } const p2pStats = data.p2p const httpStats = data.http const downloadSpeed = bytes(p2pStats.downloadSpeed + httpStats.downloadSpeed) const uploadSpeed = bytes(p2pStats.uploadSpeed) const totalDownloaded = bytes(p2pStats.downloaded + httpStats.downloaded) const totalUploaded = bytes(p2pStats.uploaded) const numPeers = p2pStats.numPeers subDivWebtorrent.title = this.player().localize('Total downloaded: ') + totalDownloaded.join(' ') + '\n' if (data.source === 'p2p-media-loader') { const downloadedFromServer = bytes(httpStats.downloaded).join(' ') const downloadedFromPeers = bytes(p2pStats.downloaded).join(' ') subDivWebtorrent.title += ' * ' + this.player().localize('From servers: ') + downloadedFromServer + '\n' + ' * ' + this.player().localize('From peers: ') + downloadedFromPeers + '\n' } subDivWebtorrent.title += this.player().localize('Total uploaded: ') + totalUploaded.join(' ') downloadSpeedNumber.textContent = downloadSpeed[0] downloadSpeedUnit.textContent = ' ' + downloadSpeed[1] uploadSpeedNumber.textContent = uploadSpeed[0] uploadSpeedUnit.textContent = ' ' + uploadSpeed[1] peersNumber.textContent = numPeers.toString() peersText.textContent = ' ' + (numPeers > 1 ? this.player().localize('peers') : this.player_.localize('peer')) subDivHttp.className = 'vjs-peertube-hidden' subDivWebtorrent.className = 'vjs-peertube-displayed' }) return div as HTMLButtonElement } } videojs.registerComponent('P2PInfoButton', P2pInfoButton)