X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2F%2Bvideos%2F%2Bvideo-watch%2Fvideo-watch.component.ts;h=543cfe3f74b016f0c54bdaa19252cf0ddb782d18;hb=19b163d045750fe06ce04f601628d12085783d7b;hp=9a34397312163581ba160d553f94f47ea8f0b817;hpb=d846d99c6c81028bb7bd3cb20abd433cbf396a22;p=github%2FChocobozzz%2FPeerTube.git 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 9a3439731..543cfe3f7 100644 --- a/client/src/app/+videos/+video-watch/video-watch.component.ts +++ b/client/src/app/+videos/+video-watch/video-watch.component.ts @@ -21,10 +21,11 @@ import { isXPercentInViewport, scrollToTop } from '@app/helpers' import { Video, VideoCaptionService, VideoDetails, VideoService } from '@app/shared/shared-main' import { VideoShareComponent } from '@app/shared/shared-share-modal' import { SubscribeButtonComponent } from '@app/shared/shared-user-subscription' -import { VideoDownloadComponent } from '@app/shared/shared-video-miniature' +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 { getStoredP2PEnabled, getStoredTheater } from '../../../assets/player/peertube-player-local-storage' import { @@ -82,6 +83,18 @@ export class VideoWatchComponent implements OnInit, OnDestroy { tooltipSupport = '' tooltipSaveToPlaylist = '' + videoActionsOptions: VideoActionsDisplayType = { + playlist: false, + download: true, + update: true, + blacklist: true, + delete: true, + report: true, + duplicate: true, + mute: true, + liveInfo: true + } + private nextVideoUuid = '' private nextVideoTitle = '' private currentTime: number @@ -400,13 +413,25 @@ export class VideoWatchComponent implements OnInit, OnDestroy { $localize`This video is not available on this instance. Do you want to be redirected on the origin instance: ${originUrl}?`, $localize`Redirection` ).then(res => { - if (res === false) return this.restExtractor.redirectTo404IfNotFound(err, [ 400, 401, 403, 404 ]) + if (res === false) { + return this.restExtractor.redirectTo404IfNotFound(err, [ + HttpStatusCode.BAD_REQUEST_400, + HttpStatusCode.UNAUTHORIZED_401, + HttpStatusCode.FORBIDDEN_403, + HttpStatusCode.NOT_FOUND_404 + ]) + } return window.location.href = originUrl }) } - return this.restExtractor.redirectTo404IfNotFound(err, [ 400, 401, 403, 404 ]) + return this.restExtractor.redirectTo404IfNotFound(err, [ + HttpStatusCode.BAD_REQUEST_400, + HttpStatusCode.UNAUTHORIZED_401, + HttpStatusCode.FORBIDDEN_403, + HttpStatusCode.NOT_FOUND_404 + ]) }) ) .subscribe(([ video, captionsResult ]) => { @@ -438,7 +463,12 @@ export class VideoWatchComponent implements OnInit, OnDestroy { this.playlistService.getVideoPlaylist(playlistId) .pipe( // If 401, the video is private or blocked so redirect to 404 - catchError(err => this.restExtractor.redirectTo404IfNotFound(err, [ 400, 401, 403, 404 ])) + catchError(err => this.restExtractor.redirectTo404IfNotFound(err, [ + HttpStatusCode.BAD_REQUEST_400, + HttpStatusCode.UNAUTHORIZED_401, + HttpStatusCode.FORBIDDEN_403, + HttpStatusCode.NOT_FOUND_404 + ])) ) .subscribe(playlist => { this.playlist = playlist @@ -595,6 +625,12 @@ export class VideoWatchComponent implements OnInit, OnDestroy { } }) + this.player.one('ended', () => { + if (this.video.isLive) { + this.video.state.id = VideoState.LIVE_ENDED + } + }) + this.player.on('theaterChange', (_: any, enabled: boolean) => { this.zone.run(() => this.theaterEnabled = enabled) }) @@ -759,6 +795,8 @@ export class VideoWatchComponent implements OnInit, OnDestroy { : null, embedUrl: video.embedUrl, + isLive: video.isLive, + language: this.localeId, userWatching: user && user.videosHistoryEnabled === true ? { @@ -828,16 +866,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy { private async subscribeToLiveEventsIfNeeded (oldVideo: VideoDetails, newVideo: VideoDetails) { if (!this.liveVideosSub) { - this.liveVideosSub = this.peertubeSocket.getLiveVideosObservable() - .subscribe(({ payload }) => { - if (payload.state !== VideoState.PUBLISHED || this.video.state.id !== VideoState.WAITING_FOR_LIVE) return - - const videoUUID = this.video.uuid - - // Reset to refetch the video - this.video = undefined - this.loadVideo(videoUUID) - }) + this.liveVideosSub = this.buildLiveEventsSubscription() } if (oldVideo && oldVideo.id !== newVideo.id) { @@ -849,6 +878,40 @@ export class VideoWatchComponent implements OnInit, OnDestroy { await this.peertubeSocket.subscribeToLiveVideosSocket(newVideo.id) } + private buildLiveEventsSubscription () { + return this.peertubeSocket.getLiveVideosObservable() + .subscribe(({ type, payload }) => { + if (type === 'state-change') return this.handleLiveStateChange(payload.state) + if (type === 'views-change') return this.handleLiveViewsChange(payload.views) + }) + } + + private handleLiveStateChange (newState: VideoState) { + if (newState !== VideoState.PUBLISHED) return + + const videoState = this.video.state.id + if (videoState !== VideoState.WAITING_FOR_LIVE && videoState !== VideoState.LIVE_ENDED) return + + console.log('Loading video after live update.') + + const videoUUID = this.video.uuid + + // Reset to refetch the video + this.video = undefined + this.loadVideo(videoUUID) + } + + private handleLiveViewsChange (newViews: number) { + if (!this.video) { + console.error('Cannot update video live views because video is no defined.') + return + } + + console.log('Updating live views.') + + this.video.views = newViews + } + private initHotkeys () { this.hotkeys = [ // These hotkeys are managed by the player