mirror of
https://github.com/shaka-project/shaka-player.git
synced 2026-06-26 17:46:26 +03:00
00442a9a7c
This changes the format of the localization data to enable apps to trivially lazy-load translations. It also adds --locales to the build scripts to allow app developers to choose the compiled-in locales. The generated output now goes into dist/ and is not checked into revision control. Finally, it adds "description" and "meaning" fields to the source messages to allow us to more easily integrate with a context-aware human translation service. The "description" field provides application context for the translator, while the "meaning" field provides linguistic disambiguation for words with multiple meanings or parts of speech in the original English. Because the translation service wants to collapse messages with identical text, we had to merge several messages together. To this end, we have removed the prefixes "ARIA_LABEL_" and "LABEL_" from the messages themselves and collapsed what remained. Issue #1688 Change-Id: I24c17e71c73f6663cf123cfdba118c486fa80ecc
153 lines
4.4 KiB
JavaScript
153 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();
|
|
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.
|
|
// 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 {
|
|
let 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) {
|
|
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;
|
|
}
|
|
|
|
/**
|
|
* 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());
|