diff --git a/assets/js/simple-media.js b/assets/js/simple-media.js index e188893b..334076b9 100644 --- a/assets/js/simple-media.js +++ b/assets/js/simple-media.js @@ -24,9 +24,9 @@ var defaults = { debug: false, seekInterval: 10, + volume: 5, selectors: { container: ".player", - videoContainer: ".player-video", controls: ".player-controls", buttons: { play: "[data-player='play']", @@ -45,6 +45,7 @@ seekTime: ".player-seek-time" }, classes: { + videoContainer: "player-video", stopped: "stopped", playing: "playing", muted: "muted", @@ -170,6 +171,38 @@ return string.replace(new RegExp(find.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"), "g"), replace); } + // Wrap an element + function wrap(elements, wrapper) { + // Convert `elms` to an array, if necessary. + if (!elements.length) { + elements = [elements]; + } + + // Loops backwards to prevent having to clone the wrapper on the + // first element (see `child` below). + for (var i = elements.length - 1; i >= 0; i--) { + var child = (i > 0) ? wrapper.cloneNode(true) : wrapper; + var el = elements[i]; + + // Cache the current parent and sibling. + var parent = el.parentNode; + var sibling = el.nextSibling; + + // Wrap the element (is automatically removed from its current + // parent). + child.appendChild(el); + + // If the element had a sibling, insert the wrapper before + // the sibling to maintain the HTML structure; otherwise, just + // append it to the parent. + if (sibling) { + parent.insertBefore(child, sibling); + } else { + parent.appendChild(child); + } + } + } + // Get click position relative to parent // http://www.kirupa.com/html5/getting_mouse_click_position.htm function getClickPosition(e) { @@ -336,7 +369,6 @@ player.buttons.rewind = getElement(config.selectors.buttons.rewind); player.buttons.forward = getElement(config.selectors.buttons.forward); player.buttons.mute = getElement(config.selectors.buttons.mute); - player.buttons.volume = getElement(config.selectors.buttons.volume); player.buttons.captions = getElement(config.selectors.buttons.captions); player.buttons.fullscreen = getElement(config.selectors.buttons.fullscreen); @@ -345,6 +377,9 @@ player.progress.bar = getElement(config.selectors.progress); player.progress.text = player.progress.bar.getElementsByTagName("span")[0]; + // Volume + player.volume = getElement(config.selectors.buttons.volume); + // Timing player.duration = getElement(config.selectors.duration); player.seekTime = getElements(config.selectors.seekTime); @@ -376,13 +411,30 @@ play(); } + // Set volume + function setVolume() { + player.volume.value = config.volume; + player.media.volume = parseFloat(config.volume / 10); + checkMute(); + } + + // Check mute state + function checkMute() { + if(player.media.volume === 0 || player.media.muted) { + player.container.className += " " + config.classes.muted; + } + else { + player.container.className = player.container.className.replace(config.classes.muted, ""); + } + } + // Setup media function setupMedia() { player.media = player.container.querySelectorAll("audio, video")[0]; // If there's no media, bail if(!player.media) { - console.warn("No audio or video element found!"); + console.error("No audio or video element found!"); return false; } @@ -396,11 +448,24 @@ // Set type player.type = (player.media.tagName.toLowerCase() == "video" ? "video" : "audio"); + + // Inject the player wrapper + if(player.type === "video") { + // Create the wrapper div + var wrapper = document.createElement("div"); + wrapper.setAttribute("class", config.classes.videoContainer); + + // Wrap the video in a container + wrap(player.media, wrapper); + + // Cache the container + player.videoContainer = wrapper; + } } // Setup captions function setupCaptions() { - if(player.type == "video") { + if(player.type === "video") { // Inject the container player.videoContainer.insertAdjacentHTML("afterbegin", "
"); @@ -583,7 +648,6 @@ // Listen for events function listeners() { - // Fullscreen player.buttons.fullscreen.addEventListener("click", function() { if(!fullscreen.isFullScreen()) { @@ -595,17 +659,19 @@ }, false); // Click video - player.videoContainer.addEventListener("click", function() { - if(player.media.paused) { - play(); - } - else if(player.media.ended) { - restart(); - } - else { - pause(); - } - }, false); + if(player.type === "video") { + player.videoContainer.addEventListener("click", function() { + if(player.media.paused) { + play(); + } + else if(player.media.ended) { + restart(); + } + else { + pause(); + } + }, false); + } // Play player.buttons.play.addEventListener("click", function() { @@ -633,7 +699,7 @@ player.media.currentTime = targetTime; } // Special handling for "manual" captions - if (!player.isTextTracks) { + if (!player.isTextTracks && player.type === "video") { adjustManualCaptions(player); } }, false); @@ -649,26 +715,26 @@ player.media.currentTime = targetTime; } // Special handling for "manual" captions - if (!player.isTextTracks) { + if (!player.isTextTracks && player.type === "video") { adjustManualCaptions(player); } }, false); // Get the HTML5 range input element and append audio volume adjustment on change - player.buttons.volume.addEventListener("change", function() { - player.media.volume = parseFloat(this.value / 10); + player.volume.addEventListener("change", function() { + config.volume = this.value; + setVolume(); }, false); // Mute player.buttons.mute.addEventListener("click", function() { if (player.media.muted === true) { player.media.muted = false; - player.container.className = player.container.className.replace(config.classes.muted, ""); } else { player.media.muted = true; - player.container.className += " " + config.classes.muted; } + checkMute(); }, false); // Duration @@ -700,7 +766,7 @@ player.media.currentTime = player.pos * player.media.duration; // Special handling for "manual" captions - if (!player.isTextTracks) { + if (!player.isTextTracks && player.type === "video") { adjustManualCaptions(player); } }); @@ -717,7 +783,9 @@ // Clear captions at end of video player.media.addEventListener("ended", function() { - player.captionsContainer.innerHTML = ""; + if(player.type === "video") { + player.captionsContainer.innerHTML = ""; + } player.container.className = player.container.className.replace(config.classes.playing, config.classes.stopped); }); } @@ -732,8 +800,7 @@ } function setupPlayer(element) { - player.container = element; - player.videoContainer = getElement(config.selectors.videoContainer); + player.container = element; // Setup media setupMedia(); @@ -747,6 +814,9 @@ // Find the elements findElements(); + // Set volume + setVolume(); + // Captions setupCaptions(); @@ -773,22 +843,25 @@ // Debug info if(config.debug) { - console.log(config); - console.log("fullscreen support: " + fullscreen.supportsFullScreen); + console.log(fullscreen.supportsFullScreen ? "Fullscreen supported" : "No fullscreen supported"); console.log(player.browserName + " " + player.browserMajorVersion); } // If IE8, stop customization (use fallback) // If IE9, stop customization (use native controls) if (player.browserName === "IE" && (player.browserMajorVersion === 8 || player.browserMajorVersion === 9) ) { - console.warn("Browser not suppported."); + if(config.debug) { + console.error("Browser not suppported."); + } return false; } // If smartphone or tablet, stop customization as video (and captions in latest devices) are handled natively player.isSmartphoneOrTablet = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent); if (player.isSmartphoneOrTablet) { - console.warn("Browser not suppported."); + if(config.debug) { + console.error("Browser not suppported."); + } return false; } @@ -801,25 +874,17 @@ } // Get the container and video container - var elements = document.querySelectorAll(config.selectors.container); - for (var i = elements.length - 1; i >= 0; i--) { - setupPlayer(elements[i]); + var element = document.querySelector(config.selectors.container); + if(element === null) { + if(config.debug) { + console.error("Selector " + config.selectors.container + " not found!"); + } + return false; } + setupPlayer(element); //now we execute callbacks registered to shout executeHandlers("setup"); } -}(this.simpleMedia = this.simpleMedia || {})); - -/*function InitPxVideo(options) { - - "use strict"; - - - // *** - // Captions - // *** - - -}*/ \ No newline at end of file +}(this.simpleMedia = this.simpleMedia || {})); \ No newline at end of file diff --git a/assets/less/simple-media.less b/assets/less/simple-media.less index 338a4706..26091c9e 100644 --- a/assets/less/simple-media.less +++ b/assets/less/simple-media.less @@ -21,14 +21,7 @@ @progress-bg: @gray; @progress-value-bg: @blue; -// BORDER-BOX ALL THE THINGS! (http://paulirish.com/2012/box-sizing-border-box-ftw/) -// ------------------------------- -.player, -.player *, -.player *::after, -.player *::before { - box-sizing: border-box; -} + // Utility classes & mixins // ------------------------------- @@ -76,6 +69,14 @@ overflow: hidden; // For the controls background: #000; + // BORDER-BOX ALL THE THINGS! + // http://paulirish.com/2012/box-sizing-border-box-ftw/ + &, + *, + *::after, + *::before { + box-sizing: border-box; + } // For video &-video { @@ -270,7 +271,7 @@ } &:focus { outline: 0; - + &::-webkit-slider-thumb { background: @control-color-active; } @@ -309,7 +310,7 @@ } } -/* fixing display for IE10+ */ +// Fixing display for IE10+ @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { .video-controls .player-volume { position: relative; diff --git a/dist/css/simple-media.css b/dist/css/simple-media.css index 16c5a64b..94aace89 100644 --- a/dist/css/simple-media.css +++ b/dist/css/simple-media.css @@ -1 +1 @@ -.player,.player *,.player ::after,.player ::before{box-sizing:border-box}.sr-only{position:absolute!important;clip:rect(1px,1px,1px,1px);padding:0!important;border:0!important;height:1px!important;width:1px!important;overflow:hidden}.player{position:relative;max-width:100%;overflow:hidden;background:#000}.player-video{position:relative}.player video{width:100%;height:auto;vertical-align:middle}.player-captions{display:none;position:absolute;bottom:0;left:0;width:100%;padding:20px;min-height:2.5em;color:#fff;font-size:24px;text-shadow:0 1px 1px rgba(0,0,0,.75);text-align:center;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}.player.captions .player-captions{display:block}.player-controls{zoom:1;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;position:relative;padding:20px 10px 10px;background:#343f4a;line-height:1}.player-controls:after,.player-controls:before{content:"";display:table}.player-controls:after{clear:both}.player-controls-playback{float:left}.player-controls-sound{float:right}.player-controls button,.player-controls input+label{display:inline-block;vertical-align:middle;margin:0 2px;padding:5px 10px;transition:background .3s ease;border-radius:3px;cursor:pointer}.player-controls button svg,.player-controls input+label svg{width:18px;height:18px;display:block;fill:currentColor;transition:fill .3s ease}.player-controls input+label,.player-controls input.inverted:checked+label{color:#565d64}.player-controls button,.player-controls input.inverted+label,.player-controls input:checked+label{color:#cbd0d3}.player-controls button{border:0;background:0 0;overflow:hidden}.player-controls button:hover,.player-controls label:hover{background:#3498db}.player-controls button:hover svg,.player-controls label:hover svg{fill:#fff}.player-controls button:focus,.player-controls input:focus+label{outline:#000 dotted thin;outline-offset:1px}.player-controls button:focus svg,.player-controls input:focus+label svg{fill:#fff}.player-controls .icon-exit-fullscreen,.player-controls .icon-muted{display:none}.player-controls .player-time{display:inline-block;vertical-align:middle;margin-left:10px;color:#fff;font-weight:600;font-size:14px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}.player-progress{position:absolute;top:0;left:0;right:0;width:100%;height:10px;margin:0;vertical-align:top}.player-progress[value]{-webkit-appearance:none;border:none;background:#565d64;cursor:pointer}.player-progress[value]::-webkit-progress-bar{background:#565d64}.player-progress[value]::-webkit-progress-value{background:#3498db}.player-progress[value]::-moz-progress-bar{background:#3498db}.player-controls [data-player=pause],.player.playing .player-controls [data-player=play]{display:none}.player.playing .player-controls [data-player=pause]{display:inline-block}.player.muted .player-controls .icon-muted{display:block}.player.muted .player-controls .icon-muted+svg{display:none}.player-volume{-webkit-appearance:none;height:6px;width:100px;margin-right:10px;background:#565d64;border-radius:10px}.player-volume::-moz-range-track{-moz-appearance:none;height:6px;background:#565d64;border:0;border-radius:10px}.player-volume::-webkit-slider-thumb{-webkit-appearance:none!important;height:12px;width:12px;background:#cbd0d3;border-radius:100%;transition:background .3s ease}.player-volume::-moz-range-thumb{height:12px;width:12px;border:0;background:#cbd0d3;border-radius:100%}.player-volume:focus{outline:0}.player-volume:focus::-webkit-slider-thumb{background:#3498db}.player-volume:focus::-moz-range-thumb{background:#3498db}.player:-webkit-full-screen{height:100%;width:100%}.player:-moz-full-screen{height:100%;width:100%}.player:-ms-fullscreen{height:100%;width:100%}.player:fullscreen{height:100%;width:100%}.player:-webkit-full-screen .player-video{position:absolute;top:50%;left:0;right:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.player:-moz-full-screen .player-video{position:absolute;top:50%;left:0;right:0;transform:translateY(-50%)}.player:-ms-fullscreen .player-video{position:absolute;top:50%;left:0;right:0;-ms-transform:translateY(-50%);transform:translateY(-50%)}.player:fullscreen .player-video{position:absolute;top:50%;left:0;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.player:-webkit-full-screen .player-controls{position:absolute;bottom:0;left:0;right:0}.player:-moz-full-screen .player-controls{position:absolute;bottom:0;left:0;right:0}.player:-ms-fullscreen .player-controls{position:absolute;bottom:0;left:0;right:0}.player:fullscreen .player-controls{position:absolute;bottom:0;left:0;right:0}.player:-webkit-full-screen .player-controls .icon-exit-fullscreen{display:block}.player:-moz-full-screen .player-controls .icon-exit-fullscreen{display:block}.player:-ms-fullscreen .player-controls .icon-exit-fullscreen{display:block}.player:fullscreen .player-controls .icon-exit-fullscreen{display:block}.player:-webkit-full-screen .player-controls .icon-exit-fullscreen+svg{display:none}.player:-moz-full-screen .player-controls .icon-exit-fullscreen+svg{display:none}.player:-ms-fullscreen .player-controls .icon-exit-fullscreen+svg{display:none}.player:fullscreen .player-controls .icon-exit-fullscreen+svg{display:none}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.video-controls .player-volume{position:relative;padding:0;height:8px;top:-3px}.player-time{margin-top:4px}.player-captions{padding:8px;min-height:36px}} \ No newline at end of file +.sr-only{position:absolute!important;clip:rect(1px,1px,1px,1px);padding:0!important;border:0!important;height:1px!important;width:1px!important;overflow:hidden}.player{position:relative;max-width:100%;overflow:hidden;background:#000}.player,.player *,.player ::after,.player ::before{box-sizing:border-box}.player-video{position:relative}.player video{width:100%;height:auto;vertical-align:middle}.player-captions{display:none;position:absolute;bottom:0;left:0;width:100%;padding:20px;min-height:2.5em;color:#fff;font-size:24px;text-shadow:0 1px 1px rgba(0,0,0,.75);text-align:center;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}.player.captions .player-captions{display:block}.player-controls{zoom:1;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;position:relative;padding:20px 10px 10px;background:#343f4a;line-height:1}.player-controls:after,.player-controls:before{content:"";display:table}.player-controls:after{clear:both}.player-controls-playback{float:left}.player-controls-sound{float:right}.player-controls button,.player-controls input+label{display:inline-block;vertical-align:middle;margin:0 2px;padding:5px 10px;transition:background .3s ease;border-radius:3px;cursor:pointer}.player-controls button svg,.player-controls input+label svg{width:18px;height:18px;display:block;fill:currentColor;transition:fill .3s ease}.player-controls input+label,.player-controls input.inverted:checked+label{color:#565d64}.player-controls button,.player-controls input.inverted+label,.player-controls input:checked+label{color:#cbd0d3}.player-controls button{border:0;background:0 0;overflow:hidden}.player-controls button:hover,.player-controls label:hover{background:#3498db}.player-controls button:hover svg,.player-controls label:hover svg{fill:#fff}.player-controls button:focus,.player-controls input:focus+label{outline:#000 dotted thin;outline-offset:1px}.player-controls button:focus svg,.player-controls input:focus+label svg{fill:#fff}.player-controls .icon-exit-fullscreen,.player-controls .icon-muted{display:none}.player-controls .player-time{display:inline-block;vertical-align:middle;margin-left:10px;color:#fff;font-weight:600;font-size:14px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}.player-progress{position:absolute;top:0;left:0;right:0;width:100%;height:10px;margin:0;vertical-align:top}.player-progress[value]{-webkit-appearance:none;border:none;background:#565d64;cursor:pointer}.player-progress[value]::-webkit-progress-bar{background:#565d64}.player-progress[value]::-webkit-progress-value{background:#3498db}.player-progress[value]::-moz-progress-bar{background:#3498db}.player-controls [data-player=pause],.player.playing .player-controls [data-player=play]{display:none}.player.playing .player-controls [data-player=pause]{display:inline-block}.player.muted .player-controls .icon-muted{display:block}.player.muted .player-controls .icon-muted+svg{display:none}.player-volume{-webkit-appearance:none;height:6px;width:100px;margin-right:10px;background:#565d64;border-radius:10px}.player-volume::-moz-range-track{-moz-appearance:none;height:6px;background:#565d64;border:0;border-radius:10px}.player-volume::-webkit-slider-thumb{-webkit-appearance:none!important;height:12px;width:12px;background:#cbd0d3;border-radius:100%;transition:background .3s ease}.player-volume::-moz-range-thumb{height:12px;width:12px;border:0;background:#cbd0d3;border-radius:100%}.player-volume:focus{outline:0}.player-volume:focus::-webkit-slider-thumb{background:#3498db}.player-volume:focus::-moz-range-thumb{background:#3498db}.player:-webkit-full-screen{height:100%;width:100%}.player:-moz-full-screen{height:100%;width:100%}.player:-ms-fullscreen{height:100%;width:100%}.player:fullscreen{height:100%;width:100%}.player:-webkit-full-screen .player-video{position:absolute;top:50%;left:0;right:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.player:-moz-full-screen .player-video{position:absolute;top:50%;left:0;right:0;transform:translateY(-50%)}.player:-ms-fullscreen .player-video{position:absolute;top:50%;left:0;right:0;-ms-transform:translateY(-50%);transform:translateY(-50%)}.player:fullscreen .player-video{position:absolute;top:50%;left:0;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.player:-webkit-full-screen .player-controls{position:absolute;bottom:0;left:0;right:0}.player:-moz-full-screen .player-controls{position:absolute;bottom:0;left:0;right:0}.player:-ms-fullscreen .player-controls{position:absolute;bottom:0;left:0;right:0}.player:fullscreen .player-controls{position:absolute;bottom:0;left:0;right:0}.player:-webkit-full-screen .player-controls .icon-exit-fullscreen{display:block}.player:-moz-full-screen .player-controls .icon-exit-fullscreen{display:block}.player:-ms-fullscreen .player-controls .icon-exit-fullscreen{display:block}.player:fullscreen .player-controls .icon-exit-fullscreen{display:block}.player:-webkit-full-screen .player-controls .icon-exit-fullscreen+svg{display:none}.player:-moz-full-screen .player-controls .icon-exit-fullscreen+svg{display:none}.player:-ms-fullscreen .player-controls .icon-exit-fullscreen+svg{display:none}.player:fullscreen .player-controls .icon-exit-fullscreen+svg{display:none}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.video-controls .player-volume{position:relative;padding:0;height:8px;top:-3px}.player-time{margin-top:4px}.player-captions{padding:8px;min-height:36px}} \ No newline at end of file diff --git a/dist/js/simple-media.js b/dist/js/simple-media.js index ce6d9378..ab215a7e 100644 --- a/dist/js/simple-media.js +++ b/dist/js/simple-media.js @@ -1 +1 @@ -!function(e){"use strict";function t(){var e,t,n,r=navigator.userAgent,s=navigator.appName,a=""+parseFloat(navigator.appVersion),o=parseInt(navigator.appVersion,10);return-1!==navigator.appVersion.indexOf("Windows NT")&&-1!==navigator.appVersion.indexOf("rv:11")?(s="IE",a="11;"):-1!==(t=r.indexOf("MSIE"))?(s="IE",a=r.substring(t+5)):-1!==(t=r.indexOf("Chrome"))?(s="Chrome",a=r.substring(t+7)):-1!==(t=r.indexOf("Safari"))?(s="Safari",a=r.substring(t+7),-1!==(t=r.indexOf("Version"))&&(a=r.substring(t+8))):-1!==(t=r.indexOf("Firefox"))?(s="Firefox",a=r.substring(t+8)):(e=r.lastIndexOf(" ")+1)<(t=r.lastIndexOf("/"))&&(s=r.substring(e,t),a=r.substring(t+1),s.toLowerCase()==s.toUpperCase()&&(s=navigator.appName)),-1!==(n=a.indexOf(";"))&&(a=a.substring(0,n)),-1!==(n=a.indexOf(" "))&&(a=a.substring(0,n)),o=parseInt(""+a,10),isNaN(o)&&(a=""+parseFloat(navigator.appVersion),o=parseInt(navigator.appVersion,10)),[s,o]}function n(e){var t=[];return t=e.split(" --> "),s(t[0])}function r(e){var t=[];return t=e.split(" --> "),s(t[1])}function s(e){if(null===e||void 0===e)return 0;var t,n=[],r=[];return n=e.split(","),r=n[0].split(":"),t=Math.floor(60*r[0]*60)+Math.floor(60*r[1])+Math.floor(r[2])}function a(e){for(e.subcount=0;r(e.captions[e.subcount][0])A simple HTML5 media player
+