Skip to content

Commit 1538fae

Browse files
committed
Add automatic parsing for audio playlists
1 parent 997ff2b commit 1538fae

File tree

3 files changed

+65
-1
lines changed

3 files changed

+65
-1
lines changed

src/ableplayer.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,18 @@ function able_player_parameters() {
345345
return apply_filters( 'ableplayer_default_parameters', $params );
346346
}
347347

348+
/**
349+
* Remove Media Element scripts.
350+
*/
351+
function ableplayer_remove_scripts() {
352+
$elements = ableplayer_get_settings( 'disable_elements' );
353+
if ( 'true' === $elements ) {
354+
wp_deregister_script( 'mediaelement' );
355+
wp_deregister_script( 'wp-playlist' );
356+
}
357+
}
358+
add_action( 'init', 'ableplayer_remove_scripts' );
359+
348360
/**
349361
* Add support for [ableplayer] shortcode.
350362
*

src/assets/js/media.js

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ if ( 0 !== ableplayer_selectors.length ) {
1111
if ( mediaEls ) {
1212
mediaEls.forEach((el,index,listObj) => {
1313
let excludeClass = ableplayer.settings.exclude_class;
14-
if ( excludeClass !== '' && el.classList.contains( excludeClass ) || el.closest( 'figure' ).classList.contains( excludeClass ) ) {
14+
let parentEl = el.closest( 'figure' );
15+
let parentHasClass = ( parentEl ) ? parentEl.classList.contains( excludeClass ) : false;
16+
if ( excludeClass !== '' && el.classList.contains( excludeClass ) || parentHasClass ) {
1517
el.classList.add( 'ableplayer-skipped' );
1618
} else {
1719
el.removeAttribute( 'controls' );
@@ -32,6 +34,42 @@ if ( 0 !== ableplayer_selectors.length ) {
3234
}
3335
}
3436

37+
if ( 'true' === ableplayer.settings.replace_playlists) {
38+
const audioPlaylists = document.querySelectorAll( '.wp-audio-playlist' );
39+
if ( audioPlaylists.length > 0 ) {
40+
audioPlaylists.forEach((playlist,index,listObj) => {
41+
renderPlaylist( playlist, index );
42+
});
43+
}
44+
}
45+
46+
function renderPlaylist( el, index ) {
47+
let contents = JSON.parse( el.querySelector( '.wp-playlist-script' ).textContent );
48+
let player = ( el.classList.contains( 'wp-audio-playlist' ) ) ? el.querySelector( 'audio' ) : el.querySelector( 'video' );
49+
let tracks = contents.tracks;
50+
let list = document.createElement( 'ul' );
51+
list.classList.add( 'able-playlist' );
52+
list.setAttribute( 'data-player', player.getAttribute( 'id' ) );
53+
list.setAttribute( 'data-embedded', true );
54+
let listItem, source, button;
55+
tracks.forEach((track,index,listObj) => {
56+
listItem = document.createElement( 'li' );
57+
source = document.createElement( 'span' );
58+
source.classList.add( 'able-source' );
59+
source.setAttribute( 'data-type', track.type );
60+
source.setAttribute( 'data-src', track.src );
61+
button = document.createElement( 'button' );
62+
button.setAttribute( 'type', 'button' );
63+
button.innerText = track.title;
64+
listItem.insertAdjacentElement( 'afterbegin', source );
65+
listItem.insertAdjacentElement( 'beforeend', button );
66+
list.insertAdjacentElement( 'beforeend', listItem );
67+
});
68+
el.insertAdjacentElement( 'beforeend', list );
69+
70+
el.querySelector( '.wp-playlist-current-item' ).remove();
71+
}
72+
3573
const ablePlayers = document.querySelectorAll( '[data-able-player]' );
3674
if ( ablePlayers ) {
3775
ablePlayers.forEach((el,index,listObj) => {

src/inc/settings.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ function ableplayer_update_settings( $post ) {
251251
$replace_audio = ( ! empty( $post['replace_audio'] ) && 'on' === $post['replace_audio'] ) ? 'true' : 'false';
252252
$exclude_class = ( ! empty( $post['exclude_class'] ) ) ? sanitize_text_field( $post['exclude_class'] ) : '';
253253
$replace_playlists = ( ! empty( $post['replace_playlists'] ) && 'on' === $post['replace_playlists'] ) ? 'true' : 'false';
254+
$disable_elements = ( ! empty( $post['disable_elements'] ) && 'on' === $post['disable_elements'] ) ? 'true' : 'false';
254255
$youtube_nocookie = ( ! empty( $post['youtube_nocookie'] ) && 'on' === $post['youtube_nocookie'] ) ? 'true' : 'false';
255256
$play_inline = ( ! empty( $post['play_inline'] ) && 'on' === $post['play_inline'] ) ? 'true' : 'false';
256257
$render_transcript = ( ! empty( $post['render_transcript'] ) && 'on' === $post['render_transcript'] ) ? 'true' : 'false';
@@ -263,6 +264,7 @@ function ableplayer_update_settings( $post ) {
263264
$settings['replace_audio'] = $replace_audio;
264265
$settings['exclude_class'] = $exclude_class;
265266
$settings['replace_playlists'] = $replace_playlists;
267+
$settings['disable_elements'] = $disable_elements;
266268
$settings['youtube_nocookie'] = $youtube_nocookie;
267269
$settings['seek_interval'] = $seek_interval;
268270
$settings['play_inline'] = $play_inline;
@@ -358,6 +360,17 @@ function ableplayer_settings_form() {
358360
</p>
359361
<p>
360362
<?php
363+
ableplayer_settings_field(
364+
array(
365+
'name' => 'disable_elements',
366+
'label' => __( 'Disable MediaElement JS.', 'ableplayer' ),
367+
'type' => 'checkbox-single',
368+
)
369+
);
370+
?>
371+
</p>
372+
<p>
373+
<?php
361374
ableplayer_settings_field(
362375
array(
363376
'name' => 'youtube_nocookie',
@@ -572,6 +585,7 @@ function ableplayer_default_settings() {
572585
'replace_audio' => 'false',
573586
'exclude_class' => '',
574587
'replace_playlists' => 'false',
588+
'disable_elements' => 'false',
575589
'youtube_nocookie' => 'false',
576590
'play_inline' => 'true',
577591
'render_transcript' => 'true',

0 commit comments

Comments
 (0)