@desynova-digital/player 4.0.1 → 4.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/Manager.js +99 -0
  2. package/actions/player.js +331 -0
  3. package/actions/video.js +206 -0
  4. package/{utils/colors.js → colors.js} +1 -2
  5. package/{media → components}/AudioMeter.js +96 -109
  6. package/components/BigPlayButton.js +84 -0
  7. package/components/ImageViewer.js +272 -0
  8. package/{control → components}/MarkerBar.js +33 -24
  9. package/{utils → components}/Menu.js +13 -4
  10. package/components/Player.js +706 -0
  11. package/{header/Header.js → components/PlayerHeader.js} +104 -78
  12. package/components/Playlist.js +95 -0
  13. package/{control → components}/PointersBar.js +122 -61
  14. package/components/PosterImage.js +50 -0
  15. package/{media → components}/SDOutline.js +13 -49
  16. package/components/Shortcut.js +821 -0
  17. package/{control → components}/Slider.js +27 -23
  18. package/components/TagsBar.js +81 -0
  19. package/components/Video.js +1280 -0
  20. package/{control → components/control-bar}/AudioTracksMenuButton.js +32 -28
  21. package/components/control-bar/CameraButton.js +75 -0
  22. package/components/control-bar/CommentsButton.js +186 -0
  23. package/components/control-bar/ControlBar.js +266 -0
  24. package/components/control-bar/EditorControlMenuButton.js +317 -0
  25. package/components/control-bar/ForwardControl.js +12 -0
  26. package/components/control-bar/ForwardReplayControl.js +106 -0
  27. package/{control → components/control-bar}/FullscreenToggle.js +26 -21
  28. package/components/control-bar/PlayToggle.js +85 -0
  29. package/components/control-bar/ReplayControl.js +12 -0
  30. package/components/control-bar/SettingsMenuButton.js +41 -0
  31. package/components/control-bar/SubtitleLanguagesMenuButton.js +149 -0
  32. package/components/control-bar/SubtitleMovementMenu.js +140 -0
  33. package/{control/VolumneMenuButton.js → components/control-bar/VolumeMenuButton.js} +26 -27
  34. package/components/control-bar/ZoomMenuButton.js +90 -0
  35. package/{control → components/marking-controls}/MarkInControl.js +32 -25
  36. package/{control → components/marking-controls}/MarkOutControl.js +35 -26
  37. package/components/marking-controls/MarkingAddButton.js +79 -0
  38. package/components/marking-controls/MarkingControl.js +95 -0
  39. package/components/marking-controls/MarkingDeleteButton.js +70 -0
  40. package/{control → components/marking-controls}/MarkingDuration.js +12 -5
  41. package/components/marking-controls/MarkingPreview.js +72 -0
  42. package/components/progress-bar/AudioWaveform.js +126 -0
  43. package/components/progress-bar/LoadProgressBar.js +67 -0
  44. package/components/progress-bar/MouseTimeDisplay.js +36 -0
  45. package/{control → components/progress-bar}/PlayProgressBar.js +4 -4
  46. package/components/progress-bar/ProgressControl.js +186 -0
  47. package/{control → components/progress-bar}/SeekBar.js +113 -72
  48. package/{control → components/progress-bar}/Timeline.js +43 -32
  49. package/{control/PlayBackRateControl.js → components/settings-menu-control/PlaybackRateControl.js} +44 -30
  50. package/components/settings-menu-control/SafeAreaControl.js +81 -0
  51. package/components/settings-menu-control/SettingsMenu.js +56 -0
  52. package/components/settings-menu-control/SubtitleControl.js +1 -0
  53. package/components/time-controls/CurrentTimeDisplay.js +83 -0
  54. package/{control → components/time-controls}/DurationDisplay.js +8 -15
  55. package/components/time-controls/TimeDivider.js +25 -0
  56. package/{control → components/volume-control}/VolumeBar.js +62 -80
  57. package/components/volume-control/VolumeControl.js +19 -0
  58. package/{control → components/volume-control}/VolumeLevel.js +2 -3
  59. package/components/zoom-control/ZoomBar.js +155 -0
  60. package/components/zoom-control/ZoomLevel.js +55 -0
  61. package/index.js +198 -1
  62. package/package.json +5 -8
  63. package/reducers/index.js +19 -0
  64. package/reducers/operation.js +35 -0
  65. package/reducers/player.js +222 -0
  66. package/utils/browser.js +30 -0
  67. package/utils/dom.js +1 -2
  68. package/utils/fullscreen.js +72 -0
  69. package/utils/index.js +156 -57
  70. package/Player.js +0 -945
  71. package/control/AudioTracksMenuButton.jsx +0 -80
  72. package/control/ControlBar.js +0 -303
  73. package/control/ControlBar.jsx +0 -264
  74. package/control/CurrentTimeDisplay.js +0 -34
  75. package/control/CurrentTimeDisplay.jsx +0 -35
  76. package/control/DurationDisplay.jsx +0 -48
  77. package/control/ForwardBackwardControl.js +0 -76
  78. package/control/ForwardBackwardControl.jsx +0 -79
  79. package/control/FullscreenToggle.jsx +0 -83
  80. package/control/MarkInControl.jsx +0 -109
  81. package/control/MarkOutControl.jsx +0 -131
  82. package/control/MarkerBar.jsx +0 -107
  83. package/control/MarkingControl.js +0 -82
  84. package/control/MarkingControl.jsx +0 -143
  85. package/control/MarkingPreview.js +0 -49
  86. package/control/MarkingPreview.jsx +0 -60
  87. package/control/PlayBackRateControl.jsx +0 -106
  88. package/control/PlayProgressBar.jsx +0 -92
  89. package/control/PlayToggle.js +0 -56
  90. package/control/PlayToggle.jsx +0 -57
  91. package/control/PointersBar.jsx +0 -286
  92. package/control/ProgressControl.js +0 -127
  93. package/control/ProgressControl.jsx +0 -155
  94. package/control/SeekBar.jsx +0 -229
  95. package/control/SettingsMenuButton.js +0 -63
  96. package/control/SettingsMenuButton.jsx +0 -69
  97. package/control/Slider.jsx +0 -243
  98. package/control/Timeline.jsx +0 -131
  99. package/control/VolumeBar.jsx +0 -174
  100. package/control/VolumeLevel.jsx +0 -66
  101. package/control/VolumneMenuButton.jsx +0 -111
  102. package/header/Header.jsx +0 -479
  103. package/media/AudioMeter.jsx +0 -411
  104. package/media/SDOutline.jsx +0 -90
  105. package/media/Video.js +0 -684
  106. package/media/Video.jsx +0 -714
  107. package/playlist/Playlist.js +0 -67
  108. package/playlist/Playlist.jsx +0 -91
  109. package/playlist/index.js +0 -13
  110. package/shortcuts/Shortcut.js +0 -662
  111. package/utils/Menu.jsx +0 -105
