Fix embed api with playlists
This commit is contained in:
parent
32f44a017c
commit
d91021548e
|
@ -13,6 +13,12 @@ export class PeerTubeEmbedApi {
|
||||||
private isReady = false
|
private isReady = false
|
||||||
private resolutions: PeerTubeResolution[] = []
|
private resolutions: PeerTubeResolution[] = []
|
||||||
|
|
||||||
|
private oldVideoElement: HTMLVideoElement
|
||||||
|
private videoElPlayListener: () => void
|
||||||
|
private videoElPauseListener: () => void
|
||||||
|
private videoElEndedListener: () => void
|
||||||
|
private videoElInterval: any
|
||||||
|
|
||||||
constructor (private readonly embed: PeerTubeEmbed) {
|
constructor (private readonly embed: PeerTubeEmbed) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -26,6 +32,11 @@ export class PeerTubeEmbedApi {
|
||||||
this.notifyReady()
|
this.notifyReady()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reInit () {
|
||||||
|
this.disposeStateTracking()
|
||||||
|
this.setupStateTracking()
|
||||||
|
}
|
||||||
|
|
||||||
private get element () {
|
private get element () {
|
||||||
return this.embed.getPlayerElement()
|
return this.embed.getPlayerElement()
|
||||||
}
|
}
|
||||||
|
@ -101,7 +112,7 @@ export class PeerTubeEmbedApi {
|
||||||
private setupStateTracking () {
|
private setupStateTracking () {
|
||||||
let currentState: 'playing' | 'paused' | 'unstarted' | 'ended' = 'unstarted'
|
let currentState: 'playing' | 'paused' | 'unstarted' | 'ended' = 'unstarted'
|
||||||
|
|
||||||
setInterval(() => {
|
this.videoElInterval = setInterval(() => {
|
||||||
const position = this.element.currentTime
|
const position = this.element.currentTime
|
||||||
const volume = this.element.volume
|
const volume = this.element.volume
|
||||||
|
|
||||||
|
@ -116,20 +127,29 @@ export class PeerTubeEmbedApi {
|
||||||
})
|
})
|
||||||
}, 500)
|
}, 500)
|
||||||
|
|
||||||
this.element.addEventListener('play', ev => {
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
this.videoElPlayListener = () => {
|
||||||
currentState = 'playing'
|
currentState = 'playing'
|
||||||
this.channel.notify({ method: 'playbackStatusChange', params: 'playing' })
|
this.channel.notify({ method: 'playbackStatusChange', params: 'playing' })
|
||||||
})
|
}
|
||||||
|
this.element.addEventListener('play', this.videoElPlayListener)
|
||||||
|
|
||||||
this.element.addEventListener('pause', ev => {
|
this.videoElPauseListener = () => {
|
||||||
currentState = 'paused'
|
currentState = 'paused'
|
||||||
this.channel.notify({ method: 'playbackStatusChange', params: 'paused' })
|
this.channel.notify({ method: 'playbackStatusChange', params: 'paused' })
|
||||||
})
|
}
|
||||||
|
this.element.addEventListener('pause', this.videoElPauseListener)
|
||||||
|
|
||||||
this.element.addEventListener('ended', ev => {
|
this.videoElEndedListener = () => {
|
||||||
currentState = 'ended'
|
currentState = 'ended'
|
||||||
this.channel.notify({ method: 'playbackStatusChange', params: 'ended' })
|
this.channel.notify({ method: 'playbackStatusChange', params: 'ended' })
|
||||||
})
|
}
|
||||||
|
this.element.addEventListener('ended', this.videoElEndedListener)
|
||||||
|
|
||||||
|
this.oldVideoElement = this.element
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
// PeerTube specific capabilities
|
// PeerTube specific capabilities
|
||||||
this.embed.player.peertubeResolutions().on('resolutionsAdded', () => this.loadResolutions())
|
this.embed.player.peertubeResolutions().on('resolutionsAdded', () => this.loadResolutions())
|
||||||
|
@ -145,6 +165,18 @@ export class PeerTubeEmbedApi {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private disposeStateTracking () {
|
||||||
|
if (!this.oldVideoElement) return
|
||||||
|
|
||||||
|
this.oldVideoElement.removeEventListener('play', this.videoElPlayListener)
|
||||||
|
this.oldVideoElement.removeEventListener('pause', this.videoElPauseListener)
|
||||||
|
this.oldVideoElement.removeEventListener('ended', this.videoElEndedListener)
|
||||||
|
|
||||||
|
clearInterval(this.videoElInterval)
|
||||||
|
|
||||||
|
this.oldVideoElement = undefined
|
||||||
|
}
|
||||||
|
|
||||||
private loadResolutions () {
|
private loadResolutions () {
|
||||||
this.resolutions = this.embed.player.peertubeResolutions().getResolutions()
|
this.resolutions = this.embed.player.peertubeResolutions().getResolutions()
|
||||||
.map(r => ({
|
.map(r => ({
|
||||||
|
|
|
@ -117,6 +117,11 @@ export class PeerTubeEmbed {
|
||||||
|
|
||||||
private initializeApi () {
|
private initializeApi () {
|
||||||
if (this.playerManagerOptions.hasAPIEnabled()) {
|
if (this.playerManagerOptions.hasAPIEnabled()) {
|
||||||
|
if (this.api) {
|
||||||
|
this.api.reInit()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
this.api = new PeerTubeEmbedApi(this)
|
this.api = new PeerTubeEmbedApi(this)
|
||||||
this.api.initialize()
|
this.api.initialize()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue