Usage
This function runs automatically, so it is not called manually. Is this incorrect?
Additional Notes
This function looks for any iframe with a src that contains “vimeo”.
Source File
Located in /assets/js/modules/video.js on line 624.
No Hooks
This function does not have any filters or actions available. Request one?nebula.createVimeoPlayers = function(){
jQuery('iframe[src*="vimeo"], iframe[data-src*="vimeo"]').each(function(){ //This is not finding lazy loaded videos
if ( !jQuery(this).hasClass('ignore') ){ //Use this class to ignore certain videos from tracking
let id = jQuery(this).attr('data-video-id') || jQuery(this).attr('data-vimeo-id') || jQuery(this).attr('id') || false;
if ( !id ){
if ( jQuery(this).attr('src').includes('player_id') ){
id = jQuery(this).attr('src').split('player_id=').pop().split('&')[0]; //Use the player_id parameter. Note: This is no longer used by the Vimeo API!
} else {
id = jQuery(this).attr('src').split('/').pop().split('?')[0]; //Grab the ID off the end of the URL (ignoring query parameters)
}
if ( id && !parseInt(id) ){ //If the ID is a not number try to find a number in the iframe src
id = (/\d{6,}/g).exec(jQuery(this).attr('src'))[0];
}
jQuery(this).attr('id', id);
}
nebula.videos = nebula.videos || {}; //Always make sure this is defined
if ( typeof nebula.videos[id] === 'object' ){ //If this video is already being tracked ignore it
return; //Continue the loop
}
//Fill in the Vimeo data object here
nebula.videos[id] = {
player: new Vimeo.Player(jQuery(this)),
element: jQuery(this),
platform: 'vimeo', //The platform the video is hosted using.
autoplay: nebula.isAutoplayVideo(jQuery(this)), //Look for the autoplay parameter in the iframe src.
id: id,
current: 0, //The current position of the video. Units: Seconds
video_percent: 0, //The percent of the current position. Multiply by 100 for actual percent.
started: false, //If the video has been started yet
engaged: false, //Whether the viewer has watched enough of the video to be considered engaged.
seeker: false, //Whether the viewer has seeked through the video at least once.
seen: [], //An array of percentages seen by the viewer. This is to roughly estimate how much was watched.
watched: 0, //Amount of time watching the video (regardless of seeking). Accurate to 1% of video duration. Units: Seconds
watchedPercent: 0, //The decimal percentage of the video watched. Multiply by 100 for actual percent.
pausedYet: false, //If this video has been paused yet by the user.
};
//Title
nebula.videos[id].player.getVideoTitle().then(function(title){
nebula.videos[id].title = title; //The title of the video
});
//Duration
nebula.videos[id].player.getDuration().then(function(duration){
nebula.videos[id].duration = duration; //The total duration of the video. Units: Seconds
});
//Play
nebula.videos[id].player.on('play', function(e){
if ( !thisVideo.started ){ //If this Vimeo video has not yet been started
thisVideo.started = true;
let thisEvent = {
event_name: 'video_start',
event_category: 'Videos',
event_action: ( nebula.isInView(jQuery(nebula.videos[id].element)) )? 'Play' : 'Play (Not In View)',
event_label: nebula.videos[id].title + ' (Vimeo Video)',
video_title: nebula.videos[id].title,
video_provider: 'vimeo',
autoplay: nebula.videos[id].autoplay
};
if ( nebula.videos[id].autoplay ){
thisEvent.event_action += ' (Autoplay)';
} else {
nebula.videos[id].element.addClass('playing');
}
nebula.dom.document.trigger('nebula_event', thisEvent);
gtag('event', thisEvent.event_name, nebula.gaEventObject(thisEvent));
nebula.crm('event', 'Video Play Began: ' + thisEvent.title);
nebula.dom.document.trigger('nebula_playing_video', nebula.videos[id].title);
}
});
//Time Update
nebula.videos[id].player.on('timeupdate', function(e){
nebula.videos[id].duration = e.duration;
nebula.videos[id].current = e.seconds;
nebula.videos[id].percent = e.percent;
//Determine watched percent by adding current percents to an array, then count the array!
nowSeen = Math.ceil(nebula.videos[id].percent*100);
if ( nebula.videos[id].seen.indexOf(nowSeen) < 0 ){
nebula.videos[id].seen.push(nowSeen);
}
nebula.videos[id].watchedPercent = nebula.videos[id].seen.length;
nebula.videos[id].watched = (nebula.videos[id].seen.length/100)*nebula.videos[id].duration; //Roughly calculate time watched based on percent seen
if ( !nebula.videos[id].autoplay && nebula.videos[id].watchedPercent > 25 && !nebula.videos[id].engaged ){
if ( nebula.isInView(jQuery(nebula.videos[id].element)) ){
nebula.videos[id].engaged = true;
let thisEvent = {
event_name: 'video_engagement',
event_category: 'Videos',
event_action: ( nebula.videos[id].autoplay )? 'Engaged' : 'Engaged (Autoplay)',
event_label: nebula.videos[id].title + ' (Vimeo Video)',
video_title: nebula.videos[id].title,
video_provider: 'vimeo',
autoplay: nebula.videos[id].autoplay,
non_interaction: true
};
nebula.dom.document.trigger('nebula_event', thisEvent);
gtag('event', thisEvent.event_name, nebula.gaEventObject(thisEvent));
nebula.crm('event', 'Video Engaged: ' + thisEvent.title);
nebula.dom.document.trigger('nebula_engaged_video', nebula.videos[id].title);
}
}
});
//Pause
nebula.videos[id].player.on('pause', function(e){
jQuery(this).removeClass('playing');
let thisEvent = {
event_name: 'video_pause',
event_category: 'Videos',
event_action: 'Paused',
event_label: nebula.videos[id].title + ' (Vimeo Video)',
first_pause: !nebula.videos[id].pausedYet,
play_time: Math.round(nebula.videos[id].watched),
video_percent: Math.round(e.percent*100),
video_title: nebula.videos[id].title,
video_provider: 'vimeo',
autoplay: nebula.videos[id].autoplay
};
if ( !nebula.videos[id].pausedYet && !nebula.videos[id].seeker ){ //Only capture first pause if they didn't seek
nebula.videos[id].pausedYet = true;
}
nebula.dom.document.trigger('nebula_event', thisEvent);
gtag('event', thisEvent.event_name, nebula.gaEventObject(thisEvent));
gtag('event', 'timing_complete', {
name: thisEvent.event_action,
value: Math.round(e.seconds*1000),
event_category: thisEvent.event_category,
event_label: thisEvent.title,
non_interaction: true
});
nebula.crm('event', 'Video Paused: ' + thisEvent.title);
nebula.dom.document.trigger('nebula_paused_video', nebula.videos[id]);
});
//Seeked
nebula.videos[id].player.on('seeked', function(e){
let thisEvent = {
event_name: 'video_seek',
event_category: 'Videos',
event_action: 'Seek',
event_label: nebula.videos[id].title + ' (Vimeo Video)',
position: e.seconds,
video_title: nebula.videos[id].title,
video_provider: 'vimeo',
autoplay: nebula.videos[id].autoplay
};
thisEvent.event_label = thisEvent.title + ' [to: ' + thisEvent.position + ']';
nebula.dom.document.trigger('nebula_event', thisEvent);
gtag('event', thisEvent.event_name, nebula.gaEventObject(thisEvent));
nebula.crm('event', 'Video Seeked: ' + thisEvent.title);
nebula.videos[id].seeker = true;
nebula.dom.document.trigger('nebula_seeked_video', nebula.videos[id]);
});
//Ended
nebula.videos[id].player.on('ended', function(e){
jQuery(this).removeClass('playing');
let thisEvent = {
event_name: 'video_complete',
event_category: 'Videos',
event_action: ( nebula.isInView(jQuery(nebula.videos[id].element)) )? 'Ended' : 'Ended (Not In View)',
event_label: nebula.videos[id].title + ' (Vimeo Video)',
video_title: nebula.videos[id].title,
video_provider: 'vimeo',
play_time: Math.round(nebula.videos[id].watched),
progress: Math.round(nebula.videos[id].watched*1000),
autoplay: nebula.videos[id].autoplay,
non_interaction: true
};
if ( nebula.videos[id].autoplay ){
thisEvent.event_action += ' (Autoplay)';
}
nebula.dom.document.trigger('nebula_event', thisEvent);
gtag('event', thisEvent.event_name, nebula.gaEventObject(thisEvent));
gtag('event', 'timing_complete', {
name: thisEvent.event_action,
value: thisEvent.progress,
event_category: thisEvent.event_category,
event_label: thisEvent.title,
non_interaction: true
});
nebula.crm('event', 'Video Ended: ' + thisEvent.title);
nebula.dom.document.trigger('nebula_ended_video', nebula.videos[id]);
});
nebula.dom.document.trigger('nebula_vimeo_player_created', nebula.videos[id]);
}
});
if ( typeof videoProgress === 'undefined' ){
let videoProgress = {};
}
};
Override
To override or disable this JavaScript function, simply redeclare it with the exact same function name. Remember: Some functionality is conditionally loaded via dynamic imports, so if your function is not overriding properly, try listening for a DOM event (described below).
For non-module import functions:
nebula.createVimeoPlayers = function(){
//Write your own code here, leave it blank, or return false.
}
For dynamically imported module function overrides:
jQuery(window).on('load', function(){
nebula.createVimeoPlayers = function(){
//Write your own code here, leave it blank, or return false.
}
});
Custom Nebula DOM events do also exist, so you could also try the following if the Window Load listener does not work:
jQuery(document).on('nebula_module_loaded', function(module){
//Note that the module variable is also available to know which module specifically was imported
if ( typeof nebula.createVimeoPlayers === 'function' ){
nebula.createVimeoPlayers = function(){
//Write your own code here, leave it blank, or return false.
}
}
});