PageSourceSearch

https://www.continualengine.com/wp-content/plugins/ableplayer/assets/js/media.js?ver=2.4.0-7445

js continualengine.com collected 2026-10-02 04:50:11 UTC 6,209 bytes, 163 lines download raw bytes

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.