@@ -1,411 +0,0 @@
1
- import { PropTypes } from 'prop-types';
2
- import React, { Component } from 'react';
3
- import styled from 'styled-components';
4
- import { Icon } from '@desynova-digital/components';
5
-
6
- const propTypes = {
7
- height: PropTypes.number,
8
- player: PropTypes.instanceOf(Object)
9
- };
10
-
11
- const defaultProps = {
12
- height: 0
13
- };
14
-
15
- const AudioMeterBlock = styled.div`
16
- width: 70px;
17
- right: 14px;
18
- top: 0px;
19
- position: absolute;
20
- height: 100%;
21
- `;
22
-
23
- const RangeBlock = styled('div')`
24
- position: absolute;
25
- right: -12px;
26
- height: 100%;
27
- overflow: hidden;
28
- .range {
29
- color: #aaaaaa;
30
- font-family: SFUIText-Medium;
31
- text-align: right;
32
- font-size: 8px;
33
- box-sizing: border-box;
34
- }
35
- `;
36
-
37
- const MeterBlock = styled('div')`
38
- width: 100%;
39
- height: 100%;
40
- position: absolute;
41
- left: 0;
42
- top: 0;
43
- display: flex;
44
- justify-content: space-evenly;
45
- align-items: center;
46
- .track-block {
47
- position: relative;
48
- width: 15px;
49
- height: 100%;
50
- overflow: visible;
51
- &.left-track,
52
- &.right-track {
53
- &:after {
54
- position: absolute;
55
- color: #aaaaaa;
56
- bottom: -12px;
57
- font-size: 10px;
58
- left: 50%;
59
- transform: translateX(-50%);
60
- font-family: SFUIText-Regular;
61
- }
62
- }
63
- &.left-track:after {
64
- content: 'L';
65
- }
66
- &.right-track:after {
67
- content: 'R';
68
- }
69
- }
70
- `;
71
-
72
- const ColorMeter = styled('div')`
73
- width: 100%;
74
- height: 100%;
75
- background: linear-gradient(to top, #00c8e7, #00e6b9 57%, #ff8d29 83%, #f6462c);
76
- position: absolute;
77
- left: 0;
78
- top: 0;
79
- z-index: 1;
80
- .stack-block {
81
- height: 2px;
82
- margin-bottom: 3px;
83
- background: #000000;
84
- }
85
- `;
86
-
87
- const BlackMeter = styled('div')`
88
- width: 100%;
89
- background: #000000;
90
- position: absolute;
91
- left: 0;
92
- top: 0;
93
- z-index: 1;
94
- height: 100%;
95
- transition: all 0.25s ease-in-out;
96
- -moz-transition: all 0.25s ease-in-out;
97
- -webkit-transition: all 0.25s ease-in-out;
98
- -ms-transition: all 0.25s ease-in-out;
99
- -o-transition: all 0.25s ease-in-out;
100
- .stack-block {
101
- height: 2px;
102
- margin-bottom: 3px;
103
- background: #304153;
104
- }
105
- `;
106
-
107
- const AudioMute = styled('div')`
108
- position: absolute;
109
- top: -20px;
110
- left: 50%;
111
- transform: translateX(-50%);
112
- color: #aaaaaa;
113
- cursor: pointer;
114
- `;
115
-
116
- export default class AudioMeter extends Component {
117
- constructor(props, context) {
118
- super(props, context);
119
- this.state = {
120
- stacksArr: [],
121
- rangeArray: [],
122
- unitBlockHeight: 30,
123
- audioPan: {
124
- left: true,
125
- right: true
126
- }
127
- };
128
- this.dbRange = -48;
129
- this.channelCount = 2;
130
- this.maskSizes = ['100%', '100%'];
131
- this.handleClick = this.handleClick.bind(this);
132
- this.getNoOfStacks = this.getNoOfStacks.bind(this);
133
- this.maskSize = this.maskSize.bind(this);
134
- this.updateMeter = this.updateMeter.bind(this);
135
- this.paintMeter = this.paintMeter.bind(this);
136
- }
137
-
138
- componentDidMount() {
139
- const { hasStarted, height } = this.props;
140
- if (hasStarted) {
141
- this.initializeMeter();
142
- }
143
- if (height) {
144
- this.getNoOfStacks();
145
- }
146
- }
147
-
148
- componentWillUnmount() {
149
- this.disconnectMeter();
150
- }
151
-
152
- disconnectMeter() {
153
- if (this.sourceNode && this.meterNode) {
154
- this.sourceNode.disconnect(this.meterNode);
155
- this.meterNode.disconnect(this.audioCtx.destination);
156
- }
157
- }
158
-
159
- getBaseLog(x, y) {
160
- return Math.log(y) / Math.log(x);
161
- }
162
-
163
- getNoOfStacks() {
164
- if (this._meterBlockRef) {
165
- const { stacksArr } = this.state;
166
- let stackHeight = 5;
167
- let height = this._meterBlockRef.offsetHeight;
168
- if (height) {
169
- let stacksLength = Math.round(height / stackHeight);
170
- let stackArr = [...Array(stacksLength)].map((x, i) => i);
171
- var numOfSteps = Math.round(height / 30);
172
- var singleStep = Math.round(this.dbRange / numOfSteps) || 1;
173
- if (singleStep > 1) {
174
- singleStep = Math.ceil(singleStep / 2) * 2;
175
- }
176
- let unitArray = [];
177
- for (let i = this.dbRange; i < 0 - singleStep / 2; i = i - singleStep) {
178
- unitArray.push(i);
179
- }
180
- let blockHeight = parseFloat(height / unitArray.length);
181
- if (stacksArr !== stackArr) {
182
- this.setState({
183
- stacksArr: stackArr,
184
- rangeArray: unitArray.reverse(),
185
- unitBlockHeight: blockHeight
186
- });
187
- }
188
- }
189
- }
190
- }
191
-
192
- createMeterNode() {
193
- let c = this.sourceNode.channelCount;
194
- this.meterNode = this.audioCtx.createScriptProcessor(2048, c, c);
195
- this.sourceNode.connect(this.meterNode);
196
- this.meterNode.connect(this.audioCtx.destination);
197
- return this.meterNode;
198
- }
199
-
200
- createMeter(meterNode) {
201
- meterNode.onaudioprocess = this.updateMeter;
202
- this.paintMeter();
203
- }
204
-
205
- updateMeter(audioProcessingEvent) {
206
- const inputBuffer = audioProcessingEvent.inputBuffer;
207
- let i = 0;
208
- const channelData = [];
209
- const channelMaxes = [];
210
- for (i = 0; i < this.channelCount; i++) {
211
- channelData[i] = inputBuffer.getChannelData(i);
212
- channelMaxes[i] = 0.0;
213
- }
214
- for (let sample = 0; sample < inputBuffer.length; sample++) {
215
- for (i = 0; i < this.channelCount; i++) {
216
- if (Math.abs(channelData[i][sample]) > channelMaxes[i]) {
217
- channelMaxes[i] = Math.abs(channelData[i][sample]);
218
- }
219
- }
220
- }
221
- for (i = 0; i < this.channelCount; i++) {
222
- let size = this.maskSize(channelMaxes[i]);
223
- this.maskSizes[i] = size + '%';
224
- }
225
- }
226
-
227
- maskSize(floatVal) {
228
- const returnVal = Math.floor((this.dbFromFloat(floatVal) * 100) / this.dbRange);
229
- if (returnVal > 100) {
230
- return 100;
231
- } else {
232
- return returnVal;
233
- }
234
- }
235
-
236
- dbFromFloat(floatVal) {
237
- return this.getBaseLog(10, floatVal) * 20;
238
- }
239
-
240
- paintMeter() {
241
- for (var i = 0; i < this.channelCount; i++) {
242
- const { audioPan } = this.state;
243
- let leftPan = audioPan.left;
244
- let rightPan = audioPan.right;
245
- var elem = document.getElementById(`channel-${i}`);
246
- if (elem) {
247
- if (i === 0 && !leftPan) {
248
- elem.style.height = '100%';
249
- } else if (i === 1 && !rightPan) {
250
- elem.style.height = '100%';
251
- } else {
252
- elem.style.height = this.maskSizes[i];
253
- }
254
- }
255
- }
256
- window.requestAnimationFrame(this.paintMeter);
257
- }
258
-
259
- muteAudio(position) {
260
- const { audioPan } = this.state;
261
- let leftPan = audioPan.left;
262
- let rightPan = audioPan.right;
263
- switch (position) {
264
- case 'left':
265
- leftPan = !leftPan;
266
- break;
267
- case 'right':
268
- rightPan = !rightPan;
269
- break;
270
- }
271
- if (leftPan && rightPan) {
272
- this.gainL.connect(this.merger, 0, 0);
273
- this.gainR.connect(this.merger, 0, 1);
274
- }
275
- if (!leftPan && rightPan) {
276
- this.gainL.disconnect();
277
- this.gainR.connect(this.merger, 0, 1);
278
- }
279
- if (leftPan && !rightPan) {
280
- this.gainL.connect(this.merger, 0, 0);
281
- this.gainR.disconnect();
282
- }
283
- if (!leftPan && !rightPan) {
284
- this.gainL.disconnect();
285
- this.gainR.disconnect();
286
- }
287
- this.setState({
288
- audioPan: {
289
- left: leftPan,
290
- right: rightPan
291
- }
292
- });
293
- }
294
-
295
- initializeMeter() {
296
- this.getNoOfStacks();
297
- const myVideo = document.querySelector('video');
298
- this.audioCtx = this.audioCtx || new window.AudioContext();
299
- this.audioCtx.createGain = this.audioCtx.createGain || this.audioCtx.createGainNode; //fallback for gain naming
300
- this.gainL = this.audioCtx.createGain();
301
- this.gainR = this.audioCtx.createGain();
302
- this.merger = this.audioCtx.createChannelMerger(2);
303
- var splitter = this.audioCtx.createChannelSplitter(2);
304
-
305
- this.sourceNode = this.sourceNode || this.audioCtx.createMediaElementSource(myVideo);
306
- this.sourceNode.connect(splitter, 0, 0);
307
-
308
- //Connect splitter' outputs to each Gain Nodes
309
- splitter.connect(this.gainL, 0);
310
- splitter.connect(this.gainR, 1);
311
-
312
- /*
313
- *Connect Left and Right Nodes to the output
314
- *Assuming stereo as initial status
315
- */
316
- this.gainL.connect(this.merger, 0, 0);
317
- this.gainR.connect(this.merger, 0, 1);
318
- this.merger.connect(this.audioCtx.destination, 0, 0);
319
- const meterNode = this.createMeterNode();
320
- this.createMeter(meterNode);
321
- }
322
-
323
- UNSAFE_componentWillReceiveProps(newProps) {
324
- const { height, hasStarted } = this.props;
325
- if (height && height !== newProps.height) {
326
- this.getNoOfStacks();
327
- }
328
- if (hasStarted !== newProps.hasStarted && newProps.hasStarted) {
329
- this.initializeMeter();
330
- }
331
- }
332
- handleClick() {}
333
-
334
- render() {
335
- const { stacksArr, rangeArray, unitBlockHeight, audioPan } = this.state;
336
- console.log('stackArray', stacksArr);
337
- return (
338
- // <AudioMeterBlock id="audio-meter-block">
339
- <>
340
- <RangeBlock>
341
- {rangeArray.map((range) => {
342
- return (
343
- <div key={'range' + range} style={{ height: unitBlockHeight + 'px' }} className="range">
344
- {range}
345
- </div>
346
- );
347
- })}
348
- </RangeBlock>
349
- <MeterBlock
350
- ref={(meterBlockRef) => {
351
- this._meterBlockRef = meterBlockRef;
352
- }}>
353
- <div className="track-block left-track">
354
- <ColorMeter>
355
- {stacksArr.map((num) => (
356
- <div className="stack-block" key={num} />
357
- ))}
358
- </ColorMeter>
359
- <BlackMeter id="channel-0">
360
- {
361
- //style={{ height: this.maskSizes[0] }}
362
- }
363
- {stacksArr.map((num) => (
364
- <div className="stack-block" key={num} />
365
- ))}
366
- </BlackMeter>
367
- <AudioMute
368
- onClick={() => {
369
- this.muteAudio('left');
370
- }}>
371
- {audioPan.left ? (
372
- <Icon name="volume" width={14} height={14} color="#aaaaaa" />
373
- ) : (
374
- <Icon name="mute" width={14} height={14} color="#aaaaaa" />
375
- )}
376
- </AudioMute>
377
- </div>
378
- <div className="track-block right-track">
379
- <ColorMeter>
380
- {stacksArr.map((num) => (
381
- <div className="stack-block" key={num} />
382
- ))}
383
- </ColorMeter>
384
- <BlackMeter id="channel-1">
385
- {
386
- //style={{ height: this.maskSizes[1] }}>
387
- }
388
- {stacksArr.map((num) => (
389
- <div className="stack-block" key={num} />
390
- ))}
391
- </BlackMeter>
392
- <AudioMute
393
- onClick={() => {
394
- this.muteAudio('right');
395
- }}>
396
- {audioPan.right ? (
397
- <Icon name="volume" width={14} height={14} color="#aaaaaa" />
398
- ) : (
399
- <Icon name="mute" width={14} height={14} color="#aaaaaa" />
400
- )}
401
- </AudioMute>
402
- </div>
403
- </MeterBlock>
404
- </>
405
- );
406
- }
407
- }
408
-
409
- AudioMeter.propTypes = propTypes;
410
- AudioMeter.defaultProps = defaultProps;
411
- AudioMeter.displayName = 'AudioMeter';
@@ -1,90 +0,0 @@
1
- import React from 'react';
2
- import styled from 'styled-components';
3
- import { PropTypes } from 'prop-types';
4
- import colors from '../utils/colors';
5
-
6
- const propTypes = {
7
- player: PropTypes.instanceOf(Object),
8
- actions: PropTypes.instanceOf(Object)
9
- };
10
-
11
- const SDPlayerBorder = styled.div`
12
- opacity: 0.3;
13
- border: solid 1px ${colors.common.base.white};
14
- top: 50%;
15
- left: 50%;
16
- -webkit-transform: translate(-50%, -50%);
17
- -ms-transform: translate(-50%, -50%);
18
- -o-transform: translate(-50%, -50%);
19
- -moz-transform: translate(-50%, -50%);
20
- transform: translate(-50%, -50%);
21
- position: absolute;
22
- padding-left: 75%;
23
- height: 100%;
24
- `;
25
-
26
- const SDBorderText = styled('p')`
27
- color: #fff;
28
- padding-top: 25%;
29
- position: absolute;
30
- font-family: SFUIText-Regular;
31
- text-shadow: 0 0 4px rgba(0, 0, 0, 0.5);
32
- font-size: 12px;
33
- top: 20%;
34
- transform: translate(-50%, -50%) rotate(-90deg);
35
- `;
36
-
37
- const SDOutline = ({ SDBorderActive, actionClick, paused }) => {
38
- return (
39
- <>
40
- <SDPlayerBorder
41
- className="sdborders"
42
- style={!SDBorderActive ? { display: 'none' } : { display: 'block' }}
43
- onClick={() => {
44
- if (paused) {
45
- actionClick({
46
- action: 'play'
47
- });
48
- } else {
49
- actionClick({
50
- action: 'pause'
51
- });
52
- }
53
- // actions.handleVideoRewind(false);
54
- }}
55
- />
56
- <SDBorderText style={!SDBorderActive ? { display: 'none' } : { display: 'block' }}>4:3 Safe Area</SDBorderText>
57
- </>
58
- );
59
- };
60
-
61
- // export default function SDOutline({ player, actions }) {
62
- // return (
63
- // <React.Fragment>
64
- // <SDPlayerBorder
65
- // style={
66
- // !player.SDBorderActive ? { display: 'none' } : { display: 'block' }
67
- // }
68
- // onClick={() => {
69
- // if (player.paused) {
70
- // actions.play();
71
- // } else {
72
- // actions.pause();
73
- // }
74
- // actions.handleVideoRewind(false);
75
- // }}
76
- // />
77
- // <SDBorderText
78
- // style={
79
- // !player.SDBorderActive ? { display: 'none' } : { display: 'block' }
80
- // }
81
- // >
82
- // 4:3 Safe Area
83
- // </SDBorderText>
84
- // </React.Fragment>
85
- // );
86
- // }
87
-
88
- SDOutline.propTypes = propTypes;
89
- SDOutline.displayName = 'SDOutline';
90
- export default SDOutline;