diff --git a/front/package.json b/front/package.json
index 19cda8790..3b0b8e075 100644
--- a/front/package.json
+++ b/front/package.json
@@ -35,7 +35,6 @@
"howler": "2.2.3",
"js-logger": "1.6.1",
"lodash-es": "4.17.21",
- "lru-cache": "^7.13.1",
"mavon-editor": "^3.0.0-beta",
"moment": "2.29.4",
"qs": "6.11.0",
@@ -43,7 +42,6 @@
"sanitize-html": "2.7.1",
"sass": "1.54.0",
"showdown": "2.1.0",
- "standardized-audio-context": "^25.3.29",
"text-clipper": "2.2.0",
"tiptap-markdown": "^0.5.0",
"transliteration": "2.3.5",
diff --git a/front/src/components/Queue.vue b/front/src/components/Queue.vue
index 759f8a0f9..7d82055f5 100644
--- a/front/src/components/Queue.vue
+++ b/front/src/components/Queue.vue
@@ -11,7 +11,7 @@ import TrackPlaylistIcon from '~/components/playlists/TrackPlaylistIcon.vue'
import { whenever, watchDebounced, useCurrentElement, useScrollLock } from '@vueuse/core'
import { useGettext } from 'vue3-gettext'
import useQueue from '~/composables/audio/useQueue'
-import useWebAudioPlayer from '~/composables/audio/useWebAudioPlayer'
+import usePlayer from '~/composables/audio/usePlayer'
import VirtualList from '~/components/vui/list/VirtualList.vue'
import QueueItem from '~/components/QueueItem.vue'
@@ -24,32 +24,32 @@ const scrollLock = useScrollLock(document.body)
const store = useStore()
const {
+ playing,
+ loading: isLoadingAudio,
+ errored,
+ duration,
+ durationFormatted,
+ currentTimeFormatted,
+ progress,
+ bufferProgress,
+ currentTime,
+ pause,
+ resume
+} = usePlayer()
+
+const {
+ currentTrack,
+ hasNext,
isEmpty: emptyQueue,
tracks,
reorder,
endsIn: timeLeft,
+ currentIndex,
removeTrack,
- clear
-} = useQueue()
-
-const currentIndex = computed(() => store.state.queue.currentIndex)
-const currentTrack = computed(() => store.state.queue.tracks[currentIndex.value])
-const hasNext = computed(() => store.getters['queue/hasNext'])
-const durationFormatted = computed(() => time.parse(Math.floor(duration.value)))
-const currentTimeFormatted = computed(() => time.parse(Math.floor(currentTime.value)))
-
-const {
- play,
- pause,
+ clear,
next,
- previous,
- playing,
- errored,
- progress,
- duration,
- time: currentTime,
- loading: isLoadingAudio
-} = useWebAudioPlayer()
+ previous
+} = useQueue()
const labels = computed(() => ({
queue: $pgettext('*/*/*', 'Queue'),
@@ -105,12 +105,13 @@ router.beforeEach(() => store.commit('ui/queueFocused', null))
const progressBar = ref()
const touchProgress = (event: MouseEvent) => {
- const percent = (event.clientX - ((event.target as Element).closest('.progress')?.getBoundingClientRect().left ?? 0)) / progressBar.value.offsetWidth
- progress.value = percent * 100
+ const time = ((event.clientX - (event.target as Element).getBoundingClientRect().left) / progressBar.value.offsetWidth) * duration.value
+ currentTime.value = time
}
-const playIndex = (index: number) => {
- store.state.queue.currentIndex = index
+const play = (index: unknown) => {
+ store.dispatch('queue/currentIndex', index as number)
+ resume()
}
const getCover = (track: Track) => {
@@ -254,8 +255,12 @@ const reorderTracks = async (from: number, to: number) => {
+
{
:title="labels.play"
:aria-label="labels.play"
class="control"
- @click.prevent.stop="play"
+ @click.prevent.stop="resume"
>
@@ -390,7 +395,7 @@ const reorderTracks = async (from: number, to: number) => {
:index="index"
:source="item"
:class="[...classList, currentIndex === index && 'active']"
- @play="playIndex"
+ @play="play"
@remove="removeTrack"
/>
diff --git a/front/src/components/audio/ChannelEntryCard.vue b/front/src/components/audio/ChannelEntryCard.vue
index 1e0dde091..cbe9abeae 100644
--- a/front/src/components/audio/ChannelEntryCard.vue
+++ b/front/src/components/audio/ChannelEntryCard.vue
@@ -4,7 +4,7 @@ import type { Cover, Track } from '~/types'
import PlayButton from '~/components/audio/PlayButton.vue'
import TrackFavoriteIcon from '~/components/favorites/TrackFavoriteIcon.vue'
import useQueue from '~/composables/audio/useQueue'
-import useWebAudioPlayer from '~/composables/audio/useWebAudioPlayer'
+import usePlayer from '~/composables/audio/usePlayer'
import { computed } from 'vue'
interface Props {
@@ -16,7 +16,7 @@ interface Props {
const props = defineProps
()
const { currentTrack } = useQueue()
-const { playing } = useWebAudioPlayer()
+const { playing } = usePlayer()
const cover = computed(() => props.entry.cover ?? null)
const duration = computed(() => props.entry.uploads.find(upload => upload.duration)?.duration ?? null)
diff --git a/front/src/components/audio/PlayButton.vue b/front/src/components/audio/PlayButton.vue
index 9dc98186b..d2575cf6c 100644
--- a/front/src/components/audio/PlayButton.vue
+++ b/front/src/components/audio/PlayButton.vue
@@ -155,7 +155,7 @@ const openMenu = () => {
data-ref="enqueue"
:disabled="!playable"
:title="labels.addToQueue"
- @click.stop.prevent="enqueue()"
+ @click.stop.prevent="enqueue"
>
Add to queue
diff --git a/front/src/components/audio/Player.vue b/front/src/components/audio/Player.vue
index d4d6a991b..3c3123dc0 100644
--- a/front/src/components/audio/Player.vue
+++ b/front/src/components/audio/Player.vue
@@ -1,7 +1,5 @@
@@ -128,13 +128,17 @@ const { width: progressWidth } = useElementSize(progressBar)
:class="['ui', 'top attached', 'small', 'inverted', {'indicating': isLoadingAudio}, 'progress']"
@click.prevent.stop="touchProgress"
>
+
@@ -253,7 +257,7 @@ const { width: progressWidth } = useElementSize(progressBar)
:aria-label="labels.previous"
:disabled="!hasPrevious"
class="circular button control tablet-and-up"
- @click.prevent.stop="previous"
+ @click.prevent.stop="$store.dispatch('queue/previous')"
>
@@ -262,7 +266,7 @@ const { width: progressWidth } = useElementSize(progressBar)
:title="labels.play"
:aria-label="labels.play"
class="circular button control"
- @click.prevent.stop="play"
+ @click.prevent.stop="resume"
>
@@ -280,7 +284,7 @@ const { width: progressWidth } = useElementSize(progressBar)
:aria-label="labels.next"
:disabled="!hasNext"
class="circular button control"
- @click.prevent.stop="next"
+ @click.prevent.stop="$store.dispatch('queue/next')"
>
@@ -291,7 +295,7 @@ const { width: progressWidth } = useElementSize(progressBar)
{{ currentTimeFormatted }}
@@ -304,53 +308,57 @@ const { width: progressWidth } = useElementSize(progressBar)
diff --git a/front/src/components/audio/VolumeControl.vue b/front/src/components/audio/VolumeControl.vue
index b31e561af..1bb7ae64f 100644
--- a/front/src/components/audio/VolumeControl.vue
+++ b/front/src/components/audio/VolumeControl.vue
@@ -1,21 +1,21 @@