mediacms/frontend/packages/vjs-plugin/src/inc/videoPreviewThumb.js
Yiannis Stergiou aa6520daac
Frontent dev env (#247)
* Added frontend development files/environment

* More items-categories related removals

* Improvements in pages templates (inc. static pages)

* Improvements in video player

* Added empty home page message + cta

* Updates in media, playlist and management pages

* Improvements in material icons font loading

* Replaced media & playlists links in frontend dev-env

* frontend package version update

* chnaged frontend dev url port

* static files update

* Changed default position of theme switcher

* enabled frontend docker container
2021-07-11 18:01:34 +03:00

175 lines
6.8 KiB
JavaScript
Executable File

function videoPreviewThumb(player, options){
player.getChild('ControlBar').getChild('ProgressControl').getChild('SeekBar').removeChild('MouseTimeDisplay');
var halfThumbWidth = -1;
var defaults = {
frame:{
width: 160,
height: 120,
}
};
function extend() {
var args = Array.prototype.slice.call(arguments);
var target = args.shift() || {};
var i, obj, prop;
for (i in args) {
obj = args[i];
for (prop in obj) {
if (obj.hasOwnProperty(prop)) {
target[prop] = 'object' === typeof obj[prop] ? extend(target[prop], obj[prop]) : obj[prop];
}
}
}
return target;
}
function getAllComputedStyles(el) {
return window.getComputedStyle ? window.getComputedStyle(el) : el.currentStyle;
}
function getComputedStyle(el, pseudo) {
return function(prop) {
return window.getComputedStyle ? window.getComputedStyle(el, pseudo)[prop] : el.currentStyle[prop];
};
}
function offsetParent(el) {
return 'HTML' !== el.nodeName && 'static' === getComputedStyle(el)('position') ? offsetParent(el.offsetParent) : el;
}
function updateDimensions(){
if ( isFullscreen ){
halfThumbWidth = ( innerBorderWidth.left + innerBorderWidth.right + ( 1.5 * settings.frame.width ) ) / 2 ;
spriteDom.inner.style.height = ( innerBorderWidth.top + innerBorderWidth.bottom + ( 1.5 * settings.frame.height ) ) + 'px';
spriteDom.inner.style.width = ( innerBorderWidth.left + innerBorderWidth.right + ( 1.5 * settings.frame.width ) ) + 'px';
}
else {
halfThumbWidth = ( innerBorderWidth.left + innerBorderWidth.right + settings.frame.width ) / 2 ;
spriteDom.inner.style.height = ( innerBorderWidth.top + innerBorderWidth.bottom + settings.frame.height ) + 'px';
spriteDom.inner.style.width = ( innerBorderWidth.left + innerBorderWidth.right + settings.frame.width ) + 'px';
}
spriteDom.inner.style.left = ( -1 * halfThumbWidth ) + 'px';
}
var spriteDom = {
wrap: document.createElement('div'),
inner: document.createElement('div'),
img: document.createElement('img'),
timeDisplay: document.createElement('div'),
timeDisplayInner: document.createElement('div'),
};
var innerBorderWidth = {
top: 0,
left: 0,
right: 0,
bottom: 0,
};
var progressControl = player.controlBar.childNameIndex_.ProgressControl;
var progressControlElem;
var seekBar = progressControl.childNameIndex_.SeekBar;
var duration = player.duration();
var isFullscreen = player.isFullscreen();
var settings = extend({}, defaults, options);
/*settings.frame.height = defaults.width / ( settings.frame.width / settings.frame.height );
settings.frame.width = defaults.width;*/
/*settings.frame.width = ( settings.frame.width / settings.frame.height ) * defaults.width;
settings.frame.height = defaults.height;*/
/*settings.frame.height = 192 / ( settings.frame.width / settings.frame.height );
settings.frame.width = 192;*/
spriteDom.wrap.className = 'vjs-preview-thumb';
spriteDom.inner.className = 'vjs-preview-thumb-inner';
spriteDom.inner.style.backgroundImage = 'url(' + settings.url + ')'
spriteDom.timeDisplay.className = 'vjs-preview-thumb-time-display';
spriteDom.timeDisplayInner.innerHTML = '0:00';
var spriteHeight = 0;
player.on('durationchange', function(e) { duration = player.duration(); }); // when the container is MP4.
player.on('loadedmetadata', function(e) { duration = player.duration(); }); // when the container is HLS.
player.on('fullscreenchange', function(e) {
setTimeout( function() {
isFullscreen = player.isFullscreen();
updateDimensions();
}, 100);
});
player.one( 'playing', function(e) { // @note: Listener bind once.
updateDimensions();
player.addClass('vjs-enabled-preview-thumb'); // @note: Enable preview functionality.
spriteDom.img.onload = function() {
var innerStyles = getAllComputedStyles(spriteDom.inner);
if( void 0 !== innerStyles ){
innerBorderWidth.top = parseFloat( innerStyles.borderTopWidth );
innerBorderWidth.left = parseFloat( innerStyles.borderLeftWidth );
innerBorderWidth.right = parseFloat( innerStyles.borderRightWidth );
innerBorderWidth.bottom = parseFloat( innerStyles.borderBottomWidth );
}
spriteHeight = this.naturalHeight;
spriteDom.img = void 0; // Unset image element.
updateDimensions();
};
spriteDom.img.src = settings.url;
});
function moveListener(event) {
progressControlElem = progressControlElem || progressControl.el();
var progressControlClientRect = offsetParent( progressControlElem ).getBoundingClientRect();
var pageXOffset = window.pageXOffset ? window.pageXOffset : document.documentElement.scrollLeft;
var pageX = event.changedTouches ? event.changedTouches[0].pageX : event.pageX;
var left = ( pageX || ( event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft ) ) - ( progressControlClientRect.left + pageXOffset );
var right = ( progressControlClientRect.width || progressControlClientRect.right ) + pageXOffset;
var mouseTime = ! spriteHeight ? 0 : Math.min( ( ( spriteHeight / settings.frame.height ) * settings.frame.seconds ) - 1, Math.floor( ( left - progressControlElem.offsetLeft ) / progressControl.width() * duration ) );
spriteDom.timeDisplayInner.innerHTML = videojs.formatTime( duration * ( left / right ) );
if( left < halfThumbWidth ){
left = halfThumbWidth;
}
else if( left > right - halfThumbWidth ){
left = right - halfThumbWidth;
}
spriteDom.wrap.style.transform = 'translate(' + Math.min( right - halfThumbWidth, left ) + 'px, 0px)';
spriteDom.inner.style.backgroundPositionY = ( ( isFullscreen ? -1.5 : -1 ) * settings.frame.height * Math.floor( mouseTime / settings.frame.seconds ) ) + 'px';
}
progressControl.on('mouseover', moveListener);
progressControl.on('mousemove', moveListener);
spriteDom.timeDisplay.appendChild(spriteDom.timeDisplayInner);
spriteDom.inner.appendChild(spriteDom.timeDisplay);
spriteDom.wrap.appendChild(spriteDom.inner);
progressControl.el_.appendChild(spriteDom.wrap);
}
export default videoPreviewThumb;