forked from shaka-project/shaka-player
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpresentation_time.js
125 lines (106 loc) · 3.77 KB
/
presentation_time.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/** @license
* Copyright 2016 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
goog.provide('shaka.ui.PresentationTimeTracker');
goog.require('shaka.ui.Element');
goog.require('shaka.ui.Utils');
goog.require('shaka.util.Dom');
/**
* @extends {shaka.ui.Element}
* @final
* @export
*/
shaka.ui.PresentationTimeTracker = class extends shaka.ui.Element {
/**
* @param {!HTMLElement} parent
* @param {!shaka.ui.Controls} controls
*/
constructor(parent, controls) {
super(parent, controls);
this.currentTime_ = shaka.util.Dom.createHTMLElement('button');
this.currentTime_.classList.add('shaka-current-time');
this.setValue_('0:00');
this.parent.appendChild(this.currentTime_);
this.eventManager.listen(this.currentTime_, 'click', () => {
// Jump to LIVE if the user clicks on the current time.
if (this.player.isLive()) {
this.video.currentTime = this.player.seekRange().end;
}
});
this.eventManager.listen(this.controls, 'timeandseekrangeupdated', () => {
this.updateTime_();
});
this.eventManager.listen(this.player, 'trackschanged', () => {
this.onTracksChanged_();
});
}
/** @private */
setValue_(value) {
// To avoid constant updates to the DOM, which makes debugging more
// difficult, only set the value if it has changed. If we don't do this
// check, the DOM updates constantly, this element flashes in the debugger
// in Chrome, and you can't make changes in the CSS panel.
if (value != this.currentTime_.textContent) {
this.currentTime_.textContent = value;
}
}
/** @private */
updateTime_() {
const isSeeking = this.controls.isSeeking();
let displayTime = this.controls.getDisplayTime();
const duration = this.video.duration;
const seekRange = this.player.seekRange();
const seekRangeSize = seekRange.end - seekRange.start;
const Utils = shaka.ui.Utils;
if (this.player.isLive()) {
// The amount of time we are behind the live edge.
const behindLive = Math.floor(seekRange.end - displayTime);
displayTime = Math.max(0, behindLive);
const showHour = seekRangeSize >= 3600;
// Consider "LIVE" when less than 1 second behind the live-edge. Always
// show the full time string when seeking, including the leading '-';
// otherwise, the time string "flickers" near the live-edge.
// The button should only be clickable when it's live stream content, and
// the current play time is behind live edge.
if ((displayTime >= 1) || isSeeking) {
this.setValue_('- ' + Utils.buildTimeString(displayTime, showHour));
this.currentTime_.disabled = false;
} else {
this.setValue_(this.localization.resolve(shaka.ui.Locales.Ids.LIVE));
this.currentTime_.disabled = true;
}
} else {
const showHour = duration >= 3600;
let value = Utils.buildTimeString(displayTime, showHour);
if (duration) {
value += ' / ' + Utils.buildTimeString(duration, showHour);
}
this.setValue_(value);
this.currentTime_.disabled = true;
}
}
/**
* Set the aria label to be 'Live' when the content is live stream.
* @private
*/
onTracksChanged_() {
if (this.player.isLive()) {
const ariaLabel = shaka.ui.Locales.Ids.SKIP_TO_LIVE;
this.currentTime_.setAttribute(shaka.ui.Constants.ARIA_LABEL,
this.localization.resolve(ariaLabel));
}
}
};
/**
* @implements {shaka.extern.IUIElement.Factory}
* @final
*/
shaka.ui.PresentationTimeTracker.Factory = class {
/** @override */
create(rootElement, controls) {
return new shaka.ui.PresentationTimeTracker(rootElement, controls);
}
};
shaka.ui.Controls.registerElement(
'time_and_duration', new shaka.ui.PresentationTimeTracker.Factory());