{"version":3,"file":"video-worker.cjs","sources":["../src/defaults.ts","../src/utils/extend.ts","../src/base-class.ts","../src/providers/local.ts","../src/utils/deferred.ts","../src/utils/global.ts","../src/providers/vimeo.ts","../src/providers/youtube.ts","../src/video-worker.ts"],"sourcesContent":["import type { VideoWorkerOptions } from './types';\n\nconst defaults: VideoWorkerOptions = {\n  autoplay: false,\n  loop: false,\n  mute: false,\n  volume: 100,\n  showControls: true,\n  accessibilityHidden: false,\n\n  // start / end video time in seconds\n  startTime: 0,\n  endTime: 0,\n};\n\nexport default defaults;\n","/**\n * Extend like jQuery.extend\n *\n * @param {Object} out - output object.\n * @param {...any} args - additional objects to extend.\n *\n * @returns {Object}\n */\nexport default function extend<T extends object>(\n  out: T,\n  ...args: Array<Partial<T> | undefined>\n): T {\n  const target = out || ({} as T);\n\n  Object.keys(args).forEach((index) => {\n    const source = args[Number(index)];\n    if (!source) {\n      return;\n    }\n\n    Object.keys(source).forEach((key) => {\n      const typedKey = key as keyof T;\n      const value = source[typedKey];\n\n      if (typeof value !== 'undefined') {\n        target[typedKey] = value as T[keyof T];\n      }\n    });\n  });\n\n  return target;\n}\n","import defaults from './defaults';\nimport type {\n  ParsedVideoID,\n  ValueCallback,\n  VideoWorkerElement,\n  VideoWorkerEventCallback,\n  VideoWorkerOptions,\n  VideoWorkerOptionsInput,\n} from './types';\nimport extend from './utils/extend';\n\nlet ID = 0;\n\nclass VideoWorkerBase {\n  type = 'none';\n\n  url: string;\n\n  options_default: VideoWorkerOptions;\n\n  options: VideoWorkerOptions;\n\n  videoID: ParsedVideoID;\n\n  ID!: number;\n\n  playerID!: string;\n\n  userEventsList?: Record<string, Array<VideoWorkerEventCallback | false>>;\n\n  player?: unknown;\n\n  $video?: VideoWorkerElement;\n\n  hiddenContainer?: HTMLDivElement;\n\n  videoImage?: string;\n\n  videoWidth?: number;\n\n  videoHeight?: number;\n\n  destroyed = false;\n\n  constructor(url: string, options?: VideoWorkerOptionsInput) {\n    this.url = url;\n    this.options_default = { ...defaults };\n    this.options = extend({ ...this.options_default }, options);\n\n    // check URL\n    this.videoID = (this.constructor as typeof VideoWorkerBase).parseURL(url);\n\n    // init\n    if (this.videoID) {\n      this.init();\n    }\n  }\n\n  isValid(): boolean {\n    return !!this.videoID;\n  }\n\n  init(): void {\n    this.ID = ID;\n    ID += 1;\n\n    this.playerID = `VideoWorker-${this.ID}`;\n  }\n\n  // events\n  on(name: string, callback: VideoWorkerEventCallback): void {\n    this.userEventsList = this.userEventsList || {};\n    if (!this.userEventsList[name]) {\n      // add new callback in events list\n      this.userEventsList[name] = [];\n    }\n\n    this.userEventsList[name].push(callback);\n  }\n\n  off(name: string, callback?: VideoWorkerEventCallback): void {\n    if (!this.userEventsList || !this.userEventsList[name]) {\n      return;\n    }\n\n    if (!callback) {\n      delete this.userEventsList[name];\n      return;\n    }\n\n    this.userEventsList[name].forEach((value, key) => {\n      if (value === callback) {\n        const eventList = this.userEventsList?.[name];\n        if (eventList) {\n          eventList[key] = false;\n        }\n      }\n    });\n  }\n\n  fire(name: string, ...args: unknown[]): void {\n    if (this.userEventsList && typeof this.userEventsList[name] !== 'undefined') {\n      this.userEventsList[name].forEach((value) => {\n        // call with all arguments\n        if (value) {\n          value.apply(this, args);\n        }\n      });\n    }\n  }\n\n  /**\n   * Methods used in providers.\n   */\n  static parseURL(_url: string): ParsedVideoID {\n    return false;\n  }\n\n  play(_start?: number): void {}\n\n  pause(): void {}\n\n  mute(): void {}\n\n  unmute(): void {}\n\n  setVolume(_volume: number | false = false): void {}\n\n  getVolume(_callback: ValueCallback<number | false>): void {}\n\n  getMuted(_callback: ValueCallback<boolean | null>): void {}\n\n  setCurrentTime(_currentTime: number | false = false): void {}\n\n  getCurrentTime(_callback: ValueCallback<number>): void {}\n\n  getImageURL(_callback: ValueCallback<string>): void {}\n\n  getVideo(_callback: ValueCallback<VideoWorkerElement>): void {}\n\n  destroy(): void {\n    this.destroyed = true;\n    this.userEventsList = undefined;\n\n    if (this.$video?.parentNode) {\n      this.$video.parentNode.removeChild(this.$video);\n    }\n\n    if (this.hiddenContainer?.parentNode) {\n      this.hiddenContainer.parentNode.removeChild(this.hiddenContainer);\n    }\n\n    this.player = undefined;\n    this.$video = undefined;\n    this.hiddenContainer = undefined;\n  }\n}\n\nexport default VideoWorkerBase;\n","import BaseClass from '../base-class';\nimport type { ValueCallback, VideoWorkerVideoSources } from '../types';\n\nclass VideoWorkerLocal extends BaseClass {\n  type = 'local';\n\n  player?: HTMLVideoElement;\n\n  $video?: HTMLVideoElement;\n\n  eventHandlers?: {\n    ended: (event: Event) => void;\n    error: (event: Event) => void;\n    loadedmetadata: (event: Event) => void;\n    pause: (event: Event) => void;\n    play: (event: Event) => void;\n    playing: (event: Event) => void;\n    timeupdate: (event: Event) => void;\n    volumechange: (event: Event) => void;\n  };\n\n  static parseURL(url: string): VideoWorkerVideoSources | false {\n    const videoFormats = url.split(/,(?=mp4:|webm:|ogv:|ogg:)/);\n    const result: VideoWorkerVideoSources = {};\n    let ready = 0;\n\n    videoFormats.forEach((value) => {\n      const match = value.match(/^(mp4|webm|ogv|ogg):(.*)/);\n      if (match?.[1] && match[2]) {\n        const key = match[1] === 'ogv' ? 'ogg' : match[1];\n        result[key as keyof VideoWorkerVideoSources] = match[2];\n        ready = 1;\n      }\n    });\n\n    return ready ? result : false;\n  }\n\n  play(start?: number): void {\n    if (!this.player) {\n      return;\n    }\n\n    if (typeof start !== 'undefined') {\n      this.player.currentTime = start;\n    }\n\n    if (this.player.paused) {\n      // Don't play if video is already ended and with no loop.\n      if (this.options.endTime && !this.options.loop) {\n        this.getCurrentTime((seconds) => {\n          if (seconds < this.options.endTime) {\n            void this.player?.play();\n          }\n        });\n      } else {\n        void this.player.play();\n      }\n    }\n  }\n\n  pause(): void {\n    if (!this.player || this.player.paused) {\n      return;\n    }\n\n    this.player.pause();\n  }\n\n  mute(): void {\n    if (!this.player || !this.$video) {\n      return;\n    }\n\n    this.$video.muted = true;\n  }\n\n  unmute(): void {\n    if (!this.player || !this.$video) {\n      return;\n    }\n\n    this.$video.muted = false;\n  }\n\n  setVolume(volume: number | false = false): void {\n    if (!this.player || !this.$video || typeof volume !== 'number') {\n      return;\n    }\n\n    this.$video.volume = volume / 100;\n  }\n\n  getVolume(callback: ValueCallback<number | false>): void {\n    if (!this.player || !this.$video) {\n      callback(false);\n      return;\n    }\n\n    callback(this.$video.volume * 100);\n  }\n\n  getMuted(callback: ValueCallback<boolean | null>): void {\n    if (!this.player || !this.$video) {\n      callback(null);\n      return;\n    }\n\n    callback(this.$video.muted);\n  }\n\n  setCurrentTime(currentTime: number | false = false): void {\n    if (!this.player || !this.$video || typeof currentTime !== 'number') {\n      return;\n    }\n\n    this.$video.currentTime = currentTime;\n  }\n\n  getCurrentTime(callback: ValueCallback<number>): void {\n    if (!this.player) {\n      return;\n    }\n\n    callback(this.player.currentTime);\n  }\n\n  getImageURL(callback: ValueCallback<string>): void {\n    if (this.videoImage) {\n      callback(this.videoImage);\n    }\n  }\n\n  getVideo(callback: ValueCallback<HTMLVideoElement>): void {\n    if (this.destroyed) {\n      return;\n    }\n\n    // return generated video block\n    if (this.$video) {\n      callback(this.$video);\n      return;\n    }\n\n    // generate new video block\n    let hiddenDiv: HTMLDivElement | undefined;\n    if (!this.$video) {\n      hiddenDiv = document.createElement('div');\n      hiddenDiv.style.display = 'none';\n    }\n\n    function addSourceElement(element: HTMLVideoElement, src: string, type: string): void {\n      const source = document.createElement('source');\n      source.src = src;\n      source.type = type;\n      element.appendChild(source);\n    }\n\n    if (!this.$video && hiddenDiv) {\n      this.$video = document.createElement('video');\n      this.player = this.$video;\n      this.hiddenContainer = hiddenDiv;\n\n      // show controls\n      if (this.options.showControls) {\n        this.$video.controls = true;\n      }\n\n      // set volume\n      if (typeof this.options.volume === 'number') {\n        this.setVolume(this.options.volume);\n      }\n\n      // mute (it is required to mute after the volume set)\n      if (this.options.mute) {\n        this.mute();\n      }\n\n      // loop\n      if (this.options.loop) {\n        this.$video.loop = true;\n      }\n\n      // autoplay enable on mobile devices\n      this.$video.setAttribute('playsinline', '');\n      this.$video.setAttribute('webkit-playsinline', '');\n\n      // add accessibility attributes\n      if (this.options.accessibilityHidden) {\n        this.$video.setAttribute('tabindex', '-1');\n        this.$video.setAttribute('aria-hidden', 'true');\n      }\n\n      this.$video.setAttribute('id', this.playerID);\n      hiddenDiv.appendChild(this.$video);\n      document.body.appendChild(hiddenDiv);\n\n      Object.keys(this.videoID as VideoWorkerVideoSources).forEach((key) => {\n        const sourceValue = (this.videoID as VideoWorkerVideoSources)[\n          key as keyof VideoWorkerVideoSources\n        ];\n        if (sourceValue) {\n          addSourceElement(this.$video as HTMLVideoElement, sourceValue, `video/${key}`);\n        }\n      });\n      const player = this.player as HTMLVideoElement;\n      let localStarted = false;\n      this.eventHandlers = {\n        playing: (event: Event) => {\n          if (!localStarted) {\n            this.fire('started', event);\n          }\n          localStarted = true;\n        },\n        timeupdate: (event: Event) => {\n          this.fire('timeupdate', event);\n\n          // check for end of video and play again or stop\n          if (\n            this.options.endTime &&\n            this.player &&\n            this.player.currentTime >= this.options.endTime\n          ) {\n            if (this.options.loop) {\n              this.play(this.options.startTime);\n            } else {\n              this.pause();\n            }\n          }\n        },\n        play: (event: Event) => {\n          this.fire('play', event);\n        },\n        pause: (event: Event) => {\n          this.fire('pause', event);\n        },\n        ended: (event: Event) => {\n          this.fire('ended', event);\n        },\n        loadedmetadata: (event: Event) => {\n          if (!this.player) {\n            return;\n          }\n\n          // get video width and height\n          this.videoWidth = this.player.videoWidth || 1280;\n          this.videoHeight = this.player.videoHeight || 720;\n\n          this.fire('ready', event);\n\n          // autoplay\n          if (this.options.autoplay) {\n            this.play(this.options.startTime);\n          }\n        },\n        volumechange: (event: Event) => {\n          this.getVolume((volume) => {\n            if (typeof volume === 'number') {\n              this.options.volume = volume;\n            }\n          });\n          this.fire('volumechange', event);\n        },\n        error: (event: Event) => {\n          this.fire('error', event);\n        },\n      };\n\n      player.addEventListener('playing', this.eventHandlers.playing);\n      player.addEventListener('timeupdate', this.eventHandlers.timeupdate);\n      player.addEventListener('play', this.eventHandlers.play);\n      player.addEventListener('pause', this.eventHandlers.pause);\n      player.addEventListener('ended', this.eventHandlers.ended);\n      player.addEventListener('loadedmetadata', this.eventHandlers.loadedmetadata);\n      player.addEventListener('volumechange', this.eventHandlers.volumechange);\n      player.addEventListener('error', this.eventHandlers.error);\n    }\n\n    callback(this.$video as HTMLVideoElement);\n  }\n\n  destroy(): void {\n    if (this.player && this.eventHandlers) {\n      this.player.removeEventListener('playing', this.eventHandlers.playing);\n      this.player.removeEventListener('timeupdate', this.eventHandlers.timeupdate);\n      this.player.removeEventListener('play', this.eventHandlers.play);\n      this.player.removeEventListener('pause', this.eventHandlers.pause);\n      this.player.removeEventListener('ended', this.eventHandlers.ended);\n      this.player.removeEventListener('loadedmetadata', this.eventHandlers.loadedmetadata);\n      this.player.removeEventListener('volumechange', this.eventHandlers.volumechange);\n      this.player.removeEventListener('error', this.eventHandlers.error);\n    }\n\n    this.eventHandlers = undefined;\n    super.destroy();\n  }\n}\n\nexport default VideoWorkerLocal;\n","// Deferred\n// thanks http://stackoverflow.com/questions/18096715/implement-deferred-object-without-using-jquery\nexport default class Deferred<TArgs extends unknown[] = unknown[]> {\n  doneCallbacks: Array<(...args: TArgs) => void> = [];\n\n  failCallbacks: Array<(...args: TArgs) => void> = [];\n\n  execute(list: Array<(...args: TArgs) => void>, args: TArgs): void {\n    let index = list.length;\n\n    while (index) {\n      index -= 1;\n      list[index](...args);\n    }\n  }\n\n  resolve(...args: TArgs): void {\n    this.execute(this.doneCallbacks, args);\n  }\n\n  reject(...args: TArgs): void {\n    this.execute(this.failCallbacks, args);\n  }\n\n  done(callback: (...args: TArgs) => void): void {\n    this.doneCallbacks.push(callback);\n  }\n\n  fail(callback: (...args: TArgs) => void): void {\n    this.failCallbacks.push(callback);\n  }\n}\n","import type { VideoWorkerGlobal } from '../types';\n\n/* eslint-disable import/no-mutable-exports */\n/* eslint-disable no-restricted-globals */\nlet win: VideoWorkerGlobal;\n\nif (typeof window !== 'undefined') {\n  win = window as unknown as VideoWorkerGlobal;\n} else if (typeof self !== 'undefined') {\n  win = self as unknown as VideoWorkerGlobal;\n} else {\n  win = globalThis as VideoWorkerGlobal;\n}\n\nexport default win;\n","import BaseClass from '../base-class';\nimport type {\n  ValueCallback,\n  VideoWorkerGlobal,\n  VimeoNamespace,\n  VimeoPlayer,\n  VimeoPlayerEvent,\n  VimeoPlayerOptions,\n} from '../types';\nimport Deferred from '../utils/deferred';\nimport global from '../utils/global';\n\nlet VimeoAPIadded = 0;\nlet loadingVimeoPlayer = 0;\nconst loadingVimeoDefer = new Deferred<[string]>();\n\nconst videoGlobal = global as VideoWorkerGlobal;\n\nfunction loadAPI(): void {\n  if (VimeoAPIadded) {\n    return;\n  }\n\n  VimeoAPIadded = 1;\n\n  // Useful when Vimeo API added using RequireJS https://github.com/nk-o/video-worker/pull/7\n  if (typeof videoGlobal.Vimeo !== 'undefined') {\n    return;\n  }\n\n  const src = 'https://player.vimeo.com/api/player.js';\n\n  // add script in head section\n  let tag: HTMLScriptElement | null = document.createElement('script');\n  let head: HTMLHeadElement | null = document.getElementsByTagName('head')[0] || null;\n  if (!head || !tag) {\n    return;\n  }\n  tag.src = src;\n\n  head.appendChild(tag);\n\n  head = null;\n  tag = null;\n}\n\nfunction onAPIready(callback: () => void): void {\n  if (typeof videoGlobal.Vimeo === 'undefined' && !loadingVimeoPlayer) {\n    loadingVimeoPlayer = 1;\n    const vimeoInterval = setInterval(() => {\n      if (typeof videoGlobal.Vimeo !== 'undefined') {\n        clearInterval(vimeoInterval);\n        loadingVimeoDefer.resolve('done');\n        callback();\n      }\n    }, 20);\n  } else if (typeof videoGlobal.Vimeo !== 'undefined') {\n    callback();\n  } else {\n    loadingVimeoDefer.done(() => {\n      callback();\n    });\n  }\n}\n\nclass VideoWorkerVimeo extends BaseClass {\n  type = 'vimeo';\n\n  player?: VimeoPlayer;\n\n  $video?: HTMLIFrameElement;\n\n  playerOptions?: VimeoPlayerOptions;\n\n  imageRequest?: XMLHttpRequest;\n\n  static parseURL(url: string): string | false {\n    const regExp =\n      /https?:\\/\\/(?:www\\.|player\\.)?vimeo.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/([^/]*)\\/videos\\/|album\\/(\\d+)\\/video\\/|video\\/|)(\\d+)(?:$|\\/|\\?)/;\n    const match = url.match(regExp);\n    return match?.[3] ? match[3] : false;\n  }\n\n  // Try to extract a hash for private videos from the URL.\n  // Thanks to https://github.com/sampotts/plyr\n  static parseURLHash(url: string): string | null {\n    /* This regex matches a hexadecimal hash if given in any of these forms:\n     *  - [https://player.]vimeo.com/video/{id}/{hash}[?params]\n     *  - [https://player.]vimeo.com/video/{id}?h={hash}[&params]\n     *  - [https://player.]vimeo.com/video/{id}?[params]&h={hash}\n     *  - video/{id}/{hash}\n     * If matched, the hash is available in capture group 4\n     */\n    const regex = /^.*(vimeo.com\\/|video\\/)(\\d+)(\\?.*&*h=|\\/)+([\\d,a-f]+)/;\n    const found = url.match(regex);\n\n    return found && found.length === 5 ? found[4] : null;\n  }\n\n  init(): void {\n    super.init();\n\n    loadAPI();\n  }\n\n  play(start?: number): void {\n    if (!this.player) {\n      return;\n    }\n\n    if (typeof start !== 'undefined') {\n      void this.player.setCurrentTime(start);\n    }\n\n    this.player.getPaused().then((paused) => {\n      if (paused) {\n        // Don't play if video is already ended and with no loop.\n        if (this.options.endTime && !this.options.loop) {\n          this.getCurrentTime((seconds) => {\n            if (seconds < this.options.endTime) {\n              void this.player?.play();\n            }\n          });\n        } else {\n          void this.player?.play();\n        }\n      }\n    });\n  }\n\n  pause(): void {\n    if (!this.player) {\n      return;\n    }\n\n    this.player.getPaused().then((paused) => {\n      if (!paused) {\n        void this.player?.pause();\n      }\n    });\n  }\n\n  mute(): void {\n    if (!this.player || !this.player.setVolume) {\n      return;\n    }\n\n    this.setVolume(0);\n  }\n\n  unmute(): void {\n    if (!this.player || !this.player.setVolume) {\n      return;\n    }\n\n    // In case the default volume is 0, we have to set 100 when unmute.\n    this.setVolume(this.options.volume || 100);\n  }\n\n  setVolume(volume: number | false = false): void {\n    if (!this.player || typeof volume !== 'number' || !this.player.setVolume) {\n      return;\n    }\n\n    void this.player.setVolume(volume / 100);\n  }\n\n  getVolume(callback: ValueCallback<number | false>): void {\n    if (!this.player) {\n      callback(false);\n      return;\n    }\n\n    if (this.player.getVolume) {\n      this.player.getVolume().then((volume) => {\n        callback(volume * 100);\n      });\n    }\n  }\n\n  getMuted(callback: ValueCallback<boolean | null>): void {\n    if (!this.player) {\n      callback(null);\n      return;\n    }\n\n    if (this.player.getVolume) {\n      this.player.getVolume().then((volume) => {\n        callback(volume === 0);\n      });\n    }\n  }\n\n  setCurrentTime(currentTime: number | false = false): void {\n    if (!this.player || typeof currentTime !== 'number' || !this.player.setCurrentTime) {\n      return;\n    }\n\n    void this.player.setCurrentTime(currentTime);\n  }\n\n  getCurrentTime(callback: ValueCallback<number>): void {\n    if (!this.player || !this.player.getCurrentTime) {\n      return;\n    }\n\n    this.player.getCurrentTime().then((currentTime) => {\n      callback(currentTime);\n    });\n  }\n\n  getImageURL(callback: ValueCallback<string>): void {\n    if (this.destroyed) {\n      return;\n    }\n\n    if (this.videoImage) {\n      callback(this.videoImage);\n      return;\n    }\n\n    // We should provide width to get HQ thumbnail URL.\n    let width = global.innerWidth || 1920;\n    if (global.devicePixelRatio) {\n      width *= global.devicePixelRatio;\n    }\n    width = Math.min(width, 1920);\n\n    let request: XMLHttpRequest | null = new XMLHttpRequest();\n    this.imageRequest = request;\n    // https://vimeo.com/api/oembed.json?url=https://vimeo.com/235212527\n    request.open('GET', `https://vimeo.com/api/oembed.json?url=${this.url}&width=${width}`, true);\n    request.onreadystatechange = () => {\n      if (!request || request.readyState !== 4) {\n        return;\n      }\n\n      if (request.status >= 200 && request.status < 400) {\n        // Success!\n        const response = JSON.parse(request.responseText) as { thumbnail_url?: string };\n\n        if (response.thumbnail_url) {\n          this.videoImage = response.thumbnail_url;\n          callback(this.videoImage);\n        }\n      }\n\n      this.imageRequest = undefined;\n    };\n    request.send();\n    request = null;\n  }\n\n  getVideo(callback: ValueCallback<HTMLIFrameElement>): void {\n    if (this.destroyed) {\n      return;\n    }\n\n    // return generated video block\n    if (this.$video) {\n      callback(this.$video);\n      return;\n    }\n\n    // generate new video block\n    onAPIready(() => {\n      if (this.destroyed) {\n        return;\n      }\n\n      let hiddenDiv: HTMLDivElement | undefined;\n      if (!this.$video) {\n        hiddenDiv = document.createElement('div');\n        hiddenDiv.style.display = 'none';\n      }\n\n      this.playerOptions = {\n        // GDPR Compliance.\n        dnt: 1,\n        id: String(this.videoID),\n        autopause: 0,\n        transparent: 0,\n        autoplay: this.options.autoplay ? 1 : 0,\n        loop: this.options.loop ? 1 : 0,\n        muted: this.options.mute || this.options.volume === 0 ? 1 : 0,\n      };\n\n      // private video hash\n      const urlHash = (this.constructor as typeof VideoWorkerVimeo).parseURLHash(this.url);\n      if (urlHash) {\n        this.playerOptions.h = urlHash;\n      }\n\n      // hide controls\n      if (!this.options.showControls) {\n        this.playerOptions.controls = 0;\n      }\n\n      // enable background option\n      if (!this.options.showControls && this.options.loop && this.options.autoplay) {\n        this.playerOptions.background = 1;\n      }\n\n      if (!this.$video && hiddenDiv) {\n        this.hiddenContainer = hiddenDiv;\n        let playerOptionsString = '';\n        Object.keys(this.playerOptions).forEach((key) => {\n          const optionKey = key as keyof VimeoPlayerOptions;\n          const value = this.playerOptions?.[optionKey];\n          if (typeof value === 'undefined') {\n            return;\n          }\n\n          if (playerOptionsString !== '') {\n            playerOptionsString += '&';\n          }\n          playerOptionsString += `${key}=${encodeURIComponent(String(value))}`;\n        });\n\n        // we need to create iframe manually because when we create it using API\n        // js events won't triggers after iframe moved to another place\n        this.$video = document.createElement('iframe');\n        this.$video.setAttribute('id', this.playerID);\n        this.$video.setAttribute(\n          'src',\n          `https://player.vimeo.com/video/${String(this.videoID)}?${playerOptionsString}`\n        );\n        this.$video.setAttribute('frameborder', '0');\n        this.$video.setAttribute('mozallowfullscreen', '');\n        this.$video.setAttribute('allowfullscreen', '');\n        this.$video.setAttribute('title', 'Vimeo video player');\n\n        // add accessibility attributes\n        if (this.options.accessibilityHidden) {\n          this.$video.setAttribute('tabindex', '-1');\n          this.$video.setAttribute('aria-hidden', 'true');\n        }\n\n        hiddenDiv.appendChild(this.$video);\n        document.body.appendChild(hiddenDiv);\n      }\n      this.player =\n        this.player ||\n        new (videoGlobal.Vimeo as VimeoNamespace).Player(\n          this.$video as HTMLIFrameElement,\n          this.playerOptions\n        );\n\n      // Since Vimeo removed the `volume` parameter, we have to set it manually.\n      if (!this.options.mute && typeof this.options.volume === 'number') {\n        this.setVolume(this.options.volume);\n      }\n\n      // set current time for autoplay\n      if (this.options.startTime && this.options.autoplay) {\n        void this.player.setCurrentTime(this.options.startTime);\n      }\n\n      // get video width and height\n      this.player.getVideoWidth().then((widthValue) => {\n        this.videoWidth = widthValue || 1280;\n      });\n      this.player.getVideoHeight().then((heightValue) => {\n        this.videoHeight = heightValue || 720;\n      });\n\n      // events\n      let vmStarted = false;\n      this.player.on('timeupdate', (event: VimeoPlayerEvent) => {\n        if (!vmStarted) {\n          this.fire('started', event);\n          vmStarted = true;\n        }\n\n        this.fire('timeupdate', event);\n\n        // check for end of video and play again or stop\n        if (this.options.endTime && event.seconds >= this.options.endTime) {\n          if (this.options.loop) {\n            this.play(this.options.startTime);\n          } else {\n            this.pause();\n          }\n        }\n      });\n      this.player.on('play', (event: VimeoPlayerEvent) => {\n        this.fire('play', event);\n\n        // check for the start time and start with it\n        if (this.options.startTime && event.seconds === 0) {\n          this.play(this.options.startTime);\n        }\n      });\n      this.player.on('pause', (event: VimeoPlayerEvent) => {\n        this.fire('pause', event);\n      });\n      this.player.on('ended', (event: VimeoPlayerEvent) => {\n        this.fire('ended', event);\n      });\n      this.player.on('loaded', (event: VimeoPlayerEvent) => {\n        this.fire('ready', event);\n      });\n      this.player.on('volumechange', (event: VimeoPlayerEvent) => {\n        this.getVolume((volume) => {\n          if (typeof volume === 'number') {\n            this.options.volume = volume;\n          }\n        });\n        this.fire('volumechange', event);\n      });\n      this.player.on('error', (event: VimeoPlayerEvent) => {\n        this.fire('error', event);\n      });\n\n      callback(this.$video as HTMLIFrameElement);\n    });\n  }\n\n  destroy(): void {\n    if (this.imageRequest) {\n      this.imageRequest.abort();\n      this.imageRequest = undefined;\n    }\n\n    if (this.player?.destroy) {\n      void this.player.destroy();\n    }\n\n    super.destroy();\n  }\n}\n\nexport default VideoWorkerVimeo;\n","import BaseClass from '../base-class';\nimport type {\n  ValueCallback,\n  VideoWorkerGlobal,\n  YouTubeNamespace,\n  YouTubePlayer,\n  YouTubePlayerEvent,\n  YouTubePlayerOptions,\n} from '../types';\nimport Deferred from '../utils/deferred';\nimport global from '../utils/global';\n\nlet YoutubeAPIadded = 0;\nlet loadingYoutubePlayer = 0;\nconst loadingYoutubeDefer = new Deferred<[string]>();\n\nconst videoGlobal = global as VideoWorkerGlobal;\n\nfunction loadAPI(): void {\n  if (YoutubeAPIadded) {\n    return;\n  }\n\n  YoutubeAPIadded = 1;\n\n  const src = 'https://www.youtube.com/iframe_api';\n\n  // add script in head section\n  let tag: HTMLScriptElement | null = document.createElement('script');\n  let head: HTMLHeadElement | null = document.getElementsByTagName('head')[0] || null;\n\n  if (!head || !tag) {\n    return;\n  }\n\n  tag.src = src;\n  head.appendChild(tag);\n\n  head = null;\n  tag = null;\n}\n\nfunction onAPIready(callback: () => void): void {\n  // Listen for global YT player callback\n  if (\n    (typeof videoGlobal.YT === 'undefined' || videoGlobal.YT.loaded === 0) &&\n    !loadingYoutubePlayer\n  ) {\n    // Prevents Ready event from being called twice\n    loadingYoutubePlayer = 1;\n\n    // Creates deferred so, other players know when to wait.\n    videoGlobal.onYouTubeIframeAPIReady = () => {\n      videoGlobal.onYouTubeIframeAPIReady = null;\n      loadingYoutubeDefer.resolve('done');\n      callback();\n    };\n  } else if (typeof videoGlobal.YT === 'object' && videoGlobal.YT.loaded === 1) {\n    callback();\n  } else {\n    loadingYoutubeDefer.done(() => {\n      callback();\n    });\n  }\n}\n\nclass VideoWorkerYoutube extends BaseClass {\n  type = 'youtube';\n\n  player?: YouTubePlayer;\n\n  $video?: HTMLElement;\n\n  playerOptions?: YouTubePlayerOptions;\n\n  progressInterval?: ReturnType<typeof setInterval>;\n\n  volumeChangeInterval?: ReturnType<typeof setInterval>;\n\n  static parseURL(url: string): string | false {\n    const regExp = /.*(?:youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|shorts\\/|watch\\?v=)([^#&?]*).*/;\n    const match = url.match(regExp);\n    return match && match[1].length === 11 ? match[1] : false;\n  }\n\n  init(): void {\n    super.init();\n\n    loadAPI();\n  }\n\n  play(start?: number): void {\n    if (!this.player || !this.player.playVideo || !videoGlobal.YT) {\n      return;\n    }\n\n    if (typeof start !== 'undefined') {\n      this.player.seekTo(start || 0);\n    }\n\n    if (videoGlobal.YT.PlayerState.PLAYING !== this.player.getPlayerState()) {\n      // Don't play if video is already ended and with no loop.\n      if (this.options.endTime && !this.options.loop) {\n        this.getCurrentTime((seconds) => {\n          if (seconds < this.options.endTime) {\n            this.player?.playVideo();\n          }\n        });\n      } else {\n        this.player.playVideo();\n      }\n    }\n  }\n\n  pause(): void {\n    if (!this.player || !this.player.pauseVideo || !videoGlobal.YT) {\n      return;\n    }\n\n    if (videoGlobal.YT.PlayerState.PLAYING === this.player.getPlayerState()) {\n      this.player.pauseVideo();\n    }\n  }\n\n  mute(): void {\n    if (!this.player || !this.player.mute) {\n      return;\n    }\n\n    this.player.mute();\n  }\n\n  unmute(): void {\n    if (!this.player || !this.player.unMute) {\n      return;\n    }\n\n    this.player.unMute();\n  }\n\n  setVolume(volume: number | false = false): void {\n    if (!this.player || typeof volume !== 'number' || !this.player.setVolume) {\n      return;\n    }\n\n    this.player.setVolume(volume);\n  }\n\n  getVolume(callback: ValueCallback<number | false>): void {\n    if (!this.player) {\n      callback(false);\n      return;\n    }\n\n    if (this.player.getVolume) {\n      callback(this.player.getVolume());\n    }\n  }\n\n  getMuted(callback: ValueCallback<boolean | null>): void {\n    if (!this.player) {\n      callback(null);\n      return;\n    }\n\n    if (this.player.isMuted) {\n      callback(this.player.isMuted());\n    }\n  }\n\n  setCurrentTime(currentTime: number | false = false): void {\n    if (!this.player || typeof currentTime !== 'number' || !this.player.seekTo) {\n      return;\n    }\n\n    this.player.seekTo(currentTime);\n  }\n\n  getCurrentTime(callback: ValueCallback<number>): void {\n    if (!this.player || !this.player.getCurrentTime) {\n      return;\n    }\n\n    callback(this.player.getCurrentTime());\n  }\n\n  getImageURL(callback: ValueCallback<string>): void {\n    if (this.videoImage) {\n      callback(this.videoImage);\n      return;\n    }\n\n    const availableSizes = ['maxresdefault', 'sddefault', 'hqdefault', '0'];\n    let step = 0;\n\n    const tempImg = new Image();\n    tempImg.onload = () => {\n      // if no thumbnail, youtube add their own image with width = 120px\n      if ((tempImg.naturalWidth || tempImg.width) !== 120 || step === availableSizes.length - 1) {\n        // ok\n        this.videoImage = `https://img.youtube.com/vi/${String(this.videoID)}/${availableSizes[step]}.jpg`;\n        callback(this.videoImage);\n      } else {\n        // try another size\n        step += 1;\n        tempImg.src = `https://img.youtube.com/vi/${String(this.videoID)}/${availableSizes[step]}.jpg`;\n      }\n    };\n    tempImg.src = `https://img.youtube.com/vi/${String(this.videoID)}/${availableSizes[step]}.jpg`;\n  }\n\n  getVideo(callback: ValueCallback<HTMLElement>): void {\n    if (this.destroyed) {\n      return;\n    }\n\n    // return generated video block\n    if (this.$video) {\n      callback(this.$video as HTMLElement);\n      return;\n    }\n\n    // generate new video block\n    onAPIready(() => {\n      if (this.destroyed) {\n        return;\n      }\n\n      let hiddenDiv: HTMLDivElement | undefined;\n      if (!this.$video) {\n        hiddenDiv = document.createElement('div');\n        hiddenDiv.style.display = 'none';\n      }\n\n      this.playerOptions = {\n        // GDPR Compliance.\n        host: 'https://www.youtube-nocookie.com',\n        videoId: String(this.videoID),\n        playerVars: {\n          autohide: 1,\n          rel: 0,\n          autoplay: 0,\n          // autoplay enable on mobile devices\n          playsinline: 1,\n        },\n        events: {\n          onReady: (event: YouTubePlayerEvent) => {\n            // mute\n            if (this.options.mute) {\n              event.target.mute();\n            } else if (typeof this.options.volume === 'number') {\n              event.target.setVolume(this.options.volume);\n            }\n\n            // autoplay\n            if (this.options.autoplay) {\n              this.play(this.options.startTime);\n            }\n            this.fire('ready', event);\n\n            // For seamless loops, set the endTime to 0.1 seconds less than the video's duration\n            // https://github.com/nk-o/video-worker/issues/2\n            if (this.options.loop && !this.options.endTime && this.player) {\n              const secondsOffset = 0.1;\n              this.options.endTime = this.player.getDuration() - secondsOffset;\n            }\n\n            // volumechange\n            if (this.volumeChangeInterval) {\n              clearInterval(this.volumeChangeInterval);\n            }\n            this.volumeChangeInterval = setInterval(() => {\n              this.getVolume((volume) => {\n                if (typeof volume === 'number' && this.options.volume !== volume) {\n                  this.options.volume = volume;\n                  this.fire('volumechange', event);\n                }\n              });\n            }, 150);\n          },\n          onStateChange: () => {},\n          onError: (event: YouTubePlayerEvent) => {\n            this.fire('error', event);\n          },\n        },\n      };\n\n      // hide controls\n      if (!this.options.showControls) {\n        this.playerOptions.playerVars.iv_load_policy = 3;\n        this.playerOptions.playerVars.modestbranding = 1;\n        this.playerOptions.playerVars.controls = 0;\n        this.playerOptions.playerVars.showinfo = 0;\n        this.playerOptions.playerVars.disablekb = 1;\n      }\n\n      // events\n      let ytStarted = false;\n      this.playerOptions.events.onStateChange = (event: YouTubePlayerEvent) => {\n        if (!videoGlobal.YT || !this.player) {\n          return;\n        }\n\n        // loop\n        if (this.options.loop && event.data === videoGlobal.YT.PlayerState.ENDED) {\n          this.play(this.options.startTime);\n        }\n        if (!ytStarted && event.data === videoGlobal.YT.PlayerState.PLAYING) {\n          ytStarted = true;\n          this.fire('started', event);\n        }\n        if (event.data === videoGlobal.YT.PlayerState.PLAYING) {\n          this.fire('play', event);\n        }\n        if (event.data === videoGlobal.YT.PlayerState.PAUSED) {\n          this.fire('pause', event);\n        }\n        if (event.data === videoGlobal.YT.PlayerState.ENDED) {\n          this.fire('ended', event);\n        }\n\n        // progress check\n        if (event.data === videoGlobal.YT.PlayerState.PLAYING) {\n          if (this.progressInterval) {\n            clearInterval(this.progressInterval);\n          }\n          this.progressInterval = setInterval(() => {\n            if (!this.player) {\n              return;\n            }\n\n            this.fire('timeupdate', event);\n\n            // check for end of video and play again or stop\n            if (this.options.endTime && this.player.getCurrentTime() >= this.options.endTime) {\n              if (this.options.loop) {\n                this.play(this.options.startTime);\n              } else {\n                this.pause();\n              }\n            }\n          }, 150);\n        } else if (this.progressInterval) {\n          clearInterval(this.progressInterval);\n          this.progressInterval = undefined;\n        }\n      };\n\n      const firstInit = !this.$video;\n      if (firstInit && hiddenDiv) {\n        this.hiddenContainer = hiddenDiv;\n        const div = document.createElement('div');\n        div.setAttribute('id', this.playerID);\n        hiddenDiv.appendChild(div);\n        document.body.appendChild(hiddenDiv);\n      }\n      this.player =\n        this.player ||\n        new (videoGlobal.YT as YouTubeNamespace).Player(this.playerID, this.playerOptions);\n      if (firstInit) {\n        this.$video = document.getElementById(this.playerID) as HTMLElement;\n\n        // add accessibility attributes\n        if (this.$video && this.options.accessibilityHidden) {\n          this.$video.setAttribute('tabindex', '-1');\n          this.$video.setAttribute('aria-hidden', 'true');\n        }\n\n        // get video width and height\n        if (this.$video) {\n          this.videoWidth = parseInt(this.$video.getAttribute('width') || '1280', 10) || 1280;\n          this.videoHeight = parseInt(this.$video.getAttribute('height') || '720', 10) || 720;\n        }\n      }\n\n      callback(this.$video as HTMLElement);\n    });\n  }\n\n  destroy(): void {\n    if (this.progressInterval) {\n      clearInterval(this.progressInterval);\n      this.progressInterval = undefined;\n    }\n\n    if (this.volumeChangeInterval) {\n      clearInterval(this.volumeChangeInterval);\n      this.volumeChangeInterval = undefined;\n    }\n\n    if (this.player?.destroy) {\n      this.player.destroy();\n    }\n\n    super.destroy();\n  }\n}\n\nexport default VideoWorkerYoutube;\n","import VideoWorkerBase from './base-class';\nimport VideoWorkerLocal from './providers/local';\nimport VideoWorkerVimeo from './providers/vimeo';\nimport VideoWorkerYoutube from './providers/youtube';\nimport type { VideoWorkerOptionsInput } from './types';\n\nexport type { VideoWorkerOptions, VideoWorkerOptionsInput } from './types';\n\nexport type VideoWorkerInstance = VideoWorkerBase;\n\ntype VideoWorkerProvider = typeof VideoWorkerBase;\n\ninterface VideoWorkerFactory {\n  (url: string, options?: VideoWorkerOptionsInput): VideoWorkerInstance;\n  new (url: string, options?: VideoWorkerOptionsInput): VideoWorkerInstance;\n  BaseClass: typeof VideoWorkerBase;\n  providers: Record<string, VideoWorkerProvider>;\n}\n\nconst VideoWorker = function (\n  this: unknown,\n  url: string,\n  options?: VideoWorkerOptionsInput\n): VideoWorkerInstance {\n  let result: VideoWorkerInstance | false = false;\n\n  Object.keys(VideoWorker.providers).forEach((key) => {\n    if (!result && VideoWorker.providers[key].parseURL(url)) {\n      result = new VideoWorker.providers[key](url, options);\n    }\n  });\n\n  return result || new VideoWorkerBase(url, options);\n} as VideoWorkerFactory;\n\nVideoWorker.BaseClass = VideoWorkerBase;\nVideoWorker.providers = {\n  Youtube: VideoWorkerYoutube,\n  Vimeo: VideoWorkerVimeo,\n  Local: VideoWorkerLocal,\n};\n\nexport default VideoWorker;\n"],"names":["BaseClass","videoGlobal","loadAPI","onAPIready","_a"],"mappings":"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"}