@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.
Files changed (75) hide show
  1. package/dist/core/AudioCtx/AudioContext.d.ts +2 -0
  2. package/dist/core/AudioCtx/AudioContext.js +92 -0
  3. package/dist/core/AudioCtx/AudioContext.js.map +1 -0
  4. package/dist/core/Loaders/BaseLoader.d.ts +17 -0
  5. package/dist/core/Loaders/BaseLoader.js +50 -0
  6. package/dist/core/Loaders/BaseLoader.js.map +1 -0
  7. package/dist/core/Loaders/HLSLoader.d.ts +17 -0
  8. package/dist/core/Loaders/HLSLoader.js +313 -0
  9. package/dist/core/Loaders/HLSLoader.js.map +1 -0
  10. package/dist/core/{LoaderInterface.d.ts → Loaders/LoaderInterface.d.ts} +11 -3
  11. package/dist/core/{LoaderInterface.js → Loaders/LoaderInterface.js} +6 -0
  12. package/dist/core/{LoaderInterface.js.map → Loaders/LoaderInterface.js.map} +1 -1
  13. package/dist/core/Loaders/NativeAudioTrackList.d.ts +39 -0
  14. package/dist/core/Loaders/NativeAudioTrackList.js.map +1 -0
  15. package/dist/core/Loaders/NativeLoader.d.ts +16 -0
  16. package/dist/core/Loaders/NativeLoader.js +114 -0
  17. package/dist/core/Loaders/NativeLoader.js.map +1 -0
  18. package/dist/core/Playlist.d.ts +4 -3
  19. package/dist/core/Playlist.js.map +1 -1
  20. package/dist/core/PlaylistPlayer.d.ts +3 -2
  21. package/dist/core/PlaylistPlayer.js +5 -3
  22. package/dist/core/PlaylistPlayer.js.map +1 -1
  23. package/dist/core/VideoPlayer.d.ts +19 -191
  24. package/dist/core/VideoPlayer.js +92 -594
  25. package/dist/core/VideoPlayer.js.map +1 -1
  26. package/dist/core/VideoPlayerEvents.d.ts +74 -0
  27. package/dist/core/VideoPlayerEvents.js +40 -0
  28. package/dist/core/VideoPlayerEvents.js.map +1 -0
  29. package/dist/core/VideoPlayerMediaLoadManager.d.ts +50 -0
  30. package/dist/core/VideoPlayerMediaLoadManager.js +269 -0
  31. package/dist/core/VideoPlayerMediaLoadManager.js.map +1 -0
  32. package/dist/core/VideoPlayerMediaState.d.ts +39 -0
  33. package/dist/core/VideoPlayerMediaState.js +161 -0
  34. package/dist/core/VideoPlayerMediaState.js.map +1 -0
  35. package/dist/core/VideoPlayerMediaStateProxy.d.ts +17 -0
  36. package/dist/core/VideoPlayerMediaStateProxy.js +42 -0
  37. package/dist/core/VideoPlayerMediaStateProxy.js.map +1 -0
  38. package/dist/core/svelte/VideoPlayerMediaStateSvelteStore.d.ts +58 -0
  39. package/dist/core/svelte/VideoPlayerMediaStateSvelteStore.js +146 -0
  40. package/dist/core/svelte/VideoPlayerMediaStateSvelteStore.js.map +1 -0
  41. package/dist/core/types/BufferedPart.d.ts +4 -0
  42. package/dist/core/types/BufferedPart.js +1 -0
  43. package/dist/core/types/BufferedPart.js.map +1 -0
  44. package/dist/core/types/PlayerLoadParams.d.ts +11 -0
  45. package/dist/core/types/PlayerLoadParams.js +1 -0
  46. package/dist/core/types/PlayerLoadParams.js.map +1 -0
  47. package/dist/core/types/QualityLevel.js +1 -0
  48. package/dist/core/types/index.d.ts +4 -0
  49. package/dist/core/types/index.js +1 -0
  50. package/dist/core/types/index.js.map +1 -0
  51. package/dist/index.d.ts +9 -4
  52. package/dist/index.js +9 -4
  53. package/dist/ui/LoadingIndicator.svelte +35 -16
  54. package/dist/ui/LoadingIndicator.svelte.d.ts +1 -1
  55. package/dist/ui/ProgressBar.svelte +7 -8
  56. package/dist/ui/ProgressBar.svelte.d.ts +1 -1
  57. package/package.json +1 -1
  58. package/dist/HybridDoublyLinkedList.d.ts +0 -20
  59. package/dist/HybridDoublyLinkedList.js +0 -90
  60. package/dist/HybridDoublyLinkedList.js.map +0 -1
  61. package/dist/HybridLinkedList.d.ts +0 -18
  62. package/dist/HybridLinkedList.js +0 -90
  63. package/dist/HybridLinkedList.js.map +0 -1
  64. package/dist/core/HLSLoader.d.ts +0 -19
  65. package/dist/core/HLSLoader.js +0 -196
  66. package/dist/core/HLSLoader.js.map +0 -1
  67. package/dist/core/NativeLoader.d.ts +0 -14
  68. package/dist/core/NativeLoader.js +0 -66
  69. package/dist/core/NativeLoader.js.map +0 -1
  70. /package/dist/core/{AudioTrack.js → Loaders/NativeAudioTrackList.js} +0 -0
  71. /package/dist/core/{AudioTrack.d.ts → types/AudioTrack.d.ts} +0 -0
  72. /package/dist/core/{QualityLevel.js → types/AudioTrack.js} +0 -0
  73. /package/dist/core/{AudioTrack.js.map → types/AudioTrack.js.map} +0 -0
  74. /package/dist/core/{QualityLevel.d.ts → types/QualityLevel.d.ts} +0 -0
  75. /package/dist/core/{QualityLevel.js.map → types/QualityLevel.js.map} +0 -0
@@ -0,0 +1,2 @@
1
+ export declare const IS_AUDIO_CONTEXT_SUPPORTED: boolean;
2
+ export declare const IS_AUDIO_GAIN_SUPPORTED: boolean;
@@ -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":"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"}
@@ -1,5 +1,5 @@
1
- import type { QualityLevel } from './QualityLevel.js';
2
- import type { AudioTrack } from './AudioTrack.js';
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
- isSupported(): boolean;
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
+ }