Speed settings logic improvements
This commit is contained in:
11
src/js/controls.js
vendored
11
src/js/controls.js
vendored
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
|
Reference in New Issue
Block a user