import * as WebTorrent from 'webtorrent'
import { timeToInt } from '@shared/core-utils'
import { VideoFile } from '@shared/models'
-import {
- getAverageBandwidthInStore,
- getStoredMute,
- getStoredP2PEnabled,
- getStoredVolume,
- saveAverageBandwidth
-} from '../peertube-player-local-storage'
+import { getAverageBandwidthInStore, getStoredMute, getStoredVolume, saveAverageBandwidth } from '../peertube-player-local-storage'
import { PeerTubeResolution, PlayerNetworkInfo, WebtorrentPluginOptions } from '../peertube-videojs-typings'
import { getRtcConfig, isIOS, videoFileMaxByResolution, videoFileMinByResolution } from '../utils'
import { PeertubeChunkStore } from './peertube-chunk-store'
this.startTime = timeToInt(options.startTime)
- // Disable auto play on iOS
+ // Custom autoplay handled by webtorrent because we lazy play the video
this.autoplay = options.autoplay
- this.playerRefusedP2P = !getStoredP2PEnabled()
+
+ this.playerRefusedP2P = options.playerRefusedP2P
this.videoFiles = options.videoFiles
this.videoDuration = options.videoDuration
}
// Do not display error to user because we will have multiple fallback
- this.disableErrorDisplay();
+ this.player.peertube().hideFatalError();
// Hack to "simulate" src link in video.js >= 6
// Without this, we can't play the video after pausing it
this.selectAppropriateResolution(true)
}
- updateResolution (resolutionId: number, delay = 0) {
+ updateEngineResolution (resolutionId: number, delay = 0) {
// Remember player state
const currentTime = this.player.currentTime()
const isPaused = this.player.paused()
return this.currentVideoFile
}
+ changeQuality (id: number) {
+ if (id === -1) {
+ if (this.autoResolutionPossible === true) {
+ this.autoResolution = true
+
+ this.selectAppropriateResolution(false)
+ }
+
+ return
+ }
+
+ this.autoResolution = false
+ this.updateEngineResolution(id)
+ this.selectAppropriateResolution(false)
+ }
+
private addTorrent (
magnetOrTorrentUrl: string,
previousVideoFile: VideoFile,
private getAppropriateFile (averageDownloadSpeed?: number): VideoFile {
if (this.videoFiles === undefined) return undefined
+ if (this.videoFiles.length === 1) return this.videoFiles[0]
const files = this.videoFiles.filter(f => f.resolution.id !== 0)
-
if (files.length === 0) return undefined
- if (files.length === 1) return files[0]
// Don't change the torrent if the player ended
if (this.torrent && this.torrent.progress === 1 && this.player.ended()) return this.currentVideoFile
}
if (changeResolution === true) {
- this.updateResolution(file.resolution.id, changeResolutionDelay)
+ this.updateEngineResolution(file.resolution.id, changeResolutionDelay)
// Wait some seconds in observation of our new resolution
this.isAutoResolutionObservation = true
this.torrent = null
// Enable error display now this is our last fallback
- this.player.one('error', () => this.enableErrorDisplay())
+ this.player.one('error', () => this.player.peertube().displayFatalError())
const httpUrl = this.currentVideoFile.fileUrl
this.player.src = this.savePlayerSrcFunction
return this.player.trigger('customError', { err })
}
- private enableErrorDisplay () {
- this.player.addClass('vjs-error-display-enabled')
- }
-
- private disableErrorDisplay () {
- this.player.removeClass('vjs-error-display-enabled')
- }
-
private pickAverageVideoFile () {
if (this.videoFiles.length === 1) return this.videoFiles[0]
label: this.buildQualityLabel(file),
height: file.resolution.id,
selected: false,
- selectCallback: () => this.qualitySwitchCallback(file.resolution.id)
+ selectCallback: () => this.changeQuality(file.resolution.id)
}))
resolutions.push({
id: -1,
label: this.player.localize('Auto'),
selected: true,
- selectCallback: () => this.qualitySwitchCallback(-1)
+ selectCallback: () => this.changeQuality(-1)
})
this.player.peertubeResolutions().add(resolutions)
return label
}
- private qualitySwitchCallback (id: number) {
- if (id === -1) {
- if (this.autoResolutionPossible === true) {
- this.autoResolution = true
-
- this.selectAppropriateResolution(false)
- }
-
- return
- }
-
- this.autoResolution = false
- this.updateResolution(id)
- this.selectAppropriateResolution(false)
- }
-
private selectAppropriateResolution (byEngine: boolean) {
const resolution = this.autoResolution
? -1