diff options
Diffstat (limited to 'frontend/site/audio/audio.player.js')
| -rw-r--r-- | frontend/site/audio/audio.player.js | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/frontend/site/audio/audio.player.js b/frontend/site/audio/audio.player.js new file mode 100644 index 0000000..9a2d783 --- /dev/null +++ b/frontend/site/audio/audio.player.js @@ -0,0 +1,43 @@ +export default class AudioPlayer { + players = {} + + play({ item, restart, loop }) { + return new Promise((resolve, reject) => { + const { id, url } = item + if (id in players) { + if (restart) { + players[id].currentTime = 0 + players[id].play() + return resolve() + } + return reject() + } + const player = document.createElement('audio') + const handleEnded = () => { + unbind() + resolve() + } + const handleError = (error) => { + console.error(error) + unbind() + reject(error) + } + const bind = () => { + player.addEventListener('ended', handleEnded) + player.addEventListener('error', handleError) + this.players[id] = player + } + const unbind = () => { + player.removeEventListener('ended', handleEnded) + player.removeEventListener('error', handleError) + delete this.players[id] + } + const start = () => { + player.src = url + player.play() + } + bind() + start() + }) + } +} |
