@video-lab/vue 1.0.1 → 2.0.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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @video-lab/vue
2
2
 
3
- Video Lab Player 的 **Vue 3 inline** 接入方式:直连播放内核,不走 iframe,首帧最快。
3
+ Video Lab Player 的 Vue 3 inline 接入方式:直连播放核心,不经过 iframe,首帧开销最低。
4
4
 
5
5
  ## 什么时候用它
6
6
 
@@ -9,7 +9,7 @@ Video Lab Player 的 **Vue 3 inline** 接入方式:直连播放内核,不走 ifr
9
9
  | Vue 项目,要最快首帧 / 最低开销 | **本包**(inline) |
10
10
  | Vue 项目,要沙箱隔离、或宿主是 SSR 框架 | `@video-lab/vue-frame`(iframe) |
11
11
  | React 项目 | `@video-lab/react` / `@video-lab/react-frame` |
12
- | CMS / Markdown 里嵌一段 | 静态 iframe URL(见 USER-GUIDE) |
12
+ | CMS / Markdown 中嵌入播放器 | 使用静态 iframe,并向项目维护团队获取接入信息 |
13
13
 
14
14
  inline 把播放内核打进你的产物(约 300KB gz,含 xgplayer + hls.js + flv.js);
15
15
  iframe 薄壳只有约 22KB,内核在 iframe 里。**这是两者唯一的实质取舍。**
@@ -20,7 +20,9 @@ iframe 薄壳只有约 22KB,内核在 iframe 里。**这是两者唯一的实质
20
20
  pnpm add @video-lab/vue
