ts-video-player 0.1.0
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/LICENSE.md +21 -0
- package/README.md +438 -0
- package/dist/cdn.d.ts +10 -0
- package/dist/cdn.d.ts.map +1 -0
- package/dist/cdn.min.js +1046 -0
- package/dist/cdn.min.js.map +54 -0
- package/dist/cdn.test.d.ts +2 -0
- package/dist/cdn.test.d.ts.map +1 -0
- package/dist/chunk-36x4yhjn.js +765 -0
- package/dist/chunk-36x4yhjn.js.map +12 -0
- package/dist/chunk-eajts2jv.js +4243 -0
- package/dist/chunk-eajts2jv.js.map +42 -0
- package/dist/chunk-z1ehbz9f.js +380 -0
- package/dist/chunk-z1ehbz9f.js.map +19 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/core/audio-gain.d.ts +67 -0
- package/dist/core/audio-gain.d.ts.map +1 -0
- package/dist/core/caption-styles.d.ts +121 -0
- package/dist/core/caption-styles.d.ts.map +1 -0
- package/dist/core/chapters.d.ts +150 -0
- package/dist/core/chapters.d.ts.map +1 -0
- package/dist/core/error-overlay.d.ts +71 -0
- package/dist/core/error-overlay.d.ts.map +1 -0
- package/dist/core/events.d.ts +119 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/features.d.ts +64 -0
- package/dist/core/features.d.ts.map +1 -0
- package/dist/core/i18n.d.ts +132 -0
- package/dist/core/i18n.d.ts.map +1 -0
- package/dist/core/index.d.ts +37 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/live.d.ts +130 -0
- package/dist/core/live.d.ts.map +1 -0
- package/dist/core/media-session.d.ts +38 -0
- package/dist/core/media-session.d.ts.map +1 -0
- package/dist/core/orientation.d.ts +22 -0
- package/dist/core/orientation.d.ts.map +1 -0
- package/dist/core/popover.d.ts +42 -0
- package/dist/core/popover.d.ts.map +1 -0
- package/dist/core/remote-playback.d.ts +195 -0
- package/dist/core/remote-playback.d.ts.map +1 -0
- package/dist/core/settings-menu.d.ts +132 -0
- package/dist/core/settings-menu.d.ts.map +1 -0
- package/dist/core/spinner.d.ts +67 -0
- package/dist/core/spinner.d.ts.map +1 -0
- package/dist/core/state.d.ts +142 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/text-tracks.d.ts +162 -0
- package/dist/core/text-tracks.d.ts.map +1 -0
- package/dist/core/themes.d.ts +213 -0
- package/dist/core/themes.d.ts.map +1 -0
- package/dist/core/thumbnails.d.ts +124 -0
- package/dist/core/thumbnails.d.ts.map +1 -0
- package/dist/core/tooltips.d.ts +100 -0
- package/dist/core/tooltips.d.ts.map +1 -0
- package/dist/elements/base.d.ts +3 -0
- package/dist/elements/base.d.ts.map +1 -0
- package/dist/elements/index.d.ts +33 -0
- package/dist/elements/index.d.ts.map +1 -0
- package/dist/elements/index.js +55 -0
- package/dist/elements/index.js.map +9 -0
- package/dist/elements/media-airplay-button.d.ts +13 -0
- package/dist/elements/media-airplay-button.d.ts.map +1 -0
- package/dist/elements/media-error-display.d.ts +13 -0
- package/dist/elements/media-error-display.d.ts.map +1 -0
- package/dist/elements/media-fullscreen-button.d.ts +13 -0
- package/dist/elements/media-fullscreen-button.d.ts.map +1 -0
- package/dist/elements/media-live-button.d.ts +13 -0
- package/dist/elements/media-live-button.d.ts.map +1 -0
- package/dist/elements/media-mute-button.d.ts +13 -0
- package/dist/elements/media-mute-button.d.ts.map +1 -0
- package/dist/elements/media-pip-button.d.ts +13 -0
- package/dist/elements/media-pip-button.d.ts.map +1 -0
- package/dist/elements/media-play-button.d.ts +14 -0
- package/dist/elements/media-play-button.d.ts.map +1 -0
- package/dist/elements/media-playback-rate-button.d.ts +10 -0
- package/dist/elements/media-playback-rate-button.d.ts.map +1 -0
- package/dist/elements/media-preview-time.d.ts +18 -0
- package/dist/elements/media-preview-time.d.ts.map +1 -0
- package/dist/elements/media-progress-bar.d.ts +16 -0
- package/dist/elements/media-progress-bar.d.ts.map +1 -0
- package/dist/elements/media-remote-playback-button.d.ts +16 -0
- package/dist/elements/media-remote-playback-button.d.ts.map +1 -0
- package/dist/elements/media-seek-button.d.ts +9 -0
- package/dist/elements/media-seek-button.d.ts.map +1 -0
- package/dist/elements/media-settings-menu.d.ts +32 -0
- package/dist/elements/media-settings-menu.d.ts.map +1 -0
- package/dist/elements/media-time-display.d.ts +21 -0
- package/dist/elements/media-time-display.d.ts.map +1 -0
- package/dist/elements/media-time-group.d.ts +22 -0
- package/dist/elements/media-time-group.d.ts.map +1 -0
- package/dist/elements/media-time-separator.d.ts +13 -0
- package/dist/elements/media-time-separator.d.ts.map +1 -0
- package/dist/elements/media-volume-slider.d.ts +16 -0
- package/dist/elements/media-volume-slider.d.ts.map +1 -0
- package/dist/elements/utils.d.ts +27 -0
- package/dist/elements/utils.d.ts.map +1 -0
- package/dist/elements/video-player.d.ts +23 -0
- package/dist/elements/video-player.d.ts.map +1 -0
- package/dist/elements/video-skin.d.ts +23 -0
- package/dist/elements/video-skin.d.ts.map +1 -0
- package/dist/features/captions.d.ts +8 -0
- package/dist/features/captions.d.ts.map +1 -0
- package/dist/features/create-player.d.ts +45 -0
- package/dist/features/create-player.d.ts.map +1 -0
- package/dist/features/fullscreen.d.ts +8 -0
- package/dist/features/fullscreen.d.ts.map +1 -0
- package/dist/features/gestures.d.ts +8 -0
- package/dist/features/gestures.d.ts.map +1 -0
- package/dist/features/index.d.ts +26 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +31 -0
- package/dist/features/index.js.map +9 -0
- package/dist/features/keyboard.d.ts +8 -0
- package/dist/features/keyboard.d.ts.map +1 -0
- package/dist/features/pip.d.ts +8 -0
- package/dist/features/pip.d.ts.map +1 -0
- package/dist/features/playback.d.ts +8 -0
- package/dist/features/playback.d.ts.map +1 -0
- package/dist/features/quality.d.ts +8 -0
- package/dist/features/quality.d.ts.map +1 -0
- package/dist/features/types.d.ts +26 -0
- package/dist/features/types.d.ts.map +1 -0
- package/dist/features/volume.d.ts +8 -0
- package/dist/features/volume.d.ts.map +1 -0
- package/dist/index.d.ts +84 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8149 -0
- package/dist/index.js.map +31 -0
- package/dist/layouts/index.d.ts +58 -0
- package/dist/layouts/index.d.ts.map +1 -0
- package/dist/player.d.ts +90 -0
- package/dist/player.d.ts.map +1 -0
- package/dist/plugins/ads.d.ts +311 -0
- package/dist/plugins/ads.d.ts.map +1 -0
- package/dist/plugins/analytics.d.ts +203 -0
- package/dist/plugins/analytics.d.ts.map +1 -0
- package/dist/plugins/end-screen.d.ts +184 -0
- package/dist/plugins/end-screen.d.ts.map +1 -0
- package/dist/plugins/index.d.ts +13 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +20 -0
- package/dist/plugins/index.js.map +9 -0
- package/dist/plugins/skip-segments.d.ts +159 -0
- package/dist/plugins/skip-segments.d.ts.map +1 -0
- package/dist/plugins/watermark.d.ts +157 -0
- package/dist/plugins/watermark.d.ts.map +1 -0
- package/dist/providers/base.d.ts +56 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/dash.d.ts +94 -0
- package/dist/providers/dash.d.ts.map +1 -0
- package/dist/providers/hls.d.ts +182 -0
- package/dist/providers/hls.d.ts.map +1 -0
- package/dist/providers/html5.d.ts +64 -0
- package/dist/providers/html5.d.ts.map +1 -0
- package/dist/providers/index.d.ts +41 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/vimeo.d.ts +157 -0
- package/dist/providers/vimeo.d.ts.map +1 -0
- package/dist/providers/youtube.d.ts +134 -0
- package/dist/providers/youtube.d.ts.map +1 -0
- package/dist/stx/index.d.ts +59 -0
- package/dist/stx/index.d.ts.map +1 -0
- package/dist/stx/index.js +480 -0
- package/dist/stx/index.js.map +11 -0
- package/dist/types.d.ts +724 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/ui/components.d.ts +121 -0
- package/dist/ui/components.d.ts.map +1 -0
- package/dist/ui/index.d.ts +9 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +16 -0
- package/dist/ui/index.js.map +9 -0
- package/package.json +109 -0
- package/src/cdn.test.ts +10 -0
- package/src/cdn.ts +60 -0
- package/src/config.ts +25 -0
- package/src/core/audio-gain.ts +171 -0
- package/src/core/caption-styles.ts +568 -0
- package/src/core/chapters.ts +551 -0
- package/src/core/error-overlay.ts +354 -0
- package/src/core/events.ts +552 -0
- package/src/core/features.ts +287 -0
- package/src/core/i18n.ts +590 -0
- package/src/core/index.ts +249 -0
- package/src/core/live.ts +472 -0
- package/src/core/media-session.ts +137 -0
- package/src/core/orientation.ts +57 -0
- package/src/core/popover.ts +143 -0
- package/src/core/remote-playback.ts +661 -0
- package/src/core/settings-menu.ts +630 -0
- package/src/core/spinner.ts +310 -0
- package/src/core/state.ts +476 -0
- package/src/core/text-tracks.ts +599 -0
- package/src/core/themes.ts +607 -0
- package/src/core/thumbnails.ts +457 -0
- package/src/core/tooltips.ts +370 -0
- package/src/elements/base.ts +2 -0
- package/src/elements/index.ts +82 -0
- package/src/elements/media-airplay-button.ts +78 -0
- package/src/elements/media-error-display.ts +47 -0
- package/src/elements/media-fullscreen-button.ts +72 -0
- package/src/elements/media-live-button.ts +65 -0
- package/src/elements/media-mute-button.ts +69 -0
- package/src/elements/media-pip-button.ts +66 -0
- package/src/elements/media-play-button.ts +69 -0
- package/src/elements/media-playback-rate-button.ts +59 -0
- package/src/elements/media-preview-time.ts +75 -0
- package/src/elements/media-progress-bar.ts +200 -0
- package/src/elements/media-remote-playback-button.ts +108 -0
- package/src/elements/media-seek-button.ts +50 -0
- package/src/elements/media-settings-menu.ts +302 -0
- package/src/elements/media-time-display.ts +99 -0
- package/src/elements/media-time-group.ts +41 -0
- package/src/elements/media-time-separator.ts +35 -0
- package/src/elements/media-volume-slider.ts +140 -0
- package/src/elements/utils.ts +82 -0
- package/src/elements/video-player.ts +175 -0
- package/src/elements/video-skin.ts +127 -0
- package/src/features/captions.ts +56 -0
- package/src/features/create-player.ts +91 -0
- package/src/features/fullscreen.ts +44 -0
- package/src/features/gestures.ts +44 -0
- package/src/features/index.ts +44 -0
- package/src/features/keyboard.ts +89 -0
- package/src/features/pip.ts +47 -0
- package/src/features/playback.ts +68 -0
- package/src/features/quality.ts +19 -0
- package/src/features/types.ts +28 -0
- package/src/features/volume.ts +46 -0
- package/src/index.ts +635 -0
- package/src/layouts/index.ts +672 -0
- package/src/player.ts +821 -0
- package/src/plugins/ads.ts +1045 -0
- package/src/plugins/analytics.ts +673 -0
- package/src/plugins/end-screen.ts +793 -0
- package/src/plugins/index.ts +61 -0
- package/src/plugins/skip-segments.ts +537 -0
- package/src/plugins/watermark.ts +537 -0
- package/src/providers/base.ts +197 -0
- package/src/providers/dash.ts +588 -0
- package/src/providers/hls.ts +624 -0
- package/src/providers/html5.ts +473 -0
- package/src/providers/index.ts +97 -0
- package/src/providers/vimeo.ts +533 -0
- package/src/providers/youtube.ts +542 -0
- package/src/stx/index.ts +606 -0
- package/src/types.ts +874 -0
- package/src/ui/components.ts +910 -0
- package/src/ui/index.ts +29 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ts-video-player Base Provider
|
|
3
|
+
*
|
|
4
|
+
* Abstract base class for media providers.
|
|
5
|
+
*
|
|
6
|
+
* @module providers/base
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type {
|
|
10
|
+
Provider,
|
|
11
|
+
ProviderType,
|
|
12
|
+
Src,
|
|
13
|
+
PlayerOptions,
|
|
14
|
+
ProviderEventMap,
|
|
15
|
+
VideoQuality,
|
|
16
|
+
AudioTrack,
|
|
17
|
+
TextTrack,
|
|
18
|
+
MediaError,
|
|
19
|
+
FeatureAvailability,
|
|
20
|
+
} from '../types'
|
|
21
|
+
import { EventEmitter } from '../core/events'
|
|
22
|
+
import {
|
|
23
|
+
detectVolumeAvailability,
|
|
24
|
+
detectFullscreenAvailability,
|
|
25
|
+
detectPipAvailability,
|
|
26
|
+
enterFullscreen as fsEnter,
|
|
27
|
+
exitFullscreen as fsExit,
|
|
28
|
+
enterPiP as pipEnter,
|
|
29
|
+
exitPiP as pipExit,
|
|
30
|
+
} from '../core/features'
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Abstract base provider implementation
|
|
34
|
+
*/
|
|
35
|
+
export abstract class BaseProvider implements Provider {
|
|
36
|
+
abstract readonly name: string
|
|
37
|
+
abstract readonly type: ProviderType
|
|
38
|
+
|
|
39
|
+
protected container: HTMLElement | null = null
|
|
40
|
+
protected options: PlayerOptions = {}
|
|
41
|
+
protected events: EventEmitter<ProviderEventMap> = new EventEmitter<ProviderEventMap>()
|
|
42
|
+
protected _ready = false
|
|
43
|
+
|
|
44
|
+
get mediaElement(): HTMLVideoElement | HTMLAudioElement | HTMLIFrameElement | null {
|
|
45
|
+
return null
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
get ready(): boolean {
|
|
49
|
+
return this._ready
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// === Lifecycle ===
|
|
53
|
+
|
|
54
|
+
async setup(container: HTMLElement, options: PlayerOptions): Promise<void> {
|
|
55
|
+
this.container = container
|
|
56
|
+
this.options = options
|
|
57
|
+
await this.initialize()
|
|
58
|
+
this._ready = true
|
|
59
|
+
this.events.emit('ready')
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
protected abstract initialize(): Promise<void>
|
|
63
|
+
|
|
64
|
+
destroy(): void {
|
|
65
|
+
this._ready = false
|
|
66
|
+
this.cleanup()
|
|
67
|
+
this.events.removeAllListeners()
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
protected abstract cleanup(): void
|
|
71
|
+
|
|
72
|
+
// === Loading ===
|
|
73
|
+
|
|
74
|
+
abstract load(src: Src | Src[]): Promise<void>
|
|
75
|
+
abstract canPlay(src: Src): boolean
|
|
76
|
+
|
|
77
|
+
// === Playback ===
|
|
78
|
+
|
|
79
|
+
abstract play(): Promise<void>
|
|
80
|
+
abstract pause(): void
|
|
81
|
+
|
|
82
|
+
stop(): void {
|
|
83
|
+
this.pause()
|
|
84
|
+
this.seekTo(0)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// === Seeking ===
|
|
88
|
+
|
|
89
|
+
abstract seekTo(time: number): void
|
|
90
|
+
abstract getCurrentTime(): number
|
|
91
|
+
abstract getDuration(): number
|
|
92
|
+
|
|
93
|
+
// === Volume ===
|
|
94
|
+
|
|
95
|
+
abstract setVolume(volume: number): void
|
|
96
|
+
abstract getVolume(): number
|
|
97
|
+
abstract setMuted(muted: boolean): void
|
|
98
|
+
abstract getMuted(): boolean
|
|
99
|
+
|
|
100
|
+
// === Playback Rate ===
|
|
101
|
+
|
|
102
|
+
abstract setPlaybackRate(rate: number): void
|
|
103
|
+
abstract getPlaybackRate(): number
|
|
104
|
+
|
|
105
|
+
// === Quality ===
|
|
106
|
+
|
|
107
|
+
getQualities(): VideoQuality[] {
|
|
108
|
+
return []
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
setQuality(_quality: VideoQuality | 'auto'): void {
|
|
112
|
+
// Override in subclass if supported
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// === Tracks ===
|
|
116
|
+
|
|
117
|
+
getTextTracks(): TextTrack[] {
|
|
118
|
+
return []
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
setTextTrackMode(_trackId: string, _mode: 'disabled' | 'hidden' | 'showing'): void {
|
|
122
|
+
// Override in subclass if supported
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
getAudioTracks(): AudioTrack[] {
|
|
126
|
+
return []
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
setAudioTrack(_trackId: string): void {
|
|
130
|
+
// Override in subclass if supported
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// === Feature Availability ===
|
|
134
|
+
|
|
135
|
+
getFeatureAvailability(feature: 'volume' | 'fullscreen' | 'pip'): FeatureAvailability {
|
|
136
|
+
// Only pass media element if it's actually an HTMLMediaElement (not an iframe)
|
|
137
|
+
const el = this.mediaElement
|
|
138
|
+
const media = el instanceof HTMLMediaElement ? el : null
|
|
139
|
+
const video = el instanceof HTMLVideoElement ? el : null
|
|
140
|
+
|
|
141
|
+
switch (feature) {
|
|
142
|
+
case 'volume':
|
|
143
|
+
// Iframe providers (YouTube/Vimeo) handle volume via their own API
|
|
144
|
+
return el && !(el instanceof HTMLMediaElement) ? 'available' : detectVolumeAvailability(media)
|
|
145
|
+
case 'fullscreen':
|
|
146
|
+
return detectFullscreenAvailability(this.container, video)
|
|
147
|
+
case 'pip':
|
|
148
|
+
// PiP is not available for iframe embeds
|
|
149
|
+
return el && !(el instanceof HTMLMediaElement) ? 'unsupported' : detectPipAvailability(video)
|
|
150
|
+
default:
|
|
151
|
+
return 'unsupported'
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// === Fullscreen ===
|
|
156
|
+
|
|
157
|
+
async enterFullscreen(): Promise<void> {
|
|
158
|
+
await fsEnter(this.container, this.mediaElement as HTMLMediaElement | null)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
async exitFullscreen(): Promise<void> {
|
|
162
|
+
await fsExit(this.mediaElement as HTMLMediaElement | null)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
protected getFullscreenElement(): HTMLElement | null {
|
|
166
|
+
return this.container
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// === Picture-in-Picture ===
|
|
170
|
+
|
|
171
|
+
async enterPiP(): Promise<void> {
|
|
172
|
+
const media = this.mediaElement as HTMLMediaElement | null
|
|
173
|
+
if (!media) return
|
|
174
|
+
await pipEnter(media)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
async exitPiP(): Promise<void> {
|
|
178
|
+
await pipExit(this.mediaElement as HTMLMediaElement | null)
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// === Events ===
|
|
182
|
+
|
|
183
|
+
on<K extends keyof ProviderEventMap>(event: K, handler: ProviderEventMap[K]): void {
|
|
184
|
+
this.events.on(event, handler)
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
off<K extends keyof ProviderEventMap>(event: K, handler: ProviderEventMap[K]): void {
|
|
188
|
+
this.events.off(event, handler)
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// === Helpers ===
|
|
192
|
+
|
|
193
|
+
protected emitError(code: number, message: string, details?: unknown): void {
|
|
194
|
+
const error: MediaError = { code, message, details }
|
|
195
|
+
this.events.emit('error', error)
|
|
196
|
+
}
|
|
197
|
+
}
|