import * as Channel from 'jschannel'
+import { EventHandler, PeerTubeResolution, PeerTubeTextTrack, PlayerEventType } from './definitions'
import { EventRegistrar } from './events'
-import { EventHandler, PlayerEventType, PeerTubeResolution } from './definitions'
const PASSTHROUGH_EVENTS = [
'pause',
*/
export class PeerTubePlayer {
- private eventRegistrar: EventRegistrar = new EventRegistrar()
+ private readonly eventRegistrar: EventRegistrar = new EventRegistrar()
private channel: Channel.MessagingChannel
private readyPromise: Promise<void>
* @param scope
*/
constructor (
- private embedElement: HTMLIFrameElement,
- private scope?: string
+ private readonly embedElement: HTMLIFrameElement,
+ private readonly scope?: string
) {
this.eventRegistrar.registerTypes(PASSTHROUGH_EVENTS)
/**
* Tell the embed to change the audio volume
+ *
* @param value A number from 0 to 1
*/
async setVolume (value: number) {
/**
* Get the current volume level in the embed.
+ *
* @param value A number from 0 to 1
*/
async getVolume (): Promise<number> {
- return this.sendMessage<void, number>('getVolume')
+ return this.sendMessage<undefined, number>('getVolume')
+ }
+
+ /**
+ * Tell the embed to change the current caption
+ *
+ * @param value Caption id
+ */
+ async setCaption (value: string) {
+ await this.sendMessage('setCaption', value)
+ }
+
+ /**
+ * Get video captions
+ */
+ async getCaptions (): Promise<PeerTubeTextTrack[]> {
+ return this.sendMessage<undefined, PeerTubeTextTrack[]>('getCaptions')
}
/**
* Tell the embed to seek to a specific position (in seconds)
+ *
* @param seconds
*/
async seek (seconds: number) {
* resolutions change.
*/
async getResolutions (): Promise<PeerTubeResolution[]> {
- return this.sendMessage<void, PeerTubeResolution[]>('getResolutions')
+ return this.sendMessage<undefined, PeerTubeResolution[]>('getResolutions')
}
/**
* Retrieve a list of available playback rates.
*/
async getPlaybackRates (): Promise<number[]> {
- return this.sendMessage<void, number[]>('getPlaybackRates')
+ return this.sendMessage<undefined, number[]>('getPlaybackRates')
}
/**
* Get the current playback rate. Defaults to 1 (1x playback rate).
*/
async getPlaybackRate (): Promise<number> {
- return this.sendMessage<void, number>('getPlaybackRate')
+ return this.sendMessage<undefined, number>('getPlaybackRate')
}
/**
await this.sendMessage('setPlaybackRate', rate)
}
+ /**
+ * Play next video in playlist
+ */
+ async playNextVideo () {
+ await this.sendMessage('playNextVideo')
+ }
+
+ /**
+ * Play previous video in playlist
+ */
+ async playPreviousVideo () {
+ await this.sendMessage('playPreviousVideo')
+ }
+
+ /**
+ * Get video position currently played (starts from 1)
+ */
+ async getCurrentPosition () {
+ return this.sendMessage<undefined, number>('getCurrentPosition')
+ }
+
private constructChannel () {
this.channel = Channel.build({
window: this.embedElement.contentWindow,
}
private prepareToBeReady () {
- let readyResolve: Function
- let readyReject: Function
+ let readyResolve: () => void
+ let readyReject: () => void
this.readyPromise = new Promise<void>((res, rej) => {
readyResolve = res
private sendMessage<TIn, TOut> (method: string, params?: TIn): Promise<TOut> {
return new Promise<TOut>((resolve, reject) => {
this.channel.call({
- method, params,
+ method,
+ params,
success: result => resolve(result),
error: error => reject(error)
})
}
// put it on the window as well as the export
-window[ 'PeerTubePlayer' ] = PeerTubePlayer
+(window['PeerTubePlayer'] as any) = PeerTubePlayer