21
21
  ```
22
22
 
23
- peer:`vue >= 3.5`。
23
+ peer: `vue ^3.4.0`(支持 Vue 3.4 / 3.5,最低 3.4.0)。
24
+
25
+ 宿主无需升级 Vue 或相关工具链;组件复用宿主 Vue,不内嵌第二份运行时。
24
26
 
25
27
  ## 用法
26
28
 
@@ -46,7 +48,7 @@ function onError(err: PlayerError) {
46
48
  <div style="width: 100%; aspect-ratio: 16 / 9">
47
49
  <VideoPlayer
48
50
  ref="player"
49
- source="https://cdn.example.com/a.m3u8"
51
+ source="https://media.example.com/live.m3u8"
50
52
  muted
51
53
  playsinline
52
54
  @ready="onReady"
@@ -69,11 +71,11 @@ Vue 编译器不参与。
69
71
 
70
72
  ## 边界
71
73
 
72
- - 只做技术:播放、事件、命令、容错。**团队品牌 UI 归业务封装层**(ADR-021)
73
- - 不发业务 HTTP 请求;认证只接受**签名 URL**(ADR-022)
74
- - 不做 DASH / PlayReady(ADR-014)
74
+ - 只提供技术能力:播放、事件、命令与容错;品牌 UI 由消费应用提供。
75
+ - 不发业务 HTTP 请求;认证只接受**签名 URL**。
76
+ - 不提供 DASH PlayReady
75
77
 
76
78
  ## 相关
77
79
 
78
- - 五种接入方式与完整 API 请联系项目维护团队获取内部使用手册。
79
- - Vue inline 的架构背景请联系项目维护团队获取。
80
+ - 完整 API 与接入方式请向项目维护团队获取。
81
+ - 契约定义:[ `@video-lab/protocol` ](https://www.npmjs.com/package/@video-lab/protocol)
@@ -3,7 +3,15 @@ declare var __VLS_5: {};
3
3
  type __VLS_Slots = {} & {
4
4
  'ssr-placeholder'?: (props: typeof __VLS_5) => any;
5
5
  };
6
- declare const __VLS_component: import('vue').DefineComponent<VideoPlayerProps, {
6
+ declare const __VLS_component: import('vue').DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToOption<VideoPlayerProps>, {
7
+ autoplay: undefined;
8
+ muted: undefined;
9
+ loop: undefined;
10
+ controls: undefined;
11
+ interactive: undefined;
12
+ playsinline: undefined;
13
+ debug: undefined;
14
+ }>, {
7
15
  play(): Promise<void>;
8
16
  pause(): void;
9
17
  seek(time: number): void;
@@ -26,11 +34,831 @@ declare const __VLS_component: import('vue').DefineComponent<VideoPlayerProps, {
26
34
  getDuration(): number;
27
35
  getPlaybackContext(): import('@video-lab/protocol').PlaybackContext | null;
28
36
  getPlayerHandle(): import('./types').PlayerHandle | null;
29
- }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
30
- [x: string]: any;
31
- }, string, import('vue').PublicProps, Readonly<VideoPlayerProps> & Readonly<{
32
- [x: `on${Capitalize<any>}`]: ((...args: any) => any) | undefined;
33
- }>, {
37
+ }, unknown, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
38
+ playerEvent: (payload: {
39
+ event: "sourceroute";
40
+ payload: {
41
+ outcome: "selected";
42
+ sessionId: string;
43
+ candidateTypes: ("mp4" | "hls" | "flv")[];
44
+ streamKind: "live" | "vod";
45
+ runtime: {
46
+ platform: "unknown" | "ios" | "android" | "desktop";
47
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
48
+ mse: "standard" | "managed" | "unavailable";
49
+ };
50
+ mediaType: "mp4" | "hls" | "flv";
51
+ kernel: "native" | "hls.js" | "flv.js";
52
+ reason: "required_hls" | "live_preference" | "vod_preference" | "native_mp4_fallback";
53
+ } | {
54
+ outcome: "unsupported";
55
+ sessionId: string;
56
+ candidateTypes: ("mp4" | "hls" | "flv")[];
57
+ streamKind: "live" | "vod";
58
+ runtime: {
59
+ platform: "unknown" | "ios" | "android" | "desktop";
60
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
61
+ mse: "standard" | "managed" | "unavailable";
62
+ };
63
+ mediaType: null;
64
+ kernel: null;
65
+ reason: "no_supported_candidate";
66
+ errorCode: "E_MEDIA_NOT_SUPPORTED";
67
+ };
68
+ } | {
69
+ event: "ready";
70
+ payload: {
71
+ duration: number;
72
+ quality: {
73
+ level: number;
74
+ label?: string | undefined;
75
+ height?: number | undefined;
76
+ bitrate?: number | undefined;
77
+ }[];
78
+ subtitles?: {
79
+ locale: string;
80
+ label: string;
81
+ id: number;
82
+ }[] | undefined;
83
+ };
84
+ } | {
85
+ event: "play";
86
+ payload: {};
87
+ } | {
88
+ event: "pause";
89
+ payload: {};
90
+ } | {
91
+ event: "ended";
92
+ payload: {};
93
+ } | {
94
+ event: "timeupdate";
95
+ payload: {
96
+ duration: number;
97
+ time: number;
98
+ };
99
+ } | {
100
+ event: "volumechange";
101
+ payload: {
102
+ muted: boolean;
103
+ volume: number;
104
+ };
105
+ } | {
106
+ event: "seeking";
107
+ payload: {
108
+ time: number;
109
+ };
110
+ } | {
111
+ event: "seeked";
112
+ payload: {
113
+ time: number;
114
+ };
115
+ } | {
116
+ event: "waiting";
117
+ payload: {};
118
+ } | {
119
+ event: "playing";
120
+ payload: {};
121
+ } | {
122
+ event: "qualitychange";
123
+ payload: {
124
+ auto: boolean;
125
+ level: number;
126
+ };
127
+ } | {
128
+ event: "subtitlechange";
129
+ payload: {
130
+ id: number | null;
131
+ };
132
+ } | {
133
+ event: "error";
134
+ payload: {
135
+ code: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED";
136
+ message: string;
137
+ retryable: boolean;
138
+ category: "autoplay" | "manifest" | "media" | "network" | "auth" | "env";
139
+ cause?: import('zod').objectOutputType<{
140
+ name: import('zod').ZodString;
141
+ message: import('zod').ZodString;
142
+ code: import('zod').ZodOptional<import('zod').ZodNumber>;
143
+ status: import('zod').ZodOptional<import('zod').ZodNumber>;
144
+ }, import('zod').ZodUnion<[import('zod').ZodString, import('zod').ZodNumber, import('zod').ZodBoolean]>, "strip"> | undefined;
145
+ };
146
+ } | {
147
+ event: "autoplayblocked";
148
+ payload: {};
149
+ } | {
150
+ event: "reconnectstart";
151
+ payload: {
152
+ attempt: number;
153
+ maxAttempts: number;
154
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
155
+ nextDelayMs?: number | undefined;
156
+ };
157
+ } | {
158
+ event: "reconnectsuccess";
159
+ payload: {
160
+ attempts: number;
161
+ };
162
+ } | {
163
+ event: "reconnectfailed";
164
+ payload: {
165
+ attempts: number;
166
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
167
+ };
168
+ } | {
169
+ event: "recovery";
170
+ payload: {
171
+ attempt: number;
172
+ maxAttempts: number;
173
+ phase: "detected";
174
+ recoveryId: number;
175
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
176
+ trigger: "error" | "manual" | "visibility";
177
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
178
+ } | {
179
+ attempt: number;
180
+ maxAttempts: number;
181
+ phase: "attempting";
182
+ recoveryId: number;
183
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
184
+ trigger: "error" | "manual" | "visibility";
185
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
186
+ } | {
187
+ attempt: number;
188
+ maxAttempts: number;
189
+ phase: "validating";
190
+ recoveryId: number;
191
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
192
+ trigger: "error" | "manual" | "visibility";
193
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
194
+ } | {
195
+ attempt: number;
196
+ maxAttempts: number;
197
+ phase: "recovered";
198
+ recoveryId: number;
199
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
200
+ trigger: "error" | "manual" | "visibility";
201
+ validatedBy: "playing_position_advance";
202
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
203
+ } | {
204
+ outcome: "timeout" | "attempts_exhausted";
205
+ attempt: number;
206
+ maxAttempts: number;
207
+ phase: "failed";
208
+ recoveryId: number;
209
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
210
+ trigger: "error" | "manual" | "visibility";
211
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
212
+ } | {
213
+ outcome: "source_changed" | "destroyed" | "superseded";
214
+ attempt: number;
215
+ maxAttempts: number;
216
+ phase: "cancelled";
217
+ recoveryId: number;
218
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
219
+ trigger: "error" | "manual" | "visibility";
220
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
221
+ };
222
+ } | {
223
+ event: "compatwarning";
224
+ payload: {
225
+ code: "W_BROWSER_INCOMPATIBLE" | "W_VERSION_MISMATCH" | "W_EVENT_REJECTED";
226
+ message: string;
227
+ ua: string;
228
+ hostVersion?: string | undefined;
229
+ iframeVersion?: string | undefined;
230
+ rejectedEvent?: string | undefined;
231
+ };
232
+ } | {
233
+ event: "stalled";
234
+ payload: {
235
+ phase: "start" | "end";
236
+ position: number;
237
+ durationMs?: number | undefined;
238
+ kind?: "seek" | "playback" | "firstframe" | undefined;
239
+ };
240
+ } | {
241
+ event: "playablechange";
242
+ payload: {
243
+ reason: "error" | "stalled" | "ok" | "initializing" | "buffering" | "reconnecting" | "autoplay_blocked" | "frame_disconnected" | "degraded";
244
+ playable: boolean;
245
+ recoverable: boolean;
246
+ };
247
+ } | {
248
+ event: "kernelhealth";
249
+ payload: {
250
+ reason: "media" | "network" | "other";
251
+ durationMs: number;
252
+ degraded: boolean;
253
+ count: number;
254
+ detail: string;
255
+ };
256
+ } | {
257
+ event: "audiohealth";
258
+ payload: {
259
+ reason: "audio_data_gap";
260
+ durationMs: number;
261
+ degraded: boolean;
262
+ };
263
+ } | {
264
+ event: "bufferhealth";
265
+ payload: {
266
+ draining: boolean;
267
+ marginSec: number;
268
+ };
269
+ } | {
270
+ event: "contextchange";
271
+ payload: {
272
+ sessionId: string;
273
+ kernel: "native" | "hls.js" | "flv.js";
274
+ position: number;
275
+ qualityLevel: number | null;
276
+ srcOrigin: string;
277
+ srcPath: string;
278
+ streamKind?: "live" | "vod" | undefined;
279
+ runtime?: {
280
+ platform: "unknown" | "ios" | "android" | "desktop";
281
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
282
+ mse: "standard" | "managed" | "unavailable";
283
+ } | undefined;
284
+ mediaType?: "mp4" | "hls" | "flv" | undefined;
285
+ };
286
+ } | {
287
+ event: "firstframe";
288
+ payload: {
289
+ fvt: number;
290
+ };
291
+ } | {
292
+ event: "framefreeze";
293
+ payload: {
294
+ durationMs: number;
295
+ droppedFrames: number;
296
+ totalFrames: number;
297
+ };
298
+ } | {
299
+ event: "useraction";
300
+ payload: {
301
+ source: string;
302
+ action: "seek" | "switch_play_pause" | "switch_fullscreen" | "switch_cssfullscreen" | "switch_css_fullscreen" | "change_definition" | "change_rate" | "change_volume" | "change_muted" | "change_pip" | "rotate" | "shot" | "download" | "switch_danmu" | "error_retry";
303
+ from: string | number | boolean | null;
304
+ to: string | number | boolean | null;
305
+ };
306
+ }) => void;
307
+ ready: (payload: {
308
+ duration: number;
309
+ quality: import('@video-lab/protocol').QualityLevel[];
310
+ subtitles?: import('@video-lab/protocol').SubtitleTrackInfo[];
311
+ }) => void;
312
+ play: () => void;
313
+ pause: () => void;
314
+ ended: () => void;
315
+ timeUpdate: (payload: {
316
+ time: number;
317
+ duration: number;
318
+ }) => void;
319
+ volumeChange: (payload: {
320
+ volume: number;
321
+ muted: boolean;
322
+ }) => void;
323
+ seeking: (payload: {
324
+ time: number;
325
+ }) => void;
326
+ seeked: (payload: {
327
+ time: number;
328
+ }) => void;
329
+ waiting: () => void;
330
+ playing: () => void;
331
+ qualityChange: (payload: {
332
+ level: number;
333
+ auto: boolean;
334
+ }) => void;
335
+ subtitleChange: (payload: {
336
+ id: number | null;
337
+ }) => void;
338
+ error: (payload: {
339
+ code: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED";
340
+ message: string;
341
+ retryable: boolean;
342
+ category: "autoplay" | "manifest" | "media" | "network" | "auth" | "env";
343
+ cause?: import('zod').objectOutputType<{
344
+ name: import('zod').ZodString;
345
+ message: import('zod').ZodString;
346
+ code: import('zod').ZodOptional<import('zod').ZodNumber>;
347
+ status: import('zod').ZodOptional<import('zod').ZodNumber>;
348
+ }, import('zod').ZodUnion<[import('zod').ZodString, import('zod').ZodNumber, import('zod').ZodBoolean]>, "strip"> | undefined;
349
+ }) => void;
350
+ autoplayBlocked: () => void;
351
+ reconnectStart: (payload: {
352
+ attempt: number;
353
+ maxAttempts: number;
354
+ }) => void;
355
+ reconnectSuccess: () => void;
356
+ reconnectFailed: () => void;
357
+ compatWarning: (payload: {
358
+ code: string;
359
+ message: string;
360
+ ua: string;
361
+ }) => void;
362
+ stalled: (payload: {
363
+ phase: "start" | "end";
364
+ position: number;
365
+ durationMs?: number;
366
+ }) => void;
367
+ playableChange: (payload: {
368
+ playable: boolean;
369
+ reason: import('@video-lab/protocol').PlayableReason;
370
+ recoverable: boolean;
371
+ }) => void;
372
+ kernelHealth: (payload: {
373
+ reason: "media" | "network" | "other";
374
+ durationMs: number;
375
+ degraded: boolean;
376
+ count: number;
377
+ detail: string;
378
+ }) => void;
379
+ audioHealth: (payload: {
380
+ reason: "audio_data_gap";
381
+ durationMs: number;
382
+ degraded: boolean;
383
+ }) => void;
384
+ bufferHealth: (payload: {
385
+ draining: boolean;
386
+ marginSec: number;
387
+ }) => void;
388
+ contextChange: (payload: {
389
+ sessionId: string;
390
+ kernel: "native" | "hls.js" | "flv.js";
391
+ position: number;
392
+ qualityLevel: number | null;
393
+ srcOrigin: string;
394
+ srcPath: string;
395
+ streamKind?: "live" | "vod" | undefined;
396
+ runtime?: {
397
+ platform: "unknown" | "ios" | "android" | "desktop";
398
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
399
+ mse: "standard" | "managed" | "unavailable";
400
+ } | undefined;
401
+ mediaType?: "mp4" | "hls" | "flv" | undefined;
402
+ }) => void;
403
+ sourceRoute: (payload: {
404
+ outcome: "selected";
405
+ sessionId: string;
406
+ candidateTypes: ("mp4" | "hls" | "flv")[];
407
+ streamKind: "live" | "vod";
408
+ runtime: {
409
+ platform: "unknown" | "ios" | "android" | "desktop";
410
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
411
+ mse: "standard" | "managed" | "unavailable";
412
+ };
413
+ mediaType: "mp4" | "hls" | "flv";
414
+ kernel: "native" | "hls.js" | "flv.js";
415
+ reason: "required_hls" | "live_preference" | "vod_preference" | "native_mp4_fallback";
416
+ } | {
417
+ outcome: "unsupported";
418
+ sessionId: string;
419
+ candidateTypes: ("mp4" | "hls" | "flv")[];
420
+ streamKind: "live" | "vod";
421
+ runtime: {
422
+ platform: "unknown" | "ios" | "android" | "desktop";
423
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
424
+ mse: "standard" | "managed" | "unavailable";
425
+ };
426
+ mediaType: null;
427
+ kernel: null;
428
+ reason: "no_supported_candidate";
429
+ errorCode: "E_MEDIA_NOT_SUPPORTED";
430
+ }) => void;
431
+ firstFrame: (payload: {
432
+ fvt: number;
433
+ }) => void;
434
+ frameFreeze: (payload: {
435
+ durationMs: number;
436
+ droppedFrames: number;
437
+ totalFrames: number;
438
+ }) => void;
439
+ userAction: (payload: {
440
+ source: string;
441
+ action: "seek" | "switch_play_pause" | "switch_fullscreen" | "switch_cssfullscreen" | "switch_css_fullscreen" | "change_definition" | "change_rate" | "change_volume" | "change_muted" | "change_pip" | "rotate" | "shot" | "download" | "switch_danmu" | "error_retry";
442
+ from: string | number | boolean | null;
443
+ to: string | number | boolean | null;
444
+ }) => void;
445
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<VideoPlayerProps>, {
446
+ autoplay: undefined;
447
+ muted: undefined;
448
+ loop: undefined;
449
+ controls: undefined;
450
+ interactive: undefined;
451
+ playsinline: undefined;
452
+ debug: undefined;
453
+ }>>> & {
454
+ onPlay?: (() => any) | undefined;
455
+ onPause?: (() => any) | undefined;
456
+ onEnded?: (() => any) | undefined;
457
+ onSeeking?: ((payload: {
458
+ time: number;
459
+ }) => any) | undefined;
460
+ onSeeked?: ((payload: {
461
+ time: number;
462
+ }) => any) | undefined;
463
+ onWaiting?: (() => any) | undefined;
464
+ onPlaying?: (() => any) | undefined;
465
+ onError?: ((payload: {
466
+ code: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED";
467
+ message: string;
468
+ retryable: boolean;
469
+ category: "autoplay" | "manifest" | "media" | "network" | "auth" | "env";
470
+ cause?: import('zod').objectOutputType<{
471
+ name: import('zod').ZodString;
472
+ message: import('zod').ZodString;
473
+ code: import('zod').ZodOptional<import('zod').ZodNumber>;
474
+ status: import('zod').ZodOptional<import('zod').ZodNumber>;
475
+ }, import('zod').ZodUnion<[import('zod').ZodString, import('zod').ZodNumber, import('zod').ZodBoolean]>, "strip"> | undefined;
476
+ }) => any) | undefined;
477
+ onStalled?: ((payload: {
478
+ phase: "start" | "end";
479
+ position: number;
480
+ durationMs?: number;
481
+ }) => any) | undefined;
482
+ onPlayerEvent?: ((payload: {
483
+ event: "sourceroute";
484
+ payload: {
485
+ outcome: "selected";
486
+ sessionId: string;
487
+ candidateTypes: ("mp4" | "hls" | "flv")[];
488
+ streamKind: "live" | "vod";
489
+ runtime: {
490
+ platform: "unknown" | "ios" | "android" | "desktop";
491
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
492
+ mse: "standard" | "managed" | "unavailable";
493
+ };
494
+ mediaType: "mp4" | "hls" | "flv";
495
+ kernel: "native" | "hls.js" | "flv.js";
496
+ reason: "required_hls" | "live_preference" | "vod_preference" | "native_mp4_fallback";
497
+ } | {
498
+ outcome: "unsupported";
499
+ sessionId: string;
500
+ candidateTypes: ("mp4" | "hls" | "flv")[];
501
+ streamKind: "live" | "vod";
502
+ runtime: {
503
+ platform: "unknown" | "ios" | "android" | "desktop";
504
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
505
+ mse: "standard" | "managed" | "unavailable";
506
+ };
507
+ mediaType: null;
508
+ kernel: null;
509
+ reason: "no_supported_candidate";
510
+ errorCode: "E_MEDIA_NOT_SUPPORTED";
511
+ };
512
+ } | {
513
+ event: "ready";
514
+ payload: {
515
+ duration: number;
516
+ quality: {
517
+ level: number;
518
+ label?: string | undefined;
519
+ height?: number | undefined;
520
+ bitrate?: number | undefined;
521
+ }[];
522
+ subtitles?: {
523
+ locale: string;
524
+ label: string;
525
+ id: number;
526
+ }[] | undefined;
527
+ };
528
+ } | {
529
+ event: "play";
530
+ payload: {};
531
+ } | {
532
+ event: "pause";
533
+ payload: {};
534
+ } | {
535
+ event: "ended";
536
+ payload: {};
537
+ } | {
538
+ event: "timeupdate";
539
+ payload: {
540
+ duration: number;
541
+ time: number;
542
+ };
543
+ } | {
544
+ event: "volumechange";
545
+ payload: {
546
+ muted: boolean;
547
+ volume: number;
548
+ };
549
+ } | {
550
+ event: "seeking";
551
+ payload: {
552
+ time: number;
553
+ };
554
+ } | {
555
+ event: "seeked";
556
+ payload: {
557
+ time: number;
558
+ };
559
+ } | {
560
+ event: "waiting";
561
+ payload: {};
562
+ } | {
563
+ event: "playing";
564
+ payload: {};
565
+ } | {
566
+ event: "qualitychange";
567
+ payload: {
568
+ auto: boolean;
569
+ level: number;
570
+ };
571
+ } | {
572
+ event: "subtitlechange";
573
+ payload: {
574
+ id: number | null;
575
+ };
576
+ } | {
577
+ event: "error";
578
+ payload: {
579
+ code: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED";
580
+ message: string;
581
+ retryable: boolean;
582
+ category: "autoplay" | "manifest" | "media" | "network" | "auth" | "env";
583
+ cause?: import('zod').objectOutputType<{
584
+ name: import('zod').ZodString;
585
+ message: import('zod').ZodString;
586
+ code: import('zod').ZodOptional<import('zod').ZodNumber>;
587
+ status: import('zod').ZodOptional<import('zod').ZodNumber>;
588
+ }, import('zod').ZodUnion<[import('zod').ZodString, import('zod').ZodNumber, import('zod').ZodBoolean]>, "strip"> | undefined;
589
+ };
590
+ } | {
591
+ event: "autoplayblocked";
592
+ payload: {};
593
+ } | {
594
+ event: "reconnectstart";
595
+ payload: {
596
+ attempt: number;
597
+ maxAttempts: number;
598
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
599
+ nextDelayMs?: number | undefined;
600
+ };
601
+ } | {
602
+ event: "reconnectsuccess";
603
+ payload: {
604
+ attempts: number;
605
+ };
606
+ } | {
607
+ event: "reconnectfailed";
608
+ payload: {
609
+ attempts: number;
610
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
611
+ };
612
+ } | {
613
+ event: "recovery";
614
+ payload: {
615
+ attempt: number;
616
+ maxAttempts: number;
617
+ phase: "detected";
618
+ recoveryId: number;
619
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
620
+ trigger: "error" | "manual" | "visibility";
621
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
622
+ } | {
623
+ attempt: number;
624
+ maxAttempts: number;
625
+ phase: "attempting";
626
+ recoveryId: number;
627
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
628
+ trigger: "error" | "manual" | "visibility";
629
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
630
+ } | {
631
+ attempt: number;
632
+ maxAttempts: number;
633
+ phase: "validating";
634
+ recoveryId: number;
635
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
636
+ trigger: "error" | "manual" | "visibility";
637
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
638
+ } | {
639
+ attempt: number;
640
+ maxAttempts: number;
641
+ phase: "recovered";
642
+ recoveryId: number;
643
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
644
+ trigger: "error" | "manual" | "visibility";
645
+ validatedBy: "playing_position_advance";
646
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
647
+ } | {
648
+ outcome: "timeout" | "attempts_exhausted";
649
+ attempt: number;
650
+ maxAttempts: number;
651
+ phase: "failed";
652
+ recoveryId: number;
653
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
654
+ trigger: "error" | "manual" | "visibility";
655
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
656
+ } | {
657
+ outcome: "source_changed" | "destroyed" | "superseded";
658
+ attempt: number;
659
+ maxAttempts: number;
660
+ phase: "cancelled";
661
+ recoveryId: number;
662
+ strategy: "reconnect" | "media_recovery" | "visibility_reload";
663
+ trigger: "error" | "manual" | "visibility";
664
+ reason?: "E_MEDIA_NOT_SUPPORTED" | "E_MANIFEST_PARSE" | "E_MEDIA_DECODE" | "E_MEDIA_ABORTED" | "E_SUBTITLE_LOAD_FAILED" | "E_AUTOPLAY_BLOCKED" | "E_NETWORK" | "E_NETWORK_TIMEOUT" | "E_AUTH_EXPIRED" | "E_ENV_CSP_BLOCKED" | "E_METHOD_NOT_SUPPORTED" | "E_DANMAKU_SEND_FAILED" | "E_INTERNAL" | "E_UNKNOWN" | "E_PLAYER_DESTROYED" | "E_HANDSHAKE_TIMEOUT" | "E_HANDSHAKE_VERSION_MISMATCH" | "E_LOAD_FAILED" | "E_FRAME_CRASHED" | undefined;
665
+ };
666
+ } | {
667
+ event: "compatwarning";
668
+ payload: {
669
+ code: "W_BROWSER_INCOMPATIBLE" | "W_VERSION_MISMATCH" | "W_EVENT_REJECTED";
670
+ message: string;
671
+ ua: string;
672
+ hostVersion?: string | undefined;
673
+ iframeVersion?: string | undefined;
674
+ rejectedEvent?: string | undefined;
675
+ };
676
+ } | {
677
+ event: "stalled";
678
+ payload: {
679
+ phase: "start" | "end";
680
+ position: number;
681
+ durationMs?: number | undefined;
682
+ kind?: "seek" | "playback" | "firstframe" | undefined;
683
+ };
684
+ } | {
685
+ event: "playablechange";
686
+ payload: {
687
+ reason: "error" | "stalled" | "ok" | "initializing" | "buffering" | "reconnecting" | "autoplay_blocked" | "frame_disconnected" | "degraded";
688
+ playable: boolean;
689
+ recoverable: boolean;
690
+ };
691
+ } | {
692
+ event: "kernelhealth";
693
+ payload: {
694
+ reason: "media" | "network" | "other";
695
+ durationMs: number;
696
+ degraded: boolean;
697
+ count: number;
698
+ detail: string;
699
+ };
700
+ } | {
701
+ event: "audiohealth";
702
+ payload: {
703
+ reason: "audio_data_gap";
704
+ durationMs: number;
705
+ degraded: boolean;
706
+ };
707
+ } | {
708
+ event: "bufferhealth";
709
+ payload: {
710
+ draining: boolean;
711
+ marginSec: number;
712
+ };
713
+ } | {
714
+ event: "contextchange";
715
+ payload: {
716
+ sessionId: string;
717
+ kernel: "native" | "hls.js" | "flv.js";
718
+ position: number;
719
+ qualityLevel: number | null;
720
+ srcOrigin: string;
721
+ srcPath: string;
722
+ streamKind?: "live" | "vod" | undefined;
723
+ runtime?: {
724
+ platform: "unknown" | "ios" | "android" | "desktop";
725
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
726
+ mse: "standard" | "managed" | "unavailable";
727
+ } | undefined;
728
+ mediaType?: "mp4" | "hls" | "flv" | undefined;
729
+ };
730
+ } | {
731
+ event: "firstframe";
732
+ payload: {
733
+ fvt: number;
734
+ };
735
+ } | {
736
+ event: "framefreeze";
737
+ payload: {
738
+ durationMs: number;
739
+ droppedFrames: number;
740
+ totalFrames: number;
741
+ };
742
+ } | {
743
+ event: "useraction";
744
+ payload: {
745
+ source: string;
746
+ action: "seek" | "switch_play_pause" | "switch_fullscreen" | "switch_cssfullscreen" | "switch_css_fullscreen" | "change_definition" | "change_rate" | "change_volume" | "change_muted" | "change_pip" | "rotate" | "shot" | "download" | "switch_danmu" | "error_retry";
747
+ from: string | number | boolean | null;
748
+ to: string | number | boolean | null;
749
+ };
750
+ }) => any) | undefined;
751
+ onReady?: ((payload: {
752
+ duration: number;
753
+ quality: import('@video-lab/protocol').QualityLevel[];
754
+ subtitles?: import('@video-lab/protocol').SubtitleTrackInfo[];
755
+ }) => any) | undefined;
756
+ onTimeUpdate?: ((payload: {
757
+ time: number;
758
+ duration: number;
759
+ }) => any) | undefined;
760
+ onVolumeChange?: ((payload: {
761
+ volume: number;
762
+ muted: boolean;
763
+ }) => any) | undefined;
764
+ onQualityChange?: ((payload: {
765
+ level: number;
766
+ auto: boolean;
767
+ }) => any) | undefined;
768
+ onSubtitleChange?: ((payload: {
769
+ id: number | null;
770
+ }) => any) | undefined;
771
+ onAutoplayBlocked?: (() => any) | undefined;
772
+ onReconnectStart?: ((payload: {
773
+ attempt: number;
774
+ maxAttempts: number;
775
+ }) => any) | undefined;
776
+ onReconnectSuccess?: (() => any) | undefined;
777
+ onReconnectFailed?: (() => any) | undefined;
778
+ onCompatWarning?: ((payload: {
779
+ code: string;
780
+ message: string;
781
+ ua: string;
782
+ }) => any) | undefined;
783
+ onPlayableChange?: ((payload: {
784
+ playable: boolean;
785
+ reason: import('@video-lab/protocol').PlayableReason;
786
+ recoverable: boolean;
787
+ }) => any) | undefined;
788
+ onKernelHealth?: ((payload: {
789
+ reason: "media" | "network" | "other";
790
+ durationMs: number;
791
+ degraded: boolean;
792
+ count: number;
793
+ detail: string;
794
+ }) => any) | undefined;
795
+ onAudioHealth?: ((payload: {
796
+ reason: "audio_data_gap";
797
+ durationMs: number;
798
+ degraded: boolean;
799
+ }) => any) | undefined;
800
+ onBufferHealth?: ((payload: {
801
+ draining: boolean;
802
+ marginSec: number;
803
+ }) => any) | undefined;
804
+ onContextChange?: ((payload: {
805
+ sessionId: string;
806
+ kernel: "native" | "hls.js" | "flv.js";
807
+ position: number;
808
+ qualityLevel: number | null;
809
+ srcOrigin: string;
810
+ srcPath: string;
811
+ streamKind?: "live" | "vod" | undefined;
812
+ runtime?: {
813
+ platform: "unknown" | "ios" | "android" | "desktop";
814
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
815
+ mse: "standard" | "managed" | "unavailable";
816
+ } | undefined;
817
+ mediaType?: "mp4" | "hls" | "flv" | undefined;
818
+ }) => any) | undefined;
819
+ onSourceRoute?: ((payload: {
820
+ outcome: "selected";
821
+ sessionId: string;
822
+ candidateTypes: ("mp4" | "hls" | "flv")[];
823
+ streamKind: "live" | "vod";
824
+ runtime: {
825
+ platform: "unknown" | "ios" | "android" | "desktop";
826
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
827
+ mse: "standard" | "managed" | "unavailable";
828
+ };
829
+ mediaType: "mp4" | "hls" | "flv";
830
+ kernel: "native" | "hls.js" | "flv.js";
831
+ reason: "required_hls" | "live_preference" | "vod_preference" | "native_mp4_fallback";
832
+ } | {
833
+ outcome: "unsupported";
834
+ sessionId: string;
835
+ candidateTypes: ("mp4" | "hls" | "flv")[];
836
+ streamKind: "live" | "vod";
837
+ runtime: {
838
+ platform: "unknown" | "ios" | "android" | "desktop";
839
+ browser: "unknown" | "webkit" | "gecko" | "chromium" | "embedded";
840
+ mse: "standard" | "managed" | "unavailable";
841
+ };
842
+ mediaType: null;
843
+ kernel: null;
844
+ reason: "no_supported_candidate";
845
+ errorCode: "E_MEDIA_NOT_SUPPORTED";
846
+ }) => any) | undefined;
847
+ onFirstFrame?: ((payload: {
848
+ fvt: number;
849
+ }) => any) | undefined;
850
+ onFrameFreeze?: ((payload: {
851
+ durationMs: number;
852
+ droppedFrames: number;
853
+ totalFrames: number;
854
+ }) => any) | undefined;
855
+ onUserAction?: ((payload: {
856
+ source: string;
857
+ action: "seek" | "switch_play_pause" | "switch_fullscreen" | "switch_cssfullscreen" | "switch_css_fullscreen" | "change_definition" | "change_rate" | "change_volume" | "change_muted" | "change_pip" | "rotate" | "shot" | "download" | "switch_danmu" | "error_retry";
858
+ from: string | number | boolean | null;
859
+ to: string | number | boolean | null;
860
+ }) => any) | undefined;
861
+ }, {
34
862
  autoplay: boolean;
35
863
  muted: boolean;
36
864
  loop: boolean;
@@ -38,12 +866,29 @@ declare const __VLS_component: import('vue').DefineComponent<VideoPlayerProps, {
38
866
  interactive: boolean;
39
867
  playsinline: boolean;
40
868
  debug: boolean;
41
- }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
869
+ }, {}>;
42
870
  declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
43
871
  export default _default;
872
+ type __VLS_WithDefaults<P, D> = {
873
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_PrettifyLocal<P[K] & {
874
+ default: D[K];
875
+ }> : P[K];
876
+ };
877
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
878
+ type __VLS_TypePropsToOption<T> = {
879
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
880
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
881
+ } : {
882
+ type: import('vue').PropType<T[K]>;
883
+ required: true;
884
+ };
885
+ };
44
886
  type __VLS_WithSlots<T, S> = T & {
45
887
  new (): {
46
888
  $slots: S;
47
889
  };
48
890
  };
891
+ type __VLS_PrettifyLocal<T> = {
892
+ [K in keyof T]: T[K];
893
+ } & {};
49
894
  //# sourceMappingURL=VideoPlayer.vue.d.ts.map
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("vue"),t=require("@video-lab/protocol"),n=require("@video-lab/player-ui"),r=require("@video-lab/player-core");function i(t,r){return(0,n.defineSentinelOverlays)(),(0,e.h)(t,r)}function a(e,t){return e[t]??t}function o(e,t,n){let r=`error.${t}`,i=a(e,r);return i===r?n:i}function s(i,a,o){let s=(0,e.shallowRef)(null),u=(0,e.shallowRef)(n.INITIAL_OVERLAY),d=(0,e.ref)(!1);function f(e){let r=(0,t.toErrorEvent)(e);u.value=(0,n.reduceOverlay)(u.value,r),l(r,o)}function p(e){let n=s.value;if(n){if(n.destroyed){f({playerError:(0,t.makePlayerError)(`E_PLAYER_DESTROYED`,t.PLAYER_DESTROYED_MESSAGE)});return}e(n)}}function m(){let e=i.value;if(e){u.value=n.INITIAL_OVERLAY;try{s.value=(0,r.createPlayer)({el:e,config:c(a),onEvent:e=>{u.value=(0,n.reduceOverlay)(u.value,e),l(e,o)}}),d.value=!0}catch(e){f(e)}}}function h(){s.value?.destroy(),s.value=null,d.value=!1}(0,e.onMounted)(m),(0,e.onBeforeUnmount)(h),(0,e.watch)(()=>JSON.stringify(a.source),()=>{u.value=(0,n.resetOverlayForNewSource)(u.value),p(e=>{e.load(a.source).catch(f)})}),(0,e.watch)(()=>a.muted,e=>{e!==void 0&&p(t=>t.setMuted(e))}),(0,e.watch)(()=>a.locale,e=>{e!==void 0&&p(t=>t.setLocale(e))},{deep:!0});function g(){h(),m()}function _(){u.value={...u.value,pauseImageVisible:!1,pauseImageDismissed:!0}}return{handle:s,overlay:u,isMounted:d,handleRetry:g,dismissPauseImage:_}}function c(e){let t={source:e.source};return e.preset!==void 0&&(t.preset=e.preset),e.autoplay!==void 0&&(t.autoplay=e.autoplay),e.muted!==void 0&&(t.muted=e.muted),e.loop!==void 0&&(t.loop=e.loop),e.playsinline!==void 0&&(t.playsinline=e.playsinline),e.playbackRate!==void 0&&(t.playbackRate=e.playbackRate),e.volume!==void 0&&(t.volume=e.volume),e.startTime!==void 0&&(t.startTime=e.startTime),e.preload!==void 0&&(t.preload=e.preload),e.controls!==void 0&&(t.controls=e.controls),e.interactive!==void 0&&(t.interactive=e.interactive),e.poster!==void 0&&(t.poster=e.poster),e.pauseImage!==void 0&&(t.pauseImage=e.pauseImage),e.locale!==void 0&&(t.locale=e.locale),e.danmaku!==void 0&&(t.danmaku=e.danmaku),e.debug!==void 0&&(t.debug=e.debug),t}function l(e,t){try{t(`playerEvent`,e)}catch{}switch(e.event){case`ready`:t(`ready`,e.payload);break;case`play`:t(`play`);break;case`pause`:t(`pause`);break;case`ended`:t(`ended`);break;case`timeupdate`:t(`timeUpdate`,e.payload);break;case`volumechange`:t(`volumeChange`,e.payload);break;case`seeking`:t(`seeking`,e.payload);break;case`seeked`:t(`seeked`,e.payload);break;case`waiting`:t(`waiting`);break;case`playing`:t(`playing`);break;case`qualitychange`:t(`qualityChange`,e.payload);break;case`subtitlechange`:t(`subtitleChange`,e.payload);break;case`error`:t(`error`,e.payload);break;case`autoplayblocked`:t(`autoplayBlocked`);break;case`reconnectstart`:t(`reconnectStart`,{attempt:e.payload.attempt,maxAttempts:e.payload.maxAttempts});break;case`reconnectsuccess`:t(`reconnectSuccess`);break;case`reconnectfailed`:t(`reconnectFailed`);break;case`compatwarning`:t(`compatWarning`,e.payload);break;case`stalled`:t(`stalled`,e.payload);break;case`playablechange`:t(`playableChange`,e.payload);break;case`bufferhealth`:t(`bufferHealth`,e.payload);break;case`contextchange`:t(`contextChange`,e.payload);break;case`sourceroute`:t(`sourceRoute`,e.payload);break;case`firstframe`:t(`firstFrame`,e.payload);break;case`framefreeze`:t(`frameFreeze`,e.payload);break;case`useraction`:t(`userAction`,e.payload);break;case`kernelhealth`:t(`kernelHealth`,e.payload);break;case`audiohealth`:t(`audioHealth`,e.payload);break;case`recovery`:break;default:break}}var u={ref:`container`,class:`sentinel-video__player`,style:{width:`100%`,height:`100%`}},d=(0,e.defineComponent)({__name:`VideoPlayer`,props:{source:{},autoplay:{type:Boolean,default:void 0},muted:{type:Boolean,default:void 0},loop:{type:Boolean,default:void 0},controls:{type:Boolean,default:void 0},interactive:{type:Boolean,default:void 0},playsinline:{type:Boolean,default:void 0},playbackRate:{},volume:{},startTime:{},preload:{},poster:{},pauseImage:{},preset:{},locale:{},danmaku:{},debug:{type:Boolean,default:void 0}},emits:`playerEvent.ready.play.pause.ended.timeUpdate.volumeChange.seeking.seeked.waiting.playing.qualityChange.subtitleChange.error.autoplayBlocked.reconnectStart.reconnectSuccess.reconnectFailed.compatWarning.stalled.playableChange.kernelHealth.audioHealth.bufferHealth.contextChange.sourceRoute.firstFrame.frameFreeze.userAction`.split(`.`),setup(n,{expose:r,emit:c}){let l=n,d=c,{handle:f,overlay:p,isMounted:m,handleRetry:h,dismissPauseImage:g}=s((0,e.useTemplateRef)(`container`),l,d),_=(0,e.computed)(()=>(0,t.resolveLocaleMessages)(l.locale).messages),v=(0,e.computed)(()=>typeof l.poster==`string`?l.poster:l.poster?.url),y=(0,e.computed)(()=>typeof l.pauseImage==`string`?l.pauseImage:l.pauseImage?.url),b=()=>[v.value?i(`sentinel-poster`,{visible:p.value.posterVisible,poster:l.poster}):null,y.value?i(`sentinel-pause`,{visible:p.value.pauseImageVisible,pauseImage:l.pauseImage,"close-label":a(_.value,`close`),"onSentinel-close":g}):null,i(`sentinel-loading`,{visible:p.value.loadingVisible,text:a(_.value,`loading`)}),p.value.error?i(`sentinel-error`,{visible:!0,code:p.value.error.code,message:o(_.value,p.value.error.code,p.value.error.message),retryable:p.value.error.retryable,"retry-label":a(_.value,`retry`),"onSentinel-retry":h}):null];return r({play:()=>f.value?.play()??Promise.resolve(),pause:()=>f.value?.pause(),seek:e=>f.value?.seek(e),setMuted:e=>f.value?.setMuted(e),setVolume:e=>f.value?.setVolume(e),setPlaybackRate:e=>f.value?.setPlaybackRate(e),enterFullscreen:()=>f.value?.enterFullscreen()??Promise.resolve(),exitFullscreen:()=>f.value?.exitFullscreen()??Promise.resolve(),setQuality:e=>f.value?.setQuality(e),setSubtitle:e=>f.value?.setSubtitle(e),setLocale:e=>f.value?.setLocale(e),pushDanmaku:e=>f.value?.pushDanmaku(e),setDanmakuEnabled:e=>f.value?.setDanmakuEnabled(e),clearDanmaku:()=>f.value?.clearDanmaku(),reconnect:e=>f.value?.reconnect(e),destroy:()=>f.value?.destroy(),getCurrentTime:()=>f.value?.getCurrentTime()??0,getDuration:()=>f.value?.getDuration()??0,getPlaybackContext:()=>f.value?.getPlaybackContext()??null,getPlayerHandle:()=>f.value}),(t,n)=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{class:`sentinel-video`,style:(0,e.normalizeStyle)({position:`relative`,width:`100%`,height:`100%`,pointerEvents:l.interactive===!1?`none`:void 0})},[(0,e.createElementVNode)(`div`,u,null,512),(0,e.createVNode)(b),(0,e.unref)(m)?(0,e.createCommentVNode)(``,!0):(0,e.renderSlot)(t.$slots,`ssr-placeholder`,{key:0})],4))}});exports.VideoPlayer=d;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("vue"),t=require("@video-lab/protocol"),n=require("@video-lab/player-ui"),r=require("@video-lab/player-core");function i(t,r){return(0,n.defineSentinelOverlays)(),(0,e.h)(t,r)}function a(e,t){return e[t]??t}function o(e,t,n){let r=`error.${t}`,i=a(e,r);return i===r?n:i}function s(i,a,o){let s=(0,e.shallowRef)(null),u=(0,e.shallowRef)(n.INITIAL_OVERLAY),d=(0,e.ref)(!1);function f(e){let r=(0,t.toErrorEvent)(e);u.value=(0,n.reduceOverlay)(u.value,r),l(r,o)}function p(e){let n=s.value;if(n){if(n.destroyed){f({playerError:(0,t.makePlayerError)(`E_PLAYER_DESTROYED`,t.PLAYER_DESTROYED_MESSAGE)});return}e(n)}}function m(){let e=i.value;if(e){u.value=n.INITIAL_OVERLAY;try{s.value=(0,r.createPlayer)({el:e,config:c(a),onEvent:e=>{u.value=(0,n.reduceOverlay)(u.value,e),l(e,o)}}),d.value=!0}catch(e){f(e)}}}function h(){s.value?.destroy(),s.value=null,d.value=!1}(0,e.onMounted)(m),(0,e.onBeforeUnmount)(h),(0,e.watch)(()=>JSON.stringify(a.source),()=>{u.value=(0,n.resetOverlayForNewSource)(u.value),p(e=>{e.load(a.source).catch(f)})}),(0,e.watch)(()=>a.muted,e=>{e!==void 0&&p(t=>t.setMuted(e))}),(0,e.watch)(()=>a.locale,e=>{e!==void 0&&p(t=>t.setLocale(e))},{deep:!0});function g(){h(),m()}function _(){u.value={...u.value,pauseImageVisible:!1,pauseImageDismissed:!0}}return{handle:s,overlay:u,isMounted:d,handleRetry:g,dismissPauseImage:_}}function c(e){let t={source:e.source};return e.preset!==void 0&&(t.preset=e.preset),e.autoplay!==void 0&&(t.autoplay=e.autoplay),e.muted!==void 0&&(t.muted=e.muted),e.loop!==void 0&&(t.loop=e.loop),e.playsinline!==void 0&&(t.playsinline=e.playsinline),e.playbackRate!==void 0&&(t.playbackRate=e.playbackRate),e.volume!==void 0&&(t.volume=e.volume),e.startTime!==void 0&&(t.startTime=e.startTime),e.preload!==void 0&&(t.preload=e.preload),e.controls!==void 0&&(t.controls=e.controls),e.interactive!==void 0&&(t.interactive=e.interactive),e.poster!==void 0&&(t.poster=e.poster),e.pauseImage!==void 0&&(t.pauseImage=e.pauseImage),e.locale!==void 0&&(t.locale=e.locale),e.danmaku!==void 0&&(t.danmaku=e.danmaku),e.debug!==void 0&&(t.debug=e.debug),t}function l(e,t){try{t(`playerEvent`,e)}catch{}switch(e.event){case`ready`:t(`ready`,e.payload);break;case`play`:t(`play`);break;case`pause`:t(`pause`);break;case`ended`:t(`ended`);break;case`timeupdate`:t(`timeUpdate`,e.payload);break;case`volumechange`:t(`volumeChange`,e.payload);break;case`seeking`:t(`seeking`,e.payload);break;case`seeked`:t(`seeked`,e.payload);break;case`waiting`:t(`waiting`);break;case`playing`:t(`playing`);break;case`qualitychange`:t(`qualityChange`,e.payload);break;case`subtitlechange`:t(`subtitleChange`,e.payload);break;case`error`:t(`error`,e.payload);break;case`autoplayblocked`:t(`autoplayBlocked`);break;case`reconnectstart`:t(`reconnectStart`,{attempt:e.payload.attempt,maxAttempts:e.payload.maxAttempts});break;case`reconnectsuccess`:t(`reconnectSuccess`);break;case`reconnectfailed`:t(`reconnectFailed`);break;case`compatwarning`:t(`compatWarning`,e.payload);break;case`stalled`:t(`stalled`,e.payload);break;case`playablechange`:t(`playableChange`,e.payload);break;case`bufferhealth`:t(`bufferHealth`,e.payload);break;case`contextchange`:t(`contextChange`,e.payload);break;case`sourceroute`:t(`sourceRoute`,e.payload);break;case`firstframe`:t(`firstFrame`,e.payload);break;case`framefreeze`:t(`frameFreeze`,e.payload);break;case`useraction`:t(`userAction`,e.payload);break;case`kernelhealth`:t(`kernelHealth`,e.payload);break;case`audiohealth`:t(`audioHealth`,e.payload);break;case`recovery`:break;default:break}}var u=(0,e.defineComponent)({__name:`VideoPlayer`,props:{source:{},autoplay:{type:Boolean,default:void 0},muted:{type:Boolean,default:void 0},loop:{type:Boolean,default:void 0},controls:{type:Boolean,default:void 0},interactive:{type:Boolean,default:void 0},playsinline:{type:Boolean,default:void 0},playbackRate:{},volume:{},startTime:{},preload:{},poster:{},pauseImage:{},preset:{},locale:{},danmaku:{},debug:{type:Boolean,default:void 0}},emits:`playerEvent.ready.play.pause.ended.timeUpdate.volumeChange.seeking.seeked.waiting.playing.qualityChange.subtitleChange.error.autoplayBlocked.reconnectStart.reconnectSuccess.reconnectFailed.compatWarning.stalled.playableChange.kernelHealth.audioHealth.bufferHealth.contextChange.sourceRoute.firstFrame.frameFreeze.userAction`.split(`.`),setup(n,{expose:r,emit:c}){let l=n,u=c,d=(0,e.shallowRef)(null),{handle:f,overlay:p,isMounted:m,handleRetry:h,dismissPauseImage:g}=s(d,l,u),_=(0,e.computed)(()=>(0,t.resolveLocaleMessages)(l.locale).messages),v=(0,e.computed)(()=>typeof l.poster==`string`?l.poster:l.poster?.url),y=(0,e.computed)(()=>typeof l.pauseImage==`string`?l.pauseImage:l.pauseImage?.url),b=()=>[v.value?i(`sentinel-poster`,{visible:p.value.posterVisible,poster:l.poster}):null,y.value?i(`sentinel-pause`,{visible:p.value.pauseImageVisible,pauseImage:l.pauseImage,"close-label":a(_.value,`close`),"onSentinel-close":g}):null,i(`sentinel-loading`,{visible:p.value.loadingVisible,text:a(_.value,`loading`)}),p.value.error?i(`sentinel-error`,{visible:!0,code:p.value.error.code,message:o(_.value,p.value.error.code,p.value.error.message),retryable:p.value.error.retryable,"retry-label":a(_.value,`retry`),"onSentinel-retry":h}):null];return r({play:()=>f.value?.play()??Promise.resolve(),pause:()=>f.value?.pause(),seek:e=>f.value?.seek(e),setMuted:e=>f.value?.setMuted(e),setVolume:e=>f.value?.setVolume(e),setPlaybackRate:e=>f.value?.setPlaybackRate(e),enterFullscreen:()=>f.value?.enterFullscreen()??Promise.resolve(),exitFullscreen:()=>f.value?.exitFullscreen()??Promise.resolve(),setQuality:e=>f.value?.setQuality(e),setSubtitle:e=>f.value?.setSubtitle(e),setLocale:e=>f.value?.setLocale(e),pushDanmaku:e=>f.value?.pushDanmaku(e),setDanmakuEnabled:e=>f.value?.setDanmakuEnabled(e),clearDanmaku:()=>f.value?.clearDanmaku(),reconnect:e=>f.value?.reconnect(e),destroy:()=>f.value?.destroy(),getCurrentTime:()=>f.value?.getCurrentTime()??0,getDuration:()=>f.value?.getDuration()??0,getPlaybackContext:()=>f.value?.getPlaybackContext()??null,getPlayerHandle:()=>f.value}),(t,n)=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{class:`sentinel-video`,style:(0,e.normalizeStyle)({position:`relative`,width:`100%`,height:`100%`,pointerEvents:l.interactive===!1?`none`:void 0})},[(0,e.createElementVNode)(`div`,{ref_key:`containerRef`,ref:d,class:`sentinel-video__player`,style:{width:`100%`,height:`100%`}},null,512),(0,e.createVNode)(b),(0,e.unref)(m)?(0,e.createCommentVNode)(``,!0):(0,e.renderSlot)(t.$slots,`ssr-placeholder`,{key:0})],4))}});exports.VideoPlayer=u;
package/dist/index.js CHANGED
@@ -1,31 +1,31 @@
1
- import { computed as e, createCommentVNode as t, createElementBlock as n, createElementVNode as r, createVNode as i, defineComponent as a, h as o, normalizeStyle as s, onBeforeUnmount as c, onMounted as l, openBlock as u, ref as d, renderSlot as f, shallowRef as p, unref as m, useTemplateRef as h, watch as g } from "vue";
2
- import { PLAYER_DESTROYED_MESSAGE as _, makePlayerError as v, resolveLocaleMessages as y, toErrorEvent as b } from "@video-lab/protocol";
3
- import { INITIAL_OVERLAY as x, defineSentinelOverlays as S, reduceOverlay as C, resetOverlayForNewSource as w } from "@video-lab/player-ui";
4
- import { createPlayer as T } from "@video-lab/player-core";
1
+ import { computed as e, createCommentVNode as t, createElementBlock as n, createElementVNode as r, createVNode as i, defineComponent as a, h as o, normalizeStyle as s, onBeforeUnmount as c, onMounted as l, openBlock as u, ref as d, renderSlot as f, shallowRef as p, unref as m, watch as h } from "vue";
2
+ import { PLAYER_DESTROYED_MESSAGE as g, makePlayerError as _, resolveLocaleMessages as v, toErrorEvent as y } from "@video-lab/protocol";
3
+ import { INITIAL_OVERLAY as b, defineSentinelOverlays as x, reduceOverlay as S, resetOverlayForNewSource as C } from "@video-lab/player-ui";
4
+ import { createPlayer as w } from "@video-lab/player-core";
5
5
  //#region src/overlay-elements.ts
6
- function E(e, t) {
7
- return S(), o(e, t);
6
+ function T(e, t) {
7
+ return x(), o(e, t);
8
8
  }
9
- function D(e, t) {
9
+ function E(e, t) {
10
10
  return e[t] ?? t;
11
11
  }
12
- function O(e, t, n) {
13
- let r = `error.${t}`, i = D(e, r);
12
+ function D(e, t, n) {
13
+ let r = `error.${t}`, i = E(e, r);
14
14
  return i === r ? n : i;
15
15
  }
16
16
  //#endregion
17
17
  //#region src/use-player.ts
18
- function k(e, t, n) {
19
- let r = p(null), i = p(x), a = d(!1);
18
+ function O(e, t, n) {
19
+ let r = p(null), i = p(b), a = d(!1);
20
20
  function o(e) {
21
- let t = b(e);
22
- i.value = C(i.value, t), j(t, n);
21
+ let t = y(e);
22
+ i.value = S(i.value, t), A(t, n);
23
23
  }
24
24
  function s(e) {
25
25
  let t = r.value;
26
26
  if (t) {
27
27
  if (t.destroyed) {
28
- o({ playerError: v("E_PLAYER_DESTROYED", _) });
28
+ o({ playerError: _("E_PLAYER_DESTROYED", g) });
29
29
  return;
30
30
  }
31
31
  e(t);
@@ -34,13 +34,13 @@ function k(e, t, n) {
34
34
  function u() {
35
35
  let s = e.value;
36
36
  if (s) {
37
- i.value = x;
37
+ i.value = b;
38
38
  try {
39
- r.value = T({
39
+ r.value = w({
40
40
  el: s,
41
- config: A(t),
41
+ config: k(t),
42
42
  onEvent: (e) => {
43
- i.value = C(i.value, e), j(e, n);
43
+ i.value = S(i.value, e), A(e, n);
44
44
  }
45
45
  }), a.value = !0;
46
46
  } catch (e) {
@@ -51,19 +51,19 @@ function k(e, t, n) {
51
51
  function f() {
52
52
  r.value?.destroy(), r.value = null, a.value = !1;
53
53
  }
54
- l(u), c(f), g(() => JSON.stringify(t.source), () => {
55
- i.value = w(i.value), s((e) => {
54
+ l(u), c(f), h(() => JSON.stringify(t.source), () => {
55
+ i.value = C(i.value), s((e) => {
56
56
  e.load(t.source).catch(o);
57
57
  });
58
- }), g(() => t.muted, (e) => {
58
+ }), h(() => t.muted, (e) => {
59
59
  e !== void 0 && s((t) => t.setMuted(e));
60
- }), g(() => t.locale, (e) => {
60
+ }), h(() => t.locale, (e) => {
61
61
  e !== void 0 && s((t) => t.setLocale(e));
62
62
  }, { deep: !0 });
63
63
  function m() {
64
64
  f(), u();
65
65
  }
66
- function h() {
66
+ function v() {
67
67
  i.value = {
68
68
  ...i.value,
69
69
  pauseImageVisible: !1,
@@ -75,14 +75,14 @@ function k(e, t, n) {
75
75
  overlay: i,
76
76
  isMounted: a,
77
77
  handleRetry: m,
78
- dismissPauseImage: h
78
+ dismissPauseImage: v
79
79
  };
80
80
  }
81
- function A(e) {
81
+ function k(e) {
82
82
  let t = { source: e.source };
83
83
  return e.preset !== void 0 && (t.preset = e.preset), e.autoplay !== void 0 && (t.autoplay = e.autoplay), e.muted !== void 0 && (t.muted = e.muted), e.loop !== void 0 && (t.loop = e.loop), e.playsinline !== void 0 && (t.playsinline = e.playsinline), e.playbackRate !== void 0 && (t.playbackRate = e.playbackRate), e.volume !== void 0 && (t.volume = e.volume), e.startTime !== void 0 && (t.startTime = e.startTime), e.preload !== void 0 && (t.preload = e.preload), e.controls !== void 0 && (t.controls = e.controls), e.interactive !== void 0 && (t.interactive = e.interactive), e.poster !== void 0 && (t.poster = e.poster), e.pauseImage !== void 0 && (t.pauseImage = e.pauseImage), e.locale !== void 0 && (t.locale = e.locale), e.danmaku !== void 0 && (t.danmaku = e.danmaku), e.debug !== void 0 && (t.debug = e.debug), t;
84
84
  }
85
- function j(e, t) {
85
+ function A(e, t) {
86
86
  try {
87
87
  t("playerEvent", e);
88
88
  } catch {}
@@ -179,15 +179,8 @@ function j(e, t) {
179
179
  }
180
180
  }
181
181
  //#endregion
182
- //#region src/VideoPlayer.vue?vue&type=script&setup=true&lang.ts
183
- var M = {
184
- ref: "container",
185
- class: "sentinel-video__player",
186
- style: {
187
- width: "100%",
188
- height: "100%"
189
- }
190
- }, N = /* @__PURE__ */ a({
182
+ //#region src/VideoPlayer.vue
183
+ var j = /* @__PURE__ */ a({
191
184
  __name: "VideoPlayer",
192
185
  props: {
193
186
  source: {},
@@ -231,51 +224,51 @@ var M = {
231
224
  },
232
225
  emits: /* @__PURE__ */ "playerEvent.ready.play.pause.ended.timeUpdate.volumeChange.seeking.seeked.waiting.playing.qualityChange.subtitleChange.error.autoplayBlocked.reconnectStart.reconnectSuccess.reconnectFailed.compatWarning.stalled.playableChange.kernelHealth.audioHealth.bufferHealth.contextChange.sourceRoute.firstFrame.frameFreeze.userAction".split("."),
233
226
  setup(a, { expose: o, emit: c }) {
234
- let l = a, d = c, { handle: p, overlay: g, isMounted: _, handleRetry: v, dismissPauseImage: b } = k(h("container"), l, d), x = e(() => y(l.locale).messages), S = e(() => typeof l.poster == "string" ? l.poster : l.poster?.url), C = e(() => typeof l.pauseImage == "string" ? l.pauseImage : l.pauseImage?.url), w = () => [
235
- S.value ? E("sentinel-poster", {
236
- visible: g.value.posterVisible,
227
+ let l = a, d = c, h = p(null), { handle: g, overlay: _, isMounted: y, handleRetry: b, dismissPauseImage: x } = O(h, l, d), S = e(() => v(l.locale).messages), C = e(() => typeof l.poster == "string" ? l.poster : l.poster?.url), w = e(() => typeof l.pauseImage == "string" ? l.pauseImage : l.pauseImage?.url), k = () => [
228
+ C.value ? T("sentinel-poster", {
229
+ visible: _.value.posterVisible,
237
230
  poster: l.poster
238
231
  }) : null,
239
- C.value ? E("sentinel-pause", {
240
- visible: g.value.pauseImageVisible,
232
+ w.value ? T("sentinel-pause", {
233
+ visible: _.value.pauseImageVisible,
241
234
  pauseImage: l.pauseImage,
242
- "close-label": D(x.value, "close"),
243
- "onSentinel-close": b
235
+ "close-label": E(S.value, "close"),
236
+ "onSentinel-close": x
244
237
  }) : null,
245
- E("sentinel-loading", {
246
- visible: g.value.loadingVisible,
247
- text: D(x.value, "loading")
238
+ T("sentinel-loading", {
239
+ visible: _.value.loadingVisible,
240
+ text: E(S.value, "loading")
248
241
  }),
249
- g.value.error ? E("sentinel-error", {
242
+ _.value.error ? T("sentinel-error", {
250
243
  visible: !0,
251
- code: g.value.error.code,
252
- message: O(x.value, g.value.error.code, g.value.error.message),
253
- retryable: g.value.error.retryable,
254
- "retry-label": D(x.value, "retry"),
255
- "onSentinel-retry": v
244
+ code: _.value.error.code,
245
+ message: D(S.value, _.value.error.code, _.value.error.message),
246
+ retryable: _.value.error.retryable,
247
+ "retry-label": E(S.value, "retry"),
248
+ "onSentinel-retry": b
256
249
  }) : null
257
250
  ];
258
251
  return o({
259
- play: () => p.value?.play() ?? Promise.resolve(),
260
- pause: () => p.value?.pause(),
261
- seek: (e) => p.value?.seek(e),
262
- setMuted: (e) => p.value?.setMuted(e),
263
- setVolume: (e) => p.value?.setVolume(e),
264
- setPlaybackRate: (e) => p.value?.setPlaybackRate(e),
265
- enterFullscreen: () => p.value?.enterFullscreen() ?? Promise.resolve(),
266
- exitFullscreen: () => p.value?.exitFullscreen() ?? Promise.resolve(),
267
- setQuality: (e) => p.value?.setQuality(e),
268
- setSubtitle: (e) => p.value?.setSubtitle(e),
269
- setLocale: (e) => p.value?.setLocale(e),
270
- pushDanmaku: (e) => p.value?.pushDanmaku(e),
271
- setDanmakuEnabled: (e) => p.value?.setDanmakuEnabled(e),
272
- clearDanmaku: () => p.value?.clearDanmaku(),
273
- reconnect: (e) => p.value?.reconnect(e),
274
- destroy: () => p.value?.destroy(),
275
- getCurrentTime: () => p.value?.getCurrentTime() ?? 0,
276
- getDuration: () => p.value?.getDuration() ?? 0,
277
- getPlaybackContext: () => p.value?.getPlaybackContext() ?? null,
278
- getPlayerHandle: () => p.value
252
+ play: () => g.value?.play() ?? Promise.resolve(),
253
+ pause: () => g.value?.pause(),
254
+ seek: (e) => g.value?.seek(e),
255
+ setMuted: (e) => g.value?.setMuted(e),
256
+ setVolume: (e) => g.value?.setVolume(e),
257
+ setPlaybackRate: (e) => g.value?.setPlaybackRate(e),
258
+ enterFullscreen: () => g.value?.enterFullscreen() ?? Promise.resolve(),
259
+ exitFullscreen: () => g.value?.exitFullscreen() ?? Promise.resolve(),
260
+ setQuality: (e) => g.value?.setQuality(e),
261
+ setSubtitle: (e) => g.value?.setSubtitle(e),
262
+ setLocale: (e) => g.value?.setLocale(e),
263
+ pushDanmaku: (e) => g.value?.pushDanmaku(e),
264
+ setDanmakuEnabled: (e) => g.value?.setDanmakuEnabled(e),
265
+ clearDanmaku: () => g.value?.clearDanmaku(),
266
+ reconnect: (e) => g.value?.reconnect(e),
267
+ destroy: () => g.value?.destroy(),
268
+ getCurrentTime: () => g.value?.getCurrentTime() ?? 0,
269
+ getDuration: () => g.value?.getDuration() ?? 0,
270
+ getPlaybackContext: () => g.value?.getPlaybackContext() ?? null,
271
+ getPlayerHandle: () => g.value
279
272
  }), (e, a) => (u(), n("div", {
280
273
  class: "sentinel-video",
281
274
  style: s({
@@ -285,11 +278,19 @@ var M = {
285
278
  pointerEvents: l.interactive === !1 ? "none" : void 0
286
279
  })
287
280
  }, [
288
- r("div", M, null, 512),
289
- i(w),
290
- m(_) ? t("", !0) : f(e.$slots, "ssr-placeholder", { key: 0 })
281
+ r("div", {
282
+ ref_key: "containerRef",
283
+ ref: h,
284
+ class: "sentinel-video__player",
285
+ style: {
286
+ width: "100%",
287
+ height: "100%"
288
+ }
289
+ }, null, 512),
290
+ i(k),
291
+ m(y) ? t("", !0) : f(e.$slots, "ssr-placeholder", { key: 0 })
291
292
  ], 4));
292
293
  }
293
294
  });
294
295
  //#endregion
295
- export { N as VideoPlayer };
296
+ export { j as VideoPlayer };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@video-lab/vue",
3
- "version": "1.0.1",
3
+ "version": "2.0.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -25,23 +25,24 @@
25
25
  ],
26
26
  "sideEffects": false,
27
27
  "peerDependencies": {
28
- "vue": ">=3.5.0"
28
+ "vue": "^3.4.0"
29
29
  },
30
30
  "dependencies": {
31
- "@video-lab/protocol": "1.0.1",
32
- "@video-lab/player-ui": "1.0.1",
33
- "@video-lab/player-core": "1.0.1"
31
+ "@video-lab/protocol": "2.0.0",
32
+ "@video-lab/player-core": "2.0.0",
33
+ "@video-lab/player-ui": "2.0.0"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@vitejs/plugin-vue": "^6.0.8",
37
- "@vue/test-utils": "^2.4.0",
37
+ "@vue/test-utils": "2.4.6",
38
38
  "jsdom": "^24.0.0",
39
39
  "typescript": "~5.9.0",
40
40
  "vite": "^8.1.5",
41
41
  "vite-plugin-dts": "^5.0.3",
42
42
  "vitest": "^4.1.10",
43
- "vue": "^3.5.0",
44
- "vue-tsc": "^2.0.0"
43
+ "vue": "3.4.0",
44
+ "vue-tsc": "^2.0.0",
45
+ "@vue/server-renderer": "3.4.0"
45
46
  },
46
47
  "description": "Video Lab Player Vue 3 inline 组件:直连 player-core 的高性能接入方式",
47
48
  "publishConfig": {