import { catchError } from 'rxjs/operators'
-import { Component, ElementRef, LOCALE_ID, NgZone, OnDestroy, OnInit, ViewChild, Inject } from '@angular/core'
+import { 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 * as videojs from 'video.js'
import 'videojs-hotkeys'
import * as WebTorrent from 'webtorrent'
-import { UserVideoRateType, VideoRateType } from '../../../../../shared'
+import { UserVideoRateType, VideoPrivacy, VideoRateType, VideoState } from '../../../../../shared'
import '../../../assets/player/peertube-videojs-plugin'
import { AuthService, ConfirmService } from '../../core'
import { RestExtractor, VideoBlacklistService } from '../../shared'
import { VideoDownloadComponent } from './modal/video-download.component'
import { VideoReportComponent } from './modal/video-report.component'
import { VideoShareComponent } from './modal/video-share.component'
-import { getVideojsOptions, loadLocale, addContextMenu } from '../../../assets/player/peertube-player'
+import { addContextMenu, getVideojsOptions, loadLocale } from '../../../assets/player/peertube-player'
import { ServerService } from '@app/core'
import { I18n } from '@ngx-translate/i18n-polyfill'
import { environment } from '../../../environments/environment'
+import { getDevLocale, isOnDevLocale } from '@app/shared/i18n/i18n-utils'
@Component({
selector: 'my-video-watch',
playerElement: HTMLVideoElement
userRating: UserVideoRateType = null
video: VideoDetails = null
- videoNotFound = false
descriptionLoading = false
completeDescriptionShown = false
}
this.videoService.getVideos({ currentPage: 1, itemsPerPage: 5 }, '-createdAt')
- .subscribe(
- data => {
- this.otherVideos = data.videos
- this.updateOtherVideosDisplayed()
- },
+ .subscribe(
+ data => {
+ this.otherVideos = data.videos
+ this.updateOtherVideosDisplayed()
+ },
- err => console.error(err)
- )
+ err => console.error(err)
+ )
this.paramsSub = this.route.params.subscribe(routeParams => {
- if (this.player) {
- this.player.pause()
- }
-
- const uuid = routeParams['uuid']
+ const uuid = routeParams[ 'uuid' ]
// Video did not change
if (this.video && this.video.uuid === uuid) return
+
+ if (this.player) this.player.pause()
+
// Video did change
this.videoService
.getVideo(uuid)
.pipe(catchError(err => this.restExtractor.redirectTo404IfNotFound(err, [ 400, 404 ])))
- .subscribe(
- video => {
- const startTime = this.route.snapshot.queryParams.start
- this.onVideoFetched(video, startTime)
- .catch(err => this.handleError(err))
- },
-
- error => {
- this.videoNotFound = true
- console.error(error)
- }
- )
+ .subscribe(video => {
+ const startTime = this.route.snapshot.queryParams.start
+ this.onVideoFetched(video, startTime)
+ .catch(err => this.handleError(err))
+ })
})
}
if (res === false) return
this.videoBlacklistService.blacklistVideo(this.video.id)
- .subscribe(
- status => {
- this.notificationsService.success(
- this.i18n('Success'),
- this.i18n('Video {{videoName}} had been blacklisted.', { videoName: this.video.name })
- )
- this.redirectService.redirectToHomepage()
- },
+ .subscribe(
+ () => {
+ this.notificationsService.success(
+ this.i18n('Success'),
+ this.i18n('Video {{videoName}} had been blacklisted.', { videoName: this.video.name })
+ )
+ this.redirectService.redirectToHomepage()
+ },
- error => this.notificationsService.error(this.i18n('Error'), error.message)
- )
+ error => this.notificationsService.error(this.i18n('Error'), error.message)
+ )
}
showMoreDescription () {
this.descriptionLoading = true
this.videoService.loadCompleteDescription(this.video.descriptionPath)
- .subscribe(
- description => {
- this.completeDescriptionShown = true
- this.descriptionLoading = false
+ .subscribe(
+ description => {
+ this.completeDescriptionShown = true
+ this.descriptionLoading = false
- this.shortVideoDescription = this.video.description
- this.completeVideoDescription = description
+ this.shortVideoDescription = this.video.description
+ this.completeVideoDescription = description
- this.updateVideoDescription(this.completeVideoDescription)
- },
+ this.updateVideoDescription(this.completeVideoDescription)
+ },
- error => {
- this.descriptionLoading = false
- this.notificationsService.error(this.i18n('Error'), error.message)
- }
- )
+ error => {
+ this.descriptionLoading = false
+ this.notificationsService.error(this.i18n('Error'), error.message)
+ }
+ )
}
showReportModal (event: Event) {
if (res === false) return
this.videoService.removeVideo(this.video.id)
- .subscribe(
- status => {
- this.notificationsService.success(
- this.i18n('Success'),
- this.i18n('Video {{videoName}} deleted.', { videoName: this.video.name })
- )
+ .subscribe(
+ status => {
+ this.notificationsService.success(
+ this.i18n('Success'),
+ this.i18n('Video {{videoName}} deleted.', { videoName: this.video.name })
+ )
- // Go back to the video-list.
- this.redirectService.redirectToHomepage()
- },
+ // Go back to the video-list.
+ this.redirectService.redirectToHomepage()
+ },
- error => this.notificationsService.error(this.i18n('Error'), error.message)
- )
+ error => this.notificationsService.error(this.i18n('Error'), error.message)
+ )
}
acceptedPrivacyConcern () {
this.hasAlreadyAcceptedPrivacyConcern = true
}
+ isVideoToTranscode () {
+ return this.video && this.video.state.id === VideoState.TO_TRANSCODE
+ }
+
+ hasVideoScheduledPublication () {
+ return this.video && this.video.scheduledUpdate !== undefined
+ }
+
private updateVideoDescription (description: string) {
this.video.description = description
this.setVideoDescriptionHTML()
}
private setVideoDescriptionHTML () {
- if (!this.video.description) {
- this.videoHTMLDescription = ''
- return
- }
-
this.videoHTMLDescription = this.markdownService.textMarkdownToHTML(this.video.description)
}
private setVideoLikesBarTooltipText () {
- this.likesBarTooltipText = this.i18n(
- '{{likesNumber}} likes / {{dislikesNumber}} dislikes',
- { likesNumber: this.video.likes, dislikes: this.video.dislikes }
- )
+ this.likesBarTooltipText = this.i18n('{{likesNumber}} likes / {{dislikesNumber}} dislikes', {
+ likesNumber: this.video.likes,
+ dislikesNumber: this.video.dislikes
+ })
}
private handleError (err: any) {
if (this.isUserLoggedIn() === false) return
this.videoService.getUserVideoRating(this.video.id)
- .subscribe(
- ratingObject => {
- if (ratingObject) {
- this.userRating = ratingObject.rating
- }
- },
+ .subscribe(
+ ratingObject => {
+ if (ratingObject) {
+ this.userRating = ratingObject.rating
+ }
+ },
- err => this.notificationsService.error(this.i18n('Error'), err.message)
- )
+ err => this.notificationsService.error(this.i18n('Error'), err.message)
+ )
}
private async onVideoFetched (video: VideoDetails, startTime = 0) {
inactivityTimeout: 2500,
videoFiles: this.video.files,
playerElement: this.playerElement,
- videoViewUrl: this.videoService.getVideoViewUrl(this.video.uuid),
+ videoViewUrl: this.video.privacy.id !== VideoPrivacy.PRIVATE ? this.videoService.getVideoViewUrl(this.video.uuid) : null,
videoDuration: this.video.duration,
enableHotkeys: true,
peertubeLink: false,
poster: this.video.previewUrl,
- startTime
+ startTime,
+ theaterMode: true
})
if (this.videojsLocaleLoaded === false) {
- await loadLocale(environment.apiUrl, videojs, environment.production === true ? this.localeId : 'fr')
+ await loadLocale(environment.apiUrl, videojs, isOnDevLocale() ? getDevLocale() : this.localeId)
this.videojsLocaleLoaded = true
}
}
method.call(this.videoService, this.video.id)
- .subscribe(
- () => {
- // Update the video like attribute
- this.updateVideoRating(this.userRating, nextRating)
- this.userRating = nextRating
- },
- err => this.notificationsService.error(this.i18n('Error'), err.message)
- )
+ .subscribe(
+ () => {
+ // Update the video like attribute
+ this.updateVideoRating(this.userRating, nextRating)
+ this.userRating = nextRating
+ },
+
+ err => this.notificationsService.error(this.i18n('Error'), err.message)
+ )
}
private updateVideoRating (oldRating: UserVideoRateType, newRating: VideoRateType) {
}
private isAutoplay () {
- // True by default
+ // We'll jump to the thread id, so do not play the video
+ if (this.route.snapshot.params['threadId']) return false
+
+ // Otherwise true by default
if (!this.user) return true
// Be sure the autoPlay is set to false