AuthUser,
ConfirmService,
MarkdownService,
+ MetaService,
Notifier,
PeerTubeSocket,
+ PluginService,
RestExtractor,
ScreenService,
ServerService,
import { SubscribeButtonComponent } from '@app/shared/shared-user-subscription'
import { VideoActionsDisplayType, VideoDownloadComponent } from '@app/shared/shared-video-miniature'
import { VideoPlaylist, VideoPlaylistService } from '@app/shared/shared-video-playlist'
-import { MetaService } from '@ngx-meta/core'
import { peertubeLocalStorage } from '@root-helpers/peertube-web-storage'
import { HttpStatusCode } from '@shared/core-utils/miscs/http-error-codes'
-import { ServerConfig, ServerErrorCode, UserVideoRateType, VideoCaption, VideoPrivacy, VideoState } from '@shared/models'
+import {
+ HTMLServerConfig,
+ PeerTubeProblemDocument,
+ ServerErrorCode,
+ UserVideoRateType,
+ VideoCaption,
+ VideoPrivacy,
+ VideoState
+} from '@shared/models'
import {
cleanupVideoWatch,
getStoredP2PEnabled,
private configSub: Subscription
private liveVideosSub: Subscription
- private serverConfig: ServerConfig
+ private serverConfig: HTMLServerConfig
constructor (
private elementRef: ElementRef,
private videoCaptionService: VideoCaptionService,
private hotkeysService: HotkeysService,
private hooks: HooksService,
+ private pluginService: PluginService,
private peertubeSocket: PeerTubeSocket,
private screenService: ScreenService,
private location: PlatformLocation,
PeertubePlayerManager.initState()
- this.serverConfig = this.serverService.getTmpConfig()
-
- this.configSub = this.serverService.getConfig()
- .subscribe(config => {
- this.serverConfig = config
-
- if (
- isWebRTCDisabled() ||
- this.serverConfig.tracker.enabled === false ||
- getStoredP2PEnabled() === false ||
- peertubeLocalStorage.getItem(VideoWatchComponent.LOCAL_STORAGE_PRIVACY_CONCERN_KEY) === 'true'
- ) {
- this.hasAlreadyAcceptedPrivacyConcern = true
- }
- })
+ this.serverConfig = this.serverService.getHTMLConfig()
+ if (
+ isWebRTCDisabled() ||
+ this.serverConfig.tracker.enabled === false ||
+ getStoredP2PEnabled() === false ||
+ peertubeLocalStorage.getItem(VideoWatchComponent.LOCAL_STORAGE_PRIVACY_CONCERN_KEY) === 'true'
+ ) {
+ this.hasAlreadyAcceptedPrivacyConcern = true
+ }
this.paramsSub = this.route.params.subscribe(routeParams => {
const videoId = routeParams[ 'videoId' ]
})
this.queryParamsSub = this.route.queryParams.subscribe(queryParams => {
- this.playlistPosition = queryParams[ 'playlistPosition' ]
+ // Handle the ?playlistPosition
+ const positionParam = queryParams[ 'playlistPosition' ] ?? 1
+
+ this.playlistPosition = positionParam === 'last'
+ ? -1 // Handle the "last" index
+ : parseInt(positionParam + '', 10)
+
+ if (isNaN(this.playlistPosition)) {
+ console.error(`playlistPosition query param '${positionParam}' was parsed as NaN, defaulting to 1.`)
+ this.playlistPosition = 1
+ }
+
this.videoWatchPlaylist.updatePlaylistIndex(this.playlistPosition)
const start = queryParams[ 'start' ]
.pipe(
// If 400, 403 or 404, the video is private or blocked so redirect to 404
catchError(err => {
- if (err.body.errorCode === ServerErrorCode.DOES_NOT_RESPECT_FOLLOW_CONSTRAINTS && err.body.originUrl) {
+ const errorBody = err.body as PeerTubeProblemDocument
+
+ if (errorBody.code === ServerErrorCode.DOES_NOT_RESPECT_FOLLOW_CONSTRAINTS && errorBody.originUrl) {
const search = window.location.search
- let originUrl = err.body.originUrl
+ let originUrl = errorBody.originUrl
if (search) originUrl += search
this.confirmService.confirm(
private async setVideoDescriptionHTML () {
const html = await this.markdownService.textMarkdownToHTML(this.video.description)
- this.videoHTMLDescription = await this.markdownService.processVideoTimestamps(html)
+ this.videoHTMLDescription = this.markdownService.processVideoTimestamps(html)
}
private setVideoLikesBarTooltipText () {
this.player.one('ended', () => {
if (this.video.isLive) {
- this.video.state.id = VideoState.LIVE_ENDED
+ this.zone.run(() => this.video.state.id = VideoState.LIVE_ENDED)
}
})
if (this.playlist) {
this.zone.run(() => this.videoWatchPlaylist.navigateToNextPlaylistVideo())
} else if (this.nextVideoUuid) {
- this.router.navigate([ '/videos/watch', this.nextVideoUuid ])
+ this.router.navigate([ '/w', this.nextVideoUuid ])
}
}
common: {
autoplay: this.isAutoplay(),
nextVideo: () => this.zone.run(() => this.autoplayNext()),
- previousVideo: () => this.zone.run(() => {
- // FIXME: Only show if this is a playlist
- if (this.playlist) this.zone.run(() => this.videoWatchPlaylist.navigateToPreviousPlaylistVideo())
- }),
playerElement: this.playerElement,
onPlayerElementChange: (element: HTMLVideoElement) => this.playerElement = element,
webtorrent: {
videoFiles: video.files
+ },
+
+ pluginsManager: this.pluginService.getPluginsManager()
+ }
+
+ // Only set this if we're in a playlist
+ if (this.playlist) {
+ options.common.previousVideo = () => {
+ this.zone.run(() => this.videoWatchPlaylist.navigateToPreviousPlaylistVideo())
}
}