/** * timeJump.js * ©2013 Dave Rupert, daverupert.com * Dual licenced under MIT and GPL version 2 licenses * * If `t` exists as a query string parameter, TimeJump will self-execute and * select the first `audio` or `video` element and attempt to autoseek to the * specified timestamp. * * @param t {string} Query string parameter. Supported formats include: * ##h##m##s (hours, minutes, seconds) * ##m##s (minutes, seconds) * ##s (seconds) * ##:##:## (hours, minutes, seconds) * ##:## (minutes, seconds) * ## (seconds) */ /*jslint browser: true*/ (function timeJump() { "use strict"; var getQueryVariable = function() { var regex = /\bt=([\dhHmMsS.:]*)(?:,([\dhHmMsS.:]+))?\b/g, match = regex.exec(location.hash) || regex.exec(location.search); if (match) { return match[1]; } return false; }; /** * parseTime(str) * @param str A timecode * @returns the time in seconds */ var parseTime = function(str) { var plain = /^\d+(\.\d+)?$/g, npt = /^(?:npt:)?(?:(?:(\d+):)?(\d\d?):)?(\d\d?)(\.\d+)?$/, quirks = /^(?:(\d\d?)[hH])?(?:(\d\d?)[mM])?(\d\d?)[sS]$/, match; if (plain.test(str)) { return parseFloat(str); } match = npt.exec(str) || quirks.exec(str); if (match) { return (3600 * (parseInt(match[1],10) || 0) + 60 * (parseInt(match[2],10) || 0) + parseInt(match[3],10) + (parseFloat(match[4]) || 0)); } return 0; }; var timestamp, media, t = getQueryVariable() || 0; if (t) { timestamp = parseTime(t); media = document.querySelector('audio, video'); if (!!media) { // Preload the media media.setAttribute('preload', 'true'); // Set the current time. Will update if playing. Will fail if paused. media.currentTime = timestamp; // If the media is able to play, play. media.addEventListener('canplay', function () { /* only start the player if it is not already playing */ if( !this.paused){ return false; } this.currentTime = timestamp; this.play(); }, false); } } if (window.addEventListener) { window.addEventListener("DOMContentLoaded", timeJump, false); window.addEventListener("hashchange", timeJump, false); } else if (window.attachEvent) { window.attachEvent("onload", timeJump); window.attachEvent("onhashchange", timeJump); } }());