58 lines
1.5 KiB
TypeScript
58 lines
1.5 KiB
TypeScript
// ~/store/player.ts
|
|
import { defineStore } from 'pinia'
|
|
import type { Track } from '~/types/types'
|
|
|
|
export const usePlayerStore = defineStore('player', {
|
|
state: () => ({
|
|
currentTrack: null as Track | null,
|
|
isPlaying: false,
|
|
position: 0,
|
|
audio: null as HTMLAudioElement | null,
|
|
}),
|
|
|
|
actions: {
|
|
setTrack(track: Track) {
|
|
this.currentTrack = track
|
|
if (!this.audio) this.audio = new Audio(this.getCompilationUrlFromTrack(track))
|
|
else this.audio.src = this.getCompilationUrlFromTrack(track)
|
|
|
|
// Commencer à start secondes
|
|
this.audio.currentTime = track.start || 0
|
|
},
|
|
|
|
playTrack(track?: Track) {
|
|
if (track) this.setTrack(track)
|
|
if (!this.currentTrack || !this.audio) return
|
|
|
|
this.audio.play()
|
|
this.isPlaying = true
|
|
},
|
|
|
|
pauseTrack() {
|
|
if (this.audio) this.audio.pause()
|
|
this.isPlaying = false
|
|
},
|
|
|
|
togglePlay(track?: Track) {
|
|
if (track && (!this.currentTrack || track.id !== this.currentTrack.id)) {
|
|
this.playTrack(track)
|
|
} else {
|
|
this.isPlaying ? this.pauseTrack() : this.playTrack()
|
|
}
|
|
},
|
|
|
|
setPosition(time: number) {
|
|
if (this.audio) this.audio.currentTime = time
|
|
this.position = time
|
|
},
|
|
},
|
|
|
|
getters: {
|
|
getCurrentTrack: (state) => state.currentTrack,
|
|
getPlaying: (state) => state.isPlaying,
|
|
getCompilationUrlFromTrack: (state) => {
|
|
return (track: Track) => `https://files.erudi.fr/evilspins/${track.compilationId}.mp3`
|
|
}
|
|
},
|
|
})
|