1let gtm4wp_soundclound_percentage_tracking = 10; 2let gtm4wp_soundclound_percentage_tracking_marks = {}; 3 4window.addEventListener('DOMContentLoaded', function() { 5 const gtm4wp_soundcloud_frames = document.querySelectorAll( 'iframe[src*="soundcloud.com"]' ); 6 if ( !gtm4wp_soundcloud_frames || gtm4wp_soundcloud_frames.length == 0 ) { 7 return; 8 } 9 10 gtm4wp_soundcloud_frames.forEach(function( soundcloud_frame ) { 11 let widget = SC.Widget( soundcloud_frame ); 12 let sound = {}; 13 14 widget.bind( SC.Widget.Events.READY, function() { 15 widget.getCurrentSound(function( soundData ) { 16 17 soundcloud_frame.setAttribute( "data-player_id", soundData.id ); 18 soundcloud_frame.setAttribute( "data-player_author", soundData.user.username ); 19 soundcloud_frame.setAttribute( "data-player_title", soundData.title ); 20 soundcloud_frame.setAttribute( "data-player_url", soundData.permalink_url ); 21 soundcloud_frame.setAttribute( "data-player_duration", soundData.duration ); 22 23 sound = soundData; 24 25 window[ gtm4wp_datalayer_name ].push({ 26 'event': 'gtm4wp.mediaPlayerReady', 27 'mediaType': 'soundcloud', 28 'mediaData': { 29 'id': soundData.id, 30 'author': soundData.user.username, 31 'title': soundData.title, 32 'url': soundData.permalink_url, 33 'duration': soundData.duration 34 }, 35 'mediaCurrentTime': 0 36 }); 37 }); // end of api call getDuration 38 39 widget.bind( SC.Widget.Events.PLAY_PROGRESS, function( eventData ) { 40 gtm4wp_onSoundCloudPercentageChange( eventData ); 41 }); 42 43 widget.bind( SC.Widget.Events.PLAY, function( eventData ) { 44 gtm4wp_onSoundCloudPlayerStateChange( eventData, 'play' ); 45 }); 46 47 widget.bind( SC.Widget.Events.PAUSE, function( eventData ) { 48 gtm4wp_onSoundCloudPlayerStateChange( eventData, 'pause' ); 49 }); 50 51 widget.bind( SC.Widget.Events.FINISH, function( eventData ) { 52 gtm4wp_onSoundCloudPlayerStateChange( eventData, 'ended' ); 53 }); 54 55 widget.bind( SC.Widget.Events.SEEK, function( eventData ) { 56 gtm4wp_onSoundCloudPlayerStateChange( eventData, 'seeked' ); 57 }); 58 59 widget.bind( SC.Widget.Events.CLICK_DOWNLOAD, function() { 60 gtm4wp_onSoundCloudPlayerEvent( 'click-download' ); 61 }); 62 63 widget.bind( SC.Widget.Events.CLICK_BUY, function() { 64 gtm4wp_onSoundCloudPlayerEvent( 'click-buy' ); 65 }); 66 67 widget.bind( SC.Widget.Events.OPEN_SHARE_PANEL, function() { 68 gtm4wp_onSoundCloudPlayerEvent( 'open-share-panel' ); 69 }); 70 71 widget.bind( SC.Widget.Events.ERROR, function() { 72 gtm4wp_onSoundCloudPlayerEvent( 'error' ); 73 }); 74 }); 75 76 const gtm4wp_onSoundCloudPlayerStateChange = function( eventData, playerState ) { 77 window[ gtm4wp_datalayer_name ].push({ 78 'event': 'gtm4wp.mediaPlayerStateChange', 79 'mediaType': 'soundcloud', 80 'mediaData': { 81 'id': sound.id, 82 'author': sound.user.username, 83 'title': sound.title, 84 'url': sound.permalink_url, 85 'duration': sound.duration 86 }, 87 'mediaCurrentTime': eventData.currentPosition, 88 'mediaPlayerState': playerState 89 }); 90 }; 91 92 const gtm4wp_onSoundCloudPercentageChange = function( eventData ) { 93 const mediaPercentage = Math.floor( eventData.currentPosition / sound.duration * 100 ); 94 95 if ( typeof gtm4wp_soundclound_percentage_tracking_marks[ sound.id ] == "undefined" ) { 96 gtm4wp_soundclound_percentage_tracking_marks[ sound.id ] = []; 97 } 98 99 for( let i=0; i<100; i+=gtm4wp_soundclound_percentage_tracking ) { 100 if ( ( mediaPercentage > i ) && ( gtm4wp_soundclound_percentage_tracking_marks[ sound.id ].indexOf( i ) == -1 ) ) { 101 gtm4wp_soundclound_percentage_tracking_marks[ sound.id ].push( i ); 102 103 window[ gtm4wp_datalayer_name ].push({ 104 'event': 'gtm4wp.mediaPlaybackPercentage', 105 'mediaType': 'soundcloud', 106 'mediaData': { 107 'id': sound.id, 108 'author': sound.user.username, 109 'title': sound.title, 110 'url': sound.permalink_url, 111 'duration': sound.duration 112 }, 113 'mediaCurrentTime': eventData.currentPosition, 114 'mediaPercentage': i 115 }); 116 } 117 } 118 }; 119 120 const gtm4wp_onSoundCloudPlayerEvent = function( eventName ) { 121 widget.getPosition(function( currentPosition ) { 122 window[ gtm4wp_datalayer_name ].push({ 123 'event': 'gtm4wp.mediaPlayerEvent', 124 'mediaType': 'soundcloud', 125 'mediaData': { 126 'id': sound.id, 127 'author': sound.user.username, 128 'title': sound.title, 129 'url': sound.permalink_url,
130 'duration': soundData.duration 131 }, 132 'mediaCurrentTime': currentPosition, 133 'mediaPlayerEvent': eventName 134 }); 135 }); 136 }; 137 138 }); 139});
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.