1
0
Fork 0

Fix play on iOS (grumph)

This commit is contained in:
Chocobozzz 2018-05-22 09:16:05 +02:00
parent 0b33c52060
commit e7eb5b3997
No known key found for this signature in database
GPG key ID: 583A612D890159BE
4 changed files with 19 additions and 6 deletions

View file

@ -340,6 +340,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
const playerElementWrapper = this.elementRef.nativeElement.querySelector('#video-element-wrapper') const playerElementWrapper = this.elementRef.nativeElement.querySelector('#video-element-wrapper')
this.playerElement = document.createElement('video') this.playerElement = document.createElement('video')
this.playerElement.className = 'video-js vjs-peertube-skin' this.playerElement.className = 'video-js vjs-peertube-skin'
this.playerElement.setAttribute('playsinline', 'true')
playerElementWrapper.appendChild(this.playerElement) playerElementWrapper.appendChild(this.playerElement)
const videojsOptions = getVideojsOptions({ const videojsOptions = getVideojsOptions({

View file

@ -63,7 +63,8 @@ class PeerTubePlugin extends Plugin {
constructor (player: videojs.Player, options: PeertubePluginOptions) { constructor (player: videojs.Player, options: PeertubePluginOptions) {
super(player, options) super(player, options)
this.autoplay = options.autoplay // Disable auto play on iOS
this.autoplay = options.autoplay && this.isIOS() === false
this.startTime = options.startTime this.startTime = options.startTime
this.videoFiles = options.videoFiles this.videoFiles = options.videoFiles
@ -180,6 +181,7 @@ class PeerTubePlugin extends Plugin {
oldTorrent.removePeer(oldTorrent['ws']) 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.addTorrentDelay = setTimeout(() => {
this.flushVideoFile(previousVideoFile) this.flushVideoFile(previousVideoFile)
@ -337,6 +339,12 @@ class PeerTubePlugin extends Plugin {
this.tryToPlay() this.tryToPlay()
}) })
} else { } 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 // Proxy first play
const oldPlay = this.player.play.bind(this.player) const oldPlay = this.player.play.bind(this.player)
this.player.play = () => { this.player.play = () => {
@ -439,7 +447,7 @@ class PeerTubePlugin extends Plugin {
return fetch(this.videoViewUrl, { method: 'POST' }) return fetch(this.videoViewUrl, { method: 'POST' })
} }
private fallbackToHttp (done: Function) { private fallbackToHttp (done?: Function, play = true) {
this.flushVideoFile(this.currentVideoFile, true) this.flushVideoFile(this.currentVideoFile, true)
this.torrent = null this.torrent = null
@ -449,9 +457,9 @@ class PeerTubePlugin extends Plugin {
const httpUrl = this.currentVideoFile.fileUrl const httpUrl = this.currentVideoFile.fileUrl
this.player.src = this.savePlayerSrcFunction this.player.src = this.savePlayerSrcFunction
this.player.src(httpUrl) this.player.src(httpUrl)
this.player.play() if (play) this.tryToPlay()
return done() if (done) return done()
} }
private handleError (err: Error | string) { private handleError (err: Error | string) {
@ -466,6 +474,10 @@ class PeerTubePlugin extends Plugin {
this.player.removeClass('vjs-error-display-enabled') this.player.removeClass('vjs-error-display-enabled')
} }
private isIOS () {
return !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform)
}
private alterInactivity () { private alterInactivity () {
let saveInactivityTimeout: number let saveInactivityTimeout: number

View file

@ -1,5 +1,5 @@
export const environment = { export const environment = {
production: false, production: false,
hmr: true, hmr: true,
apiUrl: 'http://localhost:9000' apiUrl: 'http://192.168.1.42:9000'
} }

View file

@ -17,7 +17,7 @@
<div id="error-content"></div> <div id="error-content"></div>
</div> </div>
<video id="video-container" class="video-js vjs-peertube-skin"> <video playsinline="true" id="video-container" class="video-js vjs-peertube-skin">
</video> </video>
</body> </body>