ovenplayer 0.10.49 → 0.10.51

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 (34) hide show
  1. package/dist/ovenplayer.js +1 -1
  2. package/dist/ovenplayer.js.map +1 -1
  3. package/package.json +49 -49
  4. package/src/js/api/Configurator.js +1 -1
  5. package/src/js/api/ads/vast/Ad.js +237 -237
  6. package/src/js/api/caption/Loader.js +1 -1
  7. package/src/js/api/caption/Manager.js +1 -1
  8. package/src/js/api/caption/parser/VttParser.js +1541 -1542
  9. package/src/js/api/playlist/Manager.js +229 -229
  10. package/src/js/api/provider/html5/providers/Dash.js +286 -286
  11. package/src/js/api/provider/html5/providers/Hls.js +110 -2
  12. package/src/js/api/provider/html5/providers/WebRTC.js +2 -1
  13. package/src/js/api/provider/html5/providers/WebRTCLoader.js +35 -2
  14. package/src/js/api/provider/utils.js +69 -69
  15. package/src/js/ovenplayer.sdk.js +143 -143
  16. package/src/js/utils/likeA$.js +241 -242
  17. package/src/js/utils/resize-sensor.js +145 -168
  18. package/src/js/utils/strings.js +104 -104
  19. package/src/js/view/components/controls/settingPanel/audioTrackPanel.js +57 -57
  20. package/src/js/view/components/controls/settingPanel/main.js +1 -1
  21. package/src/js/view/components/controls/settingPanel/mainTemplate.js +29 -29
  22. package/src/js/view/components/controls/settingPanel/qualityPanel.js +68 -68
  23. package/src/js/view/components/controls/settingPanel/subtitleTrackPanel.js +56 -56
  24. package/src/js/view/components/helpers/captionViewer.js +97 -15
  25. package/src/js/view/components/helpers/captionViewerTemplate.js +1 -2
  26. package/src/js/view/components/helpers/waterMark.js +69 -69
  27. package/src/js/view/engine/OvenTemplate.js +158 -158
  28. package/src/js/view/global/PanelManager.js +47 -47
  29. package/src/stylesheet/ovenplayer.less +52 -21
  30. package/src/js/utils/adapter.js +0 -4944
  31. package/src/js/utils/captions/vttCue.js +0 -308
  32. package/src/js/utils/captions/vttRegion.js +0 -136
  33. package/src/js/utils/polyfills/dom.js +0 -634
  34. package/src/js/utils/underscore.js +0 -6
