UNPKG

glightbox

Version:
106 lines (89 loc) 3.67 kB
/** * Set slide video * * @param {node} slide * @param {object} data * @param {int} index * @param {function} callback */ import { has, closest, injectAssets, addClass, removeClass, createHTML, isFunction, waitUntil } from '../utils/helpers.js'; export default function slideVideo(slide, data, index, callback) { const slideContainer = slide.querySelector('.ginner-container'); const videoID = 'gvideo' + index; const slideMedia = slide.querySelector('.gslide-media'); const videoPlayers = this.getAllPlayers(); addClass(slideContainer, 'gvideo-container'); slideMedia.insertBefore(createHTML('<div class="gvideo-wrapper"></div>'), slideMedia.firstChild); const videoWrapper = slide.querySelector('.gvideo-wrapper'); injectAssets(this.settings.plyr.css, 'Plyr'); let url = data.href; let provider = data?.videoProvider; let customPlaceholder = false; slideMedia.style.maxWidth = data.width; injectAssets(this.settings.plyr.js, 'Plyr', () => { // Set vimeo videos if (!provider && url.match(/vimeo\.com\/([0-9]*)/)) { provider = 'vimeo'; } // Set youtube videos if ( !provider && (url.match(/(youtube\.com|youtube-nocookie\.com)\/watch\?v=([a-zA-Z0-9\-_]+)/) || url.match(/youtu\.be\/([a-zA-Z0-9\-_]+)/) || url.match(/(youtube\.com|youtube-nocookie\.com)\/embed\/([a-zA-Z0-9\-_]+)/) || url.match(/(youtube\.com|youtube-nocookie\.com)\/shorts\/([a-zA-Z0-9\-_]+)/)) ) { provider = 'youtube'; } // Set local videos // if no provider, default to local if (provider === 'local' || !provider) { provider = 'local'; let html = '<video id="' + videoID + '" '; html += `style="background:#000; max-width: ${data.width};" `; html += 'preload="metadata" '; html += 'x-webkit-airplay="allow" '; html += 'playsinline '; html += 'controls '; html += 'class="gvideo-local">'; html += `<source src="${url}">`; html += '</video>'; customPlaceholder = createHTML(html); } // prettier-ignore const placeholder = customPlaceholder ? customPlaceholder : createHTML(`<div id="${videoID}" data-plyr-provider="${provider}" data-plyr-embed-id="${url}"></div>`); addClass(videoWrapper, `${provider}-video gvideo`); videoWrapper.appendChild(placeholder); videoWrapper.setAttribute('data-id', videoID); videoWrapper.setAttribute('data-index', index); const playerConfig = has(this.settings.plyr, 'config') ? this.settings.plyr.config : {}; const player = new Plyr('#' + videoID, playerConfig); player.on('ready', (event) => { videoPlayers[videoID] = event.detail.plyr; if (isFunction(callback)) { callback(); } }); waitUntil( () => { return slide.querySelector('iframe') && slide.querySelector('iframe').dataset.ready == 'true'; }, () => { this.resize(slide); } ); player.on('enterfullscreen', handleMediaFullScreen); player.on('exitfullscreen', handleMediaFullScreen); }); } /** * Handle fullscreen * * @param {object} event */ function handleMediaFullScreen(event) { const media = closest(event.target, '.gslide-media'); if (event.type === 'enterfullscreen') { addClass(media, 'fullscreen'); } if (event.type === 'exitfullscreen') { removeClass(media, 'fullscreen'); } }