aboutsummaryrefslogtreecommitdiffhomepage
path: root/client/src/assets/player
diff options
context:
space:
mode:
Diffstat (limited to 'client/src/assets/player')
-rw-r--r--client/src/assets/player/peertube-videojs-plugin.ts53
1 files changed, 52 insertions, 1 deletions
diff --git a/client/src/assets/player/peertube-videojs-plugin.ts b/client/src/assets/player/peertube-videojs-plugin.ts
index 125ef64a4..fecd4edec 100644
--- a/client/src/assets/player/peertube-videojs-plugin.ts
+++ b/client/src/assets/player/peertube-videojs-plugin.ts
@@ -1,5 +1,6 @@
1// Big thanks to: https://github.com/kmoskwiak/videojs-resolution-switcher 1// Big thanks to: https://github.com/kmoskwiak/videojs-resolution-switcher
2 2
3import { VideoService } from '@app/shared/video/video.service'
3import * as videojs from 'video.js' 4import * as videojs from 'video.js'
4import * as WebTorrent from 'webtorrent' 5import * as WebTorrent from 'webtorrent'
5import { VideoFile } from '../../../../shared/models/videos/video.model' 6import { VideoFile } from '../../../../shared/models/videos/video.model'
@@ -23,6 +24,7 @@ type PeertubePluginOptions = {
23 videoFiles: VideoFile[] 24 videoFiles: VideoFile[]
24 playerElement: HTMLVideoElement 25 playerElement: HTMLVideoElement
25 peerTubeLink: boolean 26 peerTubeLink: boolean
27 videoViewUrl: string
26} 28}
27 29
28// https://github.com/danrevah/ngx-pipes/blob/master/src/pipes/math/bytes.ts 30// https://github.com/danrevah/ngx-pipes/blob/master/src/pipes/math/bytes.ts
@@ -218,6 +220,8 @@ class PeerTubePlugin extends Plugin {
218 private videoFiles: VideoFile[] 220 private videoFiles: VideoFile[]
219 private torrent: WebTorrent.Torrent 221 private torrent: WebTorrent.Torrent
220 private autoplay = false 222 private autoplay = false
223 private videoViewUrl: string
224 private videoViewInterval
221 225
222 constructor (player: videojs.Player, options: PeertubePluginOptions) { 226 constructor (player: videojs.Player, options: PeertubePluginOptions) {
223 super(player, options) 227 super(player, options)
@@ -227,6 +231,7 @@ class PeerTubePlugin extends Plugin {
227 this.player.options_.autoplay = false 231 this.player.options_.autoplay = false
228 232
229 this.videoFiles = options.videoFiles 233 this.videoFiles = options.videoFiles
234 this.videoViewUrl = options.videoViewUrl
230 235
231 // Hack to "simulate" src link in video.js >= 6 236 // Hack to "simulate" src link in video.js >= 6
232 // Without this, we can't play the video after pausing it 237 // Without this, we can't play the video after pausing it
@@ -240,6 +245,7 @@ class PeerTubePlugin extends Plugin {
240 this.player.ready(() => { 245 this.player.ready(() => {
241 this.initializePlayer(options) 246 this.initializePlayer(options)
242 this.runTorrentInfoScheduler() 247 this.runTorrentInfoScheduler()
248 this.prepareRunViewAdd()
243 }) 249 })
244 } 250 }
245 251
@@ -334,9 +340,12 @@ class PeerTubePlugin extends Plugin {
334 } 340 }
335 } 341 }
336 342
337 setVideoFiles (files: VideoFile[]) { 343 setVideoFiles (files: VideoFile[], videoViewUrl: string) {
344 this.videoViewUrl = videoViewUrl
338 this.videoFiles = files 345 this.videoFiles = files
339 346
347 // Re run view add for the new video
348 this.prepareRunViewAdd()
340 this.updateVideoFile(undefined, () => this.player.play()) 349 this.updateVideoFile(undefined, () => this.player.play())
341 } 350 }
342 351
@@ -377,6 +386,48 @@ class PeerTubePlugin extends Plugin {
377 }, 1000) 386 }, 1000)
378 } 387 }
379 388
389 private prepareRunViewAdd () {
390 if (this.player.readyState() < 1) {
391 return this.player.one('loadedmetadata', () => this.runViewAdd())
392 }
393
394 this.runViewAdd()
395 }
396
397 private runViewAdd () {
398 this.clearVideoViewInterval()
399
400 // After 30 seconds (or 3/4 of the video), add a view to the video
401 let minSecondsToView = 30
402
403 const duration = this.player.duration()
404 if (duration < minSecondsToView) minSecondsToView = (duration * 3) / 4
405
406 let secondsViewed = 0
407 this.videoViewInterval = setInterval(() => {
408 if (this.player && !this.player.paused()) {
409 secondsViewed += 1
410
411 if (secondsViewed > minSecondsToView) {
412 this.clearVideoViewInterval()
413
414 this.addViewToVideo().catch(err => console.error(err))
415 }
416 }
417 }, 1000)
418 }
419
420 private clearVideoViewInterval () {
421 if (this.videoViewInterval !== undefined) {
422 clearInterval(this.videoViewInterval)
423 this.videoViewInterval = undefined
424 }
425 }
426
427 private addViewToVideo () {
428 return fetch(this.videoViewUrl, { method: 'POST' })
429 }
430
380 private handleError (err: Error | string) { 431 private handleError (err: Error | string) {
381 return this.player.trigger('customError', { err }) 432 return this.player.trigger('customError', { err })
382 } 433 }