snaphash/snaphash.js

77 lines
1.9 KiB
JavaScript
Raw Normal View History

2015-09-25 15:33:45 +00:00
(function(global) {
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
var Snaphash = function(els) {
if (!els) {
throw Error('You must provide an element/selector');
}
2015-09-25 15:33:45 +00:00
// selector provided
if (typeof els === 'string') {
els = document.querySelectorAll(els);
}
// single element provided
if (typeof els.length === 'undefined') {
els = [els];
}
// loop over elements
2015-09-25 15:33:45 +00:00
for (var i = 0, len = els.length; i < len; i++) {
var el = els[i];
// Let's find out target selector and time
2015-09-25 15:33:45 +00:00
var src = parseSource(el.dataset.snap);
// Target video, clone it to avoid flickering
2015-09-25 15:33:45 +00:00
var target = document.querySelector(src.selector).cloneNode();
function listener() {
target.currentTime = src.time;
target.addEventListener('seeked', function seeked() {
canvas.width = target.videoWidth;
canvas.height = target.videoHeight;
context.drawImage(target, 0, 0);
el.src = canvas.toDataURL();
target.removeEventListener('seeked', seeked);
target.remove();
})
target.removeEventListener('canplay', listener)
}
if (target.readyState === 4) {
listener();
} else {
target.addEventListener('canplay', listener);
}
}
}
function parseSource(src) {
var split = src.split('@');
var selector = split[0];
var time = parseTime(split[1]);
return {selector: selector, time: time};
}
function parseTime(time) {
var split = time.split(':');
var parsed = {
second: +split[split.length - 1] || 0,
minute: +split[split.length - 2] || 0,
hour: +split[split.length - 3] || 0
}
var total = parsed.second + parsed.minute * 60 + parsed.hour * 3600;
return total;
}
global.Snaphash = Snaphash;
}(this))