This commit is contained in:
Sam Potts 2017-10-08 19:10:04 +11:00
parent d6977473b1
commit 18a5edef0e
3 changed files with 154 additions and 145 deletions

View File

@ -1,24 +1,34 @@
{ {
"extends": ["eslint:recommended"],
"env": { "env": {
"browser": true "browser": true
}, },
"globals": {
"engine": true,
"Modernizr": false,
"ga": false,
"mixpanel": false,
"moment": false,
"fullscreen": false,
"Raven": false,
"templates": false,
"Hogan": false,
"locale_json": false,
"bootbox": false
},
"rules": { "rules": {
"no-const-assign": "warn", "no-const-assign": 1,
"no-this-before-super": "warn", "no-this-before-super": 1,
"no-undef": "warn", "no-undef": 1,
"no-unreachable": "warn", "no-unreachable": 1,
"no-unused-vars": "warn", "no-unused-vars": 1,
"constructor-super": "warn", "constructor-super": 1,
"valid-typeof": "warn", "valid-typeof": 1,
"indent": [ "indent": [2, 4, { "SwitchCase": 1 }],
"error", "quotes": [2, "single", "avoid-escape"],
4, "semi": [2, "always"],
{ "eqeqeq": [2, "always"],
"SwitchCase": 1 "one-var": [2, "never"],
} "comma-dangle": [2, "always-multiline"]
],
"quotes": ["error", "single"],
"semi": ["error", "always"],
"eqeqeq": ["error", "always"]
} }
} }

2
dist/plyr.js vendored

File diff suppressed because one or more lines are too long

View File

