Fix webtorrent disabling

This commit is contained in:
Chocobozzz 2018-10-17 10:47:01 +02:00
parent ed638e5325
commit a73115f31a
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
2 changed files with 30 additions and 28 deletions

View File

@ -15,17 +15,6 @@
</div>
</div>
<div class="form-group">
<label i18n for="webTorrentEnabled">Policy regarding P2P technologies</label>
<div class="peertube-select-container">
<select id="webTorrentEnabled" formControlName="webTorrentEnabled">
<option i18n value="enable">Enable WebTorrent</option>
<option i18n value="disable">Disable WebTorrent</option>
</select>
</div>
</div>
<my-peertube-checkbox
inputName="webTorrentEnabled" formControlName="webTorrentEnabled"
i18n-labelText labelText="Use WebTorrent to exchange parts of the video with others"

View File

@ -8,15 +8,21 @@ import { isMobile, timeToInt, videoFileMaxByResolution, videoFileMinByResolution
import * as CacheChunkStore from 'cache-chunk-store'
import { PeertubeChunkStore } from './peertube-chunk-store'
import {
getStoredWebTorrentEnabled,
getAverageBandwidthInStore,
getStoredMute,
getStoredVolume,
getStoredWebTorrentEnabled,
saveAverageBandwidth,
saveMuteInStore,
saveVolumeInStore
} from './peertube-player-local-storage'
type PlayOptions = {
forcePlay?: boolean,
seek?: number,
delay?: number
}
const Plugin: VideoJSComponentInterface = videojs.getPlugin('plugin')
class PeerTubePlugin extends Plugin {
private readonly playerElement: HTMLVideoElement
@ -181,6 +187,15 @@ class PeerTubePlugin extends Plugin {
const previousVideoFile = this.currentVideoFile
this.currentVideoFile = videoFile
// Don't try on iOS that does not support MediaSource
// Or don't use P2P if webtorrent is disabled
if (this.isIOS() || this.playerRefusedP2P) {
return this.fallbackToHttp(options, () => {
this.player.playbackRate(oldPlaybackRate)
return done()
})
}
this.addTorrent(this.currentVideoFile.magnetUri, previousVideoFile, options, () => {
this.player.playbackRate(oldPlaybackRate)
return done()
@ -251,11 +266,7 @@ class PeerTubePlugin extends Plugin {
private addTorrent (
magnetOrTorrentUrl: string,
previousVideoFile: VideoFile,
options: {
forcePlay?: boolean,
seek?: number,
delay?: number
},
options: PlayOptions,
done: Function
) {
console.log('Adding ' + magnetOrTorrentUrl + '.')
@ -291,7 +302,7 @@ class PeerTubePlugin extends Plugin {
renderVideo(torrent.files[ 0 ], this.playerElement, renderVideoOptions, (err, renderer) => {
this.renderer = renderer
if (err || this.playerRefusedP2P) return this.fallbackToHttp(done)
if (err) return this.fallbackToHttp(options, done)
return this.tryToPlay(err => {
if (err) return done(err)
@ -299,7 +310,7 @@ class PeerTubePlugin extends Plugin {
if (options.seek) this.seek(options.seek)
if (options.forcePlay === false && paused === true) this.player.pause()
return done(err)
return done()
})
})
}, options.delay || 0)
@ -435,12 +446,6 @@ class PeerTubePlugin extends Plugin {
return this.updateVideoFile(undefined, { forcePlay: true, seek: this.startTime })
}
// Don't try on iOS that does not support MediaSource
if (this.isIOS()) {
this.currentVideoFile = this.pickAverageVideoFile()
return this.fallbackToHttp(undefined, false)
}
// Proxy first play
const oldPlay = this.player.play.bind(this.player)
this.player.play = () => {
@ -570,7 +575,9 @@ class PeerTubePlugin extends Plugin {
return fetch(url, { method: 'PUT', body, headers })
}
private fallbackToHttp (done?: Function, play = true) {
private fallbackToHttp (options: PlayOptions, done?: Function) {
const paused = this.player.paused()
this.disableAutoResolution(true)
this.flushVideoFile(this.currentVideoFile, true)
@ -582,9 +589,15 @@ class PeerTubePlugin extends Plugin {
const httpUrl = this.currentVideoFile.fileUrl
this.player.src = this.savePlayerSrcFunction
this.player.src(httpUrl)
if (play) this.tryToPlay()
if (done) return done()
return this.tryToPlay(err => {
if (err && done) return done(err)
if (options.seek) this.seek(options.seek)
if (options.forcePlay === false && paused === true) this.player.pause()
if (done) return done()
})
}
private handleError (err: Error | string) {