aboutsummaryrefslogtreecommitdiffhomepage
path: root/client/src/assets/player/shared/p2p-media-loader/p2p-media-loader-plugin.ts
diff options
context:
space:
mode:
Diffstat (limited to 'client/src/assets/player/shared/p2p-media-loader/p2p-media-loader-plugin.ts')
-rw-r--r--client/src/assets/player/shared/p2p-media-loader/p2p-media-loader-plugin.ts60
1 files changed, 23 insertions, 37 deletions
diff --git a/client/src/assets/player/shared/p2p-media-loader/p2p-media-loader-plugin.ts b/client/src/assets/player/shared/p2p-media-loader/p2p-media-loader-plugin.ts
index e6f525fea..fe967a730 100644
--- a/client/src/assets/player/shared/p2p-media-loader/p2p-media-loader-plugin.ts
+++ b/client/src/assets/player/shared/p2p-media-loader/p2p-media-loader-plugin.ts
@@ -3,19 +3,12 @@ import videojs from 'video.js'
3import { Events, Segment } from '@peertube/p2p-media-loader-core' 3import { Events, Segment } from '@peertube/p2p-media-loader-core'
4import { Engine, initHlsJsPlayer, initVideoJsContribHlsJsPlayer } from '@peertube/p2p-media-loader-hlsjs' 4import { Engine, initHlsJsPlayer, initVideoJsContribHlsJsPlayer } from '@peertube/p2p-media-loader-hlsjs'
5import { logger } from '@root-helpers/logger' 5import { logger } from '@root-helpers/logger'
6import { addQueryParams, timeToInt } from '@shared/core-utils' 6import { addQueryParams } from '@shared/core-utils'
7import { P2PMediaLoaderPluginOptions, PlayerNetworkInfo } from '../../types' 7import { P2PMediaLoaderPluginOptions, PlayerNetworkInfo } from '../../types'
8import { registerConfigPlugin, registerSourceHandler } from './hls-plugin' 8import { SettingsButton } from '../settings/settings-menu-button'
9
10registerConfigPlugin(videojs)
11registerSourceHandler(videojs)
12 9
13const Plugin = videojs.getPlugin('plugin') 10const Plugin = videojs.getPlugin('plugin')
14class P2pMediaLoaderPlugin extends Plugin { 11class P2pMediaLoaderPlugin extends Plugin {
15
16 private readonly CONSTANTS = {
17 INFO_SCHEDULER: 1000 // Don't change this
18 }
19 private readonly options: P2PMediaLoaderPluginOptions 12 private readonly options: P2PMediaLoaderPluginOptions
20 13
21 private hlsjs: Hlsjs 14 private hlsjs: Hlsjs
@@ -31,7 +24,6 @@ class P2pMediaLoaderPlugin extends Plugin {
31 pendingDownload: [] as number[], 24 pendingDownload: [] as number[],
32 totalDownload: 0 25 totalDownload: 0
33 } 26 }
34 private startTime: number
35 27
36 private networkInfoInterval: any 28 private networkInfoInterval: any
37 29
@@ -39,7 +31,6 @@ class P2pMediaLoaderPlugin extends Plugin {
39 super(player) 31 super(player)
40 32
41 this.options = options 33 this.options = options
42 this.startTime = timeToInt(options.startTime)
43 34
44 // FIXME: typings https://github.com/Microsoft/TypeScript/issues/14080 35 // FIXME: typings https://github.com/Microsoft/TypeScript/issues/14080
45 if (!(videojs as any).Html5Hlsjs) { 36 if (!(videojs as any).Html5Hlsjs) {
@@ -77,17 +68,22 @@ class P2pMediaLoaderPlugin extends Plugin {
77 }) 68 })
78 69
79 player.ready(() => { 70 player.ready(() => {
80 this.initializeCore()
81
82 this.initializePlugin() 71 this.initializePlugin()
83 }) 72 })
84 } 73 }
85 74
86 dispose () { 75 dispose () {
87 if (this.hlsjs) this.hlsjs.destroy() 76 this.p2pEngine?.removeAllListeners()
88 if (this.p2pEngine) this.p2pEngine.destroy() 77 this.p2pEngine?.destroy()
78
79 this.hlsjs?.destroy()
80 this.options.segmentValidator?.destroy();
81
82 (videojs as any).Html5Hlsjs?.removeAllHooks()
89 83
90 clearInterval(this.networkInfoInterval) 84 clearInterval(this.networkInfoInterval)
85
86 super.dispose()
91 } 87 }
92 88
93 getCurrentLevel () { 89 getCurrentLevel () {
@@ -104,18 +100,6 @@ class P2pMediaLoaderPlugin extends Plugin {
104 return this.hlsjs 100 return this.hlsjs
105 } 101 }
106 102
107 private initializeCore () {
108 this.player.one('play', () => {
109 this.player.addClass('vjs-has-big-play-button-clicked')
110 })
111
112 this.player.one('canplay', () => {
113 if (this.startTime) {
114 this.player.currentTime(this.startTime)
115 }
116 })
117 }
118
119 private initializePlugin () { 103 private initializePlugin () {
120 initHlsJsPlayer(this.hlsjs) 104 initHlsJsPlayer(this.hlsjs)
121 105
@@ -133,7 +117,7 @@ class P2pMediaLoaderPlugin extends Plugin {
133 117
134 this.runStats() 118 this.runStats()
135 119
136 this.hlsjs.on(Hlsjs.Events.LEVEL_SWITCHED, () => this.player.trigger('engineResolutionChange')) 120 this.hlsjs.on(Hlsjs.Events.LEVEL_SWITCHED, () => this.player.trigger('engine-resolution-change'))
137 } 121 }
138 122
139 private runStats () { 123 private runStats () {
@@ -167,7 +151,7 @@ class P2pMediaLoaderPlugin extends Plugin {
167 this.statsP2PBytes.pendingUpload = [] 151 this.statsP2PBytes.pendingUpload = []
168 this.statsHTTPBytes.pendingDownload = [] 152 this.statsHTTPBytes.pendingDownload = []
169 153
170 return this.player.trigger('p2pInfo', { 154 return this.player.trigger('p2p-info', {
171 source: 'p2p-media-loader', 155 source: 'p2p-media-loader',
172 http: { 156 http: {
173 downloadSpeed: httpDownloadSpeed, 157 downloadSpeed: httpDownloadSpeed,
@@ -182,7 +166,7 @@ class P2pMediaLoaderPlugin extends Plugin {
182 }, 166 },
183 bandwidthEstimate: (this.hlsjs as any).bandwidthEstimate / 8 167 bandwidthEstimate: (this.hlsjs as any).bandwidthEstimate / 8
184 } as PlayerNetworkInfo) 168 } as PlayerNetworkInfo)
185 }, this.CONSTANTS.INFO_SCHEDULER) 169 }, 1000)
186 } 170 }
187 171
188 private arraySum (data: number[]) { 172 private arraySum (data: number[]) {
@@ -190,10 +174,7 @@ class P2pMediaLoaderPlugin extends Plugin {
190 } 174 }
191 175
192 private fallbackToBuiltInIOS () { 176 private fallbackToBuiltInIOS () {
193 logger.info('HLS.js does not seem to be supported. Fallback to built-in HLS.'); 177 logger.info('HLS.js does not seem to be supported. Fallback to built-in HLS.')
194
195 // Workaround to force video.js to not re create a video element
196 (this.player as any).playerElIngest_ = this.player.el().parentNode
197 178
198 this.player.src({ 179 this.player.src({
199 type: this.options.type, 180 type: this.options.type,
@@ -203,9 +184,14 @@ class P2pMediaLoaderPlugin extends Plugin {
203 }) 184 })
204 }) 185 })
205 186
206 this.player.ready(() => { 187 // Resolution button is not supported in built-in HLS player
207 this.initializeCore() 188 this.getResolutionButton().hide()
208 }) 189 }
190
191 private getResolutionButton () {
192 const settingsButton = this.player.controlBar.getDescendant([ 'settingsButton' ]) as SettingsButton
193
194 return settingsButton.menu.getChild('resolutionMenuButton')
209 } 195 }
210} 196}
211 197