+ const errorText = document.getElementById('error-content')
+ errorText.innerHTML = translatedText
+ }
+
+ videoNotFound (translations?: { [ id: string ]: string }) {
+ const text = 'This video does not exist.'
+ this.displayError(text, translations)
+ }
+
+ videoFetchError (translations?: { [ id: string ]: string }) {
+ const text = 'We cannot fetch the video. Please try again later.'
+ this.displayError(text, translations)
+ }
+
+ 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) {
+ return params.has(name) ? params.get(name) : defaultValue
+ }
+
+ async init () {
+ try {
+ await this.initCore()
+ } catch (e) {
+ console.error(e)
+ }
+ }
+
+ private initializeApi () {
+ if (!this.enableApi) return
+
+ this.api = new PeerTubeEmbedApi(this)
+ this.api.initialize()
+ }
+
+ private loadParams () {
+ try {
+ let params = new URL(window.location.toString()).searchParams
+
+ 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)
+ this.subtitle = this.getParamString(params, 'subtitle')
+ this.startTime = this.getParamString(params, 'start')
+ this.stopTime = this.getParamString(params, 'stop')
+
+ this.mode = this.getParamString(params, 'mode') === 'p2p-media-loader' ? 'p2p-media-loader' : 'webtorrent'
+ } catch (err) {
+ console.error('Cannot get params from URL.', err)
+ }
+ }
+
+ private async initCore () {
+ const urlParts = window.location.pathname.split('/')
+ const videoId = urlParts[ urlParts.length - 1 ]
+
+ const [ serverTranslations, videoResponse, captionsResponse ] = await Promise.all([
+ PeertubePlayerManager.getServerTranslations(window.location.origin, navigator.language),
+ this.loadVideoInfo(videoId),
+ this.loadVideoCaptions(videoId)
+ ])
+
+ if (!videoResponse.ok) {
+ if (videoResponse.status === 404) return this.videoNotFound(serverTranslations)
+
+ return this.videoFetchError(serverTranslations)
+ }
+
+ const videoInfo: VideoDetails = await videoResponse.json()
+ let videoCaptions: VideoJSCaption[] = []
+ if (captionsResponse.ok) {
+ const { data } = (await captionsResponse.json()) as ResultList<VideoCaption>
+ videoCaptions = data.map(c => ({
+ label: peertubeTranslate(c.language.label, serverTranslations),
+ language: c.language.id,
+ src: window.location.origin + c.captionPath
+ }))
+ }
+
+ this.loadParams()
+
+ const options: PeertubePlayerManagerOptions = {
+ common: {
+ autoplay: this.autoplay,
+ controls: this.controls,
+ muted: this.muted,
+ loop: this.loop,
+ captions: videoCaptions.length !== 0,
+ startTime: this.startTime,
+ stopTime: this.stopTime,
+ subtitle: this.subtitle,
+
+ videoCaptions,
+ inactivityTimeout: 1500,
+ videoViewUrl: this.getVideoUrl(videoId) + '/views',
+
+ playerElement: this.videoElement,
+ onPlayerElementChange: (element: HTMLVideoElement) => this.videoElement = element,
+
+ videoDuration: videoInfo.duration,
+ enableHotkeys: true,
+ peertubeLink: true,
+ poster: window.location.origin + videoInfo.previewPath,
+ theaterMode: false,
+
+ serverUrl: window.location.origin,
+ language: navigator.language,
+ embedUrl: window.location.origin + videoInfo.embedPath
+ },
+
+ webtorrent: {
+ videoFiles: videoInfo.files