@ -24,7 +24,7 @@
// Globals // Globals
var scroll = { var scroll = {
x: 0, x: 0,
y: 0 y: 0,
}; };
// Default config // Default config
@ -77,51 +77,51 @@
// Quality default // Quality default
quality: { quality: {
default: 'default', default: 'default',
options: ['hd2160', 'hd1440', 'hd1080', 'hd720', 'large', 'medium', 'small', 'tiny', 'default'] options: ['hd2160', 'hd1440', 'hd1080', 'hd720', 'large', 'medium', 'small', 'tiny', 'default'],
}, },
// Set loops // Set loops
loop: { loop: {
active: false, active: false,
start: null, start: null,
end: null end: null,
}, },
// Speed default and options to display // Speed default and options to display
speed: { speed: {
default: 1, default: 1,
options: [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] options: [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],
}, },
// Keyboard shortcut settings // Keyboard shortcut settings
keyboard: { keyboard: {
focused: true, focused: true,
global: false global: false,
}, },
// Display tooltips // Display tooltips
tooltips: { tooltips: {
controls: false, controls: false,
seek: true seek: true,
}, },
// Captions settings // Captions settings
captions: { captions: {
active: false, active: false,
language: window.navigator.language.split('-')[0] language: window.navigator.language.split('-')[0],
}, },
// Fullscreen settings // Fullscreen settings
fullscreen: { fullscreen: {
enabled: true, enabled: true,
fallback: true, fallback: true,
allowAudio: false allowAudio: false,
}, },
// Local storage // Local storage
storage: { storage: {
enabled: true, enabled: true,
key: 'plyr' key: 'plyr',
}, },
// Default controls // Default controls
@ -136,7 +136,7 @@
'settings', 'settings',
'pip', 'pip',
'airplay', 'airplay',
'fullscreen' 'fullscreen',
], ],
settings: ['captions', 'quality', 'speed', 'loop'], settings: ['captions', 'quality', 'speed', 'loop'],
@ -167,20 +167,20 @@
all: 'All', all: 'All',
reset: 'Reset', reset: 'Reset',
none: 'None', none: 'None',
disabled: 'Disabled' disabled: 'Disabled',
}, },
// URLs // URLs
urls: { urls: {
vimeo: { vimeo: {
api: 'https://player.vimeo.com/api/player.js' api: 'https://player.vimeo.com/api/player.js',
}, },
youtube: { youtube: {
api: 'https://www.youtube.com/iframe_api' api: 'https://www.youtube.com/iframe_api',
}, },
soundcloud: { soundcloud: {
api: 'https://w.soundcloud.com/player/api.js' api: 'https://w.soundcloud.com/player/api.js',
} },
}, },
// Custom control listeners // Custom control listeners
@ -200,7 +200,7 @@
speed: null, speed: null,
quality: null, quality: null,
loop: null, loop: null,
language: null language: null,
}, },
// Events to watch and bubble // Events to watch and bubble
@ -240,7 +240,7 @@
// YouTube // YouTube
'statechange', 'statechange',
'qualitychange', 'qualitychange',
'qualityrequested' 'qualityrequested',
], ],
// Selectors // Selectors
@ -250,7 +250,7 @@
container: '.plyr', container: '.plyr',
controls: { controls: {
container: null, container: null,
wrapper: '.plyr__controls' wrapper: '.plyr__controls',
}, },
labels: '[data-plyr]', labels: '[data-plyr]',
buttons: { buttons: {
@ -265,14 +265,14 @@
pip: '[data-plyr="pip"]', pip: '[data-plyr="pip"]',
airplay: '[data-plyr="airplay"]', airplay: '[data-plyr="airplay"]',
settings: '[data-plyr="settings"]', settings: '[data-plyr="settings"]',
loop: '[data-plyr="loop"]' loop: '[data-plyr="loop"]',
}, },
inputs: { inputs: {
seek: '[data-plyr="seek"]', seek: '[data-plyr="seek"]',
volume: '[data-plyr="volume"]', volume: '[data-plyr="volume"]',
speed: '[data-plyr="speed"]', speed: '[data-plyr="speed"]',
language: '[data-plyr="language"]', language: '[data-plyr="language"]',
quality: '[data-plyr="quality"]' quality: '[data-plyr="quality"]',
}, },
display: { display: {
currentTime: '.plyr__time--current', currentTime: '.plyr__time--current',
@ -280,13 +280,13 @@
buffer: '.plyr__progress--buffer', buffer: '.plyr__progress--buffer',
played: '.plyr__progress--played', played: '.plyr__progress--played',
loop: '.plyr__progress--loop', loop: '.plyr__progress--loop',
volume: '.plyr__volume--display' volume: '.plyr__volume--display',
}, },
progress: '.plyr__progress', progress: '.plyr__progress',
captions: '.plyr__captions', captions: '.plyr__captions',
menu: { menu: {
quality: '.js-plyr__menu__list--quality' quality: '.js-plyr__menu__list--quality',
} },
}, },
// Class hooks added to the player in different states // Class hooks added to the player in different states
@ -307,32 +307,32 @@
isTouch: 'plyr--is-touch', isTouch: 'plyr--is-touch',
menu: { menu: {
value: 'plyr__menu__value', value: 'plyr__menu__value',
badge: 'plyr__badge' badge: 'plyr__badge',
}, },
captions: { captions: {
enabled: 'plyr--captions-enabled', enabled: 'plyr--captions-enabled',
active: 'plyr--captions-active' active: 'plyr--captions-active',
}, },
fullscreen: { fullscreen: {
enabled: 'plyr--fullscreen-enabled', enabled: 'plyr--fullscreen-enabled',
active: 'plyr--fullscreen-active' active: 'plyr--fullscreen-active',
}, },
pip: { pip: {
enabled: 'plyr--pip-enabled', enabled: 'plyr--pip-enabled',
active: 'plyr--pip-active' active: 'plyr--pip-active',
}, },
airplay: { airplay: {
enabled: 'plyr--airplay-enabled', enabled: 'plyr--airplay-enabled',
active: 'plyr--airplay-active' active: 'plyr--airplay-active',
},
tabFocus: 'tab-focus',
}, },
tabFocus: 'tab-focus'
}
}; };
// Types // Types
var types = { var types = {
embed: ['youtube', 'vimeo', 'soundcloud'], embed: ['youtube', 'vimeo', 'soundcloud'],
html5: ['video', 'audio'] html5: ['video', 'audio'],
}; };
// Utilities // Utilities
@ -389,7 +389,7 @@
((this.string(input) || this.array(input) || this.nodeList(input)) && input.length === 0) || ((this.string(input) || this.array(input) || this.nodeList(input)) && input.length === 0) ||
(this.object(input) && Object.keys(input).length === 0) (this.object(input) && Object.keys(input).length === 0)
); );
} },
}, },
// Credits: http://paypal.github.io/accessible-html5-video-player/ // Credits: http://paypal.github.io/accessible-html5-video-player/
@ -471,7 +471,7 @@
isChrome: isChrome, isChrome: isChrome,
isSafari: isSafari, isSafari: isSafari,
isIPhone: /(iPhone|iPod)/gi.test(navigator.platform), isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),
isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform) isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),
}; };
}, },
@ -512,7 +512,7 @@
return { return {
basic: basic, basic: basic,
full: full full: full,
}; };
}, },
@ -544,11 +544,6 @@
return utils.is.array(haystack) && haystack.indexOf(needle) !== -1; return utils.is.array(haystack) && haystack.indexOf(needle) !== -1;
}, },
// Replace all
replaceAll: function(string, find, replace) {
return string.replace(new RegExp(find.replace(/([.*+?\^=!:${}()|\[\]\/\\])/g, '\\$1'), 'g'), replace);
},
// Wrap an element // Wrap an element
wrap: function(elements, wrapper) { wrap: function(elements, wrapper) {
// Convert `elements` to an array, if necessary. // Convert `elements` to an array, if necessary.
@ -678,14 +673,14 @@
case '[': case '[':
// Strip the [] // Strip the []
selector = selector.replace(/[\[\]]/g, ''); selector = selector.replace(/[[\]]/g, '');
// Get the parts if // Get the parts if
var parts = selector.split('='); var parts = selector.split('=');
var key = parts[0]; var key = parts[0];
// Get the value if provided // Get the value if provided
var value = parts.length > 1 ? parts[1].replace(/[\"\']/g, '') : ''; var value = parts.length > 1 ? parts[1].replace(/["']/g, '') : '';
// Attribute selector // Attribute selector
attributes[key] = value; attributes[key] = value;
@ -823,7 +818,7 @@
if (support.passiveListeners) { if (support.passiveListeners) {
options = { options = {
passive: passive, passive: passive,
capture: capture capture: capture,
}; };
} }
@ -866,7 +861,7 @@
params = params || { params = params || {
bubbles: false, bubbles: false,
cancelable: false, cancelable: false,
detail: undefined detail: undefined,
}; };
var custom = document.createEvent('CustomEvent'); var custom = document.createEvent('CustomEvent');
custom.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); custom.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
@ -878,7 +873,7 @@
// Create and dispatch the event // Create and dispatch the event
var event = new CustomEvent(type, { var event = new CustomEvent(type, {
bubbles: bubbles, bubbles: bubbles,
detail: properties detail: properties,
}); });
// Dispatch the event // Dispatch the event
@ -958,7 +953,7 @@
// Parse YouTube ID from url // Parse YouTube ID from url
parseYouTubeId: function(url) { parseYouTubeId: function(url) {
var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/; var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;
return url.match(regex) ? RegExp.$2 : url; return url.match(regex) ? RegExp.$2 : url;
}, },
@ -1026,7 +1021,7 @@
window.localStorage.setItem( window.localStorage.setItem(
prefix + id, prefix + id,
JSON.stringify({ JSON.stringify({
content: xhr.responseText content: xhr.responseText,
}) })
); );
} }
@ -1046,7 +1041,7 @@
WebkitTransition: 'webkitTransitionEnd', WebkitTransition: 'webkitTransitionEnd',
MozTransition: 'transitionend', MozTransition: 'transitionend',
OTransition: 'oTransitionEnd otransitionend', OTransition: 'oTransitionEnd otransitionend',
transition: 'transitionend' transition: 'transitionend',
}; };
for (var type in events) { for (var type in events) {
@ -1056,7 +1051,7 @@
} }
return false; return false;
})() })(),
}; };
// Fullscreen API // Fullscreen API
@ -1139,7 +1134,7 @@
} }
return !prefix.length ? document.fullscreenElement : document[prefix + 'FullscreenElement']; return !prefix.length ? document.fullscreenElement : document[prefix + 'FullscreenElement'];
} },
}; };
})(); })();
@ -1239,10 +1234,12 @@
var options = Object.defineProperty({}, 'passive', { var options = Object.defineProperty({}, 'passive', {
get: function() { get: function() {
supported = true; supported = true;
} },
}); });
window.addEventListener('test', null, options); window.addEventListener('test', null, options);
} catch (e) {} } catch (e) {
// Do nothing
}
return supported; return supported;
})(), })(),
@ -1256,7 +1253,7 @@
// Reduced motion iOS & MacOS setting // Reduced motion iOS & MacOS setting
// https://webkit.org/blog/7551/responsive-design-for-motion/ // https://webkit.org/blog/7551/responsive-design-for-motion/
reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,
}; };
// Plyr instance // Plyr instance
@ -1290,7 +1287,9 @@
(function() { (function() {
try { try {
return JSON.parse(player.media.getAttribute('data-plyr')); return JSON.parse(player.media.getAttribute('data-plyr'));
} catch (e) {} } catch (e) {
// Do nothing
}
})() })()
); );
@ -1304,41 +1303,41 @@
settings: { settings: {
menu: null, menu: null,
panes: {}, panes: {},
tabs: {} tabs: {},
}, },
captions: null captions: null,
}; };
// Captions // Captions
player.captions = { player.captions = {
enabled: null, enabled: null,
tracks: null, tracks: null,
currentTrack: null currentTrack: null,
}; };
// Fullscreen // Fullscreen
player.fullscreen = { player.fullscreen = {
active: false active: false,
}; };
// Speed // Speed
player.speed = { player.speed = {
selected: null, selected: null,
options: [] options: [],
}; };
// Quality // Quality
player.quality = { player.quality = {
selected: null, selected: null,
options: [] options: [],
}; };
// Loop // Loop
player.loop = { player.loop = {
indicator: { indicator: {
start: 0, start: 0,
end: 0 end: 0,
} },
}; };
// Debugging // Debugging
@ -1346,9 +1345,9 @@
var warn = function() {}; var warn = function() {};
var error = function() {}; var error = function() {};
if (player.config.debug && 'console' in window) { if (player.config.debug && 'console' in window) {
log = console.log; log = console.log; // eslint-disable-line
warn = console.warn; warn = console.warn; // eslint-disable-line
error = console.error; error = console.error; // eslint-disable-line
log('Debugging enabled'); log('Debugging enabled');
} }
@ -1363,7 +1362,7 @@
type, type,
bubbles, bubbles,
utils.extend({}, properties, { utils.extend({}, properties, {
plyr: player plyr: player,
}) })
); );
} }
@ -1418,7 +1417,7 @@
function insertElements(type, attributes) { function insertElements(type, attributes) {
if (utils.is.string(attributes)) { if (utils.is.string(attributes)) {
utils.insertElement(type, player.media, { utils.insertElement(type, player.media, {
src: attributes src: attributes,
}); });
} else if (utils.is.array(attributes)) { } else if (utils.is.array(attributes)) {
warn(attributes); warn(attributes);
@ -1433,7 +1432,7 @@
function getIconUrl() { function getIconUrl() {
return { return {
url: player.config.iconUrl, url: player.config.iconUrl,
absolute: player.config.iconUrl.indexOf('http') === 0 || player.browser.isIE absolute: player.config.iconUrl.indexOf('http') === 0 || player.browser.isIE,
}; };
} }
@ -1448,7 +1447,7 @@
utils.setAttributes( utils.setAttributes(
icon, icon,
utils.extend(attributes, { utils.extend(attributes, {
role: 'presentation' role: 'presentation',
}) })
); );
@ -1479,7 +1478,7 @@
return utils.createElement( return utils.createElement(
'span', 'span',
{ {
class: player.config.classNames.hidden class: player.config.classNames.hidden,
}, },
text text
); );
@ -1488,14 +1487,14 @@
// Create a badge // Create a badge
function createBadge(text) { function createBadge(text) {
var badge = utils.createElement('span', { var badge = utils.createElement('span', {
class: player.config.classNames.menu.value class: player.config.classNames.menu.value,
}); });
badge.appendChild( badge.appendChild(
utils.createElement( utils.createElement(
'span', 'span',
{ {
class: player.config.classNames.menu.badge class: player.config.classNames.menu.badge,
}, },
text text
) )
@ -1569,7 +1568,7 @@
if (utils.is.string(iconToggled)) { if (utils.is.string(iconToggled)) {
button.appendChild( button.appendChild(
createIcon(iconToggled, { createIcon(iconToggled, {
class: 'icon--' + iconToggled class: 'icon--' + iconToggled,
}) })
); );
} }
@ -1591,7 +1590,7 @@
'label', 'label',
{ {
for: attributes.id, for: attributes.id,
class: player.config.classNames.hidden class: player.config.classNames.hidden,
}, },
player.config.i18n[type] player.config.i18n[type]
); );
@ -1607,7 +1606,7 @@
max: 100, max: 100,
step: 0.1, step: 0.1,
value: 0, value: 0,
autocomplete: 'off' autocomplete: 'off',
}, },
attributes attributes
) )
@ -1617,7 +1616,7 @@
return { return {
label: label, label: label,
input: input input: input,
}; };
} }
@ -1630,7 +1629,7 @@
{ {
min: 0, min: 0,
max: 100, max: 100,
value: 0 value: 0,
}, },
attributes attributes
) )
@ -1662,14 +1661,14 @@
// Create time display // Create time display
function createTime(type) { function createTime(type) {
var container = utils.createElement('span', { var container = utils.createElement('span', {
class: 'plyr__time' class: 'plyr__time',
}); });
container.appendChild( container.appendChild(
utils.createElement( utils.createElement(
'span', 'span',
{ {
class: player.config.classNames.hidden class: player.config.classNames.hidden,
}, },
player.config.i18n[type] player.config.i18n[type]
) )
@ -1733,7 +1732,7 @@
// Seek range slider // Seek range slider
var seek = createRange('seek', { var seek = createRange('seek', {
id: 'plyr-seek-' + data.id id: 'plyr-seek-' + data.id,
}); });
container.appendChild(seek.label); container.appendChild(seek.label);
container.appendChild(seek.input); container.appendChild(seek.input);
@ -1752,7 +1751,7 @@
'span', 'span',
{ {
role: 'tooltip', role: 'tooltip',
class: player.config.classNames.tooltip class: player.config.classNames.tooltip,
}, },
'00:00' '00:00'
); );
@ -1783,21 +1782,21 @@
// Volume range control // Volume range control
if (utils.inArray(player.config.controls, 'volume')) { if (utils.inArray(player.config.controls, 'volume')) {
var volume = utils.createElement('span', { var volume = utils.createElement('span', {
class: 'plyr__volume' class: 'plyr__volume',
}); });
// Set the attributes // Set the attributes
var attributes = { var attributes = {
max: 1, max: 1,
step: 0.05, step: 0.05,
value: player.config.volume value: player.config.volume,
}; };
// Create the volume range slider // Create the volume range slider
var range = createRange( var range = createRange(
'volume', 'volume',
utils.extend(attributes, { utils.extend(attributes, {
id: 'plyr-volume-' + data.id id: 'plyr-volume-' + data.id,
}) })
); );
volume.appendChild(range.label); volume.appendChild(range.label);
@ -1818,7 +1817,7 @@
// Settings button / menu // Settings button / menu
if (utils.inArray(player.config.controls, 'settings') && !utils.is.empty(player.config.settings)) { if (utils.inArray(player.config.controls, 'settings') && !utils.is.empty(player.config.settings)) {
var menu = utils.createElement('div', { var menu = utils.createElement('div', {
class: 'plyr__menu' class: 'plyr__menu',
}); });
menu.appendChild( menu.appendChild(
@ -1826,7 +1825,7 @@
id: 'plyr-settings-toggle-' + data.id, id: 'plyr-settings-toggle-' + data.id,
'aria-haspopup': true, 'aria-haspopup': true,
'aria-controls': 'plyr-settings-' + data.id, 'aria-controls': 'plyr-settings-' + data.id,
'aria-expanded': false 'aria-expanded': false,
}) })
); );
@ -1836,7 +1835,7 @@
'aria-hidden': true, 'aria-hidden': true,
'aria-labelled-by': 'plyr-settings-toggle-' + data.id, 'aria-labelled-by': 'plyr-settings-toggle-' + data.id,
role: 'tablist', role: 'tablist',
tabindex: -1 tabindex: -1,
}); });
var inner = utils.createElement('div'); var inner = utils.createElement('div');
@ -1845,19 +1844,19 @@
id: 'plyr-settings-' + data.id + '-home', id: 'plyr-settings-' + data.id + '-home',
'aria-hidden': false, 'aria-hidden': false,
'aria-labelled-by': 'plyr-settings-toggle-' + data.id, 'aria-labelled-by': 'plyr-settings-toggle-' + data.id,
role: 'tabpanel' role: 'tabpanel',
}); });
// Create the tab list // Create the tab list
var tabs = utils.createElement('ul', { var tabs = utils.createElement('ul', {
role: 'tablist' role: 'tablist',
}); });
// Build the tabs // Build the tabs
player.config.settings.forEach(function(type) { player.config.settings.forEach(function(type) {
var tab = utils.createElement('li', { var tab = utils.createElement('li', {
role: 'tab', role: 'tab',
hidden: '' hidden: '',
}); });
var button = utils.createElement( var button = utils.createElement(
@ -1869,13 +1868,13 @@
id: 'plyr-settings-' + data.id + '-' + type + '-tab', id: 'plyr-settings-' + data.id + '-' + type + '-tab',
'aria-haspopup': true, 'aria-haspopup': true,
'aria-controls': 'plyr-settings-' + data.id + '-' + type, 'aria-controls': 'plyr-settings-' + data.id + '-' + type,
'aria-expanded': false 'aria-expanded': false,
}), }),
player.config.i18n[type] player.config.i18n[type]
); );
var value = utils.createElement('span', { var value = utils.createElement('span', {
class: player.config.classNames.menu.value class: player.config.classNames.menu.value,
}); });
// Speed contains HTML entities // Speed contains HTML entities
@ -1899,7 +1898,7 @@
'aria-labelled-by': 'plyr-settings-' + data.id + '-' + type + '-tab', 'aria-labelled-by': 'plyr-settings-' + data.id + '-' + type + '-tab',
role: 'tabpanel', role: 'tabpanel',
tabindex: -1, tabindex: -1,
hidden: '' hidden: '',
}); });
var back = utils.createElement( var back = utils.createElement(
@ -1909,7 +1908,7 @@
class: player.config.classNames.control + ' ' + player.config.classNames.control + '--back', class: player.config.classNames.control + ' ' + player.config.classNames.control + '--back',
'aria-haspopup': true, 'aria-haspopup': true,
'aria-controls': 'plyr-settings-' + data.id + '-home', 'aria-controls': 'plyr-settings-' + data.id + '-home',
'aria-expanded': false 'aria-expanded': false,
}, },
player.config.i18n[type] player.config.i18n[type]
); );
@ -2046,7 +2045,7 @@
var item = utils.createElement('li'); var item = utils.createElement('li');
var label = utils.createElement('label', { var label = utils.createElement('label', {
class: player.config.classNames.control class: player.config.classNames.control,
}); });
var radio = utils.createElement( var radio = utils.createElement(
@ -2054,7 +2053,7 @@
utils.extend(utils.getAttributesFromSelector(player.config.selectors.inputs.quality), { utils.extend(utils.getAttributesFromSelector(player.config.selectors.inputs.quality), {
type: 'radio', type: 'radio',
name: 'plyr-quality', name: 'plyr-quality',
value: quality value: quality,
}) })
); );
@ -2220,14 +2219,14 @@
return { return {
language: track.language, language: track.language,
badge: true, badge: true,
label: !utils.is.empty(track.label) ? track.label : track.language.toUpperCase() label: !utils.is.empty(track.label) ? track.label : track.language.toUpperCase(),
}; };
}); });
// Add the "None" option to turn off captions // Add the "None" option to turn off captions
tracks.unshift({ tracks.unshift({
language: '', language: '',
label: player.config.i18n.none label: player.config.i18n.none,
}); });
// Generate options // Generate options
@ -2235,7 +2234,7 @@
var item = utils.createElement('li'); var item = utils.createElement('li');
var label = utils.createElement('label', { var label = utils.createElement('label', {
class: player.config.classNames.control class: player.config.classNames.control,
}); });
var radio = utils.createElement( var radio = utils.createElement(
@ -2243,7 +2242,7 @@
utils.extend(utils.getAttributesFromSelector(player.config.selectors.inputs.language), { utils.extend(utils.getAttributesFromSelector(player.config.selectors.inputs.language), {
type: 'radio', type: 'radio',
name: 'plyr-language', name: 'plyr-language',
value: track.language value: track.language,
}) })
); );
@ -2305,7 +2304,7 @@
var item = utils.createElement('li'); var item = utils.createElement('li');
var label = utils.createElement('label', { var label = utils.createElement('label', {
class: player.config.classNames.control class: player.config.classNames.control,
}); });
var radio = utils.createElement( var radio = utils.createElement(
@ -2313,7 +2312,7 @@
utils.extend(utils.getAttributesFromSelector(player.config.selectors.inputs.speed), { utils.extend(utils.getAttributesFromSelector(player.config.selectors.inputs.speed), {
type: 'radio', type: 'radio',
name: 'plyr-speed', name: 'plyr-speed',
value: speed value: speed,
}) })
); );
@ -2601,7 +2600,7 @@
// The function can return a HTMLElement or String // The function can return a HTMLElement or String
controls = player.config.controls({ controls = player.config.controls({
id: player.id, id: player.id,
seektime: player.config.seekTime seektime: player.config.seekTime,
}); });
} else { } else {
// Create controls // Create controls
@ -2613,7 +2612,7 @@
quality: '-', quality: '-',
captions: getLanguage(), captions: getLanguage(),
// TODO: Get loop // TODO: Get loop
loop: 'None' loop: 'None',
}); });
} }
@ -2650,7 +2649,7 @@
' ', ' ',
player.config.selectors.labels, player.config.selectors.labels,
' .', ' .',
player.config.classNames.hidden player.config.classNames.hidden,
].join('') ].join('')
); );
@ -2681,7 +2680,7 @@
airplay: getElement(player.config.selectors.buttons.airplay), airplay: getElement(player.config.selectors.buttons.airplay),
settings: getElement(player.config.selectors.buttons.settings), settings: getElement(player.config.selectors.buttons.settings),
captions: getElement(player.config.selectors.buttons.captions), captions: getElement(player.config.selectors.buttons.captions),
fullscreen: getElement(player.config.selectors.buttons.fullscreen) fullscreen: getElement(player.config.selectors.buttons.fullscreen),
}; };
// Progress // Progress
@ -2690,7 +2689,7 @@
// Inputs // Inputs
player.elements.inputs = { player.elements.inputs = {
seek: getElement(player.config.selectors.inputs.seek), seek: getElement(player.config.selectors.inputs.seek),
volume: getElement(player.config.selectors.inputs.volume) volume: getElement(player.config.selectors.inputs.volume),
}; };
// Display // Display
@ -2699,7 +2698,7 @@
played: getElement(player.config.selectors.display.played), played: getElement(player.config.selectors.display.played),
volume: getElement(player.config.selectors.display.volume), volume: getElement(player.config.selectors.display.volume),
duration: getElement(player.config.selectors.display.duration), duration: getElement(player.config.selectors.display.duration),
currentTime: getElement(player.config.selectors.display.currentTime) currentTime: getElement(player.config.selectors.display.currentTime),
}; };
// Seek tooltip // Seek tooltip
@ -2798,7 +2797,7 @@
// version of player. See: https://github.com/sampotts/plyr/pull/313 // version of player. See: https://github.com/sampotts/plyr/pull/313
// Update the key to be JSON // Update the key to be JSON
updateStorage({ updateStorage({
volume: parseFloat(value) volume: parseFloat(value),
}); });
} else { } else {
// Assume it's JSON from this or a later version of plyr // Assume it's JSON from this or a later version of plyr
@ -2874,7 +2873,7 @@
if (utils.inArray(['video', 'youtube', 'vimeo'], player.type)) { if (utils.inArray(['video', 'youtube', 'vimeo'], player.type)) {
// Create the wrapper div // Create the wrapper div
player.elements.wrapper = utils.createElement('div', { player.elements.wrapper = utils.createElement('div', {
class: player.config.classNames.video class: player.config.classNames.video,
}); });
// Wrap the video in a container // Wrap the video in a container
@ -2968,7 +2967,7 @@
utils.setAttributes(soundCloud, { utils.setAttributes(soundCloud, {
src: 'https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/' + mediaId, src: 'https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/' + mediaId,
id: id id: id,
}); });
player.media.appendChild(soundCloud); player.media.appendChild(soundCloud);
@ -3018,7 +3017,7 @@
// Tracking for stats // Tracking for stats
origin: window.location.hostname, origin: window.location.hostname,
widget_referrer: window.location.href widget_referrer: window.location.href,
// Captions is flaky on YouTube // Captions is flaky on YouTube
//cc_load_policy: (player.captions.active ? 1 : 0), //cc_load_policy: (player.captions.active ? 1 : 0),
@ -3028,7 +3027,7 @@
onError: function(event) { onError: function(event) {
trigger(player.elements.container, 'error', true, { trigger(player.elements.container, 'error', true, {
code: event.data, code: event.data,
embed: event.target embed: event.target,
}); });
}, },
onPlaybackQualityChange: function(event) { onPlaybackQualityChange: function(event) {
@ -3201,10 +3200,10 @@
} }
trigger(player.elements.container, 'statechange', false, { trigger(player.elements.container, 'statechange', false, {
code: event.data code: event.data,
}); });
} },
} },
}); });
} }
@ -3218,7 +3217,7 @@
autoplay: player.config.autoplay, autoplay: player.config.autoplay,
byline: false, byline: false,
portrait: false, portrait: false,
title: false title: false,
}); });
// Create a faux HTML5 API using the Vimeo API // Create a faux HTML5 API using the Vimeo API
@ -3466,7 +3465,7 @@
return { return {
width: width, width: width,
height: height height: height,
}; };
} }
@ -3558,7 +3557,7 @@
// Update the volume in storage // Update the volume in storage
updateStorage({ updateStorage({
volume: player.media.volume volume: player.media.volume,
}); });
// Toggle class if muted // Toggle class if muted
@ -4085,7 +4084,7 @@
67, 67,
73, 73,
76, 76,
79 79,
]; ];
var checkFocus = [38, 40]; var checkFocus = [38, 40];
@ -4512,7 +4511,7 @@
// Save speed to localStorage // Save speed to localStorage
updateStorage({ updateStorage({
speed: player.speed.selected speed: player.speed.selected,
}); });
}); });
@ -4526,7 +4525,7 @@
// Save speed to localStorage // Save speed to localStorage
updateStorage({ updateStorage({
quality: player.quality.selected quality: player.quality.selected,
}); });
}); });
@ -4534,7 +4533,7 @@
utils.on(player.media, 'captionchange', function() { utils.on(player.media, 'captionchange', function() {
// Save speed to localStorage // Save speed to localStorage
updateStorage({ updateStorage({
language: player.captions.language language: player.captions.language,
}); });
}); });
@ -4545,7 +4544,7 @@
// Save speed to localStorage // Save speed to localStorage
updateStorage({ updateStorage({
captions: player.captions.enabled captions: player.captions.enabled,
}); });
}); });
@ -4821,7 +4820,7 @@
// Debugging // Debugging
log: log, log: log,
warn: warn, warn: warn,
error: error error: error,
}; };
// Initialize instance // Initialize instance
@ -5184,7 +5183,7 @@
switch (player.type) { switch (player.type) {
case 'youtube': case 'youtube':
player.core.trigger(player.media, 'qualityrequested', false, { player.core.trigger(player.media, 'qualityrequested', false, {
quality: quality quality: quality,
}); });
player.embed.setPlaybackQuality(quality); player.embed.setPlaybackQuality(quality);
@ -5425,7 +5424,7 @@
function saveScrollPosition() { function saveScrollPosition() {
scroll = { scroll = {
x: window.pageXOffset || 0, x: window.pageXOffset || 0,
y: window.pageYOffset || 0 y: window.pageYOffset || 0,
}; };
} }
@ -5498,7 +5497,7 @@
var player = this; var player = this;
var states = { var states = {
pip: 'picture-in-picture', pip: 'picture-in-picture',
inline: 'inline' inline: 'inline',
}; };
// Bail if no support // Bail if no support