return undefined
}
+function saveLastSubtitle (language: string) {
+ return setLocalStorage('last-subtitle', language)
+}
+
+function getStoredLastSubtitle () {
+ return getLocalStorage('last-subtitle')
+}
+
// ---------------------------------------------------------------------------
export {
saveMuteInStore,
saveTheaterInStore,
saveAverageBandwidth,
- getAverageBandwidthInStore
+ getAverageBandwidthInStore,
+ saveLastSubtitle,
+ getStoredLastSubtitle
}
// ---------------------------------------------------------------------------
videojsUntyped.getComponent('CaptionsButton').prototype.label_ = ' '
function getVideojsOptions (options: {
- autoplay: boolean,
- playerElement: HTMLVideoElement,
- videoViewUrl: string,
- videoDuration: number,
- videoFiles: VideoFile[],
- enableHotkeys: boolean,
- inactivityTimeout: number,
- peertubeLink: boolean,
- poster: string,
+ autoplay: boolean
+ playerElement: HTMLVideoElement
+ videoViewUrl: string
+ videoDuration: number
+ videoFiles: VideoFile[]
+ enableHotkeys: boolean
+ inactivityTimeout: number
+ peertubeLink: boolean
+ poster: string
startTime: number | string
- theaterMode: boolean,
- videoCaptions: VideoJSCaption[],
+ theaterMode: boolean
+ videoCaptions: VideoJSCaption[]
- language?: string,
- controls?: boolean,
- muted?: boolean,
+ language?: string
+ controls?: boolean
+ muted?: boolean
loop?: boolean
+ subtitle?: string
userWatching?: UserWatching
}) {
// We don't use text track settings for now
textTrackSettings: false,
controls: options.controls !== undefined ? options.controls : true,
- muted: options.controls !== undefined ? options.muted : false,
loop: options.loop !== undefined ? options.loop : false,
+
+ muted: options.muted !== undefined ? options.muted : undefined, // Undefined so the player knows it has to check the local storage
+
poster: options.poster,
autoplay: false,
inactivityTimeout: options.inactivityTimeout,
videoViewUrl: options.videoViewUrl,
videoDuration: options.videoDuration,
startTime: options.startTime,
- userWatching: options.userWatching
+ userWatching: options.userWatching,
+ subtitle: options.subtitle
}
},
controlBar: {
import { PeertubeChunkStore } from './peertube-chunk-store'
import {
getAverageBandwidthInStore,
+ getStoredLastSubtitle,
getStoredMute,
getStoredVolume,
getStoredWebTorrentEnabled,
saveAverageBandwidth,
+ saveLastSubtitle,
saveMuteInStore,
saveVolumeInStore
} from './peertube-player-local-storage'
private currentVideoFile: VideoFile
private torrent: WebTorrent.Torrent
private videoCaptions: VideoJSCaption[]
+ private defaultSubtitle: string
private renderer: any
private fakeRenderer: any
- private destoyingFakeRenderer = false
+ private destroyingFakeRenderer = false
private autoResolution = true
private forbidAutoResolution = false
if (this.autoplay === true) this.player.addClass('vjs-has-autoplay')
this.player.ready(() => {
+ const playerOptions = this.player.options_
+
const volume = getStoredVolume()
if (volume !== undefined) this.player.volume(volume)
- const muted = getStoredMute()
+
+ const muted = playerOptions.muted !== undefined ? playerOptions.muted : getStoredMute()
if (muted !== undefined) this.player.muted(muted)
+ this.defaultSubtitle = options.subtitle || getStoredLastSubtitle()
+
+ this.player.on('volumechange', () => {
+ saveVolumeInStore(this.player.volume())
+ saveMuteInStore(this.player.muted())
+ })
+
+ this.player.textTracks().on('change', () => {
+ const showing = this.player.textTracks().tracks_.find((t: { kind: string, mode: string }) => {
+ return t.kind === 'captions' && t.mode === 'showing'
+ })
+
+ if (!showing) {
+ saveLastSubtitle('off')
+ return
+ }
+
+ saveLastSubtitle(showing.language)
+ })
+
this.player.duration(options.videoDuration)
this.initializePlayer()
this.runAutoQualitySchedulerTimer = setTimeout(() => this.runAutoQualityScheduler(), this.CONSTANTS.AUTO_QUALITY_SCHEDULER)
})
})
-
- this.player.on('volumechange', () => {
- saveVolumeInStore(this.player.volume())
- saveMuteInStore(this.player.muted())
- })
}
dispose () {
}
private renderFileInFakeElement (file: WebTorrent.TorrentFile, delay: number) {
- this.destoyingFakeRenderer = false
+ this.destroyingFakeRenderer = false
const fakeVideoElem = document.createElement('video')
renderVideo(file, fakeVideoElem, { autoplay: false, controls: false }, (err, renderer) => {
this.fakeRenderer = renderer
// The renderer returns an error when we destroy it, so skip them
- if (this.destoyingFakeRenderer === false && err) {
+ if (this.destroyingFakeRenderer === false && err) {
console.error('Cannot render new torrent in fake video element.', err)
}
private destroyFakeRenderer () {
if (this.fakeRenderer) {
- this.destoyingFakeRenderer = true
+ this.destroyingFakeRenderer = true
if (this.fakeRenderer.destroy) {
try {
label: caption.label,
language: caption.language,
id: caption.language,
- src: caption.src
+ src: caption.src,
+ default: this.defaultSubtitle === caption.language
}, false)
}
}
autoplay: boolean,
videoCaptions: VideoJSCaption[]
+ subtitle?: string
userWatching?: UserWatching
}
}
function timeToInt (time: number | string) {
+ if (!time) return 0
if (typeof time === 'number') return time
const reg = /^((\d+)h)?((\d+)m)?((\d+)s?)?$/
player: any
playerOptions: any
api: PeerTubeEmbedApi = null
- autoplay = false
- controls = true
- muted = false
- loop = false
+ autoplay: boolean
+ controls: boolean
+ muted: boolean
+ loop: boolean
+ subtitle: string
enableApi = false
startTime: number | string = 0
scope = 'peertube'
this.displayError(text)
}
- getParamToggle (params: URLSearchParams, name: string, defaultValue: boolean) {
+ getParamToggle (params: URLSearchParams, name: string, defaultValue?: boolean) {
return params.has(name) ? (params.get(name) === '1' || params.get(name) === 'true') : defaultValue
}
- getParamString (params: URLSearchParams, name: string, defaultValue: string) {
+ getParamString (params: URLSearchParams, name: string, defaultValue?: string) {
return params.has(name) ? params.get(name) : defaultValue
}
try {
let params = new URL(window.location.toString()).searchParams
- this.autoplay = this.getParamToggle(params, 'autoplay', this.autoplay)
- this.controls = this.getParamToggle(params, 'controls', this.controls)
- this.muted = this.getParamToggle(params, 'muted', this.muted)
- this.loop = this.getParamToggle(params, 'loop', this.loop)
+ this.autoplay = this.getParamToggle(params, 'autoplay')
+ this.controls = this.getParamToggle(params, 'controls')
+ this.muted = this.getParamToggle(params, 'muted')
+ this.loop = this.getParamToggle(params, 'loop')
this.enableApi = this.getParamToggle(params, 'api', this.enableApi)
- this.scope = this.getParamString(params, 'scope', this.scope)
- const startTimeParamString = params.get('start')
- if (startTimeParamString) this.startTime = startTimeParamString
+ this.scope = this.getParamString(params, 'scope', this.scope)
+ this.subtitle = this.getParamString(params, 'subtitle')
+ this.startTime = this.getParamString(params, 'start')
} catch (err) {
console.error('Cannot get params from URL.', err)
}
muted: this.muted,
loop: this.loop,
startTime: this.startTime,
+ subtitle: this.subtitle,
videoCaptions,
inactivityTimeout: 1500,