Speed settings logic improvements

This commit is contained in:
Sam Potts
2020-02-10 18:34:05 +00:00
parent ff8dedd4ec
commit 1619510dcf
6 changed files with 22 additions and 26 deletions

11
src/js/controls.js vendored
View File

@ -9,7 +9,7 @@ import captions from './captions';
import html5 from './html5'; import html5 from './html5';
import support from './support'; import support from './support';
import { repaint, transitionEndEvent } from './utils/animation'; import { repaint, transitionEndEvent } from './utils/animation';
import { dedupe, fillRange } from './utils/arrays'; import { dedupe } from './utils/arrays';
import browser from './utils/browser'; import browser from './utils/browser';
import { import {
createElement, createElement,
@ -1053,13 +1053,8 @@ const controls = {
const type = 'speed'; const type = 'speed';
const list = this.elements.settings.panels.speed.querySelector('[role="menu"]'); const list = this.elements.settings.panels.speed.querySelector('[role="menu"]');
// Determine options to display // Filter out invalid speeds
// Vimeo and YouTube limit to 0.5x-2x this.options.speed = this.options.speed.filter(o => o >= this.minimumSpeed && o <= this.maximumSpeed);
if (this.isVimeo || this.isYouTube) {
this.options.speed = fillRange(0.5, 2, 0.25).filter(s => this.config.speed.options.includes(s));
} else {
this.options.speed = this.config.speed.options;
}
// Toggle the pane and tab // Toggle the pane and tab
const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1; const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;

View File

@ -42,13 +42,16 @@ const html5 = {
.filter(Boolean); .filter(Boolean);
}, },
extend() { setup() {
if (!this.isHTML5) { if (!this.isHTML5) {
return; return;
} }
const player = this; const player = this;
// Set speed options from config
player.options.speed = player.config.speed.options;
// Set aspect ratio if fixed // Set aspect ratio if fixed
if (!is.empty(this.config.ratio)) { if (!is.empty(this.config.ratio)) {
setAspectRatio.call(player); setAspectRatio.call(player);
@ -93,7 +96,6 @@ const html5 = {
if (preload !== 'none' || readyState) { if (preload !== 'none' || readyState) {
// Restore time // Restore time
player.once('loadedmetadata', () => { player.once('loadedmetadata', () => {
player.speed = playbackRate; player.speed = playbackRate;
player.currentTime = currentTime; player.currentTime = currentTime;

View File

@ -49,7 +49,7 @@ const media = {
} }
if (this.isHTML5) { if (this.isHTML5) {
html5.extend.call(this); html5.setup.call(this);
} else if (this.isYouTube) { } else if (this.isYouTube) {
youtube.setup.call(this); youtube.setup.call(this);
} else if (this.isVimeo) { } else if (this.isVimeo) {

View File

@ -42,23 +42,28 @@ function assurePlaybackState(play) {
const vimeo = { const vimeo = {
setup() { setup() {
const player = this;
// Add embed class for responsive // Add embed class for responsive
toggleClass(this.elements.wrapper, this.config.classNames.embed, true); toggleClass(player.elements.wrapper, player.config.classNames.embed, true);
// Set speed options from config
player.options.speed = player.config.speed.options;
// Set intial ratio // Set intial ratio
setAspectRatio.call(this); setAspectRatio.call(player);
// Load the SDK if not already // Load the SDK if not already
if (!is.object(window.Vimeo)) { if (!is.object(window.Vimeo)) {
loadScript(this.config.urls.vimeo.sdk) loadScript(player.config.urls.vimeo.sdk)
.then(() => { .then(() => {
vimeo.ready.call(this); vimeo.ready.call(player);
}) })
.catch(error => { .catch(error => {
this.debug.warn('Vimeo SDK (player.js) failed to load', error); player.debug.warn('Vimeo SDK (player.js) failed to load', error);
}); });
} else { } else {
vimeo.ready.call(this); vimeo.ready.call(player);
} }
}, },

View File

@ -297,7 +297,9 @@ const youtube = {
}); });
// Get available speeds // Get available speeds
player.options.speed = instance.getAvailablePlaybackRates(); const speeds = instance.getAvailablePlaybackRates();
// Filter based on config
player.options.speed = speeds.filter(s => player.config.speed.options.includes(s));
// Set the tabindex to avoid focus entering iframe // Set the tabindex to avoid focus entering iframe
if (player.supported.ui) { if (player.supported.ui) {

View File

@ -21,11 +21,3 @@ export function closest(array, value) {
return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev)); return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));
} }
export function fillRange(start, end, step = 1) {
const len = Math.floor((end - start) / step) + 1;
return Array(len)
.fill()
.map((_, idx) => start + idx * step);
}