fix(music): preserve subscription entity semantics

This commit is contained in:
jxxghp
2026-08-09 23:30:31 +08:00
parent 2a01a2ffe0
commit ce0b0d6330
5 changed files with 81 additions and 6 deletions
+8 -2
View File
@@ -26,7 +26,7 @@ import {
getCachedMediaSubscribeStatus,
setCachedMediaExistsStatus,
} from '@/utils/mediaStatusCache'
import { buildMusicDetailRoute } from '@/utils/music'
import { buildMusicDetailRoute, getMusicKey } from '@/utils/music'
const SearchSiteDialog = defineAsyncComponent(() => import('@/components/dialog/SearchSiteDialog.vue'))
@@ -151,7 +151,8 @@ function getMediaId() {
}
function getSubscribeStatusKey(season: number | null = props.media?.season ?? null) {
return `${getMediaId()}::${season ?? 'all'}`
const identity = props.media?.type === '音乐' ? getMusicKey(props.media) : getMediaId()
return `${identity}::${season ?? 'all'}`
}
function getExistsStatusKey() {
@@ -167,6 +168,11 @@ function getExistsStatusKey() {
}
function isSameSubscribeMedia(subscribe: Subscribe) {
if (props.media?.type === '音乐') {
const expectedMusicType = props.media.music_type ?? 'recording'
const subscribeMusicType = subscribe.music_type ?? 'recording'
if (subscribeMusicType !== expectedMusicType) return false
}
const mediaId = getMediaId()
if (subscribe.media_source && subscribe.media_id) {
const prefix = subscribe.media_source === 'themoviedb' ? 'tmdb' : subscribe.media_source
+3 -2
View File
@@ -3,7 +3,7 @@ import type { MediaInfo } from '@/api/types'
import { useGlobalSettingsStore, useUserStore } from '@/stores'
import { buildUserPermissionContext, hasPermission } from '@/utils/permission'
import { getDisplayImageUrl } from '@/utils/imageUtils'
import { getMediaSubscribeId, useMediaSubscribe } from '@/composables/useMediaSubscribe'
import { useMediaSubscribe } from '@/composables/useMediaSubscribe'
import { getCachedMediaSubscribeStatus } from '@/utils/mediaStatusCache'
import { useMusicSiteSearch } from '@/composables/useMusicSiteSearch'
import {
@@ -13,6 +13,7 @@ import {
buildMusicResourceRoute,
formatMusicDuration,
getMusicArtistLinks,
getMusicKey,
} from '@/utils/music'
const { t } = useI18n()
@@ -80,7 +81,7 @@ const showCover = computed(() => Boolean(coverUrl.value) && !imageLoadError.valu
/** 生成订阅状态缓存键。 */
function getSubscribeStatusKey() {
return `${getMediaSubscribeId(props.music)}::all`
return `${props.music ? getMusicKey(props.music) : ''}::all`
}
const subscribeActions = useMediaSubscribe({
@@ -329,6 +329,7 @@ describe('MediaCard', () => {
const { container } = await renderCard(media)
getStatusObservers()[0]?.trigger()
await waitFor(() => expect(subscribeRequest).toHaveBeenCalledOnce())
expect((subscribeRequest.mock.calls[0][0] as URL).searchParams.get('music_type')).toBe('recording')
expect(existsRequest).not.toHaveBeenCalled()
await fireEvent.mouseEnter(getHoverArea(container))