@codercms/web-player 0.0.37 → 0.0.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/AudioCtx/AudioContext.d.ts +2 -0
- package/dist/core/AudioCtx/AudioContext.js +92 -0
- package/dist/core/AudioCtx/AudioContext.js.map +1 -0
- package/dist/core/Loaders/BaseLoader.d.ts +17 -0
- package/dist/core/Loaders/BaseLoader.js +50 -0
- package/dist/core/Loaders/BaseLoader.js.map +1 -0
- package/dist/core/Loaders/HLSLoader.d.ts +17 -0
- package/dist/core/Loaders/HLSLoader.js +313 -0
- package/dist/core/Loaders/HLSLoader.js.map +1 -0
- package/dist/core/{LoaderInterface.d.ts → Loaders/LoaderInterface.d.ts} +11 -3
- package/dist/core/{LoaderInterface.js → Loaders/LoaderInterface.js} +6 -0
- package/dist/core/{LoaderInterface.js.map → Loaders/LoaderInterface.js.map} +1 -1
- package/dist/core/Loaders/NativeAudioTrackList.d.ts +39 -0
- package/dist/core/Loaders/NativeAudioTrackList.js.map +1 -0
- package/dist/core/Loaders/NativeLoader.d.ts +16 -0
- package/dist/core/Loaders/NativeLoader.js +114 -0
- package/dist/core/Loaders/NativeLoader.js.map +1 -0
- package/dist/core/Playlist.d.ts +4 -3
- package/dist/core/Playlist.js.map +1 -1
- package/dist/core/PlaylistPlayer.d.ts +3 -2
- package/dist/core/PlaylistPlayer.js +5 -3
- package/dist/core/PlaylistPlayer.js.map +1 -1
- package/dist/core/VideoPlayer.d.ts +19 -191
- package/dist/core/VideoPlayer.js +92 -594
- package/dist/core/VideoPlayer.js.map +1 -1
- package/dist/core/VideoPlayerEvents.d.ts +74 -0
- package/dist/core/VideoPlayerEvents.js +40 -0
- package/dist/core/VideoPlayerEvents.js.map +1 -0
- package/dist/core/VideoPlayerMediaLoadManager.d.ts +50 -0
- package/dist/core/VideoPlayerMediaLoadManager.js +269 -0
- package/dist/core/VideoPlayerMediaLoadManager.js.map +1 -0
- package/dist/core/VideoPlayerMediaState.d.ts +39 -0
- package/dist/core/VideoPlayerMediaState.js +161 -0
- package/dist/core/VideoPlayerMediaState.js.map +1 -0
- package/dist/core/VideoPlayerMediaStateProxy.d.ts +17 -0
- package/dist/core/VideoPlayerMediaStateProxy.js +42 -0
- package/dist/core/VideoPlayerMediaStateProxy.js.map +1 -0
- package/dist/core/svelte/VideoPlayerMediaStateSvelteStore.d.ts +58 -0
- package/dist/core/svelte/VideoPlayerMediaStateSvelteStore.js +146 -0
- package/dist/core/svelte/VideoPlayerMediaStateSvelteStore.js.map +1 -0
- package/dist/core/types/BufferedPart.d.ts +4 -0
- package/dist/core/types/BufferedPart.js +1 -0
- package/dist/core/types/BufferedPart.js.map +1 -0
- package/dist/core/types/PlayerLoadParams.d.ts +11 -0
- package/dist/core/types/PlayerLoadParams.js +1 -0
- package/dist/core/types/PlayerLoadParams.js.map +1 -0
- package/dist/core/types/QualityLevel.js +1 -0
- package/dist/core/types/index.d.ts +4 -0
- package/dist/core/types/index.js +1 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/index.d.ts +9 -4
- package/dist/index.js +9 -4
- package/dist/ui/LoadingIndicator.svelte +35 -16
- package/dist/ui/LoadingIndicator.svelte.d.ts +1 -1
- package/dist/ui/ProgressBar.svelte +7 -8
- package/dist/ui/ProgressBar.svelte.d.ts +1 -1
- package/package.json +1 -1
- package/dist/HybridDoublyLinkedList.d.ts +0 -20
- package/dist/HybridDoublyLinkedList.js +0 -90
- package/dist/HybridDoublyLinkedList.js.map +0 -1
- package/dist/HybridLinkedList.d.ts +0 -18
- package/dist/HybridLinkedList.js +0 -90
- package/dist/HybridLinkedList.js.map +0 -1
- package/dist/core/HLSLoader.d.ts +0 -19
- package/dist/core/HLSLoader.js +0 -196
- package/dist/core/HLSLoader.js.map +0 -1
- package/dist/core/NativeLoader.d.ts +0 -14
- package/dist/core/NativeLoader.js +0 -66
- package/dist/core/NativeLoader.js.map +0 -1
- /package/dist/core/{AudioTrack.js → Loaders/NativeAudioTrackList.js} +0 -0
- /package/dist/core/{AudioTrack.d.ts → types/AudioTrack.d.ts} +0 -0
- /package/dist/core/{QualityLevel.js → types/AudioTrack.js} +0 -0
- /package/dist/core/{AudioTrack.js.map → types/AudioTrack.js.map} +0 -0
- /package/dist/core/{QualityLevel.d.ts → types/QualityLevel.d.ts} +0 -0
- /package/dist/core/{QualityLevel.js.map → types/QualityLevel.js.map} +0 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { BROWSER } from 'esm-env';
|
|
2
|
+
export const IS_AUDIO_CONTEXT_SUPPORTED = BROWSER && typeof window.AudioContext !== 'undefined';
|
|
3
|
+
export const IS_AUDIO_GAIN_SUPPORTED = BROWSER && IS_AUDIO_CONTEXT_SUPPORTED && window.AudioContext?.prototype.createGain !== undefined;
|
|
4
|
+
// let audioContext: AudioContext | null = null;
|
|
5
|
+
// const gainNodes: GainNode[] = [];
|
|
6
|
+
// const audioSources: MediaElementAudioSourceNode[] = [];
|
|
7
|
+
//
|
|
8
|
+
// // Function to create a GainNode
|
|
9
|
+
// function createGainNode(): GainNode {
|
|
10
|
+
// if (!IS_AUDIO_GAIN_SUPPORTED) {
|
|
11
|
+
// console.error('Audio gain is not supported by the browser');
|
|
12
|
+
//
|
|
13
|
+
// throw Error('Audio gain is not supported by the browser');
|
|
14
|
+
// }
|
|
15
|
+
//
|
|
16
|
+
// // Check if an audio context already exists
|
|
17
|
+
// if (!audioContext) {
|
|
18
|
+
// // Create an audio context
|
|
19
|
+
// audioContext = new window.AudioContext() as AudioContext;
|
|
20
|
+
// }
|
|
21
|
+
//
|
|
22
|
+
// // Create a GainNode and add it to the array
|
|
23
|
+
// const gainNode = audioContext.createGain();
|
|
24
|
+
// gainNodes.push(gainNode);
|
|
25
|
+
//
|
|
26
|
+
// gainNode.connect(audioContext.destination);
|
|
27
|
+
//
|
|
28
|
+
// // Return the newly created GainNode if needed
|
|
29
|
+
// return gainNode;
|
|
30
|
+
// }
|
|
31
|
+
//
|
|
32
|
+
// function destroyGainNode(gainNode: GainNode) {
|
|
33
|
+
// const index = gainNodes.indexOf(gainNode);
|
|
34
|
+
// if (index !== -1) {
|
|
35
|
+
// // Disconnect the GainNode from any audio sources or destinations
|
|
36
|
+
// gainNode.disconnect();
|
|
37
|
+
//
|
|
38
|
+
// // Remove the GainNode from the array
|
|
39
|
+
// gainNodes.splice(index, 1);
|
|
40
|
+
//
|
|
41
|
+
// tryToFreeAudCtx();
|
|
42
|
+
// }
|
|
43
|
+
// }
|
|
44
|
+
//
|
|
45
|
+
// function tryToFreeAudCtx() {
|
|
46
|
+
// const isAllowedToFree = gainNodes.length === 0 && audioSources.length === 0;
|
|
47
|
+
//
|
|
48
|
+
// if (audioContext && isAllowedToFree) {
|
|
49
|
+
// const audCtx = audioContext;
|
|
50
|
+
// audioContext = null;
|
|
51
|
+
//
|
|
52
|
+
// // If there are no more GainNodes, close the AudioContext and release its resources
|
|
53
|
+
// audCtx.close().then(() => {});
|
|
54
|
+
// }
|
|
55
|
+
// }
|
|
56
|
+
//
|
|
57
|
+
// function createElementSource(
|
|
58
|
+
// el: HTMLMediaElement,
|
|
59
|
+
// gainNode: GainNode
|
|
60
|
+
// ): MediaElementAudioSourceNode {
|
|
61
|
+
// if (!IS_AUDIO_CONTEXT_SUPPORTED) {
|
|
62
|
+
// console.error('Audio context is not supported by the browser');
|
|
63
|
+
//
|
|
64
|
+
// throw Error('Audio context is not supported by the browser');
|
|
65
|
+
// }
|
|
66
|
+
//
|
|
67
|
+
// // Check if an audio context already exists
|
|
68
|
+
// if (!audioContext) {
|
|
69
|
+
// // Create an audio context
|
|
70
|
+
// audioContext = new window.AudioContext() as AudioContext;
|
|
71
|
+
// }
|
|
72
|
+
//
|
|
73
|
+
// const src = audioContext.createMediaElementSource(el);
|
|
74
|
+
// audioSources.push(src);
|
|
75
|
+
//
|
|
76
|
+
// src.connect(gainNode);
|
|
77
|
+
//
|
|
78
|
+
// return src;
|
|
79
|
+
// }
|
|
80
|
+
//
|
|
81
|
+
// function destroyElementAudioSource(elSrc: MediaElementAudioSourceNode) {
|
|
82
|
+
// const index = audioSources.indexOf(elSrc);
|
|
83
|
+
// if (index !== -1) {
|
|
84
|
+
// // Disconnect the GainNode from any audio sources or destinations
|
|
85
|
+
// elSrc.disconnect();
|
|
86
|
+
//
|
|
87
|
+
// // Remove the GainNode from the array
|
|
88
|
+
// audioSources.splice(index, 1);
|
|
89
|
+
//
|
|
90
|
+
// tryToFreeAudCtx();
|
|
91
|
+
// }
|
|
92
|
+
// }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioContext.js","sourceRoot":"","sources":["AudioContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,CAAC,MAAM,0BAA0B,GAAG,OAAO,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,WAAW,CAAC;AAChG,MAAM,CAAC,MAAM,uBAAuB,GACnC,OAAO,IAAI,0BAA0B,IAAI,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,UAAU,KAAK,SAAS,CAAC;AAElG,gDAAgD;AAChD,oCAAoC;AACpC,0DAA0D;AAC1D,EAAE;AACF,mCAAmC;AACnC,wCAAwC;AACxC,mCAAmC;AACnC,iEAAiE;AACjE,EAAE;AACF,+DAA+D;AAC/D,KAAK;AACL,EAAE;AACF,+CAA+C;AAC/C,wBAAwB;AACxB,+BAA+B;AAC/B,8DAA8D;AAC9D,KAAK;AACL,EAAE;AACF,gDAAgD;AAChD,+CAA+C;AAC/C,6BAA6B;AAC7B,EAAE;AACF,+CAA+C;AAC/C,EAAE;AACF,kDAAkD;AAClD,oBAAoB;AACpB,IAAI;AACJ,EAAE;AACF,iDAAiD;AACjD,8CAA8C;AAC9C,uBAAuB;AACvB,sEAAsE;AACtE,2BAA2B;AAC3B,EAAE;AACF,0CAA0C;AAC1C,gCAAgC;AAChC,EAAE;AACF,uBAAuB;AACvB,KAAK;AACL,IAAI;AACJ,EAAE;AACF,+BAA+B;AAC/B,gFAAgF;AAChF,EAAE;AACF,0CAA0C;AAC1C,iCAAiC;AACjC,yBAAyB;AACzB,EAAE;AACF,wFAAwF;AACxF,mCAAmC;AACnC,KAAK;AACL,IAAI;AACJ,EAAE;AACF,gCAAgC;AAChC,yBAAyB;AACzB,sBAAsB;AACtB,mCAAmC;AACnC,sCAAsC;AACtC,oEAAoE;AACpE,EAAE;AACF,kEAAkE;AAClE,KAAK;AACL,EAAE;AACF,+CAA+C;AAC/C,wBAAwB;AACxB,+BAA+B;AAC/B,8DAA8D;AAC9D,KAAK;AACL,EAAE;AACF,0DAA0D;AAC1D,2BAA2B;AAC3B,EAAE;AACF,0BAA0B;AAC1B,EAAE;AACF,eAAe;AACf,IAAI;AACJ,EAAE;AACF,2EAA2E;AAC3E,8CAA8C;AAC9C,uBAAuB;AACvB,sEAAsE;AACtE,wBAAwB;AACxB,EAAE;AACF,0CAA0C;AAC1C,mCAAmC;AACnC,EAAE;AACF,uBAAuB;AACvB,KAAK;AACL,IAAI"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { EventEmitter } from 'eventemitter3';
|
|
2
|
+
import type { LoaderEventsMap, LoaderInterface, LoadParams, LoaderType } from './LoaderInterface.js';
|
|
3
|
+
export declare abstract class BaseLoader implements LoaderInterface {
|
|
4
|
+
protected readonly el: HTMLMediaElement;
|
|
5
|
+
abstract readonly type: LoaderType;
|
|
6
|
+
protected readonly emitter: EventEmitter<LoaderEventsMap, any>;
|
|
7
|
+
protected constructor(el: HTMLMediaElement);
|
|
8
|
+
subscribe<K extends keyof LoaderEventsMap>(ev: K, cb: LoaderEventsMap[K]): void;
|
|
9
|
+
subscribeOnce<K extends keyof LoaderEventsMap>(ev: K, cb: LoaderEventsMap[K]): void;
|
|
10
|
+
unsubscribe<K extends keyof LoaderEventsMap>(ev: K, cb: LoaderEventsMap[K]): void;
|
|
11
|
+
abstract getAutoQualityLevelId(): number;
|
|
12
|
+
abstract load(params: LoadParams): Promise<void>;
|
|
13
|
+
abstract stop(): void;
|
|
14
|
+
abstract switchAudioTrack(id: number, graceful: boolean): void;
|
|
15
|
+
abstract switchQualityLevel(id: number, graceful: boolean): void;
|
|
16
|
+
protected _waitForLoadingDone(el: HTMLMediaElement, signal: AbortSignal): Promise<void>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { EventEmitter } from 'eventemitter3';
|
|
2
|
+
export class BaseLoader {
|
|
3
|
+
el;
|
|
4
|
+
emitter = new EventEmitter();
|
|
5
|
+
constructor(el) {
|
|
6
|
+
this.el = el;
|
|
7
|
+
}
|
|
8
|
+
subscribe(ev, cb) {
|
|
9
|
+
this.emitter.on(ev, cb);
|
|
10
|
+
}
|
|
11
|
+
subscribeOnce(ev, cb) {
|
|
12
|
+
this.emitter.once(ev, cb);
|
|
13
|
+
}
|
|
14
|
+
unsubscribe(ev, cb) {
|
|
15
|
+
this.emitter.off(ev, cb);
|
|
16
|
+
}
|
|
17
|
+
async _waitForLoadingDone(el, signal) {
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
const onElCanPlay = () => {
|
|
20
|
+
cleanUpEventListeners();
|
|
21
|
+
resolve();
|
|
22
|
+
};
|
|
23
|
+
const onElError = () => {
|
|
24
|
+
cleanUpEventListeners();
|
|
25
|
+
const err = el.error;
|
|
26
|
+
reject(new Error(`Loading failed: ${err?.message ?? 'Unknown error'}`));
|
|
27
|
+
};
|
|
28
|
+
const onElAbort = () => {
|
|
29
|
+
cleanUpEventListeners();
|
|
30
|
+
reject(new DOMException('Loading aborted', 'AbortError'));
|
|
31
|
+
};
|
|
32
|
+
const onSigAbort = () => {
|
|
33
|
+
cleanUpEventListeners();
|
|
34
|
+
reject(new DOMException('Loading aborted', 'AbortError'));
|
|
35
|
+
};
|
|
36
|
+
const cleanUpEventListeners = () => {
|
|
37
|
+
signal.removeEventListener('abort', onSigAbort);
|
|
38
|
+
el.removeEventListener('canplay', onElCanPlay);
|
|
39
|
+
el.removeEventListener('canplaythrough', onElCanPlay);
|
|
40
|
+
el.removeEventListener('abort', onElAbort);
|
|
41
|
+
el.removeEventListener('error', onElError);
|
|
42
|
+
};
|
|
43
|
+
signal.addEventListener('abort', onSigAbort, { once: true });
|
|
44
|
+
el.addEventListener('canplay', onElCanPlay, { once: true });
|
|
45
|
+
el.addEventListener('canplaythrough', onElCanPlay, { once: true });
|
|
46
|
+
el.addEventListener('abort', onElAbort, { once: true });
|
|
47
|
+
el.addEventListener('error', onElError, { once: true });
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseLoader.js","sourceRoot":"","sources":["BaseLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAQ7C,MAAM,OAAgB,UAAU;IAKU;IAFtB,OAAO,GAAG,IAAI,YAAY,EAAmB,CAAC;IAEjE,YAAyC,EAAoB;QAApB,OAAE,GAAF,EAAE,CAAkB;IAAG,CAAC;IAEjE,SAAS,CAAkC,EAAK,EAAE,EAAsB;QACvE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,EAAgB,CAAC,CAAC;IACvC,CAAC;IAED,aAAa,CAAkC,EAAK,EAAE,EAAsB;QAC3E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAgB,CAAC,CAAC;IACzC,CAAC;IAED,WAAW,CAAkC,EAAK,EAAE,EAAsB;QACzE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAgB,CAAC,CAAC;IACxC,CAAC;IAYS,KAAK,CAAC,mBAAmB,CAAC,EAAoB,EAAE,MAAmB;QAC5E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,MAAM,WAAW,GAAG,GAAG,EAAE;gBACxB,qBAAqB,EAAE,CAAC;gBAExB,OAAO,EAAE,CAAC;YACX,CAAC,CAAC;YAEF,MAAM,SAAS,GAAG,GAAG,EAAE;gBACtB,qBAAqB,EAAE,CAAC;gBAExB,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC;gBAErB,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,GAAG,EAAE,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC;YACzE,CAAC,CAAC;YAEF,MAAM,SAAS,GAAG,GAAG,EAAE;gBACtB,qBAAqB,EAAE,CAAC;gBAExB,MAAM,CAAC,IAAI,YAAY,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC,CAAC;YAC3D,CAAC,CAAC;YAEF,MAAM,UAAU,GAAG,GAAG,EAAE;gBACvB,qBAAqB,EAAE,CAAC;gBAExB,MAAM,CAAC,IAAI,YAAY,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC,CAAC;YAC3D,CAAC,CAAC;YAEF,MAAM,qBAAqB,GAAG,GAAG,EAAE;gBAClC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBAEhD,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gBAC/C,EAAE,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;gBACtD,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBAC3C,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAC5C,CAAC,CAAC;YAEF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAE7D,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,EAAE,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACnE,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACJ,CAAC;CACD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { LoaderType, type LoadParams } from './LoaderInterface.js';
|
|
2
|
+
import { BaseLoader } from './BaseLoader.js';
|
|
3
|
+
import Hls, { type HlsConfig } from 'hls.js';
|
|
4
|
+
export type HLSLoaderConfig = Partial<HlsConfig>;
|
|
5
|
+
export declare const IS_HLS_JS_SUPPORTED: boolean;
|
|
6
|
+
export declare class HLSLoader extends BaseLoader {
|
|
7
|
+
readonly type = LoaderType.HLS;
|
|
8
|
+
protected hls: Hls | null;
|
|
9
|
+
protected hlsConfig: HLSLoaderConfig;
|
|
10
|
+
constructor(el: HTMLMediaElement, hlsConfig?: HLSLoaderConfig);
|
|
11
|
+
load(params: LoadParams): Promise<void>;
|
|
12
|
+
private _onLevelsUpdated;
|
|
13
|
+
switchAudioTrack(id: number, graceful: boolean): void;
|
|
14
|
+
switchQualityLevel(id: number, graceful: boolean): void;
|
|
15
|
+
getAutoQualityLevelId(): number;
|
|
16
|
+
stop(): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { LoaderEvents, LoaderType } from './LoaderInterface.js';
|
|
2
|
+
import { BaseLoader } from './BaseLoader.js';
|
|
3
|
+
import Hls, {} from 'hls.js';
|
|
4
|
+
import { BROWSER } from 'esm-env';
|
|
5
|
+
const autoQualityLevelId = -1;
|
|
6
|
+
export const IS_HLS_JS_SUPPORTED = BROWSER && Hls.isSupported();
|
|
7
|
+
export class HLSLoader extends BaseLoader {
|
|
8
|
+
type = LoaderType.HLS;
|
|
9
|
+
hls = null;
|
|
10
|
+
hlsConfig;
|
|
11
|
+
constructor(el, hlsConfig) {
|
|
12
|
+
if (!IS_HLS_JS_SUPPORTED) {
|
|
13
|
+
throw Error('HLS.js is not supported');
|
|
14
|
+
}
|
|
15
|
+
super(el);
|
|
16
|
+
if (hlsConfig) {
|
|
17
|
+
this.hlsConfig = { ...hlsConfig };
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
this.hlsConfig = {};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async load(params) {
|
|
24
|
+
// Check if the abort signal is already aborted
|
|
25
|
+
if (params.abortSignal.aborted) {
|
|
26
|
+
const err = new DOMException('Loading aborted', 'AbortError');
|
|
27
|
+
this.emitter.emit(LoaderEvents.Error, { message: 'Loading aborted', data: err });
|
|
28
|
+
// If it is, reject with an AbortError
|
|
29
|
+
return Promise.reject(err);
|
|
30
|
+
}
|
|
31
|
+
// Emit a loading event
|
|
32
|
+
this.emitter.emit(LoaderEvents.Loading, params);
|
|
33
|
+
// Cancel any ongoing loading if Hls instance exists
|
|
34
|
+
if (this.hls) {
|
|
35
|
+
this.stop();
|
|
36
|
+
}
|
|
37
|
+
// Create a configuration object for Hls with default settings
|
|
38
|
+
const cfg = { ...this.hlsConfig };
|
|
39
|
+
// Override startPosition if provided in params
|
|
40
|
+
if (params.startPosition !== undefined && params.startPosition > 0) {
|
|
41
|
+
cfg.startPosition = params.startPosition;
|
|
42
|
+
}
|
|
43
|
+
// Override startLevel if provided in params
|
|
44
|
+
if (params.startLevel !== undefined && params.startLevel > 0) {
|
|
45
|
+
cfg.startLevel = params.startLevel;
|
|
46
|
+
}
|
|
47
|
+
// Create a new Hls instance
|
|
48
|
+
const hls = new Hls(cfg);
|
|
49
|
+
this.hls = hls;
|
|
50
|
+
const waitLoadingPromise = this._waitForLoadingDone(this.el, params.abortSignal);
|
|
51
|
+
hls.once(Hls.Events.MANIFEST_PARSED, (event, data) => {
|
|
52
|
+
// Add errors recovering listener
|
|
53
|
+
hls.on(Hls.Events.ERROR, (event, data) => {
|
|
54
|
+
if (data.fatal) {
|
|
55
|
+
switch (data.type) {
|
|
56
|
+
case Hls.ErrorTypes.MEDIA_ERROR:
|
|
57
|
+
console.log('fatal media error encountered, try to recover');
|
|
58
|
+
hls.recoverMediaError();
|
|
59
|
+
break;
|
|
60
|
+
case Hls.ErrorTypes.NETWORK_ERROR:
|
|
61
|
+
console.error('fatal network error encountered', data);
|
|
62
|
+
this.emitter.emit(LoaderEvents.Error, {
|
|
63
|
+
message: `fatal network error: ${data.error.message}`,
|
|
64
|
+
data
|
|
65
|
+
});
|
|
66
|
+
// All retries and media options have been exhausted.
|
|
67
|
+
// Immediately trying to restart loading could cause loop loading.
|
|
68
|
+
// Consider modifying loading policies to best fit your asset and network
|
|
69
|
+
// conditions (manifestLoadPolicy, playlistLoadPolicy, fragLoadPolicy).
|
|
70
|
+
break;
|
|
71
|
+
default:
|
|
72
|
+
console.error('unknown fatal error encountered', data);
|
|
73
|
+
this.emitter.emit(LoaderEvents.Error, {
|
|
74
|
+
message: `unknown fatal error: ${data.error.message}`,
|
|
75
|
+
data
|
|
76
|
+
});
|
|
77
|
+
// Cannot recover, destroy Hls instance
|
|
78
|
+
hls.destroy();
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
this._onLevelsUpdated(data.levels);
|
|
84
|
+
});
|
|
85
|
+
// Event listeners for various Hls events
|
|
86
|
+
hls.on(Hls.Events.LEVEL_SWITCHING, (event, data) => {
|
|
87
|
+
this.emitter.emit(LoaderEvents.QualityLevelSwitching, data.level, hls.autoLevelEnabled);
|
|
88
|
+
});
|
|
89
|
+
hls.on(Hls.Events.LEVEL_SWITCHED, (event, data) => {
|
|
90
|
+
this.emitter.emit(LoaderEvents.QualityLevelSwitched, data.level, hls.autoLevelEnabled);
|
|
91
|
+
});
|
|
92
|
+
hls.on(Hls.Events.LEVELS_UPDATED, (event, data) => {
|
|
93
|
+
this._onLevelsUpdated(data.levels);
|
|
94
|
+
});
|
|
95
|
+
hls.on(Hls.Events.AUDIO_TRACK_SWITCHING, (event, data) => {
|
|
96
|
+
this.emitter.emit(LoaderEvents.AudioTrackSwitching, data.id);
|
|
97
|
+
});
|
|
98
|
+
hls.on(Hls.Events.AUDIO_TRACK_SWITCHED, (event, data) => {
|
|
99
|
+
this.emitter.emit(LoaderEvents.AudioTrackSwitched, data.id);
|
|
100
|
+
});
|
|
101
|
+
hls.on(Hls.Events.AUDIO_TRACKS_UPDATED, (event, data) => {
|
|
102
|
+
const tracks = data.audioTracks.map((track) => ({
|
|
103
|
+
id: track.id,
|
|
104
|
+
name: track.name,
|
|
105
|
+
bitrate: track.bitrate,
|
|
106
|
+
loaderData: track
|
|
107
|
+
}));
|
|
108
|
+
this.emitter.emit(LoaderEvents.AudioTracksUpdated, tracks);
|
|
109
|
+
});
|
|
110
|
+
// Attach media element to Hls
|
|
111
|
+
hls.attachMedia(this.el);
|
|
112
|
+
// Load the source URL
|
|
113
|
+
hls.loadSource(params.url);
|
|
114
|
+
try {
|
|
115
|
+
await waitLoadingPromise;
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
try {
|
|
119
|
+
hls.destroy();
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
// ignore destroy error
|
|
123
|
+
}
|
|
124
|
+
this.emitter.emit(LoaderEvents.Error, { message: e.message, data: e });
|
|
125
|
+
return Promise.reject(e);
|
|
126
|
+
}
|
|
127
|
+
this.emitter.emit(LoaderEvents.Loaded, params);
|
|
128
|
+
// Create a promise to handle loading
|
|
129
|
+
// return new Promise<void>((resolve, reject) => {
|
|
130
|
+
// // Function to handle abort
|
|
131
|
+
// const onAbort = () => {
|
|
132
|
+
// this.stop();
|
|
133
|
+
// cleanupListeners();
|
|
134
|
+
//
|
|
135
|
+
// const err = new DOMException('Loading aborted', 'AbortError');
|
|
136
|
+
//
|
|
137
|
+
// this.emitter.emit(LoaderEvents.Error, { message: 'Loading aborted', data: err });
|
|
138
|
+
//
|
|
139
|
+
// reject(err);
|
|
140
|
+
// };
|
|
141
|
+
//
|
|
142
|
+
// // Function to handle error
|
|
143
|
+
// const onError = (event: HlsEvents.ERROR, data: ErrorData) => {
|
|
144
|
+
// cleanupListeners();
|
|
145
|
+
//
|
|
146
|
+
// this.emitter.emit(LoaderEvents.Error, {
|
|
147
|
+
// message: `HLS loading error: ${data.error.message}`,
|
|
148
|
+
// data
|
|
149
|
+
// });
|
|
150
|
+
//
|
|
151
|
+
// reject(new Error(`HLS loading error: ${data.error.message}`));
|
|
152
|
+
// };
|
|
153
|
+
//
|
|
154
|
+
// // Function to handle successful loading
|
|
155
|
+
// const onManifestParsed = (event: HlsEvents.MANIFEST_PARSED, data: ManifestParsedData) => {
|
|
156
|
+
// cleanupListeners();
|
|
157
|
+
// this.emitter.emit(LoaderEvents.Loaded, params);
|
|
158
|
+
// this._onLevelsUpdated(data.levels);
|
|
159
|
+
//
|
|
160
|
+
// // Add errors recovering listener
|
|
161
|
+
// hls.on(Hls.Events.ERROR, (event, data) => {
|
|
162
|
+
// if (data.fatal) {
|
|
163
|
+
// switch (data.type) {
|
|
164
|
+
// case Hls.ErrorTypes.MEDIA_ERROR:
|
|
165
|
+
// console.log('fatal media error encountered, try to recover');
|
|
166
|
+
// hls.recoverMediaError();
|
|
167
|
+
// break;
|
|
168
|
+
//
|
|
169
|
+
// case Hls.ErrorTypes.NETWORK_ERROR:
|
|
170
|
+
// console.error('fatal network error encountered', data);
|
|
171
|
+
//
|
|
172
|
+
// this.emitter.emit(LoaderEvents.Error, {
|
|
173
|
+
// message: `fatal network error: ${data.error.message}`,
|
|
174
|
+
// data
|
|
175
|
+
// });
|
|
176
|
+
// // All retries and media options have been exhausted.
|
|
177
|
+
// // Immediately trying to restart loading could cause loop loading.
|
|
178
|
+
// // Consider modifying loading policies to best fit your asset and network
|
|
179
|
+
// // conditions (manifestLoadPolicy, playlistLoadPolicy, fragLoadPolicy).
|
|
180
|
+
// break;
|
|
181
|
+
// default:
|
|
182
|
+
// console.error('unknown fatal error encountered', data);
|
|
183
|
+
//
|
|
184
|
+
// this.emitter.emit(LoaderEvents.Error, {
|
|
185
|
+
// message: `unknown fatal error: ${data.error.message}`,
|
|
186
|
+
// data
|
|
187
|
+
// });
|
|
188
|
+
//
|
|
189
|
+
// // Cannot recover, destroy Hls instance
|
|
190
|
+
// hls.destroy();
|
|
191
|
+
// break;
|
|
192
|
+
// }
|
|
193
|
+
// }
|
|
194
|
+
// });
|
|
195
|
+
//
|
|
196
|
+
// resolve();
|
|
197
|
+
// };
|
|
198
|
+
//
|
|
199
|
+
// const cleanupListeners = () => {
|
|
200
|
+
// params.abortSignal.removeEventListener('abort', onAbort);
|
|
201
|
+
// hls.off(Hls.Events.ERROR, onError);
|
|
202
|
+
// hls.off(Hls.Events.MANIFEST_PARSED, onManifestParsed);
|
|
203
|
+
// };
|
|
204
|
+
//
|
|
205
|
+
// // Add event listeners with { once: true } option to ensure they are triggered only once
|
|
206
|
+
// params.abortSignal.addEventListener('abort', onAbort, { once: true });
|
|
207
|
+
// hls.once(Hls.Events.ERROR, onError);
|
|
208
|
+
// hls.once(Hls.Events.MANIFEST_PARSED, onManifestParsed);
|
|
209
|
+
//
|
|
210
|
+
// // Event listeners for various Hls events
|
|
211
|
+
// hls.on(Hls.Events.LEVEL_SWITCHING, (event, data) => {
|
|
212
|
+
// this.emitter.emit(LoaderEvents.QualityLevelSwitching, data.level, hls.autoLevelEnabled);
|
|
213
|
+
// });
|
|
214
|
+
//
|
|
215
|
+
// hls.on(Hls.Events.LEVEL_SWITCHED, (event, data) => {
|
|
216
|
+
// this.emitter.emit(LoaderEvents.QualityLevelSwitched, data.level, hls.autoLevelEnabled);
|
|
217
|
+
// });
|
|
218
|
+
//
|
|
219
|
+
// hls.on(Hls.Events.LEVELS_UPDATED, (event, data) => {
|
|
220
|
+
// this._onLevelsUpdated(data.levels);
|
|
221
|
+
// });
|
|
222
|
+
//
|
|
223
|
+
// hls.on(Hls.Events.AUDIO_TRACK_SWITCHING, (event, data) => {
|
|
224
|
+
// this.emitter.emit(LoaderEvents.AudioTrackSwitching, data.id);
|
|
225
|
+
// });
|
|
226
|
+
//
|
|
227
|
+
// hls.on(Hls.Events.AUDIO_TRACK_SWITCHED, (event, data) => {
|
|
228
|
+
// this.emitter.emit(LoaderEvents.AudioTrackSwitched, data.id);
|
|
229
|
+
// });
|
|
230
|
+
//
|
|
231
|
+
// hls.on(Hls.Events.AUDIO_TRACKS_UPDATED, (event, data) => {
|
|
232
|
+
// const tracks: AudioTrack[] = data.audioTracks.map((track) => ({
|
|
233
|
+
// id: track.id,
|
|
234
|
+
// name: track.name,
|
|
235
|
+
// bitrate: track.bitrate,
|
|
236
|
+
// loaderData: track
|
|
237
|
+
// }));
|
|
238
|
+
//
|
|
239
|
+
// this.emitter.emit(LoaderEvents.AudioTracksUpdated, tracks);
|
|
240
|
+
// });
|
|
241
|
+
//
|
|
242
|
+
// // Load the source URL
|
|
243
|
+
// hls.loadSource(params.url);
|
|
244
|
+
// });
|
|
245
|
+
}
|
|
246
|
+
_onLevelsUpdated(levels) {
|
|
247
|
+
const newLevels = [];
|
|
248
|
+
let idx = 0;
|
|
249
|
+
for (const level of levels) {
|
|
250
|
+
const newLvl = {
|
|
251
|
+
id: idx,
|
|
252
|
+
width: level.width,
|
|
253
|
+
height: level.height,
|
|
254
|
+
bitrate: level.bitrate,
|
|
255
|
+
loaderData: level
|
|
256
|
+
};
|
|
257
|
+
idx++;
|
|
258
|
+
newLevels.push(newLvl);
|
|
259
|
+
}
|
|
260
|
+
this.emitter.emit(LoaderEvents.QualityLevelsUpdated, newLevels);
|
|
261
|
+
}
|
|
262
|
+
switchAudioTrack(id, graceful) {
|
|
263
|
+
if (!this.hls) {
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
// TODO: Support graceful = false
|
|
267
|
+
this.hls.audioTrack = id;
|
|
268
|
+
if (!graceful) {
|
|
269
|
+
// eslint-disable-next-line no-self-assign
|
|
270
|
+
this.el.currentTime = this.el.currentTime;
|
|
271
|
+
// this.el.currentTime -= 1;
|
|
272
|
+
// this.el.currentTime += 1;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
switchQualityLevel(id, graceful) {
|
|
276
|
+
if (!this.hls) {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
if (graceful) {
|
|
280
|
+
this.hls.nextLevel = id;
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
// Bypass HLS.js behavior that doesn't trigger event if level is selected by Auto switched to Manual
|
|
284
|
+
if (this.hls.currentLevel === id) {
|
|
285
|
+
this.hls.currentLevel = id;
|
|
286
|
+
this.emitter.emit(LoaderEvents.QualityLevelSwitching, id, this.hls.autoLevelEnabled);
|
|
287
|
+
this.emitter.emit(LoaderEvents.QualityLevelSwitched, id, this.hls.autoLevelEnabled);
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
this.hls.currentLevel = id;
|
|
291
|
+
}
|
|
292
|
+
getAutoQualityLevelId() {
|
|
293
|
+
return autoQualityLevelId;
|
|
294
|
+
}
|
|
295
|
+
stop() {
|
|
296
|
+
if (this.hls) {
|
|
297
|
+
try {
|
|
298
|
+
this.hls.stopLoad();
|
|
299
|
+
}
|
|
300
|
+
catch (e) {
|
|
301
|
+
// ignore stopLoad error
|
|
302
|
+
}
|
|
303
|
+
try {
|
|
304
|
+
this.hls.destroy();
|
|
305
|
+
}
|
|
306
|
+
catch (e) {
|
|
307
|
+
// ignore destroy error
|
|
308
|
+
}
|
|
309
|
+
// Reset current time to ensure video playback will start from needed position
|
|
310
|
+
this.hls = null;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HLSLoader.js","sourceRoot":"","sources":["HLSLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAmB,MAAM,sCAAsC,CAAC;AACjG,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAI7D,OAAO,GAAG,EAAE,EAA8B,MAAM,QAAQ,CAAC;AAEzD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,kBAAkB,GAAG,CAAC,CAAC,CAAC;AAI9B,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;AAEhE,MAAM,OAAO,SAAU,SAAQ,UAAU;IAC/B,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC;IAErB,GAAG,GAAe,IAAI,CAAC;IACvB,SAAS,CAAkB;IAErC,YAAY,EAAoB,EAAE,SAA2B;QAC5D,IAAI,CAAC,mBAAmB,EAAE;YACzB,MAAM,KAAK,CAAC,yBAAyB,CAAC,CAAC;SACvC;QAED,KAAK,CAAC,EAAE,CAAC,CAAC;QAEV,IAAI,SAAS,EAAE;YACd,IAAI,CAAC,SAAS,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;SAClC;aAAM;YACN,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;SACpB;IACF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAkB;QAC5B,+CAA+C;QAC/C,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE;YAC/B,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;YAE9D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YAEjF,sCAAsC;YACtC,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SAC3B;QAED,uBAAuB;QACvB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEhD,oDAAoD;QACpD,IAAI,IAAI,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,IAAI,EAAE,CAAC;SACZ;QAED,8DAA8D;QAC9D,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAElC,+CAA+C;QAC/C,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,IAAI,MAAM,CAAC,aAAa,GAAG,CAAC,EAAE;YACnE,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;SACzC;QAED,4CAA4C;QAC5C,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE;YAC7D,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;SACnC;QAED,4BAA4B;QAC5B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,MAAM,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QAEjF,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACpD,iCAAiC;YACjC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;gBACxC,IAAI,IAAI,CAAC,KAAK,EAAE;oBACf,QAAQ,IAAI,CAAC,IAAI,EAAE;wBAClB,KAAK,GAAG,CAAC,UAAU,CAAC,WAAW;4BAC9B,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;4BAC7D,GAAG,CAAC,iBAAiB,EAAE,CAAC;4BACxB,MAAM;wBAEP,KAAK,GAAG,CAAC,UAAU,CAAC,aAAa;4BAChC,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,IAAI,CAAC,CAAC;4BAEvD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;gCACrC,OAAO,EAAE,wBAAwB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;gCACrD,IAAI;6BACJ,CAAC,CAAC;4BACH,qDAAqD;4BACrD,kEAAkE;4BAClE,yEAAyE;4BACzE,uEAAuE;4BACvE,MAAM;wBACP;4BACC,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,IAAI,CAAC,CAAC;4BAEvD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;gCACrC,OAAO,EAAE,wBAAwB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;gCACrD,IAAI;6BACJ,CAAC,CAAC;4BAEH,uCAAuC;4BACvC,GAAG,CAAC,OAAO,EAAE,CAAC;4BACd,MAAM;qBACP;iBACD;YACF,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,yCAAyC;QACzC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAClD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,qBAAqB,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACjD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACjD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACxD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACvD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACvD,MAAM,MAAM,GAAiB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC7D,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,UAAU,EAAE,KAAK;aACjB,CAAC,CAAC,CAAC;YAEJ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,8BAA8B;QAC9B,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,sBAAsB;QACtB,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAE3B,IAAI;YACH,MAAM,kBAAkB,CAAC;SACzB;QAAC,OAAO,CAAC,EAAE;YACX,IAAI;gBACH,GAAG,CAAC,OAAO,EAAE,CAAC;aACd;YAAC,OAAO,CAAC,EAAE;gBACX,uBAAuB;aACvB;YAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,OAAO,EAAG,CAAW,CAAC,OAAO,EAAE,IAAI,EAAE,CAAU,EAAE,CAAC,CAAC;YAE3F,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SACzB;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE/C,qCAAqC;QACrC,kDAAkD;QAClD,+BAA+B;QAC/B,2BAA2B;QAC3B,iBAAiB;QACjB,wBAAwB;QACxB,EAAE;QACF,mEAAmE;QACnE,EAAE;QACF,sFAAsF;QACtF,EAAE;QACF,iBAAiB;QACjB,MAAM;QACN,EAAE;QACF,+BAA+B;QAC/B,kEAAkE;QAClE,wBAAwB;QACxB,EAAE;QACF,4CAA4C;QAC5C,0DAA0D;QAC1D,UAAU;QACV,QAAQ;QACR,EAAE;QACF,mEAAmE;QACnE,MAAM;QACN,EAAE;QACF,4CAA4C;QAC5C,8FAA8F;QAC9F,wBAAwB;QACxB,oDAAoD;QACpD,wCAAwC;QACxC,EAAE;QACF,sCAAsC;QACtC,gDAAgD;QAChD,uBAAuB;QACvB,2BAA2B;QAC3B,wCAAwC;QACxC,sEAAsE;QACtE,iCAAiC;QACjC,eAAe;QACf,EAAE;QACF,0CAA0C;QAC1C,gEAAgE;QAChE,EAAE;QACF,gDAAgD;QAChD,gEAAgE;QAChE,cAAc;QACd,YAAY;QACZ,8DAA8D;QAC9D,2EAA2E;QAC3E,kFAAkF;QAClF,gFAAgF;QAChF,eAAe;QACf,gBAAgB;QAChB,gEAAgE;QAChE,EAAE;QACF,gDAAgD;QAChD,gEAAgE;QAChE,cAAc;QACd,YAAY;QACZ,EAAE;QACF,gDAAgD;QAChD,uBAAuB;QACvB,eAAe;QACf,QAAQ;QACR,OAAO;QACP,QAAQ;QACR,EAAE;QACF,eAAe;QACf,MAAM;QACN,EAAE;QACF,oCAAoC;QACpC,8DAA8D;QAC9D,wCAAwC;QACxC,2DAA2D;QAC3D,MAAM;QACN,EAAE;QACF,4FAA4F;QAC5F,0EAA0E;QAC1E,wCAAwC;QACxC,2DAA2D;QAC3D,EAAE;QACF,6CAA6C;QAC7C,yDAAyD;QACzD,6FAA6F;QAC7F,OAAO;QACP,EAAE;QACF,wDAAwD;QACxD,4FAA4F;QAC5F,OAAO;QACP,EAAE;QACF,wDAAwD;QACxD,wCAAwC;QACxC,OAAO;QACP,EAAE;QACF,+DAA+D;QAC/D,kEAAkE;QAClE,OAAO;QACP,EAAE;QACF,8DAA8D;QAC9D,iEAAiE;QACjE,OAAO;QACP,EAAE;QACF,8DAA8D;QAC9D,oEAAoE;QACpE,mBAAmB;QACnB,uBAAuB;QACvB,6BAA6B;QAC7B,uBAAuB;QACvB,SAAS;QACT,EAAE;QACF,gEAAgE;QAChE,OAAO;QACP,EAAE;QACF,0BAA0B;QAC1B,+BAA+B;QAC/B,MAAM;IACP,CAAC;IAEO,gBAAgB,CAAC,MAAe;QACvC,MAAM,SAAS,GAAmB,EAAE,CAAC;QAErC,IAAI,GAAG,GAAG,CAAC,CAAC;QAEZ,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC3B,MAAM,MAAM,GAAiB;gBAC5B,EAAE,EAAE,GAAG;gBACP,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,UAAU,EAAE,KAAK;aACjB,CAAC;YAEF,GAAG,EAAE,CAAC;YAEN,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACvB;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;IAED,gBAAgB,CAAC,EAAU,EAAE,QAAiB;QAC7C,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACd,OAAO;SACP;QAED,iCAAiC;QACjC,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,EAAE,CAAC;QAEzB,IAAI,CAAC,QAAQ,EAAE;YACd,0CAA0C;YAC1C,IAAI,CAAC,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC;YAC1C,4BAA4B;YAC5B,4BAA4B;SAC5B;IACF,CAAC;IAED,kBAAkB,CAAC,EAAU,EAAE,QAAiB;QAC/C,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACd,OAAO;SACP;QAED,IAAI,QAAQ,EAAE;YACb,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,EAAE,CAAC;YACxB,OAAO;SACP;QAED,oGAAoG;QACpG,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,KAAK,EAAE,EAAE;YACjC,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,qBAAqB,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACrF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACpF,OAAO;SACP;QAED,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,EAAE,CAAC;IAC5B,CAAC;IAED,qBAAqB;QACpB,OAAO,kBAAkB,CAAC;IAC3B,CAAC;IAED,IAAI;QACH,IAAI,IAAI,CAAC,GAAG,EAAE;YACb,IAAI;gBACH,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;aACpB;YAAC,OAAO,CAAC,EAAE;gBACX,wBAAwB;aACxB;YAED,IAAI;gBACH,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;aACnB;YAAC,OAAO,CAAC,EAAE;gBACX,uBAAuB;aACvB;YAED,8EAA8E;YAC9E,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;SAChB;IACF,CAAC;CACD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { QualityLevel } from '
|
|
2
|
-
import type { AudioTrack } from '
|
|
1
|
+
import type { QualityLevel } from '../types/QualityLevel.js';
|
|
2
|
+
import type { AudioTrack } from '../types/AudioTrack.js';
|
|
3
3
|
export declare enum LoaderEvents {
|
|
4
4
|
Loading = "loader.loading",
|
|
5
5
|
Loaded = "loader.loaded",
|
|
@@ -33,11 +33,19 @@ export interface LoadParams {
|
|
|
33
33
|
readonly startLevel?: number;
|
|
34
34
|
readonly abortSignal: AbortSignal;
|
|
35
35
|
}
|
|
36
|
+
export declare enum LoaderType {
|
|
37
|
+
Native = 0,
|
|
38
|
+
HLS = 1,
|
|
39
|
+
DASH = 2
|
|
40
|
+
}
|
|
36
41
|
export interface LoaderInterface {
|
|
42
|
+
readonly type: LoaderType;
|
|
37
43
|
load(params: LoadParams): Promise<void>;
|
|
38
44
|
stop(): void;
|
|
39
45
|
switchQualityLevel(id: number, graceful: boolean): void;
|
|
40
46
|
switchAudioTrack(id: number, graceful: boolean): void;
|
|
41
47
|
getAutoQualityLevelId(): number;
|
|
42
|
-
|
|
48
|
+
subscribe<K extends keyof LoaderEventsMap>(ev: K, cb: LoaderEventsMap[K]): void;
|
|
49
|
+
subscribeOnce<K extends keyof LoaderEventsMap>(ev: K, cb: LoaderEventsMap[K]): void;
|
|
50
|
+
unsubscribe<K extends keyof LoaderEventsMap>(ev: K, cb: LoaderEventsMap[K]): void;
|
|
43
51
|
}
|
|
@@ -10,3 +10,9 @@ export var LoaderEvents;
|
|
|
10
10
|
LoaderEvents["AudioTrackSwitching"] = "loader.audioTrackSwitching";
|
|
11
11
|
LoaderEvents["AudioTrackSwitched"] = "loader.audioTrackSwitched";
|
|
12
12
|
})(LoaderEvents || (LoaderEvents = {}));
|
|
13
|
+
export var LoaderType;
|
|
14
|
+
(function (LoaderType) {
|
|
15
|
+
LoaderType[LoaderType["Native"] = 0] = "Native";
|
|
16
|
+
LoaderType[LoaderType["HLS"] = 1] = "HLS";
|
|
17
|
+
LoaderType[LoaderType["DASH"] = 2] = "DASH";
|
|
18
|
+
})(LoaderType || (LoaderType = {}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoaderInterface.js","sourceRoot":"","sources":["LoaderInterface.ts"],"names":[],"mappings":"AAGA,MAAM,CAAN,IAAY,YAYX;AAZD,WAAY,YAAY;IACvB,0CAA0B,CAAA;IAC1B,wCAAwB,CAAA;IACxB,sCAAsB,CAAA;IAEtB,oEAAoD,CAAA;IACpD,sEAAsD,CAAA;IACtD,oEAAoD,CAAA;IAEpD,gEAAgD,CAAA;IAChD,kEAAkD,CAAA;IAClD,gEAAgD,CAAA;AACjD,CAAC,EAZW,YAAY,KAAZ,YAAY,QAYvB"}
|
|
1
|
+
{"version":3,"file":"LoaderInterface.js","sourceRoot":"","sources":["LoaderInterface.ts"],"names":[],"mappings":"AAGA,MAAM,CAAN,IAAY,YAYX;AAZD,WAAY,YAAY;IACvB,0CAA0B,CAAA;IAC1B,wCAAwB,CAAA;IACxB,sCAAsB,CAAA;IAEtB,oEAAoD,CAAA;IACpD,sEAAsD,CAAA;IACtD,oEAAoD,CAAA;IAEpD,gEAAgD,CAAA;IAChD,kEAAkD,CAAA;IAClD,gEAAgD,CAAA;AACjD,CAAC,EAZW,YAAY,KAAZ,YAAY,QAYvB;AA6BD,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACrB,+CAAM,CAAA;IACN,yCAAG,CAAA;IACH,2CAAI,CAAA;AACL,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface AudioTrack extends EventTarget {
|
|
2
|
+
readonly id: string;
|
|
3
|
+
readonly kind: string;
|
|
4
|
+
readonly label: string;
|
|
5
|
+
readonly language: string;
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
onended: ((this: AudioTrack, ev: Event) => void) | null;
|
|
8
|
+
}
|
|
9
|
+
export interface VideoTrack {
|
|
10
|
+
selected: boolean;
|
|
11
|
+
readonly id: string;
|
|
12
|
+
readonly kind: string;
|
|
13
|
+
readonly label: string;
|
|
14
|
+
readonly language: string;
|
|
15
|
+
readonly sourceBuffer: SourceBuffer | null;
|
|
16
|
+
}
|
|
17
|
+
export interface TrackEvent extends Event {
|
|
18
|
+
readonly track: AudioTrack | VideoTrack | TextTrack | null;
|
|
19
|
+
}
|
|
20
|
+
interface AudioTrackListEventMap {
|
|
21
|
+
addtrack: TrackEvent;
|
|
22
|
+
removetrack: TrackEvent;
|
|
23
|
+
change: Event;
|
|
24
|
+
}
|
|
25
|
+
export interface AudioTrackList extends EventTarget {
|
|
26
|
+
readonly length: number;
|
|
27
|
+
onaddtrack: ((this: AudioTrackList, ev: TrackEvent) => void) | null;
|
|
28
|
+
onchange: ((this: AudioTrackList, ev: Event) => void) | null;
|
|
29
|
+
onremovetrack: ((this: AudioTrackList, ev: TrackEvent) => void) | null;
|
|
30
|
+
getTrackById(id: string): AudioTrack | null;
|
|
31
|
+
item(index: number): AudioTrack | null;
|
|
32
|
+
[index: number]: AudioTrack;
|
|
33
|
+
addEventListener<K extends keyof AudioTrackListEventMap>(type: K, listener: (this: AudioTrackList, ev: AudioTrackListEventMap[K]) => void, options?: boolean | AddEventListenerOptions): void;
|
|
34
|
+
removeEventListener<K extends keyof AudioTrackListEventMap>(type: K, listener: (this: AudioTrackList, ev: AudioTrackListEventMap[K]) => void, options?: boolean | EventListenerOptions): void;
|
|
35
|
+
}
|
|
36
|
+
export interface HTMLMediaElementWithTracks extends HTMLMediaElement {
|
|
37
|
+
readonly audioTracks?: AudioTrackList;
|
|
38
|
+
}
|
|
39
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativeAudioTrackList.js","sourceRoot":"","sources":["NativeAudioTrackList.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { LoaderType, type LoadParams } from './LoaderInterface.js';
|
|
2
|
+
import { BaseLoader } from './BaseLoader.js';
|
|
3
|
+
export declare class NativeLoader extends BaseLoader {
|
|
4
|
+
readonly type = LoaderType.Native;
|
|
5
|
+
private readonly _onAudioTrackChangeCb;
|
|
6
|
+
private readonly _onAudioTrackAddedOrRemovedCb;
|
|
7
|
+
constructor(el: HTMLMediaElement);
|
|
8
|
+
getAutoQualityLevelId(): number;
|
|
9
|
+
load(params: LoadParams): Promise<void>;
|
|
10
|
+
private _onAudioTrackAddedOrRemoved;
|
|
11
|
+
private _onAudioTrackChange;
|
|
12
|
+
stop(): void;
|
|
13
|
+
switchAudioTrack(id: number): void;
|
|
14
|
+
switchQualityLevel(): void;
|
|
15
|
+
canPlayType(mimeType: string): boolean;
|
|
16
|
+
}
|