| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495 |
- /*!
- * lightgallery | 2.4.0-beta.0 | December 12th 2021
- * http://www.lightgalleryjs.com/
- * Copyright (c) 2020 Sachin Neravath;
- * @license GPLv3
- */
- /*! *****************************************************************************
- Copyright (c) Microsoft Corporation.
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
- var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
- var videoSettings = {
- autoplayFirstVideo: true,
- youTubePlayerParams: false,
- vimeoPlayerParams: false,
- wistiaPlayerParams: false,
- gotoNextSlideOnVideoEnd: true,
- autoplayVideoOnSlide: false,
- videojs: false,
- videojsOptions: {},
- };
- /**
- * List of lightGallery events
- * All events should be documented here
- * Below interfaces are used to build the website documentations
- * */
- var lGEvents = {
- afterAppendSlide: 'lgAfterAppendSlide',
- init: 'lgInit',
- hasVideo: 'lgHasVideo',
- containerResize: 'lgContainerResize',
- updateSlides: 'lgUpdateSlides',
- afterAppendSubHtml: 'lgAfterAppendSubHtml',
- beforeOpen: 'lgBeforeOpen',
- afterOpen: 'lgAfterOpen',
- slideItemLoad: 'lgSlideItemLoad',
- beforeSlide: 'lgBeforeSlide',
- afterSlide: 'lgAfterSlide',
- posterClick: 'lgPosterClick',
- dragStart: 'lgDragStart',
- dragMove: 'lgDragMove',
- dragEnd: 'lgDragEnd',
- beforeNextSlide: 'lgBeforeNextSlide',
- beforePrevSlide: 'lgBeforePrevSlide',
- beforeClose: 'lgBeforeClose',
- afterClose: 'lgAfterClose',
- rotateLeft: 'lgRotateLeft',
- rotateRight: 'lgRotateRight',
- flipHorizontal: 'lgFlipHorizontal',
- flipVertical: 'lgFlipVertical',
- autoplay: 'lgAutoplay',
- autoplayStart: 'lgAutoplayStart',
- autoplayStop: 'lgAutoplayStop',
- };
- var param = function (obj) {
- return Object.keys(obj)
- .map(function (k) {
- return encodeURIComponent(k) + '=' + encodeURIComponent(obj[k]);
- })
- .join('&');
- };
- var getVimeoURLParams = function (defaultParams, videoInfo) {
- if (!videoInfo || !videoInfo.vimeo)
- return '';
- var urlParams = videoInfo.vimeo[2] || '';
- urlParams =
- urlParams[0] == '?' ? '&' + urlParams.slice(1) : urlParams || '';
- var defaultPlayerParams = defaultParams
- ? '&' + param(defaultParams)
- : '';
- // For vimeo last parms gets priority if duplicates found
- var vimeoPlayerParams = "?autoplay=0&muted=1" + defaultPlayerParams + urlParams;
- return vimeoPlayerParams;
- };
- /**
- * Video module for lightGallery
- * Supports HTML5, YouTube, Vimeo, wistia videos
- *
- *
- * @ref Wistia
- * https://wistia.com/support/integrations/wordpress(How to get url)
- * https://wistia.com/support/developers/embed-options#using-embed-options
- * https://wistia.com/support/developers/player-api
- * https://wistia.com/support/developers/construct-an-embed-code
- * http://jsfiddle.net/xvnm7xLm/
- * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video
- * https://wistia.com/support/embed-and-share/sharing-videos
- * https://private-sharing.wistia.com/medias/mwhrulrucj
- *
- * @ref Youtube
- * https://developers.google.com/youtube/player_parameters#enablejsapi
- * https://developers.google.com/youtube/iframe_api_reference
- * https://developer.chrome.com/blog/autoplay/#iframe-delegation
- *
- * @ref Vimeo
- * https://stackoverflow.com/questions/10488943/easy-way-to-get-vimeo-id-from-a-vimeo-url
- * https://vimeo.zendesk.com/hc/en-us/articles/360000121668-Starting-playback-at-a-specific-timecode
- * https://vimeo.zendesk.com/hc/en-us/articles/360001494447-Using-Player-Parameters
- */
- var Video = /** @class */ (function () {
- function Video(instance) {
- // get lightGallery core plugin instance
- this.core = instance;
- this.settings = __assign(__assign({}, videoSettings), this.core.settings);
- return this;
- }
- Video.prototype.init = function () {
- var _this = this;
- /**
- * Event triggered when video url found without poster
- * Append video HTML
- * Play if autoplayFirstVideo is true
- */
- this.core.LGel.on(lGEvents.hasVideo + ".video", this.onHasVideo.bind(this));
- this.core.LGel.on(lGEvents.posterClick + ".video", function () {
- var $el = _this.core.getSlideItem(_this.core.index);
- _this.loadVideoOnPosterClick($el);
- });
- this.core.LGel.on(lGEvents.slideItemLoad + ".video", this.onSlideItemLoad.bind(this));
- // @desc fired immediately before each slide transition.
- this.core.LGel.on(lGEvents.beforeSlide + ".video", this.onBeforeSlide.bind(this));
- // @desc fired immediately after each slide transition.
- this.core.LGel.on(lGEvents.afterSlide + ".video", this.onAfterSlide.bind(this));
- };
- /**
- * @desc Event triggered when a slide is completely loaded
- *
- * @param {Event} event - lightGalley custom event
- */
- Video.prototype.onSlideItemLoad = function (event) {
- var _this = this;
- var _a = event.detail, isFirstSlide = _a.isFirstSlide, index = _a.index;
- // Should check the active slide as well as user may have moved to different slide before the first slide is loaded
- if (this.settings.autoplayFirstVideo &&
- isFirstSlide &&
- index === this.core.index) {
- // Delay is just for the transition effect on video load
- setTimeout(function () {
- _this.loadAndPlayVideo(index);
- }, 200);
- }
- // Should not call on first slide. should check only if the slide is active
- if (!isFirstSlide &&
- this.settings.autoplayVideoOnSlide &&
- index === this.core.index) {
- this.loadAndPlayVideo(index);
- }
- };
- /**
- * @desc Event triggered when video url or poster found
- * Append video HTML is poster is not given
- * Play if autoplayFirstVideo is true
- *
- * @param {Event} event - Javascript Event object.
- */
- Video.prototype.onHasVideo = function (event) {
- var _a = event.detail, index = _a.index, src = _a.src, html5Video = _a.html5Video, hasPoster = _a.hasPoster;
- if (!hasPoster) {
- // All functions are called separately if poster exist in loadVideoOnPosterClick function
- this.appendVideos(this.core.getSlideItem(index), {
- src: src,
- addClass: 'lg-object',
- index: index,
- html5Video: html5Video,
- });
- // Automatically navigate to next slide once video reaches the end.
- this.gotoNextSlideOnVideoEnd(src, index);
- }
- };
- /**
- * @desc fired immediately before each slide transition.
- * Pause the previous video
- * Hide the download button if the slide contains YouTube, Vimeo, or Wistia videos.
- *
- * @param {Event} event - Javascript Event object.
- * @param {number} prevIndex - Previous index of the slide.
- * @param {number} index - Current index of the slide
- */
- Video.prototype.onBeforeSlide = function (event) {
- if (this.core.lGalleryOn) {
- var prevIndex = event.detail.prevIndex;
- this.pauseVideo(prevIndex);
- }
- };
- /**
- * @desc fired immediately after each slide transition.
- * Play video if autoplayVideoOnSlide option is enabled.
- *
- * @param {Event} event - Javascript Event object.
- * @param {number} prevIndex - Previous index of the slide.
- * @param {number} index - Current index of the slide
- * @todo should check on onSlideLoad as well if video is not loaded on after slide
- */
- Video.prototype.onAfterSlide = function (event) {
- var _this = this;
- var _a = event.detail, index = _a.index, prevIndex = _a.prevIndex;
- // Do not call on first slide
- var $slide = this.core.getSlideItem(index);
- if (this.settings.autoplayVideoOnSlide && index !== prevIndex) {
- if ($slide.hasClass('lg-complete')) {
- setTimeout(function () {
- _this.loadAndPlayVideo(index);
- }, 100);
- }
- }
- };
- Video.prototype.loadAndPlayVideo = function (index) {
- var $slide = this.core.getSlideItem(index);
- var currentGalleryItem = this.core.galleryItems[index];
- if (currentGalleryItem.poster) {
- this.loadVideoOnPosterClick($slide, true);
- }
- else {
- this.playVideo(index);
- }
- };
- /**
- * Play HTML5, Youtube, Vimeo or Wistia videos in a particular slide.
- * @param {number} index - Index of the slide
- */
- Video.prototype.playVideo = function (index) {
- this.controlVideo(index, 'play');
- };
- /**
- * Pause HTML5, Youtube, Vimeo or Wistia videos in a particular slide.
- * @param {number} index - Index of the slide
- */
- Video.prototype.pauseVideo = function (index) {
- this.controlVideo(index, 'pause');
- };
- Video.prototype.getVideoHtml = function (src, addClass, index, html5Video) {
- var video = '';
- var videoInfo = this.core.galleryItems[index]
- .__slideVideoInfo || {};
- var currentGalleryItem = this.core.galleryItems[index];
- var videoTitle = currentGalleryItem.title || currentGalleryItem.alt;
- videoTitle = videoTitle ? 'title="' + videoTitle + '"' : '';
- var commonIframeProps = "allowtransparency=\"true\"\n frameborder=\"0\"\n scrolling=\"no\"\n allowfullscreen\n mozallowfullscreen\n webkitallowfullscreen\n oallowfullscreen\n msallowfullscreen";
- if (videoInfo.youtube) {
- var videoId = 'lg-youtube' + index;
- var slideUrlParams = videoInfo.youtube[2]
- ? videoInfo.youtube[2] + '&'
- : '';
- // For youtube first parms gets priority if duplicates found
- var youTubePlayerParams = "?" + slideUrlParams + "wmode=opaque&autoplay=0&mute=1&enablejsapi=1";
- var playerParams = youTubePlayerParams +
- (this.settings.youTubePlayerParams
- ? '&' + param(this.settings.youTubePlayerParams)
- : '');
- video = "<iframe allow=\"autoplay\" id=" + videoId + " class=\"lg-video-object lg-youtube " + addClass + "\" " + videoTitle + " src=\"//www.youtube.com/embed/" + (videoInfo.youtube[1] + playerParams) + "\" " + commonIframeProps + "></iframe>";
- }
- else if (videoInfo.vimeo) {
- var videoId = 'lg-vimeo' + index;
- var playerParams = getVimeoURLParams(this.settings.vimeoPlayerParams, videoInfo);
- video = "<iframe allow=\"autoplay\" id=" + videoId + " class=\"lg-video-object lg-vimeo " + addClass + "\" " + videoTitle + " src=\"//player.vimeo.com/video/" + (videoInfo.vimeo[1] + playerParams) + "\" " + commonIframeProps + "></iframe>";
- }
- else if (videoInfo.wistia) {
- var wistiaId = 'lg-wistia' + index;
- var playerParams = param(this.settings.wistiaPlayerParams);
- playerParams = playerParams ? '?' + playerParams : '';
- video = "<iframe allow=\"autoplay\" id=\"" + wistiaId + "\" src=\"//fast.wistia.net/embed/iframe/" + (videoInfo.wistia[4] + playerParams) + "\" " + videoTitle + " class=\"wistia_embed lg-video-object lg-wistia " + addClass + "\" name=\"wistia_embed\" " + commonIframeProps + "></iframe>";
- }
- else if (videoInfo.html5) {
- var html5VideoMarkup = '';
- for (var i = 0; i < html5Video.source.length; i++) {
- html5VideoMarkup += "<source src=\"" + html5Video.source[i].src + "\" type=\"" + html5Video.source[i].type + "\">";
- }
- if (html5Video.tracks) {
- var _loop_1 = function (i) {
- var trackAttributes = '';
- var track = html5Video.tracks[i];
- Object.keys(track || {}).forEach(function (key) {
- trackAttributes += key + "=\"" + track[key] + "\" ";
- });
- html5VideoMarkup += "<track " + trackAttributes + ">";
- };
- for (var i = 0; i < html5Video.tracks.length; i++) {
- _loop_1(i);
- }
- }
- var html5VideoAttrs_1 = '';
- var videoAttributes_1 = html5Video.attributes || {};
- Object.keys(videoAttributes_1 || {}).forEach(function (key) {
- html5VideoAttrs_1 += key + "=\"" + videoAttributes_1[key] + "\" ";
- });
- video = "<video class=\"lg-video-object lg-html5 " + (this.settings.videojs ? 'video-js' : '') + "\" " + html5VideoAttrs_1 + ">\n " + html5VideoMarkup + "\n Your browser does not support HTML5 video.\n </video>";
- }
- return video;
- };
- /**
- * @desc - Append videos to the slide
- *
- * @param {HTMLElement} el - slide element
- * @param {Object} videoParams - Video parameters, Contains src, class, index, htmlVideo
- */
- Video.prototype.appendVideos = function (el, videoParams) {
- var _a;
- var videoHtml = this.getVideoHtml(videoParams.src, videoParams.addClass, videoParams.index, videoParams.html5Video);
- el.find('.lg-video-cont').append(videoHtml);
- var $videoElement = el.find('.lg-video-object').first();
- if (videoParams.html5Video) {
- $videoElement.on('mousedown.lg.video', function (e) {
- e.stopPropagation();
- });
- }
- if (this.settings.videojs && ((_a = this.core.galleryItems[videoParams.index].__slideVideoInfo) === null || _a === void 0 ? void 0 : _a.html5)) {
- try {
- return videojs($videoElement.get(), this.settings.videojsOptions);
- }
- catch (e) {
- console.error('lightGallery:- Make sure you have included videojs');
- }
- }
- };
- Video.prototype.gotoNextSlideOnVideoEnd = function (src, index) {
- var _this = this;
- var $videoElement = this.core
- .getSlideItem(index)
- .find('.lg-video-object')
- .first();
- var videoInfo = this.core.galleryItems[index].__slideVideoInfo || {};
- if (this.settings.gotoNextSlideOnVideoEnd) {
- if (videoInfo.html5) {
- $videoElement.on('ended', function () {
- _this.core.goToNextSlide();
- });
- }
- else if (videoInfo.vimeo) {
- try {
- // https://github.com/vimeo/player.js/#ended
- new Vimeo.Player($videoElement.get()).on('ended', function () {
- _this.core.goToNextSlide();
- });
- }
- catch (e) {
- console.error('lightGallery:- Make sure you have included //github.com/vimeo/player.js');
- }
- }
- else if (videoInfo.wistia) {
- try {
- window._wq = window._wq || [];
- // @todo Event is gettign triggered multiple times
- window._wq.push({
- id: $videoElement.attr('id'),
- onReady: function (video) {
- video.bind('end', function () {
- _this.core.goToNextSlide();
- });
- },
- });
- }
- catch (e) {
- console.error('lightGallery:- Make sure you have included //fast.wistia.com/assets/external/E-v1.js');
- }
- }
- }
- };
- Video.prototype.controlVideo = function (index, action) {
- var $videoElement = this.core
- .getSlideItem(index)
- .find('.lg-video-object')
- .first();
- var videoInfo = this.core.galleryItems[index].__slideVideoInfo || {};
- if (!$videoElement.get())
- return;
- if (videoInfo.youtube) {
- try {
- $videoElement.get().contentWindow.postMessage("{\"event\":\"command\",\"func\":\"" + action + "Video\",\"args\":\"\"}", '*');
- }
- catch (e) {
- console.error("lightGallery:- " + e);
- }
- }
- else if (videoInfo.vimeo) {
- try {
- new Vimeo.Player($videoElement.get())[action]();
- }
- catch (e) {
- console.error('lightGallery:- Make sure you have included //github.com/vimeo/player.js');
- }
- }
- else if (videoInfo.html5) {
- if (this.settings.videojs) {
- try {
- videojs($videoElement.get())[action]();
- }
- catch (e) {
- console.error('lightGallery:- Make sure you have included videojs');
- }
- }
- else {
- $videoElement.get()[action]();
- }
- }
- else if (videoInfo.wistia) {
- try {
- window._wq = window._wq || [];
- // @todo Find a way to destroy wistia player instance
- window._wq.push({
- id: $videoElement.attr('id'),
- onReady: function (video) {
- video[action]();
- },
- });
- }
- catch (e) {
- console.error('lightGallery:- Make sure you have included //fast.wistia.com/assets/external/E-v1.js');
- }
- }
- };
- Video.prototype.loadVideoOnPosterClick = function ($el, forcePlay) {
- var _this = this;
- // check slide has poster
- if (!$el.hasClass('lg-video-loaded')) {
- // check already video element present
- if (!$el.hasClass('lg-has-video')) {
- $el.addClass('lg-has-video');
- var _html = void 0;
- var _src = this.core.galleryItems[this.core.index].src;
- var video = this.core.galleryItems[this.core.index].video;
- if (video) {
- _html =
- typeof video === 'string' ? JSON.parse(video) : video;
- }
- var videoJsPlayer_1 = this.appendVideos($el, {
- src: _src,
- addClass: '',
- index: this.core.index,
- html5Video: _html,
- });
- this.gotoNextSlideOnVideoEnd(_src, this.core.index);
- var $tempImg = $el.find('.lg-object').first().get();
- // @todo make sure it is working
- $el.find('.lg-video-cont').first().append($tempImg);
- $el.addClass('lg-video-loading');
- videoJsPlayer_1 &&
- videoJsPlayer_1.ready(function () {
- videoJsPlayer_1.on('loadedmetadata', function () {
- _this.onVideoLoadAfterPosterClick($el, _this.core.index);
- });
- });
- $el.find('.lg-video-object')
- .first()
- .on('load.lg error.lg loadedmetadata.lg', function () {
- setTimeout(function () {
- _this.onVideoLoadAfterPosterClick($el, _this.core.index);
- }, 50);
- });
- }
- else {
- this.playVideo(this.core.index);
- }
- }
- else if (forcePlay) {
- this.playVideo(this.core.index);
- }
- };
- Video.prototype.onVideoLoadAfterPosterClick = function ($el, index) {
- $el.addClass('lg-video-loaded');
- this.playVideo(index);
- };
- Video.prototype.destroy = function () {
- this.core.LGel.off('.lg.video');
- this.core.LGel.off('.video');
- };
- return Video;
- }());
- export default Video;
- //# sourceMappingURL=lg-video.es5.js.map
|