@cloud-app-dev/vidc 2.1.0-alpha.8 → 2.2.0-alpha.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.
- package/.umirc.ts +4 -3
- package/es/Api/index.js +1 -1
- package/es/AppContext/Sync.d.ts +1 -0
- package/es/AppContext/interface.d.ts +4 -1
- package/es/CheckGroupFixed/index.d.ts +1 -0
- package/es/DeviceSelect/TreeType.d.ts +1 -0
- package/es/DeviceSelect/demo.d.ts +1 -0
- package/es/DeviceSelect/index.d.ts +1 -0
- package/es/DeviceSelect/index.js +1 -1
- package/es/Drag/DragAndDropItem.js +2 -2
- package/es/Drag/DropItem.js +2 -2
- package/es/Drawer/Demo.js +24 -3
- package/es/Drawer/Footer.d.ts +1 -0
- package/es/Drawer/index.d.ts +29 -3
- package/es/Drawer/index.js +155 -4
- package/es/FrontendPlayer/index.d.ts +2 -0
- package/es/FrontendPlayer/index.js +2 -0
- package/es/FullScreen/index.d.ts +2 -3
- package/es/FullScreen/index.js +14 -41
- package/es/InitialConfig/utils.d.ts +5 -5
- package/es/InitialConfig/utils.js +19 -19
- package/es/Input/index.d.ts +1 -0
- package/es/List/CheckExt.d.ts +1 -0
- package/es/List/DeviceList/index.js +1 -1
- package/es/List/DynamicDeviceList/Demo.d.ts +1 -0
- package/es/List/DynamicDeviceList/index.d.ts +1 -0
- package/es/List/GridList/index.js +0 -1
- package/es/List/VList/index.d.ts +1 -0
- package/es/List/index.d.ts +1 -0
- package/es/LoaderApp/index.js +26 -22
- package/es/LoaderApp/loader.js +2 -6
- package/es/LoaderApp/utils.d.ts +1 -0
- package/es/LoaderApp/utils.js +37 -0
- package/es/Modal/index.d.ts +27 -0
- package/es/Modal/index.js +155 -1
- package/es/Picture/component/DefaultRects/RectInfo.d.ts +1 -0
- package/es/Picture/component/DefaultRects/index.d.ts +2 -1
- package/es/Picture/component/DrawRect/index.d.ts +3 -4
- package/es/Picture/component/MoveContent/index.js +16 -12
- package/es/Picture/component/RectMenu/index.d.ts +2 -3
- package/es/Picture/component/Tools/index.js +0 -5
- package/es/Picture/component/WheelScale/index.d.ts +1 -0
- package/es/Picture/component/WheelScale/index.js +3 -3
- package/es/Picture/index.d.ts +1 -0
- package/es/Picture/index.js +4 -2
- package/es/Picture/interface.d.ts +4 -2
- package/es/Picture/utils.d.ts +1 -0
- package/es/Player/api/index.d.ts +71 -0
- package/es/Player/api/index.js +284 -0
- package/es/Player/contraller_bar/bar.d.ts +8 -0
- package/es/Player/contraller_bar/bar.js +21 -0
- package/es/Player/contraller_bar/contraller_event.d.ts +9 -0
- package/es/{RefModal/index.js → Player/contraller_bar/contraller_event.js} +39 -54
- package/es/Player/contraller_bar/index.d.ts +19 -0
- package/es/Player/contraller_bar/index.js +37 -0
- package/es/Player/contraller_bar/left_bar.d.ts +15 -0
- package/es/Player/contraller_bar/left_bar.js +91 -0
- package/es/Player/contraller_bar/right_bar.d.ts +13 -0
- package/es/Player/contraller_bar/right_bar.js +55 -0
- package/es/Player/contraller_bar/useBarStatus.d.ts +3 -0
- package/es/{RefDrawer/index.js → Player/contraller_bar/useBarStatus.js} +27 -46
- package/es/Player/demo.d.ts +2 -0
- package/es/Player/demo.js +269 -0
- package/es/Player/event/browserTabEvent.d.ts +9 -0
- package/es/Player/event/browserTabEvent.js +57 -0
- package/es/Player/event/errorEvent.d.ts +16 -0
- package/es/Player/event/errorEvent.js +120 -0
- package/es/Player/event/eventName.d.ts +3 -0
- package/es/Player/event/eventName.js +15 -0
- package/es/Player/event/index.d.ts +22 -0
- package/es/Player/event/index.js +175 -0
- package/es/Player/frontend_player.d.ts +15 -0
- package/es/Player/frontend_player.js +90 -0
- package/es/Player/frontend_timeline.d.ts +14 -0
- package/es/Player/frontend_timeline.js +138 -0
- package/es/Player/iconfont.d.ts +13 -0
- package/es/Player/iconfont.js +18 -0
- package/es/Player/index.d.ts +8 -0
- package/es/Player/index.js +8 -0
- package/es/Player/live_heart.d.ts +6 -0
- package/es/Player/live_heart.js +29 -0
- package/es/Player/message.d.ts +11 -0
- package/es/Player/message.js +150 -0
- package/es/Player/player.d.ts +75 -0
- package/es/Player/segment_player.d.ts +13 -0
- package/es/Player/segment_player.js +191 -0
- package/es/Player/segment_timeline.d.ts +16 -0
- package/es/Player/segment_timeline.js +154 -0
- package/es/Player/single_player.d.ts +5 -0
- package/es/Player/single_player.js +185 -0
- package/es/Player/style/bar.css +37 -0
- package/es/Player/style/iconfont.css +62 -0
- package/es/Player/style/index.css +22 -0
- package/es/Player/style/message.css +49 -0
- package/es/Player/style/slider.css +96 -0
- package/es/Player/style/timeline.css +92 -0
- package/es/Player/timeline.d.ts +11 -0
- package/es/Player/timeline.js +104 -0
- package/es/Player/util.d.ts +48 -0
- package/es/Player/util.js +172 -0
- package/es/Progress/index.d.ts +1 -0
- package/es/SegmentPlayer/index.d.ts +2 -0
- package/es/SegmentPlayer/index.js +2 -0
- package/es/Service/fetch-adapter.d.ts +12 -0
- package/es/Service/fetch-adapter.js +184 -0
- package/es/Service/http.d.ts +1 -1
- package/es/Service/http.js +4 -2
- package/es/Service/interface.d.ts +2 -1
- package/es/Tree/BaseTree/demo.d.ts +1 -0
- package/es/Tree/BaseTree/demo.js +3 -1
- package/es/Tree/BaseTree/index.d.ts +2 -2
- package/es/Tree/demo.d.ts +1 -0
- package/es/Tree/index.js +1 -1
- package/es/UserSelect/demo.d.ts +1 -0
- package/es/WorkerFlow/Form/Approver.d.ts +1 -0
- package/es/WorkerFlow/Form/Condition.d.ts +1 -0
- package/es/WorkerFlow/Form/Condition.js +2 -1
- package/es/WorkerFlow/Form/EmptyUserSet.d.ts +1 -0
- package/es/WorkerFlow/Form/EmptyUserSet.js +2 -1
- package/es/WorkerFlow/Form/FormAuth.d.ts +1 -0
- package/es/WorkerFlow/Form/GroupList.d.ts +1 -0
- package/es/WorkerFlow/Form/GroupSelect.d.ts +1 -0
- package/es/WorkerFlow/Form/GroupSelect.js +2 -1
- package/es/WorkerFlow/Form/Handle.d.ts +1 -0
- package/es/WorkerFlow/Form/LevelGroupSelect.d.ts +1 -0
- package/es/WorkerFlow/Form/LevelGroupSelect.js +2 -1
- package/es/WorkerFlow/Form/Notifier.d.ts +1 -0
- package/es/WorkerFlow/Form/UserAndGroupSelect.d.ts +1 -0
- package/es/WorkerFlow/Form/UserAndGroupSelect.js +2 -1
- package/es/WorkerFlow/Form/UserSelect.d.ts +1 -0
- package/es/WorkerFlow/Form/UserSelect.js +2 -1
- package/es/WorkerFlow/Form/UserSet.d.ts +1 -0
- package/es/WorkerFlow/Form/UsersHandleType.d.ts +1 -0
- package/es/WorkerFlow/Nodes/Add.d.ts +1 -0
- package/es/WorkerFlow/Nodes/Add.js +1 -1
- package/es/WorkerFlow/Nodes/AddOption.d.ts +1 -0
- package/es/WorkerFlow/Nodes/AddOptionList.d.ts +1 -0
- package/es/WorkerFlow/Nodes/Approver.d.ts +1 -0
- package/es/WorkerFlow/Nodes/Condition.d.ts +1 -0
- package/es/WorkerFlow/Nodes/End.d.ts +1 -0
- package/es/WorkerFlow/Nodes/Handle.d.ts +1 -0
- package/es/WorkerFlow/Nodes/Node.d.ts +1 -0
- package/es/WorkerFlow/Nodes/Notifier.d.ts +1 -0
- package/es/WorkerFlow/Nodes/Render.d.ts +1 -0
- package/es/WorkerFlow/Nodes/Start.d.ts +1 -0
- package/es/WorkerFlow/Nodes/TitleElement.d.ts +1 -0
- package/es/WorkerFlow/Nodes/TitleElement.js +6 -2
- package/es/WorkerFlow/index.js +2 -1
- package/es/index.d.ts +5 -8
- package/es/index.js +6 -9
- package/es/typings.d.ts +1 -0
- package/package.json +15 -10
- package/tsconfig.json +3 -2
- package/typings/global.d.ts +4 -0
- package/es/AppRedirect/index.css +0 -0
- package/es/AppRedirect/index.d.ts +0 -16
- package/es/AppRedirect/index.js +0 -33
- package/es/AppRouter/index.d.ts +0 -8
- package/es/AppRouter/index.js +0 -17
- package/es/RefDrawer/index.d.ts +0 -15
- package/es/RefModal/index.d.ts +0 -15
- package/es/useDrawer/index.d.ts +0 -14
- package/es/useDrawer/index.js +0 -91
- package/es/useModal/index.d.ts +0 -14
- package/es/useModal/index.js +0 -93
- package/typings.d.ts +0 -2
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
2
|
+
|
|
3
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
4
|
+
|
|
5
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
6
|
+
|
|
7
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
8
|
+
|
|
9
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
10
|
+
|
|
11
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
12
|
+
|
|
13
|
+
import React, { useEffect, useState, useMemo } from 'react';
|
|
14
|
+
import IconFont from './iconfont';
|
|
15
|
+
import EventName from './event/eventName';
|
|
16
|
+
import "./style/message.css";
|
|
17
|
+
|
|
18
|
+
function VideoMessage(_ref) {
|
|
19
|
+
var event = _ref.event,
|
|
20
|
+
api = _ref.api;
|
|
21
|
+
|
|
22
|
+
var _useState = useState({
|
|
23
|
+
status: null,
|
|
24
|
+
errorTimer: null,
|
|
25
|
+
loading: false
|
|
26
|
+
}),
|
|
27
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
28
|
+
state = _useState2[0],
|
|
29
|
+
setState = _useState2[1];
|
|
30
|
+
|
|
31
|
+
var message = useMemo(function () {
|
|
32
|
+
if (state.status === 'fail') {
|
|
33
|
+
return '视频错误';
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (state.status === 'reload') {
|
|
37
|
+
return "\u89C6\u9891\u52A0\u8F7D\u9519\u8BEF\uFF0C\u6B63\u5728\u8FDB\u884C\u91CD\u8FDE\u7B2C".concat(state.errorTimer, "\u6B21\u91CD\u8FDE");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return '';
|
|
41
|
+
}, [state.errorTimer, state.status]);
|
|
42
|
+
useEffect(function () {
|
|
43
|
+
var openLoading = function openLoading() {
|
|
44
|
+
return setState(function (old) {
|
|
45
|
+
return Object.assign(Object.assign({}, old), {
|
|
46
|
+
loading: true
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
var closeLoading = function closeLoading() {
|
|
52
|
+
return setState(function (old) {
|
|
53
|
+
return Object.assign(Object.assign({}, old), {
|
|
54
|
+
loading: false
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
var errorReload = function errorReload(timer) {
|
|
60
|
+
return setState(function () {
|
|
61
|
+
return {
|
|
62
|
+
status: 'reload',
|
|
63
|
+
errorTimer: timer,
|
|
64
|
+
loading: true
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
var reloadFail = function reloadFail() {
|
|
70
|
+
return setState(function (old) {
|
|
71
|
+
return Object.assign(Object.assign({}, old), {
|
|
72
|
+
status: 'fail'
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
var reloadSuccess = function reloadSuccess() {
|
|
78
|
+
return setState(function (old) {
|
|
79
|
+
return Object.assign(Object.assign({}, old), {
|
|
80
|
+
status: null
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
var reload = function reload() {
|
|
86
|
+
return setState(function (old) {
|
|
87
|
+
return Object.assign(Object.assign({}, old), {
|
|
88
|
+
status: 'reload'
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
var playEnd = function playEnd() {
|
|
94
|
+
return setState(function (old) {
|
|
95
|
+
return Object.assign(Object.assign({}, old), {
|
|
96
|
+
status: null,
|
|
97
|
+
loading: false
|
|
98
|
+
});
|
|
99
|
+
}), api.pause();
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
event.addEventListener('loadstart', openLoading);
|
|
103
|
+
event.addEventListener('waiting', openLoading); // event.addEventListener('seeking', openLoading)
|
|
104
|
+
|
|
105
|
+
event.addEventListener('loadeddata', closeLoading);
|
|
106
|
+
event.addEventListener('canplay', closeLoading);
|
|
107
|
+
event.on(EventName.ERROR_RELOAD, errorReload);
|
|
108
|
+
event.on(EventName.RELOAD_FAIL, reloadFail);
|
|
109
|
+
event.on(EventName.RELOAD_SUCCESS, reloadSuccess);
|
|
110
|
+
event.on(EventName.RELOAD, reload);
|
|
111
|
+
event.on(EventName.HISTORY_PLAY_END, playEnd);
|
|
112
|
+
event.on(EventName.CLEAR_ERROR_TIMER, reloadSuccess);
|
|
113
|
+
return function () {
|
|
114
|
+
event.removeEventListener('loadstart', openLoading);
|
|
115
|
+
event.removeEventListener('waiting', openLoading); // event.removeEventListener('seeking', openLoading)
|
|
116
|
+
|
|
117
|
+
event.removeEventListener('loadeddata', closeLoading);
|
|
118
|
+
event.removeEventListener('canplay', closeLoading);
|
|
119
|
+
event.off(EventName.ERROR_RELOAD, errorReload);
|
|
120
|
+
event.off(EventName.RELOAD_FAIL, reloadFail);
|
|
121
|
+
event.off(EventName.RELOAD_SUCCESS, reloadSuccess);
|
|
122
|
+
event.off(EventName.RELOAD, reload);
|
|
123
|
+
event.off(EventName.HISTORY_PLAY_END, playEnd);
|
|
124
|
+
event.off(EventName.CLEAR_ERROR_TIMER, reloadSuccess);
|
|
125
|
+
};
|
|
126
|
+
}, [event]);
|
|
127
|
+
var loading = state.loading,
|
|
128
|
+
status = state.status;
|
|
129
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
130
|
+
className: "lm-player-message-mask ".concat(loading || status === 'fail' ? 'lm-player-mask-loading-animation' : '')
|
|
131
|
+
}, /*#__PURE__*/React.createElement(IconFont, {
|
|
132
|
+
type: status === 'fail' ? 'lm-player-YesorNo_No_Dark' : 'lm-player-Loading',
|
|
133
|
+
className: "".concat(loading && status !== 'fail' ? 'lm-player-loading-animation' : status === 'fail' ? 'lm-player-loadfail' : '', " lm-player-loading-icon")
|
|
134
|
+
}), /*#__PURE__*/React.createElement("span", {
|
|
135
|
+
className: "lm-player-message"
|
|
136
|
+
}, message));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export var NoSource = function NoSource() {
|
|
140
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
141
|
+
className: "lm-player-message-mask lm-player-mask-loading-animation"
|
|
142
|
+
}, /*#__PURE__*/React.createElement(IconFont, {
|
|
143
|
+
style: {
|
|
144
|
+
fontSize: 80
|
|
145
|
+
},
|
|
146
|
+
type: "lm-player-PlaySource",
|
|
147
|
+
title: "\u8BF7\u9009\u62E9\u89C6\u9891\u6E90"
|
|
148
|
+
}));
|
|
149
|
+
};
|
|
150
|
+
export default VideoMessage;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type FlvJs from 'flv.zv.js';
|
|
2
|
+
import type Hls, { HlsConfig } from 'hls.js';
|
|
3
|
+
import type React from 'react';
|
|
4
|
+
import type Api from './api';
|
|
5
|
+
import type VideoEventInstance from './event';
|
|
6
|
+
|
|
7
|
+
export type FlvPlayerConfig = {
|
|
8
|
+
mediaDataSource: FlvJs.MediaDataSource;
|
|
9
|
+
config: FlvJs.Config;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export interface ISinglePlayerProps {
|
|
13
|
+
url?: string;
|
|
14
|
+
className?: string;
|
|
15
|
+
children?: React.ReactNode;
|
|
16
|
+
muted?: boolean;
|
|
17
|
+
scale?: boolean;
|
|
18
|
+
autoPlay?: boolean;
|
|
19
|
+
playsInline?: boolean;
|
|
20
|
+
preload?: string;
|
|
21
|
+
poster?: string;
|
|
22
|
+
loop?: boolean;
|
|
23
|
+
type?: 'flv' | 'hls' | 'native';
|
|
24
|
+
hideContrallerBar?: boolean;
|
|
25
|
+
isLive?: boolean;
|
|
26
|
+
rightExtContents?: React.ReactNode;
|
|
27
|
+
rightMidExtContents?: React.ReactNode;
|
|
28
|
+
leftExtContents?: React.ReactNode;
|
|
29
|
+
leftMidExtContents?: React.ReactNode;
|
|
30
|
+
customTimeLine?: React.ReactNode;
|
|
31
|
+
errorReloadTimer?: number;
|
|
32
|
+
flvConfig?: FlvPlayerConfig;
|
|
33
|
+
hlsConfig?: HlsConfig;
|
|
34
|
+
reload?: () => void;
|
|
35
|
+
onCanPlayerInit?: () => void;
|
|
36
|
+
videoEvents?: CustomEvent[];
|
|
37
|
+
playerEvents?: CustomEvent[];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const SinglePlayer: React.FunctionComponent<ISinglePlayerProps>;
|
|
41
|
+
|
|
42
|
+
export interface EventName {
|
|
43
|
+
RELOAD: 'reload'; //手动视频重载
|
|
44
|
+
RELOAD_FAIL: 'reloadFail'; // 视频出错,重连失败
|
|
45
|
+
RELOAD_SUCCESS: 'reloadSuccess'; //视频出错,重连成功
|
|
46
|
+
ERROR: 'error'; //视频出错
|
|
47
|
+
ERROR_RELOAD: 'errorRload'; //视频出错,自动重连
|
|
48
|
+
HISTORY_PLAY_END: 'historyPlayEnd'; //历史视频列表播放结束
|
|
49
|
+
SEEK: 'seek'; //跳跃播放时间
|
|
50
|
+
TRANSFORM: 'transform'; //视频容器缩放
|
|
51
|
+
CHANGE_PLAY_INDEX: 'changePlayIndex'; //历史视频列表播放索引改变
|
|
52
|
+
HIDE_CONTRALLER: 'hideContraller';
|
|
53
|
+
SHOW_CONTRALLER: 'showContraller';
|
|
54
|
+
CLEAR_ERROR_TIMER: 'clearErrorTimer';
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export type EventInfo = {
|
|
58
|
+
type: string;
|
|
59
|
+
listener: ((...args: any) => void)[];
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export type ExportPlayerType = {
|
|
63
|
+
video: HTMLVideoElement;
|
|
64
|
+
container: HTMLElement;
|
|
65
|
+
api: Api;
|
|
66
|
+
event: VideoEventInstance;
|
|
67
|
+
plugins: [FlvJs.Player, Hls];
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export interface ISegmentType {
|
|
71
|
+
url?: string;
|
|
72
|
+
duration: number;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export type CustomEvent = [string, () => void];
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { ISegmentType, ISinglePlayerProps } from './player';
|
|
3
|
+
interface ISegmentPlayerProps extends Omit<ISinglePlayerProps, 'url' | 'customTimeLine' | 'onCanPlayerInit'> {
|
|
4
|
+
segments?: ISegmentType[];
|
|
5
|
+
begin?: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* @desc 主组件,负责片段整体逻辑控制
|
|
9
|
+
* @param param0
|
|
10
|
+
* @returns
|
|
11
|
+
*/
|
|
12
|
+
declare function SegmentPlayer({ segments, begin, ...props }: ISegmentPlayerProps): JSX.Element;
|
|
13
|
+
export default SegmentPlayer;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
2
|
+
|
|
3
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
4
|
+
|
|
5
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
6
|
+
|
|
7
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
8
|
+
|
|
9
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
10
|
+
|
|
11
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
12
|
+
|
|
13
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
14
|
+
|
|
15
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
16
|
+
|
|
17
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
18
|
+
|
|
19
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
20
|
+
|
|
21
|
+
import { __rest } from "tslib";
|
|
22
|
+
import React, { useEffect, useMemo, useRef, useState } from 'react';
|
|
23
|
+
import SinglePlayer from './single_player';
|
|
24
|
+
import SegmentTimeLine from './segment_timeline';
|
|
25
|
+
/**
|
|
26
|
+
* @desc 计算第一个url
|
|
27
|
+
* @param segments
|
|
28
|
+
* @param defaultIndex
|
|
29
|
+
* @returns
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
function getFirstUrlIndex(segments) {
|
|
33
|
+
var defaultIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
34
|
+
|
|
35
|
+
if (!(Array.isArray(segments) && segments.length > 0)) {
|
|
36
|
+
return defaultIndex;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (segments[defaultIndex].url) {
|
|
40
|
+
return defaultIndex;
|
|
41
|
+
} else {
|
|
42
|
+
var i = defaultIndex + 1;
|
|
43
|
+
|
|
44
|
+
if (i > segments.length) {
|
|
45
|
+
return i;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return getFirstUrlIndex(segments, i);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* @desc 片段索引控制
|
|
53
|
+
* @param event
|
|
54
|
+
* @param segments
|
|
55
|
+
* @param deps
|
|
56
|
+
* @returns
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
function usePlayIndex(event, segments, deps) {
|
|
61
|
+
var _useState = useState({
|
|
62
|
+
index: getFirstUrlIndex(segments, 0)
|
|
63
|
+
}),
|
|
64
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
65
|
+
state = _useState2[0],
|
|
66
|
+
setState = _useState2[1]; // 片段发生变化重新开始计算索引
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
useEffect(function () {
|
|
70
|
+
var index = getFirstUrlIndex(segments, 0);
|
|
71
|
+
setState(function (old) {
|
|
72
|
+
return Object.assign(Object.assign({}, old), {
|
|
73
|
+
index: index
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
}, [segments]); // 索引不存在播放地址,自动跳转下一段
|
|
77
|
+
|
|
78
|
+
useEffect(function () {
|
|
79
|
+
var _a;
|
|
80
|
+
|
|
81
|
+
if (!((_a = segments[state.index]) === null || _a === void 0 ? void 0 : _a.url) && state.index < segments.length - 1) {
|
|
82
|
+
setState(function (old) {
|
|
83
|
+
return Object.assign(Object.assign({}, old), {
|
|
84
|
+
index: old.index + 1
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}, [state.index]); // 监听片段播放状态,自动跳转下一个片段
|
|
89
|
+
|
|
90
|
+
useEffect(function () {
|
|
91
|
+
if (!event) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
var fn = function fn() {
|
|
96
|
+
return setState(function (old) {
|
|
97
|
+
return Object.assign(Object.assign({}, onload), {
|
|
98
|
+
index: old.index + 1 < segments.length ? old.index + 1 : old.index
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
event.addEventListener('ended', fn);
|
|
104
|
+
return function () {
|
|
105
|
+
return event.removeEventListener('ended', fn);
|
|
106
|
+
};
|
|
107
|
+
}, [event, segments].concat(_toConsumableArray(deps)));
|
|
108
|
+
return {
|
|
109
|
+
index: state.index,
|
|
110
|
+
setIndex: function setIndex(i) {
|
|
111
|
+
return setState(function (old) {
|
|
112
|
+
return Object.assign(Object.assign({}, old), {
|
|
113
|
+
index: i
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* @desc 主组件,负责片段整体逻辑控制
|
|
121
|
+
* @param param0
|
|
122
|
+
* @returns
|
|
123
|
+
*/
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
function SegmentPlayer(_a) {
|
|
127
|
+
var _b;
|
|
128
|
+
|
|
129
|
+
var segments = _a.segments,
|
|
130
|
+
begin = _a.begin,
|
|
131
|
+
props = __rest(_a, ["segments", "begin"]);
|
|
132
|
+
|
|
133
|
+
var _useState3 = useState({
|
|
134
|
+
forceKey: Date.now()
|
|
135
|
+
}),
|
|
136
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
137
|
+
state = _useState4[0],
|
|
138
|
+
setState = _useState4[1];
|
|
139
|
+
|
|
140
|
+
var duration = useMemo(function () {
|
|
141
|
+
return segments === null || segments === void 0 ? void 0 : segments.map(function (v) {
|
|
142
|
+
return v.duration;
|
|
143
|
+
}).reduce(function (a, b) {
|
|
144
|
+
return a + b;
|
|
145
|
+
}, 0);
|
|
146
|
+
}, [segments]);
|
|
147
|
+
var playerRef = useRef(null);
|
|
148
|
+
|
|
149
|
+
var _usePlayIndex = usePlayIndex((_b = playerRef.current) === null || _b === void 0 ? void 0 : _b.event, segments, [state.forceKey]),
|
|
150
|
+
index = _usePlayIndex.index,
|
|
151
|
+
setIndex = _usePlayIndex.setIndex;
|
|
152
|
+
|
|
153
|
+
var url = useMemo(function () {
|
|
154
|
+
return segments && segments[index] ? segments[index].url : undefined;
|
|
155
|
+
}, [segments, index]); // 重置reload
|
|
156
|
+
|
|
157
|
+
var reload = function reload() {
|
|
158
|
+
setIndex(0);
|
|
159
|
+
playerRef.current.api.reload();
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
var _ref = playerRef.current || {},
|
|
163
|
+
api = _ref.api,
|
|
164
|
+
event = _ref.event; // 秒级别转换
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
var beginTemp = useMemo(function () {
|
|
168
|
+
return begin ? String(begin).length === 10 ? Math.floor(begin * 1000) : begin : begin;
|
|
169
|
+
}, []);
|
|
170
|
+
return /*#__PURE__*/React.createElement(SinglePlayer, Object.assign({
|
|
171
|
+
ref: playerRef,
|
|
172
|
+
url: url,
|
|
173
|
+
reload: reload,
|
|
174
|
+
onCanPlayerInit: function onCanPlayerInit() {
|
|
175
|
+
return setState({
|
|
176
|
+
forceKey: Date.now()
|
|
177
|
+
});
|
|
178
|
+
},
|
|
179
|
+
customTimeLine: api && event ? /*#__PURE__*/React.createElement(SegmentTimeLine, {
|
|
180
|
+
begin: beginTemp,
|
|
181
|
+
api: api,
|
|
182
|
+
event: event,
|
|
183
|
+
index: index,
|
|
184
|
+
segments: segments,
|
|
185
|
+
duration: duration,
|
|
186
|
+
setIndex: setIndex
|
|
187
|
+
}) : /*#__PURE__*/React.createElement(React.Fragment, null)
|
|
188
|
+
}, props));
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export default SegmentPlayer;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type Api from './api';
|
|
3
|
+
import type VideoEventInstance from './event';
|
|
4
|
+
import type { ISegmentType } from './player';
|
|
5
|
+
import './style/timeline.less';
|
|
6
|
+
interface ITimeLineProps {
|
|
7
|
+
api: Api;
|
|
8
|
+
event: VideoEventInstance;
|
|
9
|
+
index: number;
|
|
10
|
+
segments: ISegmentType[];
|
|
11
|
+
duration: number;
|
|
12
|
+
setIndex: (i: number) => void;
|
|
13
|
+
begin: number;
|
|
14
|
+
}
|
|
15
|
+
declare function SegmentTimeLine({ api, event, index, segments, duration, begin, setIndex }: ITimeLineProps): JSX.Element;
|
|
16
|
+
export default SegmentTimeLine;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import "antd/lib/tooltip/style";
|
|
2
|
+
import _Tooltip from "antd/lib/tooltip";
|
|
3
|
+
|
|
4
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
5
|
+
|
|
6
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
7
|
+
|
|
8
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
9
|
+
|
|
10
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
11
|
+
|
|
12
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
13
|
+
|
|
14
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
15
|
+
|
|
16
|
+
import React, { useCallback, useMemo } from 'react';
|
|
17
|
+
import { useTimes } from './timeline';
|
|
18
|
+
import useBarStatus from './contraller_bar/useBarStatus';
|
|
19
|
+
import { dateFormat } from './util';
|
|
20
|
+
import "./style/timeline.css";
|
|
21
|
+
|
|
22
|
+
function SegmentTimeLine(_ref) {
|
|
23
|
+
var api = _ref.api,
|
|
24
|
+
event = _ref.event,
|
|
25
|
+
index = _ref.index,
|
|
26
|
+
segments = _ref.segments,
|
|
27
|
+
duration = _ref.duration,
|
|
28
|
+
begin = _ref.begin,
|
|
29
|
+
setIndex = _ref.setIndex;
|
|
30
|
+
var status = useBarStatus(event);
|
|
31
|
+
|
|
32
|
+
var _useTimes = useTimes(api, event),
|
|
33
|
+
_useTimes2 = _slicedToArray(_useTimes, 2),
|
|
34
|
+
currentTime = _useTimes2[0],
|
|
35
|
+
buffered = _useTimes2[1];
|
|
36
|
+
|
|
37
|
+
var indexDuration = useMemo(function () {
|
|
38
|
+
return segments.map(function (v) {
|
|
39
|
+
return v.duration;
|
|
40
|
+
}).reduce(function (a, b, i) {
|
|
41
|
+
return i >= index ? a : a + b;
|
|
42
|
+
}, 0);
|
|
43
|
+
}, [index]);
|
|
44
|
+
var playPercent = useMemo(function () {
|
|
45
|
+
return (currentTime + indexDuration) / duration * 100;
|
|
46
|
+
}, [currentTime, duration, indexDuration]);
|
|
47
|
+
var bufferedPercent = useMemo(function () {
|
|
48
|
+
return (buffered + indexDuration) / duration * 100;
|
|
49
|
+
}, [buffered, duration, indexDuration]);
|
|
50
|
+
var seekWithLine = useCallback(function (e, i) {
|
|
51
|
+
if (!segments[i].url) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
var ele = e.currentTarget;
|
|
56
|
+
var rect = ele.getBoundingClientRect();
|
|
57
|
+
var current = e.pageX - rect.left;
|
|
58
|
+
var currentTime = current / rect.width * api.getDuration();
|
|
59
|
+
|
|
60
|
+
if (i !== index) {
|
|
61
|
+
setIndex(i); // 临时方案,最好方案在初始化播放器时实现,这样处理理论上也可以
|
|
62
|
+
|
|
63
|
+
setTimeout(function () {
|
|
64
|
+
return api.seekTo(currentTime);
|
|
65
|
+
}, 500);
|
|
66
|
+
} else {
|
|
67
|
+
api.seekTo(currentTime);
|
|
68
|
+
}
|
|
69
|
+
}, [api, segments, index]);
|
|
70
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
71
|
+
className: "player-timeline-layout player-segment-timeline-layout ".concat(status === 0 ? 'hide-time-line' : '')
|
|
72
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
73
|
+
className: "segment-line-box"
|
|
74
|
+
}, segments.map(function (v, i) {
|
|
75
|
+
return /*#__PURE__*/React.createElement(_Tooltip, {
|
|
76
|
+
key: "time-line-".concat(i),
|
|
77
|
+
title: /*#__PURE__*/React.createElement(TipTitle, {
|
|
78
|
+
segments: segments,
|
|
79
|
+
index: i,
|
|
80
|
+
begin: begin
|
|
81
|
+
})
|
|
82
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
83
|
+
className: "segment-line-item ".concat(!v.url ? 'segment-line-item-none' : '', " ").concat(i === segments.length - 1 ? 'last-segment-line-item' : ''),
|
|
84
|
+
onClick: function onClick(e) {
|
|
85
|
+
return seekWithLine(e, i);
|
|
86
|
+
},
|
|
87
|
+
style: {
|
|
88
|
+
width: "".concat(v.duration / duration * 100, "%")
|
|
89
|
+
}
|
|
90
|
+
}));
|
|
91
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
92
|
+
className: "buffer-line",
|
|
93
|
+
style: {
|
|
94
|
+
width: "".concat(bufferedPercent, "%")
|
|
95
|
+
}
|
|
96
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
97
|
+
className: "current-line",
|
|
98
|
+
style: {
|
|
99
|
+
width: "".concat(playPercent, "%")
|
|
100
|
+
}
|
|
101
|
+
})));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function TipTitle(_ref2) {
|
|
105
|
+
var index = _ref2.index,
|
|
106
|
+
segments = _ref2.segments,
|
|
107
|
+
begin = _ref2.begin;
|
|
108
|
+
|
|
109
|
+
var _useMemo = useMemo(function () {
|
|
110
|
+
if (index === 0) {
|
|
111
|
+
var _start = begin;
|
|
112
|
+
|
|
113
|
+
var _end = begin + segments[0].duration * 1000;
|
|
114
|
+
|
|
115
|
+
return {
|
|
116
|
+
start: dateFormat(_start),
|
|
117
|
+
end: dateFormat(_end)
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
var indexDuration = segments.map(function (v) {
|
|
122
|
+
return v.duration;
|
|
123
|
+
}).reduce(function (a, b, i) {
|
|
124
|
+
return i >= index ? a : a + b;
|
|
125
|
+
}, 0);
|
|
126
|
+
var start = begin + indexDuration * 1000;
|
|
127
|
+
var end = start + segments[index].duration * 1000;
|
|
128
|
+
return {
|
|
129
|
+
start: dateFormat(start),
|
|
130
|
+
end: dateFormat(end)
|
|
131
|
+
};
|
|
132
|
+
}, [index, segments, begin]),
|
|
133
|
+
start = _useMemo.start,
|
|
134
|
+
end = _useMemo.end;
|
|
135
|
+
|
|
136
|
+
var hasUrl = useMemo(function () {
|
|
137
|
+
var _a;
|
|
138
|
+
|
|
139
|
+
return ((_a = segments[index]) === null || _a === void 0 ? void 0 : _a.url) ? true : false;
|
|
140
|
+
}, [index, segments]);
|
|
141
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
142
|
+
className: "segment-line-tip-box"
|
|
143
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
144
|
+
style: {
|
|
145
|
+
fontWeight: 600
|
|
146
|
+
}
|
|
147
|
+
}, "\u5F55\u50CF\u7247\u6BB5\u4FE1\u606F"), /*#__PURE__*/React.createElement("div", null, "\u5F00\u59CB\uFF1A", start), /*#__PURE__*/React.createElement("div", null, "\u7ED3\u675F\uFF1A", end), /*#__PURE__*/React.createElement("div", null, "\u72B6\u6001\uFF1A", /*#__PURE__*/React.createElement("span", {
|
|
148
|
+
style: {
|
|
149
|
+
color: hasUrl ? 'green' : 'red'
|
|
150
|
+
}
|
|
151
|
+
}, hasUrl ? '正常' : '缺失')));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export default SegmentTimeLine;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ISinglePlayerProps, ExportPlayerType } from './player';
|
|
3
|
+
import './style/index.less';
|
|
4
|
+
declare const _default: React.MemoExoticComponent<React.ForwardRefExoticComponent<ISinglePlayerProps & React.RefAttributes<ExportPlayerType>>>;
|
|
5
|
+
export default _default;
|