fix(music): label subscription entity types

This commit is contained in:
jxxghp
2026-08-10 09:06:56 +08:00
parent cf5b95ec04
commit c5f7924484
2 changed files with 36 additions and 9 deletions
+22 -9
View File
@@ -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"
/>
<span
v-if="subscribeProgressText || musicAlbumTrackText"
v-if="subscribeProgressText || musicSubscribeMeta"
class="subscribe-card-mobile-progress-text"
>
{{ subscribeProgressText || musicAlbumTrackText }}
{{ subscribeProgressText || musicSubscribeMeta?.text }}
</span>
</div>
@@ -734,11 +747,11 @@ function handleCardClick() {
</VTooltip>
</div>
<div
v-else-if="musicAlbumTrackText"
v-else-if="musicSubscribeMeta"
class="flex flex-shrink-0 align-center text-subtitle-2 me-2 text-white"
>
<VIcon icon="mdi-album" size="small" class="me-1" />
{{ musicAlbumTrackText }}
<VIcon :icon="musicSubscribeMeta.icon" size="small" class="me-1" />
{{ musicSubscribeMeta.text }}
</div>
<VIcon
v-if="props.media?.username && props.sortable"
@@ -194,6 +194,20 @@ describe('SubscribeCard display and progress', () => {
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'],