mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-09-06 08:06:43 +08:00
fix(music): preserve subscription entity semantics
This commit is contained in:
@@ -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,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))
|
||||
|
||||
Reference in New Issue
Block a user