p2p-info-button.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import { PlayerNetworkInfo } from '../peertube-videojs-typings'
  2. import videojs from 'video.js'
  3. import { bytes } from '../utils'
  4. const Button = videojs.getComponent('Button')
  5. class P2pInfoButton extends Button {
  6. createEl () {
  7. const div = videojs.dom.createEl('div', {
  8. className: 'vjs-peertube'
  9. })
  10. const subDivWebtorrent = videojs.dom.createEl('div', {
  11. className: 'vjs-peertube-hidden' // Hide the stats before we get the info
  12. }) as HTMLDivElement
  13. div.appendChild(subDivWebtorrent)
  14. const downloadIcon = videojs.dom.createEl('span', {
  15. className: 'icon icon-download'
  16. })
  17. subDivWebtorrent.appendChild(downloadIcon)
  18. const downloadSpeedText = videojs.dom.createEl('span', {
  19. className: 'download-speed-text'
  20. })
  21. const downloadSpeedNumber = videojs.dom.createEl('span', {
  22. className: 'download-speed-number'
  23. })
  24. const downloadSpeedUnit = videojs.dom.createEl('span')
  25. downloadSpeedText.appendChild(downloadSpeedNumber)
  26. downloadSpeedText.appendChild(downloadSpeedUnit)
  27. subDivWebtorrent.appendChild(downloadSpeedText)
  28. const uploadIcon = videojs.dom.createEl('span', {
  29. className: 'icon icon-upload'
  30. })
  31. subDivWebtorrent.appendChild(uploadIcon)
  32. const uploadSpeedText = videojs.dom.createEl('span', {
  33. className: 'upload-speed-text'
  34. })
  35. const uploadSpeedNumber = videojs.dom.createEl('span', {
  36. className: 'upload-speed-number'
  37. })
  38. const uploadSpeedUnit = videojs.dom.createEl('span')
  39. uploadSpeedText.appendChild(uploadSpeedNumber)
  40. uploadSpeedText.appendChild(uploadSpeedUnit)
  41. subDivWebtorrent.appendChild(uploadSpeedText)
  42. const peersText = videojs.dom.createEl('span', {
  43. className: 'peers-text'
  44. })
  45. const peersNumber = videojs.dom.createEl('span', {
  46. className: 'peers-number'
  47. })
  48. subDivWebtorrent.appendChild(peersNumber)
  49. subDivWebtorrent.appendChild(peersText)
  50. const subDivHttp = videojs.dom.createEl('div', {
  51. className: 'vjs-peertube-hidden'
  52. })
  53. const subDivHttpText = videojs.dom.createEl('span', {
  54. className: 'http-fallback',
  55. textContent: 'HTTP'
  56. })
  57. subDivHttp.appendChild(subDivHttpText)
  58. div.appendChild(subDivHttp)
  59. this.player_.on('p2pInfo', (event: any, data: PlayerNetworkInfo) => {
  60. // We are in HTTP fallback
  61. if (!data) {
  62. subDivHttp.className = 'vjs-peertube-displayed'
  63. subDivWebtorrent.className = 'vjs-peertube-hidden'
  64. return
  65. }
  66. const p2pStats = data.p2p
  67. const httpStats = data.http
  68. const downloadSpeed = bytes(p2pStats.downloadSpeed + httpStats.downloadSpeed)
  69. const uploadSpeed = bytes(p2pStats.uploadSpeed + httpStats.uploadSpeed)
  70. const totalDownloaded = bytes(p2pStats.downloaded + httpStats.downloaded)
  71. const totalUploaded = bytes(p2pStats.uploaded + httpStats.uploaded)
  72. const numPeers = p2pStats.numPeers
  73. subDivWebtorrent.title = this.player().localize('Total downloaded: ') + totalDownloaded.join(' ') + '\n' +
  74. this.player().localize('Total uploaded: ' + totalUploaded.join(' '))
  75. downloadSpeedNumber.textContent = downloadSpeed[ 0 ]
  76. downloadSpeedUnit.textContent = ' ' + downloadSpeed[ 1 ]
  77. uploadSpeedNumber.textContent = uploadSpeed[ 0 ]
  78. uploadSpeedUnit.textContent = ' ' + uploadSpeed[ 1 ]
  79. peersNumber.textContent = numPeers.toString()
  80. peersText.textContent = ' ' + (numPeers > 1 ? this.player().localize('peers') : this.player_.localize('peer'))
  81. subDivHttp.className = 'vjs-peertube-hidden'
  82. subDivWebtorrent.className = 'vjs-peertube-displayed'
  83. })
  84. return div as HTMLButtonElement
  85. }
  86. }
  87. videojs.registerComponent('P2PInfoButton', P2pInfoButton)