@desynova-digital/player 4.0.1 → 4.0.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.
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
package/header/Header.jsx DELETED
@@ -1,479 +0,0 @@
1
- import { PropTypes } from 'prop-types';
2
- import React, { Component } from 'react';
3
- import styled from 'styled-components';
4
- import { Button, Icon } from '@desynova-digital/components';
5
- import colors from '../utils/colors';
6
-
7
- const PlayerHeaderBlock = styled.div`
8
- position: relative;
9
- display: flex;
10
- justify-content: flex-start;
11
- align-items: center;
12
- background: #000;
13
- transition: all 250ms ease-in-out;
14
- height: ${(props) => ((props.player === 'panel' && props.active) || props.player !== 'panel' ? '60px' : '0px')};
15
- width: 100%;
16
- z-index: 1;
17
- position: ${(props) => (props.player === 'panel' ? 'absolute' : 'relative')};
18
- top: ${(props) => (props.player === 'panel' ? '0px' : 'initial')};
19
- overflow: ${(props) =>
20
- (props.player === 'panel' && props.active) || props.player !== 'panel' ? 'visible' : 'hidden'};
21
- `;
22
-
23
- const VideoTitle = styled.button`
24
- font-family: SFUIText-Regular;
25
- text-align: left;
26
- padding: 0;
27
- font-size: 13px;
28
- color: #ffffff;
29
- background-color: transparent;
30
- border: none;
31
- outline: none;
32
- cursor: ${({ isShowPageAvailable }) => (isShowPageAvailable ? 'pointer' : 'default')};
33
- `;
34
-
35
- const PlayerDetails = styled.div`
36
- margin-left: 20px;
37
- text-align: left;
38
- .video-bottom-container {
39
- display: flex;
40
- justify-content: flex-start;
41
- align-items: center;
42
- margin-top: 8px;
43
- .video-sub-title {
44
- color: #afb2ba;
45
- font-size: 10px;
46
- font-family: SFUIText-Medium;
47
- margin-right: 5px;
48
- }
49
- .version-category {
50
- font-size: 10px;
51
- letter-spacing: 0.4px;
52
- color: #fff;
53
- font-family: SFUIText-Regular;
54
- text-transform: uppercase;
55
- }
56
- .versions-dropdown-block {
57
- position: relative;
58
- &:hover {
59
- .active-version {
60
- cursor: pointer;
61
- border-color: #00cec6 !important;
62
- }
63
- .versions-dropdown-container {
64
- visibility: visible;
65
- opacity: 1;
66
- }
67
- }
68
- .active-version {
69
- transition: all 350ms ease-in-out;
70
- border: 1px solid #fff;
71
- border-radius: 10px;
72
- margin-left: 5px;
73
- padding: 3px 10px;
74
- color: #fff;
75
- font-size: 10px;
76
- font-family: SFUIText-Regular;
77
- font-weight: bold;
78
- pointer-events: none;
79
- }
80
- .versions-dropdown-container {
81
- padding-top: 15px;
82
- position: absolute;
83
- top: 13px;
84
- left: 50%;
85
- transform: translateX(-50%);
86
- visibility: hidden;
87
- opacity: 0;
88
- transition: all 450ms ease-in-out;
89
- &:after {
90
- content: '';
91
- border-bottom: 6px solid #00cec6;
92
- border-right: 6px solid transparent;
93
- border-left: 6px solid transparent;
94
- position: absolute;
95
- top: 9px;
96
- left: 50%;
97
- transform: translateX(-50%);
98
- }
99
- .versions-container {
100
- overflow-y: auto;
101
- overflow-x: hidden;
102
- max-height: 204px;
103
- box-shadow: 0px 12px 24px rgb(0 0 0 / 20%);
104
- min-width: 250px;
105
- background: #fff;
106
- border-radius: 10px;
107
- .ingest-versions-container {
108
- border-bottom: 1px solid rgba(0, 0, 0, 0.1);
109
- padding: 10px 15px;
110
- .ingest-version-block {
111
- display: flex;
112
- justify-content: space-between;
113
- align-items: center;
114
- .upload-type {
115
- width: 6px;
116
- height: 6px;
117
- border-radius: 100%;
118
- overflow: hidden;
119
- left: 5px;
120
- position: absolute;
121
- }
122
- .ingest-version-name {
123
- color: #182738;
124
- font-size: 11px;
125
- font-family: SFUIText-Regular;
126
- font-weight: bold;
127
- margin-right: 10px;
128
- }
129
- .video-versions-container {
130
- display: inline-flex;
131
- align-items: center;
132
- .more-dropdown-icon {
133
- padding-top: 8px;
134
- cursor: pointer;
135
- }
136
- path {
137
- fill: #182738;
138
- }
139
- }
140
- }
141
- }
142
- &::-webkit-scrollbar {
143
- width: 5px;
144
- background-color: #6d6a6a;
145
- }
146
- }
147
- }
148
- }
149
- .video-time-block {
150
- margin-left: 5px;
151
- display: flex;
152
- justify-content: center;
153
- align-items: center;
154
- .tv-time,
155
- .ott-time {
156
- display: flex;
157
- justify-content: center;
158
- align-items: center;
159
- margin-left: 10px;
160
- p {
161
- margin-left: 5px;
162
- color: rgb(175, 178, 186);
163
- font-family: 'SFUIText-Regular';
164
- font-size: 10px;
165
- align-self: self-end;
166
- }
167
- }
168
- }
169
- }
170
- `;
171
-
172
- const VersionBlock = styled.div`
173
- font-family: SFUIText-Regular;
174
- font-weight: bold;
175
- font-size: 10px;
176
- line-height: 1.2;
177
- border-radius: 100%;
178
- width: 30px;
179
- height: 30px;
180
- display: flex;
181
- align-items: center;
182
- justify-content: center;
183
- cursor: pointer;
184
- background: ${(props) => (props.upload_type === 'fc' ? 'rgba(0, 206, 198, 0.1)' : 'rgba(255, 99, 39, 0.1)')};
185
- color: ${(props) => (props.upload_type === 'fc' ? '#00CEC6' : '#FF6327')};
186
- &.active {
187
- background: ${(props) => (props.upload_type === 'fc' ? '#00cec6' : '#FF6327')};
188
- color: #ffffff;
189
- pointer-events: none;
190
- }
191
- margin-right: 10px;
192
- `;
193
-
194
- const PlayerType = styled.div`
195
- margin-left: auto;
196
- margin-right: 15px;
197
- display: flex;
198
- ${Button.Element} {
199
- padding: 7px;
200
- background-color: rgba(255, 255, 255, 0.1);
201
- border: none;
202
- }
203
- `;
204
-
205
- const QCReportButton = styled(Button)`
206
- pointer-events: all !important;
207
- margin-right: 10px;
208
- `;
209
-
210
- const BackButton = styled(Button)`
211
- background: ${(props) => colors.common.video[props.assetType].base};
212
- border: none;
213
- margin: 10px;
214
- margin-right: 0;
215
- width: 40px;
216
- height: 40px;
217
- &:hover,
218
- &:focus {
219
- background: ${(props) => colors.common.video[props.assetType].base};
220
- }
221
- ${Icon.Element} {
222
- transform: translate(-50%, -50%);
223
- top: 50%;
224
- left: 50%;
225
- position: absolute;
226
- }
227
- `;
228
-
229
- export default class Header extends Component {
230
- constructor(props, context) {
231
- super(props, context);
232
- this.state = {
233
- versionIndex: -1,
234
- updatedVersionsList: []
235
- };
236
- // this.handleClick = this.handleClick.bind(this);
237
- }
238
-
239
- // handleClick() {
240
- // const { onPlayerClose, onPlayerChange, controlType } = this.props;
241
- // if (controlType !== 'default') {
242
- // onPlayerChange();
243
- // } else {
244
- // if (onPlayerClose) {
245
- // onPlayerClose();
246
- // }
247
- // }
248
- // }
249
-
250
- openQCReport() {
251
- const { onReportClick, actions } = this.props;
252
- if (onReportClick) {
253
- actions.pause();
254
- onReportClick();
255
- }
256
- }
257
-
258
- /**
259
- * saves the index of version that is expanded.
260
- * @param {Number} index index of the versionList
261
- */
262
- saveIndexOfVersion(index) {
263
- const { versionIndex } = this.state;
264
- const currentIndex = versionIndex === index ? -1 : index;
265
- this.setState({
266
- versionIndex: currentIndex
267
- });
268
- }
269
-
270
- /**
271
- * returns the object with active version at the first element in object
272
- * @param {Object} version object containing complete version list.
273
- * @param {Object} activeVersion object containing currently active version.
274
- */
275
- updateVersion(version, activeVersion) {
276
- let updatedVersionsList = JSON.parse(JSON.stringify(version));
277
- updatedVersionsList.map((ele, index) => {
278
- ele.versions.map((versionsList, innerIndex) => {
279
- if (versionsList.ingest_db_id === activeVersion.ingest_db_id) {
280
- let tempData = updatedVersionsList[index]['versions'][innerIndex];
281
- updatedVersionsList[index]['versions'].splice(innerIndex, 1);
282
- updatedVersionsList[index]['versions'].unshift(tempData);
283
- }
284
- });
285
- });
286
- this.setState({
287
- updatedVersionsList: updatedVersionsList
288
- });
289
- }
290
-
291
- componentDidMount() {
292
- const { versions, activeVersion } = this.props;
293
- if (versions && versions.length) {
294
- this.updateVersion(versions, activeVersion);
295
- }
296
- }
297
-
298
- componentDidUpdate(prevProps, prevState) {
299
- const { versions, activeVersion } = this.props;
300
- if (activeVersion.ingest_db_id !== prevProps.activeVersion.ingest_db_id || !prevState.updatedVersionsList.length) {
301
- if (versions && versions.length) {
302
- this.updateVersion(versions, activeVersion);
303
- }
304
- }
305
- }
306
-
307
- render() {
308
- const {
309
- videoDetails,
310
- versionClick,
311
- activeVersion,
312
- onTitleClick,
313
- isFullscreen,
314
- playerType,
315
- qcReportAvailable,
316
- openSharePopup,
317
- isShareAvailable,
318
- onBackPressed
319
- } = this.props;
320
- const { versionIndex, updatedVersionsList } = this.state;
321
-
322
- return (
323
- <PlayerHeaderBlock className="player-header-block" player={playerType}>
324
- {!isFullscreen && !false && (
325
- <BackButton
326
- display="rounded"
327
- appearance="cta"
328
- icon="arrow-left"
329
- width={50}
330
- height={50}
331
- iconWidth={16}
332
- iconHeight={16}
333
- tabIndex="0"
334
- onClick={onBackPressed}
335
- {...this.props}
336
- />
337
- )}
338
- <PlayerDetails>
339
- <VideoTitle type="button" isShowPageAvailable={!false} onClick={() => !false && onTitleClick()}>
340
- {videoDetails.title}
341
- </VideoTitle>
342
-
343
- {activeVersion && (
344
- <div className="video-bottom-container">
345
- <p className="video-sub-title">{videoDetails.subTitle}</p>
346
- <p className="version-category">{activeVersion.category}</p>
347
- <div className="versions-dropdown-block">
348
- <p className="active-version">{`${activeVersion.version_name} ${activeVersion.version}`}</p>
349
- {updatedVersionsList && updatedVersionsList.length > 0 && playerType === 'default' && (
350
- <div className="versions-dropdown-container">
351
- <div className="versions-container">
352
- {updatedVersionsList.map((version, index) => {
353
- return (
354
- <div
355
- className="ingest-versions-container"
356
- key={version.version_name_short + version.upload_type}>
357
- <div className="ingest-version-block">
358
- <p className="ingest-version-name">{version.version_name_short}</p>
359
- <div className="video-versions-container">
360
- <VersionBlock
361
- role="presentation"
362
- upload_type={version.upload_type}
363
- className={
364
- version.versions[0].ingest_db_id === activeVersion.ingest_db_id && 'active'
365
- }
366
- key={version.versions[0].ingest_db_id}
367
- onClick={() => versionClick(version.versions[0].ingest_db_id)}>
368
- {version.versions[0].version_name}
369
- </VersionBlock>
370
- {version.versions.length > 1 && (
371
- <span className="more-dropdown-icon" onClick={() => this.saveIndexOfVersion(index)}>
372
- {versionIndex === index ? (
373
- <Icon name="dropdown_less_icon" width="14" height="14" />
374
- ) : (
375
- <Icon name="dropdown_more_icon" width="14" height="14" />
376
- )}
377
- </span>
378
- )}
379
- </div>
380
- </div>
381
- <div className="ingest-version-block">
382
- <div className="video-versions-container">
383
- {versionIndex === index &&
384
- version.versions.slice(1).map((video_version, idx) => {
385
- return (
386
- <VersionBlock
387
- role="presentation"
388
- key={video_version.ingest_db_id}
389
- upload_type={version.upload_type}
390
- className={
391
- video_version.ingest_db_id === activeVersion.ingest_db_id && 'active'
392
- }
393
- onClick={() => versionClick(video_version.ingest_db_id)}>
394
- {video_version.version_name}
395
- </VersionBlock>
396
- );
397
- })}
398
- </div>
399
- </div>
400
- </div>
401
- );
402
- })}
403
- </div>
404
- </div>
405
- )}
406
- </div>
407
- <div className="video-time-block">
408
- {videoDetails.txDate ? (
409
- <div className="tv-time">
410
- <p>{videoDetails.txDate}</p>
411
- </div>
412
- ) : null}
413
- {videoDetails.tvTime ? (
414
- <div className="tv-time">
415
- <Icon name="tv" width={14} height={12} color="#afb2ba" />
416
- <p>{videoDetails.tvTime}</p>
417
- </div>
418
- ) : null}
419
- {videoDetails.ottTime ? (
420
- <div className="ott-time">
421
- <Icon name="tablet" width={16} height={12} color="#afb2ba" />
422
- <p>{videoDetails.ottTime}</p>
423
- </div>
424
- ) : null}
425
- </div>
426
- </div>
427
- )}
428
- </PlayerDetails>
429
-
430
- <PlayerType>
431
- {!isFullscreen && !false && isShareAvailable && playerType === 'default' && (
432
- <Button
433
- display="rounded"
434
- appearance="cta"
435
- icon="share"
436
- width={25}
437
- height={25}
438
- iconWidth={12}
439
- iconHeight={12}
440
- tabIndex="0"
441
- {...this.props}
442
- onClick={openSharePopup}
443
- />
444
- )}
445
- {!isFullscreen && !false && (playerType === 'default' || playerType === 'qc') && qcReportAvailable && (
446
- <QCReportButton
447
- display="rounded"
448
- appearance="cta"
449
- icon="qc_report"
450
- width={25}
451
- height={25}
452
- iconWidth={12}
453
- iconHeight={12}
454
- tabIndex="0"
455
- onClick={() => this.openQCReport()}
456
- {...this.props}
457
- />
458
- )}
459
- {playerType !== 'default' && playerType !== 'clipping_default' ? (
460
- <Button
461
- display="rounded"
462
- appearance="cta"
463
- icon={playerType === 'dubbing_review' ? 'access_dubbing_studio' : playerType}
464
- width={25}
465
- height={25}
466
- iconWidth={12}
467
- iconHeight={12}
468
- tabIndex="0"
469
- style={{
470
- pointerEvents: 'none'
471
- }}
472
- {...this.props}
473
- />
474
- ) : null}
475
- </PlayerType>
476
- </PlayerHeaderBlock>
477
- );
478
- }
479
- }