X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fassets%2Fplayer%2Fpeertube-videojs-plugin.ts;h=79df42a533783f81269f1746a49bb8c75b8f7139;hb=77728efa627527a9f0f27010a597e8984d7a27f8;hp=290d88724f063bbd914b783332f56f54ca5d3a69;hpb=0030284b0df2983914291d6fe83675e2aa892e6a;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/assets/player/peertube-videojs-plugin.ts b/client/src/assets/player/peertube-videojs-plugin.ts index 290d88724..79df42a53 100644 --- a/client/src/assets/player/peertube-videojs-plugin.ts +++ b/client/src/assets/player/peertube-videojs-plugin.ts @@ -8,12 +8,15 @@ import { getAverageBandwidth, getStoredMute, getStoredVolume, + isMobile, saveAverageBandwidth, saveMuteInStore, saveVolumeInStore } from './utils' import minBy from 'lodash-es/minBy' import maxBy from 'lodash-es/maxBy' +import * as CacheChunkStore from 'cache-chunk-store' +import { PeertubeChunkStore } from './peertube-chunk-store' const webtorrent = new WebTorrent({ tracker: { @@ -68,7 +71,8 @@ class PeerTubePlugin extends Plugin { constructor (player: videojs.Player, options: PeertubePluginOptions) { super(player, options) - this.autoplay = options.autoplay + // Disable auto play on iOS + this.autoplay = options.autoplay && this.isIOS() === false this.startTime = options.startTime this.videoFiles = options.videoFiles @@ -169,7 +173,13 @@ class PeerTubePlugin extends Plugin { console.log('Adding ' + magnetOrTorrentUrl + '.') const oldTorrent = this.torrent - this.torrent = webtorrent.add(magnetOrTorrentUrl, torrent => { + const options = { + store: (chunkLength, storeOpts) => new CacheChunkStore(new PeertubeChunkStore(chunkLength, storeOpts), { + max: 100 + }) + } + + this.torrent = webtorrent.add(magnetOrTorrentUrl, options, torrent => { console.log('Added ' + magnetOrTorrentUrl + '.') // Pause the old torrent @@ -179,6 +189,7 @@ class PeerTubePlugin extends Plugin { oldTorrent.removePeer(oldTorrent['ws']) } + // Render the video in a few seconds? (on resolution change for example, we wait some seconds of the new video resolution) this.addTorrentDelay = setTimeout(() => { this.flushVideoFile(previousVideoFile) @@ -257,6 +268,14 @@ class PeerTubePlugin extends Plugin { this.trigger('autoResolutionUpdate') } + getCurrentVideoFile () { + return this.currentVideoFile + } + + getTorrent () { + return this.torrent + } + private tryToPlay (done?: Function) { if (!done) done = function () { /* empty */ } @@ -284,9 +303,11 @@ class PeerTubePlugin extends Plugin { private getAppropriateFile (averageDownloadSpeed?: number): VideoFile { if (this.videoFiles === undefined || this.videoFiles.length === 0) return undefined if (this.videoFiles.length === 1) return this.videoFiles[0] - if (this.torrent && this.torrent.progress === 1) return this.currentVideoFile - if (!averageDownloadSpeed) averageDownloadSpeed = this.getActualDownloadSpeed() + // Don't change the torrent is the play was ended + if (this.torrent && this.torrent.progress === 1 && this.player.ended()) return this.currentVideoFile + + if (!averageDownloadSpeed) averageDownloadSpeed = this.getAndSaveActualDownloadSpeed() // Filter videos we can play according to our bandwidth const filteredFiles = this.videoFiles.filter(f => { @@ -307,7 +328,7 @@ class PeerTubePlugin extends Plugin { return maxBy(filteredFiles, 'resolution.id') } - private getActualDownloadSpeed () { + private getAndSaveActualDownloadSpeed () { const start = Math.max(this.downloadSpeeds.length - this.CONSTANTS.BANDWIDTH_AVERAGE_NUMBER_OF_VALUES, 0) const lastDownloadSpeeds = this.downloadSpeeds.slice(start, this.downloadSpeeds.length) if (lastDownloadSpeeds.length === 0) return -1 @@ -334,6 +355,12 @@ class PeerTubePlugin extends Plugin { this.tryToPlay() }) } else { + // Don't try on iOS that does not support MediaSource + if (this.isIOS()) { + this.currentVideoFile = this.videoFiles[0] + return this.fallbackToHttp(undefined, false) + } + // Proxy first play const oldPlay = this.player.play.bind(this.player) this.player.play = () => { @@ -436,7 +463,7 @@ class PeerTubePlugin extends Plugin { return fetch(this.videoViewUrl, { method: 'POST' }) } - private fallbackToHttp (done: Function) { + private fallbackToHttp (done?: Function, play = true) { this.flushVideoFile(this.currentVideoFile, true) this.torrent = null @@ -446,9 +473,9 @@ class PeerTubePlugin extends Plugin { const httpUrl = this.currentVideoFile.fileUrl this.player.src = this.savePlayerSrcFunction this.player.src(httpUrl) - this.player.play() + if (play) this.tryToPlay() - return done() + if (done) return done() } private handleError (err: Error | string) { @@ -463,6 +490,10 @@ class PeerTubePlugin extends Plugin { this.player.removeClass('vjs-error-display-enabled') } + private isIOS () { + return !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform) + } + private alterInactivity () { let saveInactivityTimeout: number