otherVideosDisplayed: Video[] = []
- error = false
+ syndicationItems = {}
+
player: videojs.Player
playerElement: HTMLVideoElement
userRating: UserVideoRateType = null
video: VideoDetails = null
- videoPlayerLoaded = false
videoNotFound = false
descriptionLoading = false
private otherVideos: Video[] = []
private paramsSub: Subscription
- private videojsInstance: videojs.Player
constructor (
private elementRef: ElementRef,
)
this.paramsSub = this.route.params.subscribe(routeParams => {
- if (this.videoPlayerLoaded) {
+ if (this.player) {
this.player.pause()
}
const uuid = routeParams['uuid']
- // Video did not changed
+ // Video did not change
if (this.video && this.video.uuid === uuid) return
-
+ // Video did change
this.videoService.getVideo(uuid).subscribe(
- video => this.onVideoFetched(video),
+ video => {
+ const startTime = this.route.snapshot.queryParams.start
+ this.onVideoFetched(video, startTime)
+ .catch(err => this.handleError(err))
+ this.generateSyndicationList()
+ },
error => {
this.videoNotFound = true
}
ngOnDestroy () {
- // Remove player if it exists
- if (this.videoPlayerLoaded === true) {
- videojs(this.playerElement).dispose()
- }
+ this.flushPlayer()
// Unsubscribe subscriptions
this.paramsSub.unsubscribe()
return this.video.tags.join(', ')
}
+ generateSyndicationList () {
+ this.syndicationItems = this.videoService.getAccountFeedUrls(this.video.account.id)
+ }
+
isVideoRemovable () {
return this.video.isRemovableBy(this.authService.getUser())
}
)
}
- private async onVideoFetched (video: VideoDetails) {
+ private async onVideoFetched (video: VideoDetails, startTime = 0) {
this.video = video
+ // Re init attributes
+ this.descriptionLoading = false
+ this.completeDescriptionShown = false
+
this.updateOtherVideosDisplayed()
if (this.video.isVideoNSFWForUser(this.user)) {
if (res === false) return this.redirectService.redirectToHomepage()
}
- // Player was already loaded, remove old videojs
- if (this.videojsInstance) {
- this.videojsInstance.dispose()
- this.videojsInstance = undefined
- }
+ // Flush old player if needed
+ this.flushPlayer()
// Build video element, because videojs remove it on dispose
const playerElementWrapper = this.elementRef.nativeElement.querySelector('#video-element-wrapper')
const videojsOptions = getVideojsOptions({
autoplay: this.isAutoplay(),
- inactivityTimeout: 4000,
+ inactivityTimeout: 2500,
videoFiles: this.video.files,
playerElement: this.playerElement,
videoViewUrl: this.videoService.getVideoViewUrl(this.video.uuid),
videoDuration: this.video.duration,
enableHotkeys: true,
peertubeLink: false,
- poster: this.video.previewUrl
+ poster: this.video.previewUrl,
+ startTime
})
- this.videoPlayerLoaded = true
-
const self = this
this.zone.runOutsideAngular(() => {
- self.videojsInstance = videojs(this.playerElement, videojsOptions, function () {
+ videojs(this.playerElement, videojsOptions, function () {
self.player = this
this.on('customError', (event, data) => self.handleError(data.err))
})
// Be sure the autoPlay is set to false
return this.user.autoPlayVideo !== false
}
+
+ private flushPlayer () {
+ // Remove player if it exists
+ if (this.player) {
+ this.player.dispose()
+ this.player = undefined
+ }
+ }
}