class PeerTubePlugin extends Plugin {
private readonly videoViewUrl: string
- private readonly authorizationHeader: string
+ private readonly authorizationHeader: () => string
private readonly videoUUID: string
private readonly startTime: number
- private readonly CONSTANTS = {
- USER_VIEW_VIDEO_INTERVAL: 5000 // Every 5 seconds, notify the user is watching the video
- }
+ private readonly videoViewIntervalMs: number
private videoCaptions: VideoJSCaption[]
private defaultSubtitle: string
this.authorizationHeader = options.authorizationHeader
this.videoUUID = options.videoUUID
this.startTime = timeToInt(options.startTime)
+ this.videoViewIntervalMs = options.videoViewIntervalMs
this.videoCaptions = options.videoCaptions
this.initialInactivityTimeout = this.player.options_.inactivityTimeout
- if (options.autoplay) this.player.addClass('vjs-has-autoplay')
+ if (options.autoplay !== false) this.player.addClass('vjs-has-autoplay')
this.player.on('autoplay-failure', () => {
this.player.removeClass('vjs-has-autoplay')
})
this.player.on('seeked', () => {
- // Don't take into account small seek events
- if (Math.abs(this.player.currentTime() - lastCurrentTime) < 3) return
+ const diff = Math.floor(this.player.currentTime()) - lastCurrentTime
+
+ // Don't take into account small forwards
+ if (diff > 0 && diff < 3) return
lastViewEvent = 'seek'
})
this.player.one('ended', () => {
- const currentTime = Math.round(this.player.duration())
+ const currentTime = Math.floor(this.player.duration())
lastCurrentTime = currentTime
this.notifyUserIsWatching(currentTime, lastViewEvent)
})
this.videoViewInterval = setInterval(() => {
- const currentTime = Math.round(this.player.currentTime())
+ const currentTime = Math.floor(this.player.currentTime())
// No need to update
if (currentTime === lastCurrentTime) return
.catch(err => logger.error('Cannot notify user is watching.', err))
lastViewEvent = undefined
-
- // Server won't save history, so save the video position in local storage
- if (!this.authorizationHeader) {
- saveVideoWatchHistory(this.videoUUID, currentTime)
- }
- }, this.CONSTANTS.USER_VIEW_VIDEO_INTERVAL)
+ }, this.videoViewIntervalMs)
}
private notifyUserIsWatching (currentTime: number, viewEvent: VideoViewEvent) {
- if (!this.videoViewUrl) return Promise.resolve(undefined)
-
- const body: VideoView = {
- currentTime,
- viewEvent
+ // Server won't save history, so save the video position in local storage
+ if (!this.authorizationHeader()) {
+ saveVideoWatchHistory(this.videoUUID, currentTime)
}
- const headers = new Headers({
- 'Content-type': 'application/json; charset=UTF-8'
- })
+ if (!this.videoViewUrl) return Promise.resolve(true)
+
+ const body: VideoView = { currentTime, viewEvent }
- if (this.authorizationHeader) headers.set('Authorization', this.authorizationHeader)
+ const headers = new Headers({ 'Content-type': 'application/json; charset=UTF-8' })
+ if (this.authorizationHeader()) headers.set('Authorization', this.authorizationHeader())
return fetch(this.videoViewUrl, { method: 'POST', body: JSON.stringify(body), headers })
}