1let gtm4wp_youtube_percentage_tracking = 10; 2let gtm4wp_youtube_percentage_tracking_timeouts = {}; 3let gtm4wp_youtube_percentage_tracking_marks = {}; 4 5if ( typeof onYouTubeIframeAPIReady === "undefined" ) { 6 window.onYouTubeIframeAPIReady = function() { 7 window[ gtm4wp_datalayer_name ].push({ 8 'event': 'gtm4wp.mediaApiReady', 9 'mediaType': 'youtube' 10 }); 11 12 const gtm4wp_youtube_frames = document.querySelectorAll( "iframe[src^='https://www.youtube.com/embed']" ); 13 if ( !gtm4wp_youtube_frames || gtm4wp_youtube_frames.length == 0 ) { 14 return; 15 } 16 17 gtm4wp_youtube_frames.forEach( function( youtube_frame ) { 18 let playerID = youtube_frame.getAttribute( "id" ); 19 20 if ( ( playerID === null ) || ( playerID === undefined ) || ( playerID === "" ) ) { 21 const _gtm4wp_temp = youtube_frame.getAttribute( "src" ).split( "?" ); 22 const _gtm4wp_temp2 = _gtm4wp_temp[ 0 ].split( "/" ); 23 24 playerID = "youtubeplayer_" + _gtm4wp_temp2[ _gtm4wp_temp2.length-1 ]; 25 youtube_frame.setAttribute( "id", playerID ); 26 } 27 28 let gtm4wp_yturl = youtube_frame.getAttribute( "src" ); 29 if ( gtm4wp_yturl.indexOf( "enablejsapi=1" ) == -1 ) { 30 if ( gtm4wp_yturl.indexOf( "?" ) == -1 ) { 31 gtm4wp_yturl += "?"; 32 } 33 34 gtm4wp_yturl += "&enablejsapi=1&origin=" + document.location.protocol + "//" + document.location.hostname; 35 36 youtube_frame.setAttribute( "src", gtm4wp_yturl ); 37 } 38 39 player = new YT.Player( playerID, { 40 events: { 41 'onReady': gtm4wp_onYouTubePlayerReady, 42 'onStateChange': gtm4wp_onYouTubePlayerStateChange, 43 'onPlaybackQualityChange': gtm4wp_onYouTubePlaybackQualityChange, 44 'onPlaybackRateChange': gtm4wp_onYouTubePlaybackRateChange, 45 'onError': gtm4wp_onYouTubeError, 46 'onApiChange': gtm4wp_onYouTubeApiChange 47 } 48 }); 49 }); 50 }; 51 52 let tag = document.createElement( 'script' ); 53 tag.src = "//www.youtube.com/iframe_api"; 54 let firstScriptTag = document.getElementsByTagName( 'script' )[0]; 55 firstScriptTag.parentNode.insertBefore( tag, firstScriptTag ); 56} else { 57 let gtm4wp_err = new Error( "Another code is already utilizing YouTube API, GTM4WP plugin can not load YouTube tracking!" ); 58 throw gtm4wp_err; 59} 60 61function gtm4wp_onYouTubePlayerReady( event ) { 62 const videodata = event.target.getVideoData(); 63 64 window[ gtm4wp_datalayer_name ].push({ 65 'event': 'gtm4wp.mediaPlayerReady', 66 'mediaType': 'youtube', 67 'mediaData': { 68 'id': videodata.video_id, 69 'author': videodata.author, 70 'title': videodata.title, 71 'url': event.target.getVideoUrl(), 72 'duration': event.target.getDuration() 73 }, 74 'mediaCurrentTime': event.target.getCurrentTime() 75 }); 76} 77 78function gtm4wp_onYouTubePlayerStateChange( event ) { 79 let playerState = "unknown"; 80 81 switch( event.data ) { 82 case -1: playerState = "unstarted"; break; 83 case YT.PlayerState.ENDED: playerState = "ended"; break; 84 case YT.PlayerState.PLAYING: playerState = "play"; break; 85 case YT.PlayerState.PAUSED: playerState = "pause"; break; 86 case YT.PlayerState.BUFFERING: playerState = "buffering"; break; 87 case YT.PlayerState.CUED: playerState = "cued"; break; 88 } 89 90 const videoId = event.target.getVideoData().video_id; 91 92 if ( ( YT.PlayerState.PLAYING == event.data ) && ( gtm4wp_youtube_percentage_tracking > 0 ) ) { 93 gtm4wp_youtube_percentage_tracking_timeouts[ videoId ] = setInterval(function() { 94 gtm4wp_onYouTubePercentageChange( event ); 95 }, 1000); 96 } else { 97 if ( gtm4wp_youtube_percentage_tracking_timeouts[ videoId ] ) { 98 clearInterval( gtm4wp_youtube_percentage_tracking_timeouts[ videoId ] ); 99 } 100 } 101 102 const videodata = event.target.getVideoData(); 103 104 window[ gtm4wp_datalayer_name ].push({ 105 'event': 'gtm4wp.mediaPlayerStateChange', 106 'mediaType': 'youtube', 107 'mediaData': { 108 'id': videodata.video_id, 109 'author': videodata.author, 110 'title': videodata.title, 111 'url': event.target.getVideoUrl(), 112 'duration': event.target.getDuration() 113 }, 114 'mediaPlayerState': playerState, 115 'mediaCurrentTime': event.target.getCurrentTime() 116 }); 117} 118 119function gtm4wp_onYouTubePlaybackQualityChange( event ) { 120 const videodata = event.target.getVideoData(); 121 122 window[ gtm4wp_datalayer_name ].push({ 123 'event': 'gtm4wp.mediaPlayerEvent', 124 'mediaType': 'youtube', 125 'mediaData': { 126 'id': videodata.video_id, 127 'author': videodata.author, 128 'title': videodata.title, 129 'url': event.target.getVideoUrl(), 130 'duration': event.target.getDuration() 131 }, 132 'mediaCurrentTime': event.target.getCurrentTime(), 133 'mediaPlayerEvent': 'quality-change', 134 'mediaPlayerEventParam': event.data 135 }); 136} 137 138function gtm4wp_onYouTubePlaybackRateChange( event ) { 139 const videodata = event.target.getVideoData(); 140 141 window[ gtm4wp_datalayer_name ].push({ 142 'event': 'gtm4wp.mediaPlayerEvent', 143 'mediaType': 'youtube', 144 'mediaData': { 145 'id': videodata.video_id, 146 'author': videodata.author, 147 'title': videodata.title, 148 'url': event.target.getVideoUrl(), 149 'duration': event.target.getDuration() 150 }, 151 'mediaCurrentTime': event.target.getCurrentTime(), 152 'mediaPlayerEvent': 'ratechange', 153 'mediaPlayerEventParam': event.data 154 }); 155} 156 157function gtm4wp_onYouTubeError( event ) { 158 const videodata = event.target.getVideoData(); 159 160 window[ gtm4wp_datalayer_name ].push({ 161 'event': 'gtm4wp.mediaPlayerEvent', 162 'mediaType': 'youtube', 163 'mediaData': { 164 'id': videodata.video_id, 165 'author': videodata.author, 166 'title': videodata.title, 167 'url': event.target.getVideoUrl(), 168 'duration': event.target.getDuration() 169 }, 170 'mediaCurrentTime': event.target.getCurrentTime(), 171 'mediaPlayerEvent': 'error', 172 'mediaPlayerEventParam': event.data 173 }); 174} 175
176function gtm4wp_onYouTubeApiChange( event ) { 177 const videodata = event.target.getVideoData(); 178 179 window[ gtm4wp_datalayer_name ].push({ 180 'event': 'gtm4wp.mediaPlayerEvent', 181 'mediaType': 'youtube', 182 'mediaData': { 183 'id': videodata.video_id, 184 'author': videodata.author, 185 'title': videodata.title, 186 'url': event.target.getVideoUrl(), 187 'duration': event.target.getDuration() 188 }, 189 'mediaCurrentTime': event.target.getCurrentTime(), 190 'mediaPlayerEvent': 'api-change', 191 'mediaPlayerEventParam': event.data 192 }); 193} 194 195function gtm4wp_onYouTubePercentageChange( event ) { 196 const videoId = event.target.getVideoData().video_id; 197 const videoCurrentTime = event.target.getCurrentTime(); 198 const videoDuration = event.target.getDuration(); 199 const videoPercentage = Math.floor( videoCurrentTime / videoDuration * 100 ); 200 201 if ( typeof gtm4wp_youtube_percentage_tracking_marks[ videoId ] == "undefined" ) { 202 gtm4wp_youtube_percentage_tracking_marks[ videoId ] = []; 203 } 204 205 const videodata = event.target.getVideoData(); 206 207 for( let i=0; i<100; i+=gtm4wp_youtube_percentage_tracking ) { 208 if ( ( videoPercentage > i ) && ( gtm4wp_youtube_percentage_tracking_marks[ videoId ].indexOf( i ) == -1 ) ) { 209 gtm4wp_youtube_percentage_tracking_marks[ videoId ].push( i ); 210 211 window[ gtm4wp_datalayer_name ].push({ 212 'event': 'gtm4wp.mediaPlaybackPercentage', 213 'mediaType': 'youtube', 214 'mediaData': { 215 'id': videodata.video_id, 216 'author': videodata.author, 217 'title': videodata.title, 218 'url': event.target.getVideoUrl(), 219 'duration': event.target.getDuration() 220 }, 221 'mediaCurrentTime': event.target.getCurrentTime(), 222 'mediaPercentage': i 223 }); 224 } 225 } 226}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.