aboutsummaryrefslogtreecommitdiffstats
path: root/src/js/plyr.js
diff options
context:
space:
mode:
authorSam Potts <me@sampotts.me>2015-03-22 11:05:28 +1100
committerSam Potts <me@sampotts.me>2015-03-22 11:05:28 +1100
commitc61db87fd676ce84db2fef7408bbed20a2bcd652 (patch)
tree59ace07a2ba5db5a2b10e7cc6e14142fa415ffd7 /src/js/plyr.js
parent388cb4df3964cf4db4e77eee5090bcf817c38dbc (diff)
downloadplyr-c61db87fd676ce84db2fef7408bbed20a2bcd652.tar.lz
plyr-c61db87fd676ce84db2fef7408bbed20a2bcd652.tar.xz
plyr-c61db87fd676ce84db2fef7408bbed20a2bcd652.zip
API improvements
Diffstat (limited to 'src/js/plyr.js')
-rw-r--r--src/js/plyr.js139
1 files changed, 89 insertions, 50 deletions
diff --git a/src/js/plyr.js b/src/js/plyr.js
index fd408709..6ef6cb75 100644
--- a/src/js/plyr.js
+++ b/src/js/plyr.js
@@ -1,6 +1,6 @@
// ==========================================================================
// Plyr
-// plyr.js v1.0.27
+// plyr.js v1.0.28
// https://github.com/selz/plyr
// License: The MIT License (MIT)
// ==========================================================================
@@ -219,7 +219,7 @@
// Check for mime type support against a player instance
// Credits: http://diveintohtml5.info/everything.html
// Related: http://www.leanbackplayer.com/test/h5mt.html
- function _support(player, mimeType) {
+ function _supportMime(player, mimeType) {
var media = player.media;
// Only check video types for video players
@@ -496,7 +496,7 @@
// Seek the manual caption time and update UI
function _seekManualCaptions(time) {
// If it's not video, or we're using textTracks, bail.
- if (player.usingTextTracks || player.type !== "video") {
+ if (player.usingTextTracks || player.type !== "video" || !player.supported.full) {
return;
}
@@ -681,8 +681,6 @@
// Setup media
function _setupMedia() {
- player.media = player.container.querySelectorAll("audio, video")[0];
-
// If there's no media, bail
if(!player.media) {
_log("No audio or video element found!", true);
@@ -690,10 +688,9 @@
}
// Remove native video controls
- player.media.removeAttribute("controls");
-
- // Set media type
- player.type = player.media.tagName.toLowerCase();
+ if(player.supported.full) {
+ player.media.removeAttribute("controls");
+ }
// Add type class
_toggleClass(player.container, config.classes[player.type], true);
@@ -707,7 +704,7 @@
}
// Inject the player wrapper
- if(player.type === "video") {
+ if(player.type === "video" && player.supported.full) {
// Create the wrapper div
var wrapper = document.createElement("div");
wrapper.setAttribute("class", config.classes.videoWrapper);
@@ -1027,8 +1024,15 @@
volume = 10;
}
- player.volume.value = volume;
+ // If the controls are there
+ if(player.supported.full) {
+ player.volume.value = volume;
+ }
+
+ // Set the player volume
player.media.volume = parseFloat(volume / 10);
+
+ // Update the UI
_checkMute();
// Store the volume in storage
@@ -1040,24 +1044,35 @@
// Mute
function _toggleMute(muted) {
// If the method is called without parameter, toggle based on current value
- if(typeof active === "undefined") {
+ if(typeof muted === "undefined") {
muted = !player.media.muted;
+ }
+
+ // If the controls are there
+ if(player.supported.full) {
player.buttons.mute.checked = muted;
}
+ // Set mute on the player
player.media.muted = muted;
+
+ // Update UI
_checkMute();
}
// Toggle captions
- function _toggleCaptions(active) {
+ function _toggleCaptions(show) {
+ if(!player.supported.plyr) {
+ return;
+ }
+
// If the method is called without parameter, toggle based on current value
if(typeof active === "undefined") {
- active = (player.container.className.indexOf(config.classes.captions.active) === -1);
- player.buttons.captions.checked = active;
+ show = (player.container.className.indexOf(config.classes.captions.active) === -1);
+ player.buttons.captions.checked = show;
}
- if (active) {
+ if (show) {
_toggleClass(player.container, config.classes.captions.active, true);
}
else {
@@ -1214,7 +1229,9 @@
}
// Reset time display
- _timeUpdate();
+ if(player.supported.full) {
+ _timeUpdate();
+ }
// Re-load sources
player.media.load();
@@ -1270,7 +1287,9 @@
_on(player.buttons.fullscreen, "click", _toggleFullscreen);
// Handle user exiting fullscreen by escaping etc
- _on(document, fullscreen.fullScreenEventName, _toggleFullscreen);
+ if(fullscreen.supportsFullScreen) {
+ _on(document, fullscreen.fullScreenEventName, _toggleFullscreen);
+ }
// Time change on media
_on(player.media, "timeupdate seeking", _timeUpdate);
@@ -1336,47 +1355,62 @@
// Setup the fullscreen api
fullscreen = _fullscreen();
- // Sniff
+ // Sniff out the browser
player.browser = _browserSniff();
- // Debug info
- _log(player.browser.name + " " + player.browser.version);
+ // Check for full support
+ player.supported = api.supported();
- // If IE8, stop customization (use fallback)
- // If IE9, stop customization (use native controls)
- if (player.browser.name === "IE" && (player.browser.version === 8 || player.browser.version === 9) ) {
- _log("Browser not suppported.", true);
+ // If no native support, bail
+ if(!player.supported.basic) {
return false;
}
+ // Get the media element
+ player.media = player.container.querySelectorAll("audio, video")[0];
+
+ // Set media type
+ player.type = player.media.tagName.toLowerCase();
+
+ // If iPhone/iPod and video, customisation support is limited
+ if(/iPhone|iPod/i.test(navigator.userAgent) && player.type === "video") {
+ player.supported.full = false;
+ }
+
+ // Debug info
+ _log(player.browser.name + " " + player.browser.version);
+
// Setup media
_setupMedia();
// Generate random number for id/for attribute values for controls
player.random = Math.floor(Math.random() * (10000));
- // Inject custom controls
- _injectControls();
+ // If there's full support
+ if(player.supported.full) {
+ // Inject custom controls
+ _injectControls();
- // Find the elements
- if(!_findElements()) {
- return false;
- }
+ // Find the elements
+ if(!_findElements()) {
+ return false;
+ }
- // Set up aria-label for Play button with the title option
- _setupAria();
+ // Set up aria-label for Play button with the title option
+ _setupAria();
- // Captions
- _setupCaptions();
+ // Captions
+ _setupCaptions();
- // Set volume
- _setVolume();
+ // Set volume
+ _setVolume();
- // Setup fullscreen
- _setupFullscreen();
+ // Setup fullscreen
+ _setupFullscreen();
- // Listeners
- _listeners();
+ // Listeners
+ _listeners();
+ }
// Successful setup
return true;
@@ -1399,10 +1433,21 @@
toggleCaptions: _toggleCaptions,
source: _parseSource,
poster: _updatePoster,
- support: function(mimeType) { return _support(player, mimeType); }
+ support: function(mimeType) { return _supportMime(player, mimeType); }
}
}
+ // Check for support
+ api.supported = function() {
+ var browser = _browserSniff(),
+ basic = (!!document.createElement("audio").canPlayType && !!document.createElement("video").canPlayType);
+
+ return {
+ basic: basic,
+ full: basic && !(browser.name === "IE" && (browser.version <= 9))
+ };
+ }
+
// Expose setup function
api.setup = function(options){
// Extend the default options with user specified
@@ -1410,7 +1455,7 @@
// If enabled carry on
// You may want to disable certain UAs etc
- if(!config.enabled) {
+ if(!config.enabled || !api.supported().basic) {
return false;
}
@@ -1423,13 +1468,6 @@
// Get the current element
var element = elements[i];
- // Disabled for <video> for iPhone
- // Since it doesn't allow customisation
- if (element.querySelectorAll("audio, video")[0].tagName.toLowerCase() === "video"
- && /iPhone/i.test(navigator.userAgent)) {
- continue;
- }
-
// Setup a player instance and add to the element
if(typeof element.plyr === "undefined") {
// Create new instance
@@ -1445,4 +1483,5 @@
return players;
}
+
}(this.plyr = this.plyr || {})); \ No newline at end of file