diff --git a/client/src/app/+videos/+video-watch/video-watch.component.ts b/client/src/app/+videos/+video-watch/video-watch.component.ts index 84548de97..19ad97d42 100644 --- a/client/src/app/+videos/+video-watch/video-watch.component.ts +++ b/client/src/app/+videos/+video-watch/video-watch.component.ts @@ -91,6 +91,8 @@ export class VideoWatchComponent implements OnInit, OnDestroy { private hotkeys: Hotkey[] = [] + private static VIEW_VIDEO_INTERVAL_MS = 5000 + constructor ( private elementRef: ElementRef, private route: ActivatedRoute, @@ -613,16 +615,18 @@ export class VideoWatchComponent implements OnInit, OnDestroy { const byLocalStorage = getStoredVideoWatchHistory(video.uuid) if (byUrl) return timeToInt(urlOptions.startTime) - if (byHistory) return video.userHistory.currentTime - if (byLocalStorage) return byLocalStorage.duration - return 0 + let startTime = 0 + if (byHistory) startTime = video.userHistory.currentTime + if (byLocalStorage) startTime = byLocalStorage.duration + + // If we are at the end of the video, reset the timer + if (video.duration - startTime <= 1) startTime = 0 + + return startTime } - let startTime = getStartTime() - - // If we are at the end of the video, reset the timer - if (video.duration - startTime <= 1) startTime = 0 + const startTime = getStartTime() const playerCaptions = videoCaptions.map(c => ({ label: c.language.label, @@ -679,6 +683,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy { videoViewUrl: video.privacy.id !== VideoPrivacy.PRIVATE ? this.videoService.getVideoViewUrl(video.uuid) : null, + videoViewIntervalMs: VideoWatchComponent.VIEW_VIDEO_INTERVAL_MS, authorizationHeader: () => this.authService.getRequestHeaderValue(), serverUrl: environment.originServerUrl || window.location.origin, diff --git a/client/src/assets/player/shared/manager-options/manager-options-builder.ts b/client/src/assets/player/shared/manager-options/manager-options-builder.ts index c820d637b..5d3ee4c4a 100644 --- a/client/src/assets/player/shared/manager-options/manager-options-builder.ts +++ b/client/src/assets/player/shared/manager-options/manager-options-builder.ts @@ -35,6 +35,7 @@ export class ManagerOptionsBuilder { ...pick(commonOptions, [ 'videoViewUrl', + 'videoViewIntervalMs', 'authorizationHeader', 'startTime', 'videoDuration', diff --git a/client/src/assets/player/shared/peertube/peertube-plugin.ts b/client/src/assets/player/shared/peertube/peertube-plugin.ts index ec8fbb320..b5f177f30 100644 --- a/client/src/assets/player/shared/peertube/peertube-plugin.ts +++ b/client/src/assets/player/shared/peertube/peertube-plugin.ts @@ -27,9 +27,7 @@ class PeerTubePlugin extends Plugin { 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 @@ -48,6 +46,7 @@ class PeerTubePlugin extends Plugin { 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 @@ -188,7 +187,7 @@ class PeerTubePlugin extends Plugin { }) this.player.one('ended', () => { - const currentTime = Math.round(this.player.duration()) + const currentTime = Math.floor(this.player.duration()) lastCurrentTime = currentTime this.notifyUserIsWatching(currentTime, lastViewEvent) @@ -197,7 +196,7 @@ class PeerTubePlugin extends Plugin { }) 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 @@ -213,7 +212,7 @@ class PeerTubePlugin extends Plugin { if (!this.authorizationHeader()) { saveVideoWatchHistory(this.videoUUID, currentTime) } - }, this.CONSTANTS.USER_VIEW_VIDEO_INTERVAL) + }, this.videoViewIntervalMs) } private notifyUserIsWatching (currentTime: number, viewEvent: VideoViewEvent) { diff --git a/client/src/assets/player/types/manager-options.ts b/client/src/assets/player/types/manager-options.ts index 3fbcec29c..c14fd7e99 100644 --- a/client/src/assets/player/types/manager-options.ts +++ b/client/src/assets/player/types/manager-options.ts @@ -55,6 +55,8 @@ export interface CommonOptions extends CustomizationOptions { inactivityTimeout: number poster: string + videoViewIntervalMs: number + instanceName: string theaterButton: boolean diff --git a/client/src/assets/player/types/peertube-videojs-typings.ts b/client/src/assets/player/types/peertube-videojs-typings.ts index 5674f78cb..eadf56cfa 100644 --- a/client/src/assets/player/types/peertube-videojs-typings.ts +++ b/client/src/assets/player/types/peertube-videojs-typings.ts @@ -108,6 +108,8 @@ type PeerTubePluginOptions = { isLive: boolean videoUUID: string + + videoViewIntervalMs: number } type MetricsPluginOptions = { diff --git a/client/src/standalone/videos/shared/player-manager-options.ts b/client/src/standalone/videos/shared/player-manager-options.ts index f09c86d14..43ae22a3b 100644 --- a/client/src/standalone/videos/shared/player-manager-options.ts +++ b/client/src/standalone/videos/shared/player-manager-options.ts @@ -217,6 +217,7 @@ export class PlayerManagerOptions { videoCaptions, inactivityTimeout: 2500, videoViewUrl: this.videoFetcher.getVideoViewsUrl(video.uuid), + videoViewIntervalMs: 5000, metricsUrl: window.location.origin + '/api/v1/metrics/playback', videoShortUUID: video.shortUUID,