mirror of
https://github.com/shaka-project/shaka-player.git
synced 2026-06-27 17:56:23 +03:00
eb97e85ec7
Issue #1861 Change-Id: I9bf7dc65883f9aa9b6853999a2c23a720919de26
139 lines
4.0 KiB
JavaScript
139 lines
4.0 KiB
JavaScript
/**
|
|
* @license
|
|
* Copyright 2016 Google Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
|
|
goog.provide('shaka.ui.PresentationTimeTracker');
|
|
|
|
goog.require('shaka.ui.Element');
|
|
|
|
|
|
/**
|
|
* @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.ui.Utils.createHTMLElement('div');
|
|
this.currentTime_.classList.add('shaka-current-time');
|
|
this.currentTime_.textContent = '0:00';
|
|
this.parent.appendChild(this.currentTime_);
|
|
|
|
// TODO(#1861): This is not accessible, since it is just a clickable div.
|
|
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_();
|
|
});
|
|
}
|
|
|
|
|
|
/**
|
|
* @private
|
|
*/
|
|
updateTime_() {
|
|
const isSeeking = this.controls.isSeeking();
|
|
let displayTime = this.controls.getDisplayTime();
|
|
let duration = this.video.duration;
|
|
let seekRange = this.player.seekRange();
|
|
let seekRangeSize = seekRange.end - seekRange.start;
|
|
|
|
if (this.player.isLive()) {
|
|
// The amount of time we are behind the live edge.
|
|
let behindLive = Math.floor(seekRange.end - displayTime);
|
|
displayTime = Math.max(0, behindLive);
|
|
|
|
let 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.
|
|
if ((displayTime >= 1) || isSeeking) {
|
|
this.currentTime_.textContent =
|
|
'- ' + this.buildTimeString_(displayTime, showHour);
|
|
// TODO: move to CSS
|
|
this.currentTime_.style.cursor = 'pointer';
|
|
} else {
|
|
this.currentTime_.textContent =
|
|
this.localization.resolve(shaka.ui.Locales.Ids.LABEL_LIVE);
|
|
// TODO: move to CSS
|
|
this.currentTime_.style.cursor = '';
|
|
}
|
|
} else {
|
|
let showHour = duration >= 3600;
|
|
|
|
this.currentTime_.textContent =
|
|
this.buildTimeString_(displayTime, showHour);
|
|
|
|
if (duration) {
|
|
this.currentTime_.textContent += ' / ' +
|
|
this.buildTimeString_(duration, showHour);
|
|
}
|
|
// TODO: move to CSS
|
|
this.currentTime_.style.cursor = '';
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Builds a time string, e.g., 01:04:23, from |displayTime|.
|
|
*
|
|
* @param {number} displayTime
|
|
* @param {boolean} showHour
|
|
* @return {string}
|
|
* @private
|
|
*/
|
|
buildTimeString_(displayTime, showHour) {
|
|
let h = Math.floor(displayTime / 3600);
|
|
let m = Math.floor((displayTime / 60) % 60);
|
|
let s = Math.floor(displayTime % 60);
|
|
if (s < 10) s = '0' + s;
|
|
let text = m + ':' + s;
|
|
if (showHour) {
|
|
if (m < 10) text = '0' + text;
|
|
text = h + ':' + text;
|
|
}
|
|
return text;
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* @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());
|