@codercms/web-player 0.0.1

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 (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/dist/HybridDoublyLinkedList.d.ts +20 -0
  4. package/dist/HybridDoublyLinkedList.js +90 -0
  5. package/dist/HybridDoublyLinkedList.js.map +1 -0
  6. package/dist/HybridLinkedList.d.ts +18 -0
  7. package/dist/HybridLinkedList.js +90 -0
  8. package/dist/HybridLinkedList.js.map +1 -0
  9. package/dist/core/HLSLoader.d.ts +18 -0
  10. package/dist/core/HLSLoader.js +144 -0
  11. package/dist/core/HLSLoader.js.map +1 -0
  12. package/dist/core/LoaderInterface.d.ts +37 -0
  13. package/dist/core/LoaderInterface.js +27 -0
  14. package/dist/core/LoaderInterface.js.map +1 -0
  15. package/dist/core/Playlist.d.ts +60 -0
  16. package/dist/core/Playlist.js +141 -0
  17. package/dist/core/Playlist.js.map +1 -0
  18. package/dist/core/PlaylistPlayer.d.ts +29 -0
  19. package/dist/core/PlaylistPlayer.js +82 -0
  20. package/dist/core/PlaylistPlayer.js.map +1 -0
  21. package/dist/core/QualityLevel.d.ts +7 -0
  22. package/dist/core/QualityLevel.js +1 -0
  23. package/dist/core/QualityLevel.js.map +1 -0
  24. package/dist/core/VideoPlayer.d.ts +104 -0
  25. package/dist/core/VideoPlayer.js +342 -0
  26. package/dist/core/VideoPlayer.js.map +1 -0
  27. package/dist/index.d.ts +0 -0
  28. package/dist/index.js +1 -0
  29. package/dist/ui/LoadingIndicator.svelte +74 -0
  30. package/dist/ui/LoadingIndicator.svelte.d.ts +18 -0
  31. package/dist/ui/ProgressBar.svelte +283 -0
  32. package/dist/ui/ProgressBar.svelte.d.ts +17 -0
  33. package/dist/ui/utils/duration.d.ts +1 -0
  34. package/dist/ui/utils/duration.js +23 -0
  35. package/dist/ui/utils/duration.js.map +1 -0
  36. package/dist/ui/utils/slider.d.ts +25 -0
  37. package/dist/ui/utils/slider.js +132 -0
  38. package/dist/ui/utils/slider.js.map +1 -0
  39. package/package.json +54 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 AvmDB
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # web-player
2
+
3
+ Web player for front-end
@@ -0,0 +1,20 @@
1
+ export declare class DoublyListNode<T> {
2
+ data: T;
3
+ next: DoublyListNode<T> | null;
4
+ prev: DoublyListNode<T> | null;
5
+ constructor(data: T);
6
+ }
7
+ export declare class HybridDoublyLinkedList<T> {
8
+ private _head;
9
+ private _tail;
10
+ private _size;
11
+ private _flatList;
12
+ head(): DoublyListNode<T> | null;
13
+ tail(): DoublyListNode<T> | null;
14
+ append(data: T): void;
15
+ remove(data: T): void;
16
+ find(item: T): DoublyListNode<T> | null;
17
+ toArray(): T[];
18
+ getSize(): number;
19
+ [Symbol.iterator](): Iterator<T>;
20
+ }
@@ -0,0 +1,90 @@
1
+ export class DoublyListNode {
2
+ data;
3
+ next;
4
+ prev;
5
+ constructor(data) {
6
+ this.data = data;
7
+ this.next = null;
8
+ this.prev = null;
9
+ }
10
+ }
11
+ export class HybridDoublyLinkedList {
12
+ _head = null;
13
+ _tail = null;
14
+ _size = 0;
15
+ _flatList = [];
16
+ head() {
17
+ return this._head;
18
+ }
19
+ tail() {
20
+ return this._tail;
21
+ }
22
+ // Add a new node to the end of the linked list.
23
+ append(data) {
24
+ const newNode = new DoublyListNode(data);
25
+ if (!this._head) {
26
+ this._head = newNode;
27
+ this._tail = newNode;
28
+ }
29
+ else {
30
+ newNode.prev = this._tail;
31
+ this._tail.next = newNode;
32
+ this._tail = newNode;
33
+ }
34
+ this._size++;
35
+ this._flatList.push(data);
36
+ }
37
+ // Remove the first occurrence of a node with the given data.
38
+ remove(data) {
39
+ let current = this._head;
40
+ while (current) {
41
+ if (current.data === data) {
42
+ if (current.prev) {
43
+ current.prev.next = current.next;
44
+ }
45
+ else {
46
+ this._head = current.next;
47
+ }
48
+ if (current.next) {
49
+ current.next.prev = current.prev;
50
+ }
51
+ else {
52
+ this._tail = current.prev;
53
+ }
54
+ this._size--;
55
+ const indexToRemove = this._flatList.indexOf(data);
56
+ if (indexToRemove !== -1) {
57
+ this._flatList.splice(indexToRemove, 1);
58
+ }
59
+ return;
60
+ }
61
+ current = current.next;
62
+ }
63
+ }
64
+ find(item) {
65
+ let current = this._head;
66
+ while (current) {
67
+ if (current === item) {
68
+ return current;
69
+ }
70
+ current = current.next;
71
+ }
72
+ return null;
73
+ }
74
+ // Convert the linked list to an array for easier access and iteration.
75
+ toArray() {
76
+ return this._flatList;
77
+ }
78
+ // Get the size (number of nodes) of the linked list.
79
+ getSize() {
80
+ return this._size;
81
+ }
82
+ // Implement the Symbol.iterator method for iteration.
83
+ *[Symbol.iterator]() {
84
+ let current = this._head;
85
+ while (current) {
86
+ yield current.data;
87
+ current = current.next;
88
+ }
89
+ }
90
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HybridDoublyLinkedList.js","sourceRoot":"","sources":["HybridDoublyLinkedList.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export declare class ListNode<T> {
2
+ data: T;
3
+ next: ListNode<T> | null;
4
+ constructor(data: T);
5
+ }
6
+ export declare class HybridLinkedList<T> {
7
+ private head;
8
+ private tail;
9
+ private size;
10
+ private flatList;
11
+ constructor();
12
+ getHead(): ListNode<T> | null;
13
+ append(data: T): void;
14
+ remove(data: T): void;
15
+ toArray(): T[];
16
+ getSize(): number;
17
+ [Symbol.iterator](): Iterator<T>;
18
+ }
@@ -0,0 +1,90 @@
1
+ export class ListNode {
2
+ data;
3
+ next;
4
+ constructor(data) {
5
+ this.data = data;
6
+ this.next = null;
7
+ }
8
+ }
9
+ export class HybridLinkedList {
10
+ head;
11
+ tail;
12
+ size;
13
+ flatList;
14
+ constructor() {
15
+ this.head = null;
16
+ this.tail = null;
17
+ this.size = 0;
18
+ this.flatList = [];
19
+ }
20
+ getHead() {
21
+ return this.head ?? null;
22
+ }
23
+ // Add a new node to the end of the linked list.
24
+ append(data) {
25
+ const newNode = new ListNode(data);
26
+ if (!this.head) {
27
+ this.head = newNode;
28
+ this.tail = newNode;
29
+ }
30
+ else {
31
+ this.tail.next = newNode;
32
+ this.tail = newNode;
33
+ }
34
+ this.size++;
35
+ this.flatList.push(data);
36
+ }
37
+ // Remove the first occurrence of a node with the given data.
38
+ remove(data) {
39
+ if (!this.head)
40
+ return;
41
+ if (this.head.data === data) {
42
+ this.head = this.head.next;
43
+ if (!this.head)
44
+ this.tail = null;
45
+ this.size--;
46
+ this.flatList.shift();
47
+ return;
48
+ }
49
+ let current = this.head;
50
+ while (current.next) {
51
+ if (current.next.data === data) {
52
+ current.next = current.next.next;
53
+ if (!current.next)
54
+ this.tail = current;
55
+ this.size--;
56
+ const indexToRemove = this.flatList.indexOf(data);
57
+ if (indexToRemove !== -1)
58
+ this.flatList.splice(indexToRemove, 1);
59
+ return;
60
+ }
61
+ current = current.next;
62
+ }
63
+ }
64
+ // Convert the linked list to an array for easier access and iteration.
65
+ toArray() {
66
+ return this.flatList;
67
+ }
68
+ // Get the size (number of nodes) of the linked list.
69
+ getSize() {
70
+ return this.size;
71
+ }
72
+ // Define the Symbol.iterator method to make the list iterable.
73
+ [Symbol.iterator]() {
74
+ let current = this.head;
75
+ let index = 0;
76
+ return {
77
+ next: () => {
78
+ if (current) {
79
+ const value = current.data;
80
+ current = current.next;
81
+ index++;
82
+ return { value, done: false };
83
+ }
84
+ else {
85
+ return { value: undefined, done: true };
86
+ }
87
+ }
88
+ };
89
+ }
90
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HybridLinkedList.js","sourceRoot":"","sources":["HybridLinkedList.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { LoaderEventsMap, LoaderInterface, LoadParams } from './LoaderInterface.js';
2
+ import Hls, { type HlsConfig } from 'hls.js';
3
+ import type { EventEmitter } from 'eventemitter3';
4
+ export declare class HLSLoader implements LoaderInterface {
5
+ private emitter;
6
+ private el;
7
+ protected hls: Hls | null;
8
+ protected hlsConfig: Partial<HlsConfig>;
9
+ constructor(emitter: EventEmitter<LoaderEventsMap>, el: HTMLVideoElement, hlsConfig?: Partial<HlsConfig>);
10
+ load(params: LoadParams): Promise<void>;
11
+ private _onLevelsUpdated;
12
+ switchAudioTrack(id: number, graceful: boolean): void;
13
+ switchQualityLevel(id: number, graceful: boolean): void;
14
+ getAutoQualityLevelId(): number;
15
+ stop(): void;
16
+ isSupported(): boolean;
17
+ }
18
+ export declare function isHlsJsSupported(): boolean;
@@ -0,0 +1,144 @@
1
+ import { getLoadUrl, LoaderEvents } from './LoaderInterface.js';
2
+ import Hls, {} from 'hls.js';
3
+ const autoQualityLevelId = -1;
4
+ export class HLSLoader {
5
+ emitter;
6
+ el;
7
+ hls = null;
8
+ hlsConfig;
9
+ constructor(emitter, el, hlsConfig) {
10
+ this.emitter = emitter;
11
+ this.el = el;
12
+ if (!this.isSupported()) {
13
+ throw Error('HLS.js is not supported');
14
+ }
15
+ if (hlsConfig) {
16
+ this.hlsConfig = { ...hlsConfig };
17
+ }
18
+ else {
19
+ this.hlsConfig = {};
20
+ }
21
+ }
22
+ load(params) {
23
+ if (params.abortSignal.aborted) {
24
+ return Promise.reject(new DOMException('Operation aborted', 'AbortError'));
25
+ }
26
+ this.emitter.emit(LoaderEvents.Loading, params);
27
+ // Cancel any ongoing loading
28
+ if (this.hls) {
29
+ this.stop();
30
+ }
31
+ const cfg = this.hlsConfig;
32
+ if ((params.startPosition ?? 0) > 0) {
33
+ cfg.startPosition = params.startPosition;
34
+ }
35
+ const hls = new Hls(cfg);
36
+ this.hls = hls;
37
+ hls.attachMedia(this.el);
38
+ return new Promise(async (resolve, reject) => {
39
+ const url = await getLoadUrl(params);
40
+ // Handle abort signal
41
+ params.abortSignal.addEventListener('abort', () => {
42
+ this.stop();
43
+ reject(new DOMException('Loading aborted', 'AbortError'));
44
+ });
45
+ hls.loadSource(url);
46
+ hls.once(Hls.Events.MANIFEST_PARSED, (event, data) => {
47
+ this.emitter.emit(LoaderEvents.Loaded, params);
48
+ this._onLevelsUpdated(data.levels);
49
+ resolve();
50
+ });
51
+ hls.on(Hls.Events.LEVEL_SWITCHED, (event, data) => {
52
+ this.emitter.emit(LoaderEvents.QualityLevelSwitched, data.level);
53
+ });
54
+ hls.on(Hls.Events.LEVELS_UPDATED, (event, data) => {
55
+ this._onLevelsUpdated(data.levels);
56
+ });
57
+ hls.on(Hls.Events.ERROR, (event, data) => {
58
+ if (data.fatal) {
59
+ switch (data.type) {
60
+ case Hls.ErrorTypes.MEDIA_ERROR:
61
+ console.log('fatal media error encountered, try to recover');
62
+ hls.recoverMediaError();
63
+ break;
64
+ case Hls.ErrorTypes.NETWORK_ERROR:
65
+ console.error('fatal network error encountered', data);
66
+ this.emitter.emit(LoaderEvents.Error, {
67
+ message: `fatal network error: ${data.error.message}`,
68
+ data
69
+ });
70
+ // All retries and media options have been exhausted.
71
+ // Immediately trying to restart loading could cause loop loading.
72
+ // Consider modifying loading policies to best fit your asset and network
73
+ // conditions (manifestLoadPolicy, playlistLoadPolicy, fragLoadPolicy).
74
+ break;
75
+ default:
76
+ console.error('unknown fatal error encountered', data);
77
+ this.emitter.emit(LoaderEvents.Error, {
78
+ message: `unknown fatal error: ${data.error.message}`,
79
+ data
80
+ });
81
+ // cannot recover
82
+ hls.destroy();
83
+ break;
84
+ }
85
+ }
86
+ });
87
+ });
88
+ }
89
+ _onLevelsUpdated(levels) {
90
+ const newLevels = [];
91
+ let idx = 0;
92
+ for (const level of levels) {
93
+ const newLvl = {
94
+ id: idx,
95
+ width: level.width,
96
+ height: level.height,
97
+ bitrate: level.bitrate,
98
+ loaderData: level
99
+ };
100
+ idx++;
101
+ newLevels.push(newLvl);
102
+ }
103
+ this.emitter.emit(LoaderEvents.QualityLevelsUpdated, newLevels);
104
+ }
105
+ switchAudioTrack(id, graceful) {
106
+ if (!this.hls) {
107
+ return;
108
+ }
109
+ // TODO: Support graceful = false
110
+ this.hls.audioTrack = id;
111
+ }
112
+ switchQualityLevel(id, graceful) {
113
+ if (!this.hls) {
114
+ return;
115
+ }
116
+ if (graceful) {
117
+ this.hls.nextLevel = id;
118
+ return;
119
+ }
120
+ this.hls.currentLevel = id;
121
+ }
122
+ getAutoQualityLevelId() {
123
+ return autoQualityLevelId;
124
+ }
125
+ stop() {
126
+ if (this.hls) {
127
+ try {
128
+ this.hls.stopLoad();
129
+ }
130
+ catch (e) { }
131
+ try {
132
+ this.hls.destroy();
133
+ }
134
+ catch (e) { }
135
+ this.hls = null;
136
+ }
137
+ }
138
+ isSupported() {
139
+ return isHlsJsSupported();
140
+ }
141
+ }
142
+ export function isHlsJsSupported() {
143
+ return Hls.isSupported();
144
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HLSLoader.js","sourceRoot":"","sources":["HLSLoader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { QualityLevel } from './QualityLevel';
2
+ export declare enum LoaderEvents {
3
+ Loading = "loader.loading",
4
+ Loaded = "loader.loaded",
5
+ Error = "loader.error",
6
+ QualityLevelsUpdated = "loader.qualityLevelsUpdated",
7
+ QualityLevelSwitched = "loader.qualityLevelSwitched"
8
+ }
9
+ export type LoaderError = {
10
+ message: string;
11
+ data: object;
12
+ };
13
+ export type LoaderEventsMap = {
14
+ [LoaderEvents.Loading]: (params: LoadParams) => void;
15
+ [LoaderEvents.Loaded]: (params: LoadParams) => void;
16
+ [LoaderEvents.Error]: (error: LoaderError) => void;
17
+ [LoaderEvents.QualityLevelsUpdated]: (levels: QualityLevel[]) => void;
18
+ [LoaderEvents.QualityLevelSwitched]: (levelId: number) => void;
19
+ };
20
+ export type GetUrlCb = (signal: AbortSignal) => Promise<string>;
21
+ export interface LoadParams {
22
+ readonly url: string | Promise<string>;
23
+ readonly getUrlCb?: GetUrlCb;
24
+ readonly startPosition?: number;
25
+ readonly audioTrack?: number;
26
+ readonly startLevel?: number;
27
+ readonly abortSignal: AbortSignal;
28
+ }
29
+ export interface LoaderInterface {
30
+ load(params: LoadParams): Promise<void>;
31
+ stop(): void;
32
+ switchQualityLevel(id: number, graceful: boolean): void;
33
+ switchAudioTrack(id: number, graceful: boolean): void;
34
+ getAutoQualityLevelId(): number;
35
+ isSupported(): boolean;
36
+ }
37
+ export declare function getLoadUrl(params: LoadParams): Promise<string>;
@@ -0,0 +1,27 @@
1
+ export var LoaderEvents;
2
+ (function (LoaderEvents) {
3
+ LoaderEvents["Loading"] = "loader.loading";
4
+ LoaderEvents["Loaded"] = "loader.loaded";
5
+ LoaderEvents["Error"] = "loader.error";
6
+ LoaderEvents["QualityLevelsUpdated"] = "loader.qualityLevelsUpdated";
7
+ LoaderEvents["QualityLevelSwitched"] = "loader.qualityLevelSwitched";
8
+ })(LoaderEvents || (LoaderEvents = {}));
9
+ export async function getLoadUrl(params) {
10
+ let url;
11
+ if (params.getUrlCb) {
12
+ url = await params.getUrlCb(params.abortSignal);
13
+ console.log('cb url', url);
14
+ }
15
+ else if (params.url instanceof Promise) {
16
+ url = await params.url;
17
+ console.log('promise url', url);
18
+ }
19
+ else {
20
+ url = params.url;
21
+ console.log('plain url', url);
22
+ }
23
+ if (!url || !url.length) {
24
+ throw Error('Bad load url');
25
+ }
26
+ return url;
27
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoaderInterface.js","sourceRoot":"","sources":["LoaderInterface.ts"],"names":[],"mappings":"AAEA,MAAM,CAAN,IAAY,YAOX;AAPD,WAAY,YAAY;IACvB,0CAA0B,CAAA;IAC1B,wCAAwB,CAAA;IACxB,sCAAsB,CAAA;IAEtB,oEAAoD,CAAA;IACpD,oEAAoD,CAAA;AACrD,CAAC,EAPW,YAAY,KAAZ,YAAY,QAOvB;AAyCD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAkB;IAClD,IAAI,GAAW,CAAC;IAEhB,IAAI,MAAM,CAAC,QAAQ,EAAE;QACpB,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;KAC3B;SAAM,IAAI,MAAM,CAAC,GAAG,YAAY,OAAO,EAAE;QACzC,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;KAChC;SAAM;QACN,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;KAC9B;IAED,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;QACxB,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC;KAC5B;IAED,OAAO,GAAG,CAAC;AACZ,CAAC"}
@@ -0,0 +1,60 @@
1
+ import type { PlayerLoadParams, Loader } from './VideoPlayer';
2
+ import type { EventEmitter } from 'eventemitter3';
3
+ export interface LoadOpts {
4
+ startPosition?: number;
5
+ audioTrack?: number;
6
+ }
7
+ export interface PlaylistItemInterface {
8
+ readonly title: string;
9
+ getUrl(signal: AbortSignal): Promise<string>;
10
+ getLoadParams(opts: LoadOpts): PlayerLoadParams | null;
11
+ }
12
+ export declare class PlaylistItem implements PlaylistItemInterface {
13
+ readonly title: string;
14
+ readonly url: string;
15
+ readonly loader?: Loader | undefined;
16
+ constructor(title: string, url: string, loader?: Loader | undefined);
17
+ getUrl(signal: AbortSignal): Promise<string>;
18
+ getLoadParams(opts?: LoadOpts): PlayerLoadParams | null;
19
+ }
20
+ export declare enum PlaylistEvents {
21
+ ItemAdded = "playlist.ItemAdded",
22
+ ItemRemoved = "playlist.ItemRemoved",
23
+ Rewind = "playlist.Rewind",
24
+ SetNext = "playlist.SetNext",
25
+ SetPrev = "playlist.SetPrev",
26
+ Set = "playlist.Set",
27
+ BeforeSet = "playlist.BeforeSet",
28
+ Clear = "playlist.Clear"
29
+ }
30
+ export type PlaylistEventsMap<ItemImpl extends PlaylistItemInterface> = {
31
+ [PlaylistEvents.ItemAdded]: (item: ItemImpl) => void;
32
+ [PlaylistEvents.ItemRemoved]: (item: ItemImpl) => void;
33
+ [PlaylistEvents.Rewind]: () => void;
34
+ [PlaylistEvents.SetNext]: (item: ItemImpl, opts: LoadOpts) => void;
35
+ [PlaylistEvents.SetPrev]: (item: ItemImpl, opts: LoadOpts) => void;
36
+ [PlaylistEvents.BeforeSet]: (item: ItemImpl, opts: LoadOpts) => void;
37
+ [PlaylistEvents.Set]: (item: ItemImpl, opts: LoadOpts) => void;
38
+ [PlaylistEvents.Clear]: () => void;
39
+ };
40
+ export declare class Playlist<ItemImpl extends PlaylistItemInterface> {
41
+ private emitter;
42
+ private items;
43
+ private current;
44
+ constructor(emitter: EventEmitter<PlaylistEventsMap<ItemImpl>>);
45
+ addItem(item: ItemImpl): void;
46
+ addItems(items: ItemImpl[]): void;
47
+ removeItem(item: ItemImpl): void;
48
+ setCurrent(item: ItemImpl, opts?: LoadOpts): void;
49
+ setNext(opts?: LoadOpts): ItemImpl | null;
50
+ setPrev(opts?: LoadOpts): ItemImpl | null;
51
+ getCurrent(): ItemImpl | null;
52
+ getNext(): ItemImpl | null;
53
+ getPrev(): ItemImpl | null;
54
+ rewind(): void;
55
+ clear(): void;
56
+ size(): number;
57
+ getItems(): ItemImpl[];
58
+ subscribe<K extends keyof PlaylistEventsMap<ItemImpl>>(ev: K, cb: PlaylistEventsMap<ItemImpl>[K]): void;
59
+ unsubscribe<K extends keyof PlaylistEventsMap<ItemImpl>>(ev: K, cb: PlaylistEventsMap<ItemImpl>[K]): void;
60
+ }