1
0
Fork 0

Add ability to update embed captions

This commit is contained in:
Chocobozzz 2020-05-06 11:54:33 +02:00
parent fc8aabd0bf
commit 1151f5210c
No known key found for this signature in database
GPG key ID: 583A612D890159BE
7 changed files with 98 additions and 9 deletions

View file

@ -38,7 +38,7 @@ declare module 'video.js' {
textTracks (): TextTrackList & {
on: Function
tracks_: { kind: string, mode: string, language: string }[]
tracks_: (TextTrack & { id: string, label: string, src: string })[]
}
audioTracks (): AudioTrackList

View file

@ -16,3 +16,10 @@ export interface PeerTubeResolution {
src?: string
width?: number
}
export type PeerTubeTextTrack = {
id: string
label: string
src: string
mode: 'showing' | 'disabled'
}

View file

@ -1,6 +1,6 @@
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',
@ -104,6 +104,21 @@ export class PeerTubePlayer {
return this.sendMessage<void, 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<void, PeerTubeTextTrack[]>('getCaptions')
}
/**
* Tell the embed to seek to a specific position (in seconds)
* @param seconds

View file

@ -1,7 +1,7 @@
import './embed.scss'
import * as Channel from 'jschannel'
import { PeerTubeResolution } from '../player/definitions'
import { PeerTubeResolution, PeerTubeTextTrack } from '../player/definitions'
import { PeerTubeEmbed } from './embed'
/**
@ -44,6 +44,9 @@ export class PeerTubeEmbedApi {
channel.bind('setResolution', (txn, resolutionId) => this.setResolution(resolutionId))
channel.bind('getResolutions', (txn, params) => this.resolutions)
channel.bind('getCaptions', (txn, params) => this.getCaptions())
channel.bind('setCaption', (txn, id) => this.setCaption(id)),
channel.bind('setPlaybackRate', (txn, playbackRate) => this.embed.player.playbackRate(playbackRate))
channel.bind('getPlaybackRate', (txn, params) => this.embed.player.playbackRate())
channel.bind('getPlaybackRates', (txn, params) => this.embed.player.options_.playbackRates)
@ -71,6 +74,26 @@ export class PeerTubeEmbedApi {
this.embed.player.p2pMediaLoader().getHLSJS().nextLevel = resolutionId
}
private getCaptions (): PeerTubeTextTrack[] {
return this.embed.player.textTracks().tracks_.map(t => {
return {
id: t.id,
src: t.src,
label: t.label,
mode: t.mode as any
}
})
}
private setCaption (id: string) {
const tracks = this.embed.player.textTracks().tracks_
for (const track of tracks) {
if (track.id === id) track.mode = 'showing'
else track.mode = 'disabled'
}
}
/**
* Let the host know that we're ready to go!
*/

View file

@ -37,6 +37,12 @@
<br/>
</fieldset>
<fieldset>
<legend>Captions:</legend>
<div id="caption-list"></div>
<br/>
</fieldset>
<fieldset>
<legend>Rates:</legend>
<div id="rate-list"></div>

View file

@ -1,6 +1,6 @@
import './test-embed.scss'
import { PeerTubePlayer } from '../player/player'
import { PeerTubeResolution, PlayerEventType } from '../player/definitions'
import { PeerTubeResolution, PlayerEventType, PeerTubeTextTrack } from '../player/definitions'
window.addEventListener('load', async () => {
const urlParts = window.location.href.split('/')
@ -67,6 +67,36 @@ window.addEventListener('load', async () => {
updateRates()
})
const updateCaptions = async () => {
const captions = await player.getCaptions()
const captionEl = document.querySelector('#caption-list')
captionEl.innerHTML = ''
captions.forEach(c => {
console.log(c)
if (c.mode === 'showing') {
const itemEl = document.createElement('strong')
itemEl.innerText = `${c.label} (active)`
itemEl.style.display = 'block'
captionEl.appendChild(itemEl)
} else {
const itemEl = document.createElement('a')
itemEl.href = 'javascript:;'
itemEl.innerText = c.label
itemEl.addEventListener('click', () => {
player.setCaption(c.id)
updateCaptions()
})
itemEl.style.display = 'block'
captionEl.appendChild(itemEl)
}
})
}
updateCaptions()
const updateResolutions = ((resolutions: PeerTubeResolution[]) => {
const resolutionListEl = document.querySelector('#resolution-list')
resolutionListEl.innerHTML = ''

View file

@ -107,6 +107,14 @@ Set the playback volume. Value should be between `0` and `1`.
Get the playback volume. Returns a value between `0` and `1`.
## `setCaption(id: string) : Promise<void>`
Update current caption using the caption id.
## `getCaptions(): Promise<{ id: string, label: string, src: string, mode: 'disabled' | 'showing' }>`
Get video captions.
# Events
You can subscribe to events by using `addEventListener()`. See above for details.