-import videojs from 'video.js'
-import 'videojs-dock/dist/videojs-dock.es.js'
-import * as WebTorrent from 'webtorrent'
-import { Video } from '../../../../shared'
-
-// videojs typings don't have some method we need
-const videojsUntyped = videojs as any
-
-function loadVideoInfos (videoId: string, callback: (err: Error, res?: Video) => void) {
- const xhttp = new XMLHttpRequest()
- xhttp.onreadystatechange = function () {
- if (this.readyState === 4 && this.status === 200) {
- const json = JSON.parse(this.responseText)
- return callback(null, json)
+import {
+ getCompleteLocale,
+ is18nLocale,
+ isDefaultLocale,
+ peertubeTranslate,
+ ResultList,
+ ServerConfig,
+ VideoDetails
+} from '../../../../shared'
+import { VideoJSCaption } from '../../assets/player/peertube-videojs-typings'
+import { VideoCaption } from '../../../../shared/models/videos/caption/video-caption.model'
+import {
+ P2PMediaLoaderOptions,
+ PeertubePlayerManagerOptions,
+ PlayerMode
+} from '../../assets/player/peertube-player-manager'
+import { VideoStreamingPlaylistType } from '../../../../shared/models/videos/video-streaming-playlist.type'
+import { PeerTubeEmbedApi } from './embed-api'
+import { TranslationsManager } from '../../assets/player/translations-manager'
+
+export class PeerTubeEmbed {
+ videoElement: HTMLVideoElement
+ player: 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)