mirror of
https://github.com/mediacms-io/mediacms.git
synced 2025-11-11 09:58:53 -05:00
* 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
175 lines
6.8 KiB
JavaScript
Executable File
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;
|