3 changed files with 139 additions and 20 deletions
@ -0,0 +1,75 @@ |
|||||||
|
(function (Drupal, once) { |
||||||
|
|
||||||
|
async function getAudioSourceFromNode(url) { |
||||||
|
const res = await fetch(url, { |
||||||
|
headers: { 'X-Requested-With': 'XMLHttpRequest' } |
||||||
|
}); |
||||||
|
|
||||||
|
const html = await res.text(); |
||||||
|
const doc = new DOMParser().parseFromString(html, 'text/html'); |
||||||
|
|
||||||
|
const source = doc.querySelector( |
||||||
|
'audio[data-able-player] source[type="audio/mpeg"]' |
||||||
|
); |
||||||
|
|
||||||
|
const title = |
||||||
|
doc.querySelector( |
||||||
|
'h1.title.page-title span[property="dcterms:title"]' |
||||||
|
)?.textContent.trim() |
||||||
|
|| |
||||||
|
doc.querySelector('meta[property="og:title"]')?.content |
||||||
|
|| |
||||||
|
doc.querySelector('title')?.textContent |
||||||
|
|| |
||||||
|
''; |
||||||
|
|
||||||
|
return { src: source?.src, title }; |
||||||
|
} |
||||||
|
|
||||||
|
function playAbleAudio(src) { |
||||||
|
const audio = document.getElementById('global-able-player'); |
||||||
|
if (!audio) return; |
||||||
|
|
||||||
|
const source = audio.querySelector('source'); |
||||||
|
source.src = src; |
||||||
|
|
||||||
|
audio.load(); |
||||||
|
|
||||||
|
if (audio.ablePlayer) { |
||||||
|
audio.ablePlayer.refreshControls(); |
||||||
|
audio.ablePlayer.playMedia(); |
||||||
|
} else { |
||||||
|
audio.play(); |
||||||
|
} |
||||||
|
|
||||||
|
document.getElementById('global-audio-wrapper') |
||||||
|
?.classList.remove('is-hidden'); |
||||||
|
} |
||||||
|
|
||||||
|
Drupal.behaviors.ablePlayerRemoteLoad = { |
||||||
|
attach(context) { |
||||||
|
once('able-player-fetch', '.js-play-audio-from-node', context) |
||||||
|
.forEach(link => { |
||||||
|
|
||||||
|
link.addEventListener('click', async e => { |
||||||
|
e.preventDefault(); |
||||||
|
|
||||||
|
const { src, title } = await getAudioSourceFromNode(link.href); |
||||||
|
|
||||||
|
if (!src) { |
||||||
|
console.warn('No Able Player audio found on page'); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
playAbleAudio(src); |
||||||
|
|
||||||
|
const titleEl = document.getElementById('global-audio-title'); |
||||||
|
if (titleEl && title) { |
||||||
|
titleEl.textContent = title; |
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
})(Drupal, once); |
||||||
Loading…
Reference in new issue