@@ -1,158 +1,158 @@
1
- /**
2
- * Created by hoho on 2018. 7. 19..
3
- */
4
-
5
- import Templates from "view/engine/Templates";
6
- import LA$ from 'utils/likeA$';
7
- import _ from "utils/underscore";
8
-
9
- /**
10
- * @brief This is simple ui renderer. This returns onRendered callback, onDestroyed callback on Template. And this bind events for Templates.
11
- * @param container dom element or LA$ object
12
- * @param templateName templateName
13
- * @param data preload data
14
- * @param events Template's events.
15
- * @param onRendered This callback occurs after append template.
16
- * @param onDestroyed This callback occurs after destroyed template.
17
- * @param isRoot
18
- *
19
- * */
20
- const OvenTemplate = function (container, templateName, playerConfig, data, events, onRendered, onDestroyed, isRoot) {
21
-
22
- let $container = _.isElement(container) ? LA$(container) : container;
23
- let $template;
24
- let viewEvents = {};
25
- let uiText = null;
26
- let that = {};
27
- that.data = data;
28
- let createAndSelectElement = function (html) {
29
- const newElement = document.createElement('div');
30
- newElement.innerHTML = html;
31
-
32
- $template = LA$(newElement.firstChild);
33
-
34
- return newElement.firstChild;
35
- }
36
- if(playerConfig && playerConfig.systemText){
37
- uiText = playerConfig.systemText.ui;
38
- }
39
- if (isRoot) {
40
- $container.replace(createAndSelectElement(Templates[templateName + "Template"](uiText, data)));
41
- } else {
42
- $container.append(createAndSelectElement(Templates[templateName + "Template"](uiText, data)));
43
- }
44
-
45
- if (onRendered) {
46
- onRendered($template, that);
47
- }
48
-
49
- Object.keys(events).forEach(eventString => {
50
- let explodedText = eventString.split(" ");
51
- let eventName = explodedText[0].replace(/ /gi, "");
52
- let target = explodedText[1].replace(/ /gi, "");
53
-
54
- let $target = "";
55
-
56
- if(target === "document" || target === "window" || target === "body"){
57
- $target = LA$(target);
58
- }else{
59
- $target = $template.find(target) || ($template.hasClass(target.replace(".","")) ? $template : null);
60
- }
61
-
62
-
63
- if (eventName && target && $target) {
64
- let id = Object.keys(viewEvents).length++;
65
-
66
- //because It retuns another data.
67
- let wrappedFunc = function (event) {
68
- return events[eventString](event, $template, that);
69
- };
70
- viewEvents[id] = {name: eventName, target: target, callback: wrappedFunc};
71
-
72
- /*$template.get().addEventListener(eventName,function(evt){
73
- var gtarget = evt.target;
74
- while (gtarget!= null){
75
- if (gtarget.isEqualNode($target.get())){
76
- console.log("isEqual", gtarget, $target.get());
77
- wrappedFunc(evt);
78
- return;
79
- }
80
- gtarget = gtarget.parentElement;
81
- }
82
- }, true);*/
83
-
84
- let eventOption = null;
85
-
86
- if (eventName.indexOf('touch') > -1) {
87
- eventOption = { passive: true };
88
- }
89
-
90
- //sometimes target is NodeList
91
- let nodeLength = $target.get().length;
92
-
93
- if(nodeLength > 1){
94
- let nodeList = $target.get();
95
- for(let i = 0; i < nodeLength; i ++){
96
- nodeList[i].addEventListener(eventName, wrappedFunc, eventOption);
97
- }
98
- //IE NodeList doesn't have forEach. It's wack.
99
- //$target.get().forEach(function($item){
100
- // $item.addEventListener(eventName, wrappedFunc);
101
- //});
102
- }else{
103
- $target.get().addEventListener(eventName, wrappedFunc, eventOption);
104
- }
105
-
106
-
107
- } else {
108
- return false;
109
- }
110
- });
111
-
112
- that.destroy = function () {
113
- Object.keys(viewEvents).forEach(id => {
114
- let event = viewEvents[id];
115
- let $target = "";
116
-
117
- if(event.target === "document" || event.target === "window" || event.target === "body"){
118
- $target = LA$(event.target);
119
- }else{
120
- $target = $template.find(event.target) || ($template.hasClass(event.target.replace(".","")) ? $template : null);
121
- }
122
-
123
- //sometimes target is NodeList
124
- let nodeLength = $target.get().length;
125
- if(nodeLength > 1){
126
- let nodeList = $target.get();
127
- for(let i = 0; i < nodeLength; i ++){
128
- nodeList[i].removeEventListener(event.name, event.callback);
129
- }
130
- /*$target.get().forEach(function($item){
131
- $item.removeEventListener(event.name, event.callback);
132
- });*/
133
- }else{
134
- $target.get().removeEventListener(event.name, event.callback);
135
- }
136
-
137
- delete viewEvents[id];
138
- });
139
-
140
- if($template){
141
- if(isRoot){
142
- $template.removeChild();
143
- $template.removeAttribute("class");
144
- }else{
145
- $template.remove();
146
- }
147
- }
148
-
149
- if (onDestroyed) {
150
- onDestroyed(that);
151
- }
152
- };
153
- return that;
154
-
155
- };
156
-
157
-
158
- export default OvenTemplate;
1
+ /**
2
+ * Created by hoho on 2018. 7. 19..
3
+ */
4
+
5
+ import Templates from "view/engine/Templates";
6
+ import LA$ from 'utils/likeA$';
7
+ import _ from "underscore";
8
+
9
+ /**
10
+ * @brief This is simple ui renderer. This returns onRendered callback, onDestroyed callback on Template. And this bind events for Templates.
11
+ * @param container dom element or LA$ object
12
+ * @param templateName templateName
13
+ * @param data preload data
14
+ * @param events Template's events.
15
+ * @param onRendered This callback occurs after append template.
16
+ * @param onDestroyed This callback occurs after destroyed template.
17
+ * @param isRoot
18
+ *
19
+ * */
20
+ const OvenTemplate = function (container, templateName, playerConfig, data, events, onRendered, onDestroyed, isRoot) {
21
+
22
+ let $container = _.isElement(container) ? LA$(container) : container;
23
+ let $template;
24
+ let viewEvents = {};
25
+ let uiText = null;
26
+ let that = {};
27
+ that.data = data;
28
+ let createAndSelectElement = function (html) {
29
+ const newElement = document.createElement('div');
30
+ newElement.innerHTML = html;
31
+
32
+ $template = LA$(newElement.firstChild);
33
+
34
+ return newElement.firstChild;
35
+ }
36
+ if(playerConfig && playerConfig.systemText){
37
+ uiText = playerConfig.systemText.ui;
38
+ }
39
+ if (isRoot) {
40
+ $container.replace(createAndSelectElement(Templates[templateName + "Template"](uiText, data)));
41
+ } else {
42
+ $container.append(createAndSelectElement(Templates[templateName + "Template"](uiText, data)));
43
+ }
44
+
45
+ if (onRendered) {
46
+ onRendered($template, that);
47
+ }
48
+
49
+ Object.keys(events).forEach(eventString => {
50
+ let explodedText = eventString.split(" ");
51
+ let eventName = explodedText[0].replace(/ /gi, "");
52
+ let target = explodedText[1].replace(/ /gi, "");
53
+
54
+ let $target = "";
55
+
56
+ if(target === "document" || target === "window" || target === "body"){
57
+ $target = LA$(target);
58
+ }else{
59
+ $target = $template.find(target) || ($template.hasClass(target.replace(".","")) ? $template : null);
60
+ }
61
+
62
+
63
+ if (eventName && target && $target) {
64
+ let id = Object.keys(viewEvents).length++;
65
+
66
+ //because It retuns another data.
67
+ let wrappedFunc = function (event) {
68
+ return events[eventString](event, $template, that);
69
+ };
70
+ viewEvents[id] = {name: eventName, target: target, callback: wrappedFunc};
71
+
72
+ /*$template.get().addEventListener(eventName,function(evt){
73
+ var gtarget = evt.target;
74
+ while (gtarget!= null){
75
+ if (gtarget.isEqualNode($target.get())){
76
+ console.log("isEqual", gtarget, $target.get());
77
+ wrappedFunc(evt);
78
+ return;
79
+ }
80
+ gtarget = gtarget.parentElement;
81
+ }
82
+ }, true);*/
83
+
84
+ let eventOption = null;
85
+
86
+ if (eventName.indexOf('touch') > -1) {
87
+ eventOption = { passive: true };
88
+ }
89
+
90
+ //sometimes target is NodeList
91
+ let nodeLength = $target.get().length;
92
+
93
+ if(nodeLength > 1){
94
+ let nodeList = $target.get();
95
+ for(let i = 0; i < nodeLength; i ++){
96
+ nodeList[i].addEventListener(eventName, wrappedFunc, eventOption);
97
+ }
98
+ //IE NodeList doesn't have forEach. It's wack.
99
+ //$target.get().forEach(function($item){
100
+ // $item.addEventListener(eventName, wrappedFunc);
101
+ //});
102
+ }else{
103
+ $target.get().addEventListener(eventName, wrappedFunc, eventOption);
104
+ }
105
+
106
+
107
+ } else {
108
+ return false;
109
+ }
110
+ });
111
+
112
+ that.destroy = function () {
113
+ Object.keys(viewEvents).forEach(id => {
114
+ let event = viewEvents[id];
115
+ let $target = "";
116
+
117
+ if(event.target === "document" || event.target === "window" || event.target === "body"){
118
+ $target = LA$(event.target);
119
+ }else{
120
+ $target = $template.find(event.target) || ($template.hasClass(event.target.replace(".","")) ? $template : null);
121
+ }
122
+
123
+ //sometimes target is NodeList
124
+ let nodeLength = $target.get().length;
125
+ if(nodeLength > 1){
126
+ let nodeList = $target.get();
127
+ for(let i = 0; i < nodeLength; i ++){
128
+ nodeList[i].removeEventListener(event.name, event.callback);
129
+ }
130
+ /*$target.get().forEach(function($item){
131
+ $item.removeEventListener(event.name, event.callback);
132
+ });*/
133
+ }else{
134
+ $target.get().removeEventListener(event.name, event.callback);
135
+ }
136
+
137
+ delete viewEvents[id];
138
+ });
139
+
140
+ if($template){
141
+ if(isRoot){
142
+ $template.removeChild();
143
+ $template.removeAttribute("class");
144
+ }else{
145
+ $template.remove();
146
+ }
147
+ }
148
+
149
+ if (onDestroyed) {
150
+ onDestroyed(that);
151
+ }
152
+ };
153
+ return that;
154
+
155
+ };
156
+
157
+
158
+ export default OvenTemplate;
@@ -1,47 +1,47 @@
1
- /**
2
- * Created by hoho on 2018. 7. 26..
3
- */
4
- import _ from "utils/underscore";
5
-
6
- let settingPanelList = [];
7
-
8
- const PanelManager = function(){
9
- const that = {};
10
-
11
- let refreshFront = function(){
12
- for(let i = 0 ; i < settingPanelList.length; i ++){
13
- settingPanelList[i].data.setFront(false);
14
- }
15
- if(settingPanelList.length ){
16
- settingPanelList[settingPanelList.length - 1].data.setFront(true);
17
- }
18
- };
19
- that.clear = () => {
20
- //clear all SettingPanelTemplate
21
-
22
- _.each(settingPanelList, function(settingPanel){
23
- settingPanel.destroy();
24
- });
25
- settingPanelList = [];
26
- refreshFront();
27
- };
28
-
29
- that.removeLastItem = () =>{
30
- let last = settingPanelList.pop();
31
- last.destroy();
32
- refreshFront();
33
- };
34
-
35
- that.add = (settingPanelObject) => {
36
- settingPanelList.push(settingPanelObject);
37
- refreshFront();
38
- };
39
-
40
- that.size = () => {
41
- return settingPanelList.length;
42
- };
43
-
44
- return that;
45
- };
46
-
47
- export default PanelManager;
1
+ /**
2
+ * Created by hoho on 2018. 7. 26..
3
+ */
4
+ import _ from "underscore";
5
+
6
+ let settingPanelList = [];
7
+
8
+ const PanelManager = function(){
9
+ const that = {};
10
+
11
+ let refreshFront = function(){
12
+ for(let i = 0 ; i < settingPanelList.length; i ++){
13
+ settingPanelList[i].data.setFront(false);
14
+ }
15
+ if(settingPanelList.length ){
16
+ settingPanelList[settingPanelList.length - 1].data.setFront(true);
17
+ }
18
+ };
19
+ that.clear = () => {
20
+ //clear all SettingPanelTemplate
21
+
22
+ _.each(settingPanelList, function(settingPanel){
23
+ settingPanel.destroy();
24
+ });
25
+ settingPanelList = [];
26
+ refreshFront();
27
+ };
28
+
29
+ that.removeLastItem = () =>{
30
+ let last = settingPanelList.pop();
31
+ last.destroy();
32
+ refreshFront();
33
+ };
34
+
35
+ that.add = (settingPanelObject) => {
36
+ settingPanelList.push(settingPanelObject);
37
+ refreshFront();
38
+ };
39
+
40
+ that.size = () => {
41
+ return settingPanelList.length;
42
+ };
43
+
44
+ return that;
45
+ };
46
+
47
+ export default PanelManager;
@@ -109,7 +109,7 @@
109
109
  zoom: 1 !important;
