From c5f79244840223148f9f2349d6784182f31f53f5 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Mon, 10 Aug 2026 09:06:56 +0800 Subject: [PATCH] fix(music): label subscription entity types --- src/components/cards/SubscribeCard.vue | 31 +++++++++++++------ .../cards/__tests__/SubscribeCard.spec.ts | 14 +++++++++ 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/components/cards/SubscribeCard.vue b/src/components/cards/SubscribeCard.vue index 847ffa6a..00b765f4 100644 --- a/src/components/cards/SubscribeCard.vue +++ b/src/components/cards/SubscribeCard.vue @@ -136,10 +136,23 @@ const subscribeProgressText = computed(() => { return `${downloadedEpisode.value} / ${total}` }) -// 专辑订阅按整包完成,不伪造分集进度;这里只展示整专规模,提醒用户该目标包含多首曲目。 -const musicAlbumTrackText = computed(() => { - if (props.media?.type !== '音乐' || props.media?.music_type !== 'album' || !props.media?.total_tracks) return '' - return `${t('music.entityAlbum')} · ${t('music.trackCount', { count: props.media.total_tracks })}` +// 音乐订阅始终展示实体类型;旧数据缺少 music_type 时按既有单曲语义兼容。 +const musicSubscribeMeta = computed(() => { + if (props.media?.type !== '音乐') return null + if (props.media.music_type === 'album') { + const trackCount = props.media.total_tracks + return { + icon: 'mdi-album', + text: trackCount + ? `${t('music.entityAlbum')} · ${t('music.trackCount', { count: trackCount })}` + : t('music.entityAlbum'), + } + } + + return { + icon: 'mdi-music-note', + text: t('music.entityRecording'), + } }) // 订阅卡片 hover 文案: @@ -641,10 +654,10 @@ function handleCardClick() { size="16" /> - {{ subscribeProgressText || musicAlbumTrackText }} + {{ subscribeProgressText || musicSubscribeMeta?.text }} @@ -734,11 +747,11 @@ function handleCardClick() {
- - {{ musicAlbumTrackText }} + + {{ musicSubscribeMeta.text }}
{ expect(screen.queryByText(/^\d{1,4} \/ \d{1,4}$/)).not.toBeInTheDocument() }) + it.each([480, 1024])('identifies recording subscriptions at %ipx', async width => { + setViewport(width) + await renderCard({ music_type: 'recording', name: '晴天', total_tracks: undefined, type: '音乐' }) + + expect(screen.getByText('单曲')).toBeInTheDocument() + expect(screen.queryByText(/首$/)).not.toBeInTheDocument() + }) + + it('keeps the album identity visible when a legacy subscription has no track count', async () => { + await renderCard({ music_type: 'album', name: '旧专辑', total_tracks: undefined, type: '音乐' }) + + expect(screen.getByText('专辑')).toBeInTheDocument() + }) + it.each([ ['regular progress', 10, 4, '6 / 10', '60'], ['negative missing episodes', 10, -2, '10 / 10', '100'],