+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)