110
110
  width: 100%;
111
111
  display: block;
112
- font-family: Helvetica, Arial, sans-serif;
112
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
113
113
  background-color: #000;
114
114
  -moz-box-sizing: border-box;
115
115
  -webkit-box-sizing: border-box;
@@ -193,6 +193,10 @@
193
193
  .op-caption-text-container {
194
194
  bottom: 25px;
195
195
  }
196
+
197
+ .op-caption-cue:not(.op-caption-cue-positioned) {
198
+ bottom: 25px;
199
+ }
196
200
  }
197
201
 
198
202
  &.op-no-controls {
@@ -1588,25 +1592,52 @@ i.op-con {
1588
1592
 
1589
1593
  .op-caption-text-container {
1590
1594
  position: absolute;
1591
- bottom: 60px;
1595
+ top: 0;
1596
+ left: 0;
1592
1597
  width: 100%;
1593
- padding: 0 12px;
1594
- text-align: center;
1595
- -moz-transition: bottom .25s cubic-bezier(0.0, 0.0, 0.2, 1);
1596
- -webkit-transition: bottom .25s cubic-bezier(0.0, 0.0, 0.2, 1);
1597
- transition: bottom .25s cubic-bezier(0.0, 0.0, 0.2, 1);
1598
+ height: 100%;
1599
+ overflow: visible;
1600
+ pointer-events: none;
1601
+
1602
+ .op-caption-cue {
1603
+ position: absolute;
1604
+ bottom: 60px;
1605
+ width: 100%;
1606
+ left: 50%;
1607
+ transform: translateX(-50%);
1608
+ text-align: center;
1609
+ padding: 0 8%;
1610
+ -moz-transition: bottom .25s cubic-bezier(0.0, 0.0, 0.2, 1);
1611
+ -webkit-transition: bottom .25s cubic-bezier(0.0, 0.0, 0.2, 1);
1612
+ transition: bottom .25s cubic-bezier(0.0, 0.0, 0.2, 1);
1613
+
1614
+ &.op-caption-cue-positioned {
1615
+ bottom: auto;
1616
+ padding: 0;
1617
+ transition: none;
1618
+ }
1619
+ }
1598
1620
 
1599
1621
  .op-caption-text {
1622
+ display: inline-block;
1600
1623
  color: #fff;
1601
- font-size: 1em;
1602
- line-height: 1.2em;
1603
- text-shadow: 2px 2px 2px gray;
1604
- padding: .1em .3em;
1624
+ font-size: 1.5em;
1625
+ line-height: 1.5em;
1626
+ font-weight: 400;
1627
+ text-shadow: none;
1628
+ background: rgba(8, 8, 8, 0.75);
1629
+ padding: .25em .6em;
1630
+ border-radius: .25em;
1605
1631
  user-select: none;
1606
- word-break: break-word;
1632
+ word-break: keep-all;
1633
+ overflow-wrap: break-word;
1607
1634
  white-space: pre-line;
1608
1635
  border: none;
1609
- background: none;
1636
+
1637
+ &:empty {
1638
+ background: none;
1639
+ padding: 0;
1640
+ }
1610
1641
  }
1611
1642
  }
1612
1643
  }
@@ -1634,8 +1665,8 @@ i.op-con {
1634
1665
  font-size: 14px;
1635
1666
 
1636
1667
  .op-caption-text {
1637
- font-size: 2em;
1638
- line-height: 2em;
1668
+ font-size: 2em; /* 14px × 2 = 28px */
1669
+ line-height: 1.5em;
1639
1670
  }
1640
1671
 
1641
1672
  }
@@ -1644,8 +1675,8 @@ i.op-con {
1644
1675
  font-size: 12px;
1645
1676
 
1646
1677
  .op-caption-text {
1647
- font-size: 1.4em;
1648
- line-height: 1.4em;
1678
+ font-size: 1.75em; /* 12px × 1.75 = 21px */
1679
+ line-height: 1.5em;
1649
1680
  }
1650
1681
  }
1651
1682
 
@@ -1653,8 +1684,8 @@ i.op-con {
1653
1684
  font-size: 10px;
1654
1685
 
1655
1686
  .op-caption-text {
1656
- font-size: 1.4em;
1657
- line-height: 1.4em;
1687
+ font-size: 1.6em; /* 10px × 1.6 = 16px */
1688
+ line-height: 1.5em;
1658
1689
  }
1659
1690
 
1660
1691
  .op-playlist {
@@ -1681,8 +1712,8 @@ i.op-con {
1681
1712
  }
1682
1713
 
1683
1714
  .op-caption-text {
1684
- font-size: 1.4em;
1685
- line-height: 1.4em;
1715
+ font-size: 1.3em; /* 10px × 1.3 = 13px */
1716
+ line-height: 1.5em;
1686
1717
  }
1687
1718
 
1688
1719
  .op-playlist {