UNPKG

@atmtfy/video-background

Version:

Automatic background video from various sources (Youtube, MP4, vimeo) with autoplay across devices. No JS dependencies.

176 lines (147 loc) 3.88 kB
import Player from "@vimeo/player" import VideoPlayer from "./videoPlayer" interface PlayerElements { parent: HTMLElement iframe: HTMLIFrameElement } export class VimeoPlayer extends VideoPlayer{ source: string player?: Player wrapper: HTMLElement constructor(config:PlayerConfigInput) { super(config); this.type = 'vimeo'; this.wrapper = this.parent.ownerDocument.createElement('div') this.iframe = this.parent.ownerDocument.createElement('iframe') this.source = this.config.source![0].url; this.build(); } unbuild() { if (!this.player) { return } this.player.destroy(); this.player = undefined; } build() { if (this.player) { // this.destroy(); return; } this.setupWrapper(); this.player = new Player(this.wrapper, { url:this.source, controls: false, dnt: true, loop:true, muted:true}) const self = this; this.afterPlayerSetup().then(() => { this.status.ready = true; this.status.apiReady = true; this.do('ready') self.parent.status = "ready" }) } setupWrapper() { // this.wrapper.id = this.source this.wrapper.classList.add('vbg__video'); this.wrapper.classList.add('vbg--loading'); this.parent.append(this.wrapper) // this.iframe.setAttribute('frameborder', "0") // this.iframe.setAttribute('allow', "autoplay") } async afterPlayerSetup() { if (this.player) { if (this.config.loop) { this.player.on('timeupdate', (e:{percent:number})=> { if (e.percent > 0.97) { this.player!.setCurrentTime(this.config.startTime).then(()=>{this.player!.play()}) } }) } this.props.aspectRatio = await this.getAspectRatio(); this.resize(); } return false } async getAspectRatio() { const h = await this.player!.getVideoHeight() const w = await this.player!.getVideoWidth() return h && w ? h / w : 0.5625 } async getPlayState() { if (this.player) { const ended = await this.player.getEnded() const paused = await this.player.getPaused() const currentTime = await this.player.getCurrentTime() return currentTime > 0 && !ended && !paused; } return false } get paused():boolean { return this.paused ?? false; } set paused(paused) { } set muted(isMuted) { } get muted():boolean { return this.muted ?? true } get playing() { this.getPlayState().then(resp=> { return resp; }) return false } get aspectRatio() { return 1 } get currentTime() { return 0 } setPlayStatuses() { this.paused = false; this.status.started = true; this.status.playing = true; } async play() { if (this.player) { this.wrapper.classList.remove('vbg--loading') if (this.status.started == true) { this.player.play().then(()=> { this.setPlayStatuses()}) } else { this.player.ready().then(()=>{this.player!.setCurrentTime(this.config.startTime).then(()=> { this.setPlayStatuses()}) }) this.player.ready().then(()=>{this.player!.play().then(()=> { this.setPlayStatuses()}) }) } return true } else { this.on('ready', this.play.bind(this), 'playCheck') return false } } async pause() { if (this.player && this.status.playing) { await this.player.ready().then(()=>{this.player!.pause(); this.paused = true;}); return true } else { return false } } async mute() { if (this.player) { await this.player.setVolume(0) this.muted = true return } return; } async unmute() { if (this.player) { await this.player.setVolume(0.7) this.muted = false return; } else { this.on('ready', this.unmute.bind(this), 'muteCheck') } return; } }