import { ChangeDetectorRef, Component, ElementRef, Inject, LOCALE_ID, NgZone, OnDestroy, OnInit, ViewChild } from '@angular/core'
import { ActivatedRoute, Router } from '@angular/router'
import { RedirectService } from '@app/core/routing/redirect.service'
-import { peertubeLocalStorage } from '@app/shared/misc/peertube-local-storage'
+import { peertubeLocalStorage, peertubeSessionStorage } from '@app/shared/misc/peertube-web-storage'
import { VideoSupportComponent } from '@app/videos/+video-watch/modal/video-support.component'
import { MetaService } from '@ngx-meta/core'
import { AuthUser, Notifier, ServerService } from '@app/core'
import { PlatformLocation } from '@angular/common'
import { randomInt } from '@shared/core-utils/miscs/miscs'
import { RecommendedVideosComponent } from '../recommendations/recommended-videos.component'
+import { scrollToTop } from '@app/shared/misc/utils'
@Component({
selector: 'my-video-watch',
})
export class VideoWatchComponent implements OnInit, OnDestroy {
private static LOCAL_STORAGE_PRIVACY_CONCERN_KEY = 'video-watch-privacy-concern'
- private static LOCAL_STORAGE_AUTO_PLAY_NEXT_VIDEO = 'auto_play_next_video'
@ViewChild('videoWatchPlaylist', { static: true }) videoWatchPlaylist: VideoWatchPlaylistComponent
@ViewChild('videoShareModal', { static: false }) videoShareModal: VideoShareComponent
remoteServerDown = false
hotkeys: Hotkey[] = []
+ tooltipLike = ''
+ tooltipDislike = ''
+ tooltipSupport = ''
+ tooltipSaveToPlaylist = ''
+
private nextVideoUuid = ''
private currentTime: number
private paramsSub: Subscription
private hooks: HooksService,
private location: PlatformLocation,
@Inject(LOCALE_ID) private localeId: string
- ) {}
+ ) {
+ this.tooltipLike = this.i18n('Like this video')
+ this.tooltipDislike = this.i18n('Dislike this video')
+ this.tooltipSupport = this.i18n('Support options for this video')
+ this.tooltipSaveToPlaylist = this.i18n('Save to playlist')
+ }
get user () {
return this.authService.getUser()
if (playlistId) this.loadPlaylist(playlistId)
})
- this.queryParamsSub = this.route.queryParams.subscribe(queryParams => {
+ this.queryParamsSub = this.route.queryParams.subscribe(async queryParams => {
const videoId = queryParams[ 'videoId' ]
- if (videoId) this.loadVideo(videoId)
+ if (videoId) await this.loadVideo(videoId)
+
+ const start = queryParams[ 'start' ]
+ if (this.player && start) this.player.currentTime(parseInt(start, 10))
})
this.initHotkeys()
return video.isVideoNSFWForUser(this.user, this.serverService.getConfig())
}
+ isAutoPlayEnabled () {
+ return (
+ (this.user && this.user.autoPlayNextVideo) ||
+ peertubeSessionStorage.getItem(RecommendedVideosComponent.SESSION_STORAGE_AUTO_PLAY_NEXT_VIDEO) === 'true'
+ )
+ }
+
+ handleTimestampClicked (timestamp: number) {
+ if (this.player) this.player.currentTime(timestamp)
+ scrollToTop()
+ }
+
+ isPlaylistAutoPlayEnabled () {
+ return (
+ (this.user && this.user.autoPlayNextVideoPlaylist) ||
+ peertubeSessionStorage.getItem(VideoWatchPlaylistComponent.SESSION_STORAGE_AUTO_PLAY_NEXT_VIDEO_PLAYLIST) === 'true'
+ )
+ }
+
private loadVideo (videoId: string) {
// Video did not change
if (this.video && this.video.uuid === videoId) return
}
private async setVideoDescriptionHTML () {
- this.videoHTMLDescription = await this.markdownService.textMarkdownToHTML(this.video.description)
+ const html = await this.markdownService.textMarkdownToHTML(this.video.description)
+ this.videoHTMLDescription = await this.markdownService.processVideoTimestamps(html)
}
private setVideoLikesBarTooltipText () {
this.player.one('ended', () => {
if (this.playlist) {
- if (
- this.user && this.user.autoPlayNextVideoPlaylist ||
- peertubeLocalStorage.getItem(VideoWatchPlaylistComponent.LOCAL_STORAGE_AUTO_PLAY_NEXT_VIDEO_PLAYLIST) === 'true'
- ) this.zone.run(() => this.videoWatchPlaylist.navigateToNextPlaylistVideo())
- } else if (
- this.user && this.user.autoPlayNextVideo ||
- peertubeLocalStorage.getItem(RecommendedVideosComponent.LOCAL_STORAGE_AUTO_PLAY_NEXT_VIDEO) === 'true'
- ) {
+ if (this.isPlaylistAutoPlayEnabled()) this.zone.run(() => this.videoWatchPlaylist.navigateToNextPlaylistVideo())
+ } else if (this.isAutoPlayEnabled()) {
this.zone.run(() => this.autoplayNext())
}
})
this.player.one('stopped', () => {
if (this.playlist) {
- if (
- this.user && this.user.autoPlayNextVideoPlaylist ||
- peertubeLocalStorage.getItem(VideoWatchPlaylistComponent.LOCAL_STORAGE_AUTO_PLAY_NEXT_VIDEO_PLAYLIST) === 'true'
- ) this.zone.run(() => this.videoWatchPlaylist.navigateToNextPlaylistVideo())
+ if (this.isPlaylistAutoPlayEnabled()) this.zone.run(() => this.videoWatchPlaylist.navigateToNextPlaylistVideo())
}
})
user?: AuthUser
}) {
const { video, videoCaptions, urlOptions, user } = params
+ const getStartTime = () => {
+ const byUrl = urlOptions.startTime !== undefined
+ const byHistory = video.userHistory && !this.playlist
+
+ if (byUrl) {
+ return timeToInt(urlOptions.startTime)
+ } else if (byHistory) {
+ return video.userHistory.currentTime
+ } else {
+ return 0
+ }
+ }
- let startTime = timeToInt(urlOptions.startTime) || (video.userHistory ? video.userHistory.currentTime : 0)
+ let startTime = getStartTime()
// If we are at the end of the video, reset the timer
if (video.duration - startTime <= 1) startTime = 0