summaryrefslogtreecommitdiff
path: root/frontend/site/audio/audio.player.js
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/site/audio/audio.player.js')
-rw-r--r--frontend/site/audio/audio.player.js43
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()
+ })
+ }
+}