mirror of
https://github.com/shaka-project/shaka-player.git
synced 2026-06-15 16:06:41 +03:00
f130dffcef
This is a fully automated change. The linter will fail because the extra indentation caused line-length errors. These won't be fixed automatically. They are fixed in a follow-up to make this one fully automated. Change-Id: I4d8cf9c998985add2bcd24a81c8d65495668c4f3
157 lines
4.4 KiB
JavaScript
157 lines
4.4 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');
|
|
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.currentTime_.textContent = '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
|
|
*/
|
|
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;
|
|
|
|
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.currentTime_.textContent =
|
|
'- ' + this.buildTimeString_(displayTime, showHour);
|
|
this.currentTime_.disabled = false;
|
|
} else {
|
|
this.currentTime_.textContent =
|
|
this.localization.resolve(shaka.ui.Locales.Ids.LIVE);
|
|
this.currentTime_.disabled = true;
|
|
}
|
|
} else {
|
|
const showHour = duration >= 3600;
|
|
|
|
this.currentTime_.textContent =
|
|
this.buildTimeString_(displayTime, showHour);
|
|
|
|
if (duration) {
|
|
this.currentTime_.textContent += ' / ' +
|
|
this.buildTimeString_(duration, showHour);
|
|
}
|
|
this.currentTime_.disabled = true;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Builds a time string, e.g., 01:04:23, from |displayTime|.
|
|
*
|
|
* @param {number} displayTime
|
|
* @param {boolean} showHour
|
|
* @return {string}
|
|
* @private
|
|
*/
|
|
buildTimeString_(displayTime, showHour) {
|
|
const h = Math.floor(displayTime / 3600);
|
|
const 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;
|
|
}
|
|
|
|
/**
|
|
* Set the aria label to be 'Live' when the content is live stream.
|
|
*/
|
|
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());
|