xxf_react 0.9.1 → 0.9.2
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.
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
* Video 安全播放扩展
|
|
3
3
|
* 处理移动端自动播放限制,自动降级为静音播放
|
|
4
4
|
*/
|
|
5
|
+
/** 播放失败信息 */
|
|
6
|
+
export interface PlayErrorInfo {
|
|
7
|
+
url: string;
|
|
8
|
+
error: Error;
|
|
9
|
+
}
|
|
10
|
+
/** 全局播放失败监听器类型 */
|
|
11
|
+
export type PlayErrorListener = (info: PlayErrorInfo) => void;
|
|
12
|
+
/** 设置全局播放失败监听 */
|
|
13
|
+
export declare function setPlayErrorListener(listener: PlayErrorListener | null): void;
|
|
5
14
|
export interface PlaySafeOptions {
|
|
6
15
|
/** 是否在非静音播放失败时降级为静音重试,默认 true */
|
|
7
16
|
mutedRetry?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video-play-safe.d.ts","sourceRoot":"","sources":["../../src/media/video-play-safe.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC5B,iCAAiC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kBAAkB;IAClB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC9B;AAGD,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,gBAAgB;QACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACtD;CACJ;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAC1B,KAAK,EAAE,gBAAgB,EACvB,OAAO,GAAE,eAAoB,GAC9B,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"video-play-safe.d.ts","sourceRoot":"","sources":["../../src/media/video-play-safe.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,aAAa;AACb,MAAM,WAAW,aAAa;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC;CAChB;AAED,kBAAkB;AAClB,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;AAK9D,iBAAiB;AACjB,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAE7E;AAOD,MAAM,WAAW,eAAe;IAC5B,iCAAiC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kBAAkB;IAClB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC9B;AAGD,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,gBAAgB;QACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACtD;CACJ;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAC1B,KAAK,EAAE,gBAAgB,EACvB,OAAO,GAAE,eAAoB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAoDf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAYzC"}
|
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
* Video 安全播放扩展
|
|
3
3
|
* 处理移动端自动播放限制,自动降级为静音播放
|
|
4
4
|
*/
|
|
5
|
+
/** 全局监听器 */
|
|
6
|
+
let globalErrorListener = null;
|
|
7
|
+
/** 设置全局播放失败监听 */
|
|
8
|
+
export function setPlayErrorListener(listener) {
|
|
9
|
+
globalErrorListener = listener;
|
|
10
|
+
}
|
|
11
|
+
/** 通知监听器 */
|
|
12
|
+
function notifyPlayError(info) {
|
|
13
|
+
globalErrorListener === null || globalErrorListener === void 0 ? void 0 : globalErrorListener(info);
|
|
14
|
+
}
|
|
5
15
|
/**
|
|
6
16
|
* 安全播放视频
|
|
7
17
|
* 1. 按当前 video.muted 状态尝试播放
|
|
@@ -13,28 +23,43 @@ export async function playSafe(video, options = {}) {
|
|
|
13
23
|
return;
|
|
14
24
|
}
|
|
15
25
|
const wasMuted = video.muted;
|
|
26
|
+
const videoUrl = video.currentSrc || video.src || '';
|
|
16
27
|
try {
|
|
17
28
|
await video.play();
|
|
18
29
|
}
|
|
19
30
|
catch (error) {
|
|
31
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
20
32
|
// 处理自动播放被阻止的错误
|
|
21
33
|
// - NotAllowedError: Chrome/Firefox 自动播放策略阻止
|
|
22
34
|
// - AbortError: Safari/iOS 自动播放策略阻止(包括低电量模式)
|
|
23
|
-
const isAutoplayBlocked =
|
|
24
|
-
(error.name === 'NotAllowedError' || error.name === 'AbortError');
|
|
35
|
+
const isAutoplayBlocked = err.name === 'NotAllowedError' || err.name === 'AbortError';
|
|
25
36
|
if (!isAutoplayBlocked) {
|
|
26
|
-
|
|
37
|
+
// 非自动播放阻止的错误,通知全局监听器
|
|
38
|
+
notifyPlayError({ url: videoUrl, error: err });
|
|
39
|
+
throw err;
|
|
27
40
|
}
|
|
28
41
|
// 不启用静音重试,直接抛出
|
|
29
|
-
if (!mutedRetry)
|
|
30
|
-
|
|
42
|
+
if (!mutedRetry) {
|
|
43
|
+
notifyPlayError({ url: videoUrl, error: err });
|
|
44
|
+
throw err;
|
|
45
|
+
}
|
|
31
46
|
// 已经是静音还失败,直接抛出
|
|
32
|
-
if (wasMuted)
|
|
33
|
-
|
|
47
|
+
if (wasMuted) {
|
|
48
|
+
notifyPlayError({ url: videoUrl, error: err });
|
|
49
|
+
throw err;
|
|
50
|
+
}
|
|
34
51
|
// 降级为静音播放
|
|
35
52
|
video.muted = true;
|
|
36
53
|
onMutedChange === null || onMutedChange === void 0 ? void 0 : onMutedChange();
|
|
37
|
-
|
|
54
|
+
try {
|
|
55
|
+
await video.play();
|
|
56
|
+
}
|
|
57
|
+
catch (retryError) {
|
|
58
|
+
// 静音重试也失败,通知全局监听器
|
|
59
|
+
const retryErr = retryError instanceof Error ? retryError : new Error(String(retryError));
|
|
60
|
+
notifyPlayError({ url: videoUrl, error: retryErr });
|
|
61
|
+
throw retryErr;
|
|
62
|
+
}
|
|
38
63
|
}
|
|
39
64
|
}
|
|
40
65
|
/**
|