@videojs/core
Version:
Core components and utilities for Video.js
139 lines (136 loc) • 3.92 kB
JavaScript
import Hls from "hls.js";
//#region src/media/engine/hls-engine.ts
var HlsPlaybackEngine = class extends EventTarget {
constructor() {
super();
}
get src() {
return this._hlsInstance?.url ?? void 0;
}
set src(src) {
if (this.src === src) return;
if (!this._hlsInstance) this._createHlsInstance();
if (!this.src && src) this._hlsInstance?.loadSource(src);
}
get element() {
return this.mediaElement;
}
set element(val) {
if (this.element === val) return;
/** @TODO programmatic type checking? (CJP) */
this.mediaElement = val;
}
get mediaElement() {
return this._hlsInstance?.media ?? void 0;
}
set mediaElement(val) {
if (this.mediaElement === val) return;
if (!this._hlsInstance) this._createHlsInstance();
if (!this.mediaElement && val) this._hlsInstance?.attachMedia(val);
}
_createHlsInstance() {
this._hlsInstance = new Hls();
}
_destroyHlsInstance() {
this._hlsInstance?.destroy();
this._hlsInstance = void 0;
}
destroy() {
this._destroyHlsInstance();
}
};
const createHlsPlaybackEngine = () => new HlsPlaybackEngine();
//#endregion
//#region src/media/playable.ts
/** @TODO Split out "playable" vs. "audible" vs. "temporal" and compose via factory (current mixin pattern or spreadable mixin pattern) (CJP) */
const Events = [
"volumechange",
"pause",
"play",
"playing",
"emptied",
"loadedmetadata",
"timeupdate",
"durationchange"
];
var MediaPlaybackController = class extends EventTarget {
constructor() {
super();
this._playbackEngine = createHlsPlaybackEngine();
}
get mediaElement() {
return this._playbackEngine.mediaElement;
}
set mediaElement(value) {
if (this.mediaElement === value) return;
if (this.mediaElement != null) Events.forEach((eventType) => {
this.mediaElement?.removeEventListener(eventType, this);
});
this._playbackEngine.mediaElement = value;
if (this.mediaElement) Events.forEach((eventType) => {
this.mediaElement?.addEventListener(eventType, this);
});
}
get paused() {
return this.mediaElement?.paused ?? false;
}
pause() {
/** @TODO implement deferred state etc. for cases where media has yet to be set */
if (!this.mediaElement) return;
return this.mediaElement.pause();
}
play() {
/** @TODO implement deferred state etc. for cases where media has yet to be set */
if (!this.mediaElement) throw new Error("No media element is set");
return this.mediaElement.play();
}
get muted() {
return this.mediaElement?.muted ?? false;
}
set muted(value) {
if (value === this.muted) return;
/** @TODO implement deferred state etc. for cases where media has yet to be set */
if (!this.mediaElement) return;
this.mediaElement.muted = value;
}
get volume() {
return this.mediaElement?.volume ?? 0;
}
set volume(value) {
if (value === this.volume) return;
/** @TODO implement deferred state etc. for cases where media has yet to be set */
if (!this.mediaElement) return;
this.mediaElement.volume = value;
}
get duration() {
return this.mediaElement?.duration ?? 0;
}
get currentTime() {
return this.mediaElement?.currentTime ?? 0;
}
set currentTime(value) {
if (value === this.currentTime) return;
/** @TODO implement deferred state etc. for cases where media has yet to be set */
if (!this.mediaElement) return;
this.mediaElement.currentTime = value;
}
get src() {
return this._playbackEngine.src ?? "";
}
set src(value) {
this._playbackEngine.src = value;
}
handleEvent(event) {
if (event.target === this.mediaElement) {
const clonedEvent = new event.constructor(event.type, event);
this.dispatchEvent(clonedEvent);
}
}
destroy() {
this._playbackEngine.destroy();
}
};
const createMediaPlaybackController = () => new MediaPlaybackController();
//#endregion
export { Events, HlsPlaybackEngine, MediaPlaybackController, createHlsPlaybackEngine, createMediaPlaybackController };
//# sourceMappingURL=media.js.map