1let ableplayer_selectors = []; 2if ( ableplayer !== 'undefined' ) { 3 if ( ableplayer.settings.replace_video === 'true' ) { 4 ableplayer_selectors.push( 'video' ); 5 } 6 if ( ableplayer.settings.replace_youtube === 'true' ) { 7 ableplayer_selectors.push( '.is-provider-youtube iframe' ); 8 } 9 if ( ableplayer.settings.replace_audio === 'true' ) { 10 ableplayer_selectors.push( 'audio' ); 11 } 12 if ( 0 !== ableplayer_selectors.length ) { 13 const mediaEls = document.querySelectorAll( ableplayer_selectors ); 14 let childTracks; 15 if ( mediaEls ) { 16 mediaEls.forEach((el,index,listObj) => { 17 let excludeClass = ableplayer.settings.exclude_class; 18 let parentEl = el.closest( 'figure' ); 19 let parentDiv = el.closest( 'div' ); 20 let parentHasClass = ( parentEl ) ? parentEl.classList.contains( excludeClass ) : false; 21 let parentDivHasClass = ( parentDiv ) ? parentDiv.classList.contains( excludeClass ) : false; 22 if ( excludeClass !== '' && el.classList.contains( excludeClass ) || parentHasClass || parentDivHasClass ) { 23 el.classList.add( 'ableplayer-skipped' ); 24 } else { 25 if ( el.tagName === 'IFRAME' ) { 26 let url = el.getAttribute( 'src' ); 27 let newEl = document.createElement( 'video' ); 28 let youTubeId = getYouTubeIdFromEmbed( url ); 29 newEl.setAttribute( 'data-able-player', 'true' ); 30 newEl.setAttribute( 'data-youtube-id', youTubeId ); 31 el.remove(); 32 parentEl.appendChild( newEl ); 33 parentEl.classList.remove( 'wp-has-aspect-ratio' ); 34 } 35 el.removeAttribute( 'controls' ); 36 if ( ! el.hasAttribute( 'data-able-player' ) ) { 37 el.setAttribute( 'data-able-player', 'true' ); 38 } 39 if ( ! el.hasAttribute( 'id' ) ) { 40 el.setAttribute( 'id', 'able-player-id-' + index ); 41 } 42 if ( ! el.hasAttribute( 'data-skin' ) ) { 43 el.setAttribute( 'data-skin', '2020' ); 44 } 45 } 46 childTracks = el.querySelectorAll( 'track' ); 47 childTracks.forEach((track,index,listObj) => { 48 if ( ! track.hasAttribute( 'kind' ) ) { 49 track.setAttribute( 'kind', 'subtitles' ); 50 } 51 }); 52 }); 53 } 54 } 55 56 if ( 'true' === ableplayer.settings.replace_playlists) { 57 const playlists = document.querySelectorAll( '.wp-playlist' ); 58 if ( playlists.length > 0 ) {
59 playlists.forEach((playlist,index,listObj) => { 60 renderPlaylist( playlist ); 61 }); 62 } 63 } 64 65 function getYouTubeIdFromEmbed( embedUrl ) { 66 try { 67 const url = new URL( embedUrl ); 68 // Splits '/embed/abc123xyz' and returns the final segment 69 const segments = url.pathname.split('/'); 70 return segments[segments.indexOf('embed') + 1] || null; 71 } catch ( error ) { 72 return null; 73 } 74 } 75 76 /** 77 * Render the AblePlayer playlist over WP Playlist data sources. 78 * 79 * @param Element el Playlist wrapper element. 80 */ 81 function renderPlaylist( el ) { 82 el.classList.add( 'has-ableplayer' ); 83 let contents = JSON.parse( el.querySelector( '.wp-playlist-script' ).textContent ); 84 let player = ( el.classList.contains( 'wp-audio-playlist' ) ) ? el.querySelector( 'audio' ) : el.querySelector( 'video' ); 85 let tracks = contents.tracks; 86 let list = document.createElement( 'ul' ); 87 list.classList.add( 'able-playlist' ); 88 list.setAttribute( 'data-player', player.getAttribute( 'id' ) ); 89 list.setAttribute( 'data-embedded', true ); 90 let listItem, source, button; 91 tracks.forEach((track,index,listObj) => { 92 listItem = document.createElement( 'li' ); 93 listItem.setAttribute( 'data-poster', track.image.src ); 94 source = document.createElement( 'span' ); 95 source.classList.add( 'able-source' ); 96 source.setAttribute( 'data-type', track.type ); 97 source.setAttribute( 'data-src', track.src ); 98 button = document.createElement( 'button' ); 99 button.setAttribute( 'type', 'button' ); 100 button.innerText = track.title; 101 if ( track.image.src ) { 102 img = document.createElement( 'img' ); 103 img.setAttribute( 'src', track.image.src ); 104 img.setAttribute( 'alt', '' ); 105 img.setAttribute( 'height', track.image.height ); 106 img.setAttribute( 'width', track.image.width ); 107 button.insertAdjacentElement( 'afterbegin', img ); 108 } 109 listItem.insertAdjacentElement( 'afterbegin', source ); 110 listItem.insertAdjacentElement( 'beforeend', button ); 111 list.insertAdjacentElement( 'beforeend', listItem ); 112 }); 113 el.insertAdjacentElement( 'beforeend', list ); 114 115 let wpCurrent = el.querySelector( '.wp-playlist-current-item' ); 116 if ( wpCurrent ) { 117 wpCurrent.remove(); 118 } 119 } 120 121 const ablePlayers = document.querySelectorAll( '[data-able-player]' ); 122 if ( ablePlayers ) { 123 ablePlayers.forEach((el,index,listObj) => { 124 if ( 'true' === ableplayer.settings.youtube_nocookie ) { 125 if ( ! el.hasAttribute( 'data-youtube-nocookie' ) ) { 126 el.setAttribute( 'data-youtube-nocookie', 'true' ); 127 } 128 } 129 if ( 'auto' !== ableplayer.settings.default_heading ) { 130 if ( ! el.hasAttribute( 'data-heading-level' ) ) { 131 el.setAttribute( 'data-heading-level', ableplayer.settings.default_heading ); 132 } 133 } 134 if ( 'animals' !== ableplayer.settings.default_speed ) { 135 if ( ! el.hasAttribute( 'data-speed-icons' ) ) { 136 el.setAttribute( 'data-speed-icons', 'arrows' ); 137 } 138 } 139 if ( 'true' === ableplayer.settings.hide_controls ) { 140 if ( ! el.hasAttribute( 'data-hide-controls' ) ) { 141 el.setAttribute( 'data-hide-controls', 'true' ); 142 } 143 } 144 if ( ableplayer.settings.seek_interval ) { 145 if ( ! el.hasAttribute( 'data-seek-interval' ) ) { 146 el.setAttribute( 'data-seek-interval', ableplayer.settings.seek_interval ); 147 } 148 } 149 if ( 'true' === ableplayer.settings.render_transcript ) { 150 if ( ! el.hasAttribute( 'data-transcript-div' ) ) { 151 let tracks = el.querySelectorAll( 'track' ); 152 if ( tracks.length > 0 ) { 153 el.setAttribute( 'data-transcript-div', 'ableplayer-transcript-' + el.getAttribute( 'id' ) ); 154 let transcriptContainer = document.createElement( 'div' ); 155 transcriptContainer.setAttribute( 'id', 'ableplayer-transcript-' + el.getAttribute( 'id' ) ); 156 transcriptContainer.classList.add( 'ableplayer-transcript' ); 157 el.insertAdjacentElement( 'afterend', transcriptContainer ); 158 } 159 } 160 } 161 }); 162 } 163}
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.