From bb6be9a04fed95798ee0a1b472a38d4aabf330db Mon Sep 17 00:00:00 2001 From: lyf <2514544224@qq.com> Date: Mon, 31 Aug 2026 17:15:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E8=AE=B2=E8=A7=A3=E9=9F=B3?= =?UTF-8?q?=E9=A2=91=E6=97=B6=E9=95=BF=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 未加载媒体元数据时默认显示零时长 - 使用音频文件真实媒体时长更新播放器 - 避免使用不准确的接口时长覆盖播放器显示 - 补充音频时长回归测试 Made-with: Proma --- src/composables/useGlobalAudioPlayer.ts | 11 ++++++----- src/pages/exhibit/detail.vue | 11 +++-------- tests/unit/ExhibitDetailAudioFirst.spec.ts | 2 +- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/composables/useGlobalAudioPlayer.ts b/src/composables/useGlobalAudioPlayer.ts index 86ca469..d0d2ea2 100644 --- a/src/composables/useGlobalAudioPlayer.ts +++ b/src/composables/useGlobalAudioPlayer.ts @@ -74,9 +74,10 @@ const isAutoplayBlocked = (err: unknown) => { const syncAudioDuration = () => { if (!audioElement) return - duration.value = Number.isFinite(audioElement.duration) - ? audioElement.duration - : currentAudio.value?.duration || 0 + const mediaDuration = audioElement.duration + duration.value = Number.isFinite(mediaDuration) && mediaDuration > 0 + ? mediaDuration + : 0 } const ensureAudioElement = () => { @@ -180,7 +181,7 @@ const stopPlayback = () => { loading.value = false pendingLanguage.value = '' currentTime.value = 0 - duration.value = currentAudio.value?.duration || 0 + duration.value = 0 } const updateDetailRouteLanguage = (route: string | undefined, lang: AudioLanguage) => { @@ -246,7 +247,7 @@ const play = async (audio: AudioItem, options: GlobalAudioPlayOptions = {}) => { if (isNewAudio) { currentTime.value = 0 - duration.value = audio.duration || 0 + duration.value = 0 } if (element.getAttribute('src') !== audio.audioUrl) { diff --git a/src/pages/exhibit/detail.vue b/src/pages/exhibit/detail.vue index 19a4370..eb140d0 100644 --- a/src/pages/exhibit/detail.vue +++ b/src/pages/exhibit/detail.vue @@ -372,14 +372,9 @@ const formatDetailAudioTime = (seconds?: number) => { return `${minutes}:${remainSeconds.toString().padStart(2, '0')}` } -const detailAudioDurationSeconds = computed(() => { - if (!isCurrentDetailAudioTarget.value) return exhibit.value.audio.duration || 0 - - return globalAudioPlayer.duration.value - || globalAudioPlayer.currentAudio.value?.duration - || exhibit.value.audio.duration - || 0 -}) +const detailAudioDurationSeconds = computed(() => ( + isCurrentDetailAudioTarget.value ? globalAudioPlayer.duration.value : 0 +)) const detailAudioCurrentSeconds = computed(() => ( isCurrentDetailAudioTarget.value ? globalAudioPlayer.currentTime.value : 0 )) diff --git a/tests/unit/ExhibitDetailAudioFirst.spec.ts b/tests/unit/ExhibitDetailAudioFirst.spec.ts index 2669a22..ef19f22 100644 --- a/tests/unit/ExhibitDetailAudioFirst.spec.ts +++ b/tests/unit/ExhibitDetailAudioFirst.spec.ts @@ -164,7 +164,7 @@ describe('讲解详情音频优先布局', () => { expect(wrapper.get('.content-section').classes()).toContain('is-english') expect(wrapper.find('.section-title').exists()).toBe(false) expect(wrapper.get('.section-text').text()).toContain('detailed English narration') - expect(wrapper.get('.detail-audio-time').text()).toBe('0:00 / 1:21') + expect(wrapper.get('.detail-audio-time').text()).toBe('0:00 / 0:00') expect(wrapper.get('.detail-audio-speed').attributes('aria-label')).toBe('播放速度 1.0倍') })