/** * main player and orchest * * author: db123 at db * creation: 21/4/2026 */ import { adapterRegistry } from '../adapters'; import { AdapterAPI, PlayerConfig } from '../types/index'; import { BaseUI } from '../ui'; export class VP { private video: HTMLVideoElement; private videoSrc?: NodeListOf; private config?: PlayerConfig; private adapter: AdapterAPI; private ui?: BaseUI; /** * @param video The targeted video element or id * @param config The config array */ constructor(video: string | HTMLVideoElement, config: PlayerConfig) { this.config = config; this.video = this.videoElement(video); this.videoSrc = this.video?.querySelectorAll('source'); if (!this.config.type) { throw new Error('Type not specified in config.'); } this.adapter = adapterRegistry.createAdapter(this.config.type, this.video, { src: this.config.adapters?.src, }); if (config.controls) { this.ui = new BaseUI(this, this.video, this.config.prefixClass); } this.info(); } private info(): void { console.info(` ==================================== VP = VideoPlayer by db https://git.db123.ir/db/VideoPlayer ==================================== `); } destroy(): void { this.ui?.destroy(); this.adapter.destroy(); } private videoElement(video: string | HTMLVideoElement): HTMLVideoElement { let videoEl; if (video instanceof HTMLVideoElement) { videoEl = video; } else { videoEl = document.querySelector(video); } if (!videoEl) { throw new Error(`Video element not found: ${video}`); } return videoEl; } load(): void { this.adapter.load(); } play(): void { this.adapter.play(); } pause(): void { this.adapter.pause(); } get time(): number { return this.adapter.time; } set time(time: number) { this.adapter.time = time; } get volume(): number { return this.adapter.volume; } set volume(volume: number) { this.adapter.volume = volume; } get muted(): boolean { return this.adapter.muted; } set muted(muted: boolean) { this.adapter.muted = muted; } duration(): number { return this.adapter.duration(); } }