+export class PeerTubeEmbed {
+ videoElement: HTMLVideoElement
+ player: any
+ playerOptions: any
+ api: PeerTubeEmbedApi = null
+ autoplay: boolean
+ controls: boolean
+ muted: boolean
+ loop: boolean
+ subtitle: string
+ enableApi = false
+ startTime: number | string = 0
+ stopTime: number | string
+
+ title: boolean
+ warningTitle: boolean
+ bigPlayBackgroundColor: string
+ foregroundColor: string
+
+ mode: PlayerMode
+ scope = 'peertube'
+
+ static async main () {
+ const videoContainerId = 'video-container'
+ const embed = new PeerTubeEmbed(videoContainerId)
+ await embed.init()
+ }
+
+ constructor (private videoContainerId: string) {
+ this.videoElement = document.getElementById(videoContainerId) as HTMLVideoElement
+ }
+
+ getVideoUrl (id: string) {
+ return window.location.origin + '/api/v1/videos/' + id
+ }
+
+ loadVideoInfo (videoId: string): Promise<Response> {
+ return fetch(this.getVideoUrl(videoId))
+ }
+
+ loadVideoCaptions (videoId: string): Promise<Response> {
+ return fetch(this.getVideoUrl(videoId) + '/captions')
+ }
+
+ loadConfig (): Promise<Response> {
+ return fetch('/api/v1/config')
+ }
+
+ removeElement (element: HTMLElement) {
+ element.parentElement.removeChild(element)
+ }
+
+ displayError (text: string, translations?: { [ id: string ]: string }) {
+ // Remove video element
+ if (this.videoElement) this.removeElement(this.videoElement)
+
+ const translatedText = peertubeTranslate(text, translations)
+ const translatedSorry = peertubeTranslate('Sorry', translations)
+
+ document.title = translatedSorry + ' - ' + translatedText
+
+ const errorBlock = document.getElementById('error-block')
+ errorBlock.style.display = 'flex'
+
+ const errorTitle = document.getElementById('error-title')
+ errorTitle.innerHTML = peertubeTranslate('Sorry', translations)
+
+ 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 {
+ const params = new URL(window.location.toString()).searchParams
+
+ this.autoplay = this.getParamToggle(params, 'autoplay', false)
+ this.controls = this.getParamToggle(params, 'controls', true)
+ this.muted = this.getParamToggle(params, 'muted', false)
+ this.loop = this.getParamToggle(params, 'loop', false)
+ this.title = this.getParamToggle(params, 'title', true)
+ this.enableApi = this.getParamToggle(params, 'api', this.enableApi)
+ this.warningTitle = this.getParamToggle(params, 'warningTitle', true)
+
+ 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.bigPlayBackgroundColor = this.getParamString(params, 'bigPlayBackgroundColor')
+ this.foregroundColor = this.getParamString(params, 'foregroundColor')
+
+ 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, configResponse ] = await Promise.all([
+ PeertubePlayerManager.getServerTranslations(window.location.origin, navigator.language),
+ this.loadVideoInfo(videoId),
+ this.loadVideoCaptions(videoId),
+ this.loadConfig()
+ ])
+
+ if (!videoResponse.ok) {
+ if (videoResponse.status === 404) return this.videoNotFound(serverTranslations)