@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
@@ -0,0 +1,141 @@
1
+ import { HybridDoublyLinkedList, DoublyListNode as ListNode } from '../HybridDoublyLinkedList.js';
2
+ export class PlaylistItem {
3
+ title;
4
+ url;
5
+ loader;
6
+ constructor(title, url, loader) {
7
+ this.title = title;
8
+ this.url = url;
9
+ this.loader = loader;
10
+ }
11
+ async getUrl(signal) {
12
+ return Promise.resolve(this.url);
13
+ }
14
+ getLoadParams(opts) {
15
+ if (this.loader) {
16
+ return {
17
+ url: this.url,
18
+ getUrlCb: this.getUrl.bind(this),
19
+ loader: this.loader
20
+ };
21
+ }
22
+ return null;
23
+ }
24
+ }
25
+ export var PlaylistEvents;
26
+ (function (PlaylistEvents) {
27
+ PlaylistEvents["ItemAdded"] = "playlist.ItemAdded";
28
+ PlaylistEvents["ItemRemoved"] = "playlist.ItemRemoved";
29
+ PlaylistEvents["Rewind"] = "playlist.Rewind";
30
+ PlaylistEvents["SetNext"] = "playlist.SetNext";
31
+ PlaylistEvents["SetPrev"] = "playlist.SetPrev";
32
+ PlaylistEvents["Set"] = "playlist.Set";
33
+ PlaylistEvents["BeforeSet"] = "playlist.BeforeSet";
34
+ PlaylistEvents["Clear"] = "playlist.Clear";
35
+ })(PlaylistEvents || (PlaylistEvents = {}));
36
+ export class Playlist {
37
+ emitter;
38
+ items = new HybridDoublyLinkedList();
39
+ current = null;
40
+ constructor(emitter) {
41
+ this.emitter = emitter;
42
+ }
43
+ addItem(item) {
44
+ this.items.append(item);
45
+ this.emitter.emit(PlaylistEvents.ItemAdded, item);
46
+ }
47
+ addItems(items) {
48
+ for (const item of items) {
49
+ this.addItem(item);
50
+ }
51
+ }
52
+ removeItem(item) {
53
+ this.items.remove(item);
54
+ this.emitter.emit(PlaylistEvents.ItemRemoved, item);
55
+ }
56
+ setCurrent(item, opts) {
57
+ const foundNode = this.items.find(item);
58
+ if (!foundNode) {
59
+ throw Error('Playlist item not found');
60
+ }
61
+ // Nothing was changed
62
+ if (foundNode.data === item) {
63
+ return;
64
+ }
65
+ this.current = foundNode;
66
+ // Gives an ability to modify opts
67
+ opts = opts ?? {};
68
+ this.emitter.emit(PlaylistEvents.BeforeSet, foundNode.data, opts);
69
+ this.emitter.emit(PlaylistEvents.Set, foundNode.data, opts);
70
+ }
71
+ setNext(opts) {
72
+ let next;
73
+ if (this.current === null) {
74
+ next = this.items.head();
75
+ }
76
+ else {
77
+ next = this.current.next;
78
+ }
79
+ if (next === null) {
80
+ return null;
81
+ }
82
+ this.current = next;
83
+ // Gives an ability to modify opts
84
+ opts = opts ?? {};
85
+ this.emitter.emit(PlaylistEvents.BeforeSet, next.data, opts);
86
+ this.emitter.emit(PlaylistEvents.SetNext, next.data, opts);
87
+ this.emitter.emit(PlaylistEvents.Set, next.data, opts);
88
+ return next.data;
89
+ }
90
+ setPrev(opts) {
91
+ let prev;
92
+ if (this.current === null) {
93
+ prev = this.items.head();
94
+ }
95
+ else {
96
+ prev = this.current.prev;
97
+ }
98
+ if (prev === null) {
99
+ return null;
100
+ }
101
+ this.current = prev;
102
+ // Gives an ability to modify opts
103
+ opts = opts ?? {};
104
+ this.emitter.emit(PlaylistEvents.BeforeSet, prev.data, opts);
105
+ this.emitter.emit(PlaylistEvents.SetPrev, prev.data, opts);
106
+ this.emitter.emit(PlaylistEvents.Set, prev.data, opts);
107
+ return prev.data;
108
+ }
109
+ getCurrent() {
110
+ return this.current?.data ?? null;
111
+ }
112
+ getNext() {
113
+ const current = this.current;
114
+ return current?.next?.data ?? null;
115
+ }
116
+ getPrev() {
117
+ const current = this.current;
118
+ return current?.prev?.data ?? null;
119
+ }
120
+ rewind() {
121
+ this.current = null;
122
+ this.emitter.emit(PlaylistEvents.Rewind);
123
+ }
124
+ clear() {
125
+ this.current = null;
126
+ this.items = new HybridDoublyLinkedList();
127
+ this.emitter.emit(PlaylistEvents.Clear);
128
+ }
129
+ size() {
130
+ return this.items.getSize();
131
+ }
132
+ getItems() {
133
+ return this.items.toArray();
134
+ }
135
+ subscribe(ev, cb) {
136
+ this.emitter.on(ev, cb);
137
+ }
138
+ unsubscribe(ev, cb) {
139
+ this.emitter.off(ev, cb);
140
+ }
141
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Playlist.js","sourceRoot":"","sources":["Playlist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { VideoPlayer, type VideoPlayerEventsMap } from './VideoPlayer';
2
+ import { type LoadOpts, Playlist, type PlaylistEventsMap, type PlaylistItemInterface } from './Playlist';
3
+ export declare enum PlaylistPlayerEvents {
4
+ PlaylistItemLoading = "playlistPlayer.itemLoading",
5
+ PlaylistItemLoaded = "playlistPlayer.itemLoaded",
6
+ PlaylistItemLoadingFailed = "playlistPlayer.itemLoadingFailed"
7
+ }
8
+ export type PlaylistPlayerEventsMap<ItemImpl extends PlaylistItemInterface> = {
9
+ [PlaylistPlayerEvents.PlaylistItemLoading]: (item: ItemImpl, opts?: LoadOpts) => void;
10
+ [PlaylistPlayerEvents.PlaylistItemLoaded]: (item: ItemImpl, opts?: LoadOpts) => void;
11
+ [PlaylistPlayerEvents.PlaylistItemLoadingFailed]: (item: ItemImpl, err: Error) => void;
12
+ } & PlaylistEventsMap<ItemImpl> & VideoPlayerEventsMap;
13
+ export interface PlaylistPlayerOpts {
14
+ autoPlayOnSet?: boolean;
15
+ }
16
+ export declare class PlaylistPlayer<ItemImpl extends PlaylistItemInterface> {
17
+ private emitter;
18
+ readonly playlist: Playlist<ItemImpl>;
19
+ readonly player: VideoPlayer;
20
+ protected readonly opts: PlaylistPlayerOpts;
21
+ constructor(el: HTMLVideoElement, opts?: PlaylistPlayerOpts);
22
+ private _handleHTMLPlayEvent;
23
+ private _loadPlaylistItem;
24
+ togglePlay(opts?: LoadOpts): Promise<void>;
25
+ play(opts?: LoadOpts): Promise<void>;
26
+ pause(): void;
27
+ subscribe<K extends keyof PlaylistPlayerEventsMap<ItemImpl>>(ev: K, cb: PlaylistPlayerEventsMap<ItemImpl>[K]): void;
28
+ unsubscribe<K extends keyof PlaylistPlayerEventsMap<ItemImpl>>(ev: K, cb: PlaylistPlayerEventsMap<ItemImpl>[K]): void;
29
+ }
@@ -0,0 +1,82 @@
1
+ import { PlayerEvents, VideoPlayer } from './VideoPlayer';
2
+ import { Playlist, PlaylistEvents } from './Playlist';
3
+ import { EventEmitter } from 'eventemitter3';
4
+ export var PlaylistPlayerEvents;
5
+ (function (PlaylistPlayerEvents) {
6
+ PlaylistPlayerEvents["PlaylistItemLoading"] = "playlistPlayer.itemLoading";
7
+ PlaylistPlayerEvents["PlaylistItemLoaded"] = "playlistPlayer.itemLoaded";
8
+ PlaylistPlayerEvents["PlaylistItemLoadingFailed"] = "playlistPlayer.itemLoadingFailed";
9
+ })(PlaylistPlayerEvents || (PlaylistPlayerEvents = {}));
10
+ export class PlaylistPlayer {
11
+ emitter = new EventEmitter();
12
+ // @ts-ignore
13
+ playlist = new Playlist(this.emitter);
14
+ player;
15
+ opts;
16
+ constructor(el, opts) {
17
+ // @ts-ignore
18
+ this.player = new VideoPlayer(el, this.emitter);
19
+ this.opts = opts ?? {};
20
+ this.emitter.on(PlaylistEvents.Set, async (item, opts) => {
21
+ await this._loadPlaylistItem(item, opts);
22
+ if (this.opts.autoPlayOnSet) {
23
+ await this.player.play();
24
+ }
25
+ });
26
+ // Handle native play event
27
+ this.emitter.on(PlayerEvents.Play, this._handleHTMLPlayEvent, this);
28
+ }
29
+ async _handleHTMLPlayEvent() {
30
+ if (this.playlist.getCurrent()) {
31
+ return;
32
+ }
33
+ await this.play();
34
+ }
35
+ async _loadPlaylistItem(item, opts) {
36
+ this.emitter.emit(PlaylistPlayerEvents.PlaylistItemLoading, item);
37
+ const loadParams = item.getLoadParams(opts);
38
+ try {
39
+ if (loadParams) {
40
+ await this.player.load(loadParams);
41
+ }
42
+ else {
43
+ await this.player.load({
44
+ url: '',
45
+ getUrlCb: item.getUrl.bind(item)
46
+ });
47
+ }
48
+ }
49
+ catch (e) {
50
+ console.error('playlist item loading failed', item, e);
51
+ this.emitter.emit(PlaylistPlayerEvents.PlaylistItemLoadingFailed, item, e);
52
+ return;
53
+ }
54
+ this.emitter.emit(PlaylistPlayerEvents.PlaylistItemLoaded, item);
55
+ }
56
+ async togglePlay(opts) {
57
+ if (!this.playlist.getCurrent()) {
58
+ return this.play(opts);
59
+ }
60
+ await this.player.togglePlay();
61
+ }
62
+ async play(opts) {
63
+ if (!this.playlist.getCurrent()) {
64
+ const next = this.playlist.setNext(opts);
65
+ if (!next) {
66
+ throw Error('Empty playlist');
67
+ }
68
+ // Play will happen on playlist.set event
69
+ return;
70
+ }
71
+ await this.player.play();
72
+ }
73
+ pause() {
74
+ this.player.pause();
75
+ }
76
+ subscribe(ev, cb) {
77
+ this.emitter.on(ev, cb);
78
+ }
79
+ unsubscribe(ev, cb) {
80
+ this.emitter.off(ev, cb);
81
+ }
82
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaylistPlayer.js","sourceRoot":"","sources":["PlaylistPlayer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface QualityLevel {
2
+ readonly id: number;
3
+ readonly width: number;
4
+ readonly height: number;
5
+ readonly bitrate: number;
6
+ readonly loaderData: object;
7
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QualityLevel.js","sourceRoot":"","sources":["QualityLevel.ts"],"names":[],"mappings":""}
@@ -0,0 +1,104 @@
1
+ import { EventEmitter } from 'eventemitter3';
2
+ import { HLSLoader } from './HLSLoader.js';
3
+ import type { GetUrlCb, LoaderEventsMap, LoaderInterface } from './LoaderInterface.js';
4
+ import type { QualityLevel } from './QualityLevel';
5
+ export declare enum PlayerEvents {
6
+ Play = "player.play",
7
+ Pause = "player.pause",
8
+ Ended = "player.ended",
9
+ Error = "player.error",
10
+ Playing = "player.playing",
11
+ LoadingStarted = "player.loadingStarted",
12
+ LoadingEnded = "player.loadingEnded",
13
+ PlaybackBufferingProgress = "player.bufferingProgress",
14
+ PlaybackDurationChange = "player.durationChange",
15
+ PlaybackTimeUpdate = "player.timeUpdate",
16
+ PlaybackRateChange = "player.playbackRateChange",
17
+ VolumeChange = "player.volumeChange",
18
+ MuteChange = "player.muteChange",
19
+ VolumeStateChange = "player.volumeStateChange",
20
+ QualityLevelsUpdated = "player.qualityLevelsUpdated",
21
+ QualityLevelSwitched = "player.qualityLevelSwitched"
22
+ }
23
+ export type VideoPlayerEventsMap = {
24
+ [PlayerEvents.Play]: () => void;
25
+ [PlayerEvents.Pause]: () => void;
26
+ [PlayerEvents.Ended]: () => void;
27
+ [PlayerEvents.Error]: (error: string) => void;
28
+ [PlayerEvents.Playing]: () => void;
29
+ [PlayerEvents.LoadingStarted]: () => void;
30
+ [PlayerEvents.LoadingEnded]: () => void;
31
+ [PlayerEvents.PlaybackBufferingProgress]: (buffered: Array<BufferedPart>) => void;
32
+ [PlayerEvents.PlaybackDurationChange]: (duration: number) => void;
33
+ [PlayerEvents.PlaybackTimeUpdate]: (currentTime: number) => void;
34
+ [PlayerEvents.PlaybackRateChange]: (rate: number) => void;
35
+ [PlayerEvents.VolumeChange]: (volume: number) => void;
36
+ [PlayerEvents.MuteChange]: (muted: boolean) => void;
37
+ [PlayerEvents.VolumeStateChange]: (volume: number, muted: boolean) => void;
38
+ [PlayerEvents.QualityLevelsUpdated]: (levels: QualityLevel[]) => void;
39
+ [PlayerEvents.QualityLevelSwitched]: (level: QualityLevel) => void;
40
+ } & LoaderEventsMap;
41
+ export declare enum PlayerActions {
42
+ PlayItem = "player.playItem"
43
+ }
44
+ export declare enum Loader {
45
+ Native = 0,
46
+ HLS = 1,
47
+ DASH = 2
48
+ }
49
+ export interface PlayerLoadParams {
50
+ readonly url: string | Promise<string>;
51
+ readonly getUrlCb?: GetUrlCb;
52
+ readonly startPosition?: number;
53
+ readonly audioTrack?: number;
54
+ readonly startLevel?: number;
55
+ readonly loader?: Loader;
56
+ readonly playAfterLoad?: boolean;
57
+ }
58
+ export type BufferedPart = {
59
+ start: number;
60
+ end: number;
61
+ };
62
+ export declare class VideoPlayer {
63
+ protected el: HTMLVideoElement;
64
+ protected emitter: EventEmitter<VideoPlayerEventsMap>;
65
+ protected loadAbortController: AbortController | null;
66
+ protected currentLoader: LoaderInterface | null;
67
+ protected hlsLoader: HLSLoader | null;
68
+ protected _isLoading: boolean;
69
+ protected _duration: number;
70
+ protected _paused: boolean;
71
+ protected _currentTime: number;
72
+ protected _playbackRate: number;
73
+ protected _muted: boolean;
74
+ protected _volume: number;
75
+ protected _buffered: Array<BufferedPart>;
76
+ protected _isAutoQuality: boolean;
77
+ protected _currentQualityLevel: QualityLevel | null;
78
+ protected _qualityLevels: Array<QualityLevel>;
79
+ constructor(el: HTMLVideoElement, emitter?: EventEmitter<VideoPlayerEventsMap, any>);
80
+ private _registerVideoEvents;
81
+ private _onPause;
82
+ private _onProgress;
83
+ private _onLoaded;
84
+ load(params: PlayerLoadParams): Promise<void>;
85
+ togglePlay(): Promise<void>;
86
+ play(): Promise<void>;
87
+ pause(): void;
88
+ seekTo(pos: number): void;
89
+ setQualityLevel(id: number, graceful: boolean): void;
90
+ setAutoQualityLevel(graceful: boolean): void;
91
+ subscribe<K extends keyof VideoPlayerEventsMap>(ev: K, cb: VideoPlayerEventsMap[K]): void;
92
+ unsubscribe<K extends keyof VideoPlayerEventsMap>(ev: K, cb: VideoPlayerEventsMap[K]): void;
93
+ get isLoading(): boolean;
94
+ get qualityLevels(): QualityLevel[];
95
+ get isAutoQuality(): boolean;
96
+ get qualityLevel(): QualityLevel | null;
97
+ get duration(): number;
98
+ get paused(): boolean;
99
+ get currentTime(): number;
100
+ get buffered(): BufferedPart[];
101
+ get playbackRate(): number;
102
+ get volume(): number;
103
+ get muted(): boolean;
104
+ }