+ this.notificationsService.error('Error', 'Cannot append the file in the video element.')
+ console.error(err)
+ }
+
+ // Hack to "simulate" src link in video.js >= 6
+ // If no, we can't play the video after pausing it
+ // https://github.com/videojs/video.js/blob/master/src/js/player.js#L1633
+ (this.player as any).src = () => true
+
+ this.player.play()
+ })
+
+ this.runInProgress(torrent)
+ })
+
+ torrent.on('error', err => this.handleError(err))
+ torrent.on('warning', err => this.handleError(err))
+ }
+
+ setLike () {
+ if (this.isUserLoggedIn() === false) return
+ // Already liked this video
+ if (this.userRating === 'like') return
+
+ this.videoService.setVideoLike(this.video.id)
+ .subscribe(
+ () => {
+ // Update the video like attribute
+ this.updateVideoRating(this.userRating, 'like')
+ this.userRating = 'like'
+ },
+
+ err => this.notificationsService.error('Error', err)
+ )
+ }
+
+ setDislike () {
+ if (this.isUserLoggedIn() === false) return
+ // Already disliked this video
+ if (this.userRating === 'dislike') return
+
+ this.videoService.setVideoDislike(this.video.id)
+ .subscribe(
+ () => {
+ // Update the video dislike attribute
+ this.updateVideoRating(this.userRating, 'dislike')
+ this.userRating = 'dislike'
+ },
+
+ err => this.notificationsService.error('Error', err)
+ )
+ }
+
+ removeVideo (event: Event) {
+ event.preventDefault()
+
+ this.confirmService.confirm('Do you really want to delete this video?', 'Delete').subscribe(
+ res => {
+ if (res === false) return
+
+ this.videoService.removeVideo(this.video.id)
+ .subscribe(
+ status => {
+ this.notificationsService.success('Success', `Video ${this.video.name} deleted.`)
+ // Go back to the video-list.
+ this.router.navigate(['/videos/list'])
+ },
+
+ error => this.notificationsService.error('Error', error.text)
+ )
+ }
+ )
+ }
+
+ blacklistVideo (event: Event) {
+ event.preventDefault()
+
+ this.confirmService.confirm('Do you really want to blacklist this video ?', 'Blacklist').subscribe(
+ res => {
+ if (res === false) return
+
+ this.videoService.blacklistVideo(this.video.id)
+ .subscribe(
+ status => {
+ this.notificationsService.success('Success', `Video ${this.video.name} had been blacklisted.`)
+ this.router.navigate(['/videos/list'])
+ },
+
+ error => this.notificationsService.error('Error', error.text)
+ )
+ }
+ )
+ }
+
+ showReportModal (event: Event) {
+ event.preventDefault()
+ this.videoReportModal.show()
+ }
+
+ showShareModal () {
+ this.videoShareModal.show()
+ }
+
+ showMagnetUriModal (event: Event) {
+ event.preventDefault()
+ this.videoMagnetModal.show()
+ }
+
+ isUserLoggedIn () {
+ return this.authService.isLoggedIn()
+ }
+
+ canUserUpdateVideo () {
+ return this.video.isUpdatableBy(this.authService.getUser())
+ }
+
+ isVideoRemovable () {
+ return this.video.isRemovableBy(this.authService.getUser())
+ }
+
+ isVideoBlacklistable () {
+ return this.video.isBlackistableBy(this.authService.getUser())
+ }
+
+ private handleError (err: any) {
+ const errorMessage: string = typeof err === 'string' ? err : err.message
+ let message = ''
+
+ if (errorMessage.indexOf('http error') !== -1) {
+ message = 'Cannot fetch video from server, maybe down.'
+ } else {
+ message = errorMessage
+ }
+
+ this.notificationsService.error('Error', message)
+ }
+
+ private checkUserRating () {
+ // Unlogged users do not have ratings
+ if (this.isUserLoggedIn() === false) return
+
+ this.videoService.getUserVideoRating(this.video.id)
+ .subscribe(
+ ratingObject => {
+ if (ratingObject) {
+ this.userRating = ratingObject.rating
+ }
+ },
+
+ err => this.notificationsService.error('Error', err)
+ )
+ }
+
+ private onVideoFetched (video: Video) {
+ this.video = video
+
+ let observable
+ if (this.video.isVideoNSFWForUser(this.authService.getUser())) {
+ observable = this.confirmService.confirm('This video is not safe for work. Are you sure you want to watch it?', 'NSFW')
+ } else {
+ observable = Observable.of(true)
+ }
+
+ observable.subscribe(
+ res => {
+ if (res === false) {
+ return this.router.navigate([ '/videos/list' ])