aboutsummaryrefslogtreecommitdiffstats
path: root/src/js/html5.js
diff options
context:
space:
mode:
authorSam Potts <sam@potts.es>2019-01-29 21:34:40 +1100
committerSam Potts <sam@potts.es>2019-01-29 21:34:40 +1100
commitb1da599b5d5891dc1dca44bd6aa9d8d03872fdcb (patch)
treec799fb2b444482f6d99dcdf3f16a957b290888c0 /src/js/html5.js
parentafc969bac322f9b17dc0554a65fa848eb998c8e6 (diff)
parentb798368ba68853558819d79a995aa0deec27f95e (diff)
downloadplyr-b1da599b5d5891dc1dca44bd6aa9d8d03872fdcb.tar.lz
plyr-b1da599b5d5891dc1dca44bd6aa9d8d03872fdcb.tar.xz
plyr-b1da599b5d5891dc1dca44bd6aa9d8d03872fdcb.zip
Merge branch 'develop' into beta
Diffstat (limited to 'src/js/html5.js')
-rw-r--r--src/js/html5.js117
1 files changed, 47 insertions, 70 deletions
diff --git a/src/js/html5.js b/src/js/html5.js
index 3818a441..3266a58e 100644
--- a/src/js/html5.js
+++ b/src/js/html5.js
@@ -3,40 +3,37 @@
// ==========================================================================
import support from './support';
-import utils from './utils';
+import { removeElement } from './utils/elements';
+import { triggerEvent } from './utils/events';
+import is from './utils/is';
const html5 = {
getSources() {
if (!this.isHTML5) {
- return null;
+ return [];
}
- return this.media.querySelectorAll('source');
- },
-
- // Get quality levels
- getQualityOptions() {
- if (!this.isHTML5) {
- return null;
- }
+ const sources = Array.from(this.media.querySelectorAll('source'));
- // Get sources
- const sources = html5.getSources.call(this);
-
- if (utils.is.empty(sources)) {
- return null;
- }
+ // Filter out unsupported sources (if type is specified)
+ return sources.filter(source => {
+ const type = source.getAttribute('type');
- // Get <source> with size attribute
- const sizes = Array.from(sources).filter(source => !utils.is.empty(source.getAttribute('size')));
+ if (is.empty(type)) {
+ return true;
+ }
- // If none, bail
- if (utils.is.empty(sizes)) {
- return null;
- }
+ return support.mime.call(this, type);
+ });
+ },
- // Reduce to unique list
- return utils.dedupe(sizes.map(source => Number(source.getAttribute('size'))));
+ // Get quality levels
+ getQualityOptions() {
+ // Get sizes from <source> elements
+ return html5.getSources
+ .call(this)
+ .map(source => Number(source.getAttribute('size')))
+ .filter(Boolean);
},
extend() {
@@ -51,67 +48,47 @@ const html5 = {
get() {
// Get sources
const sources = html5.getSources.call(player);
+ const source = sources.find(source => source.getAttribute('src') === player.source);
- if (utils.is.empty(sources)) {
- return null;
- }
-
- const matches = Array.from(sources).filter(source => source.getAttribute('src') === player.source);
-
- if (utils.is.empty(matches)) {
- return null;
- }
-
- return Number(matches[0].getAttribute('size'));
+ // Return size, if match is found
+ return source && Number(source.getAttribute('size'));
},
set(input) {
// Get sources
const sources = html5.getSources.call(player);
- if (utils.is.empty(sources)) {
- return;
- }
-
- // Get matches for requested size
- const matches = Array.from(sources).filter(source => Number(source.getAttribute('size')) === input);
-
- // No matches for requested size
- if (utils.is.empty(matches)) {
- return;
- }
-
- // Get supported sources
- const supported = matches.filter(source => support.mime.call(player, source.getAttribute('type')));
+ // Get first match for requested size
+ const source = sources.find(source => Number(source.getAttribute('size')) === input);
- // No supported sources
- if (utils.is.empty(supported)) {
+ // No matching source found
+ if (!source) {
return;
}
- // Trigger change event
- utils.dispatchEvent.call(player, player.media, 'qualityrequested', false, {
- quality: input,
- });
-
// Get current state
- const { currentTime, playing } = player;
+ const { currentTime, paused, preload, readyState } = player.media;
// Set new source
- player.media.src = supported[0].getAttribute('src');
-
- // Load new source
- player.media.load();
-
- // Resume playing
- if (playing) {
- player.play();
+ player.media.src = source.getAttribute('src');
+
+ // Prevent loading if preload="none" and the current source isn't loaded (#1044)
+ if (preload !== 'none' || readyState) {
+ // Restore time
+ player.once('loadedmetadata', () => {
+ player.currentTime = currentTime;
+
+ // Resume playing
+ if (!paused) {
+ player.play();
+ }
+ });
+
+ // Load new source
+ player.media.load();
}
- // Restore time
- player.currentTime = currentTime;
-
// Trigger change event
- utils.dispatchEvent.call(player, player.media, 'qualitychange', false, {
+ triggerEvent.call(player, player.media, 'qualitychange', false, {
quality: input,
});
},
@@ -126,7 +103,7 @@ const html5 = {
}
// Remove child sources
- utils.removeElement(html5.getSources());
+ removeElement(html5.getSources.call(this));
// Set blank video src attribute
// This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error